LoginSignup
1
0

More than 5 years have passed since last update.

scapy IPv6

Last updated at Posted at 2016-09-01

備忘録的な。

Router solicit

# いつもの投げっぱなし
>>> sendp(Ether()/IPv6()/ICMPv6ND_RS())
# 応答が欲しい
>>> sr1(IPv6()/ICMPv6ND_RS())

DHCPv6 solicit には client-id が必須(RFC 3351)

>>> client_id=DUID_LLT(lladdr=get_if_hwaddr(conf.iface6))
>>> a=sr1(IPv6(dst="ff02::1:2")/UDP()/DHCP6_Solicit()/DHCP6OptClientId(duid=client_id))
>>> client_id=a[DHCP6OptClientId].duid
>>> server_id=a[DHCP6OptServerId].duid

DHCPv6 solicit, advertise, request, reply とつなげるとこんな感じ。dnsmasq はとりあえず応答してくれる。

a=sr1(IPv6(dst="ff02::1:2")/UDP()/DHCP6_Solicit()
 /DHCP6OptClientId(duid=DUID_LLT(lladdr=get_if_hwaddr(conf.iface6))))
b=sr1(IPv6(src=a[IPv6].dst, dst=a[IPv6].src)/UDP()/DHCP6_Request()
 /DHCP6OptServerId(duid=a[DHCP6OptServerId].duid)
 /DHCP6OptClientId(duid=a[DHCP6OptClientId].duid))

Cisco は DHCPv6_Solicit に DHCP6OptIA_NA が無いと、応答しない。RFC 3351 の記述をそのまま実行すると付くことになる(いちおう validation では要求されていない)。

a=sr1(IPv6(dst="ff02::1:2")/UDP()/DHCP6_Solicit()
 /DHCP6OptClientId(duid=DUID_LLT(lladdr=get_if_hwaddr(conf.iface6)))
 /DHCP6OptIA_NA(iaid=1)
)
b=sr1(IPv6(dst="ff02::1:2")/UDP()/DHCP6_Request()
 /DHCP6OptServerId(duid=a[DHCP6OptServerId].duid)
 /DHCP6OptClientId(duid=a[DHCP6OptClientId].duid)
 /DHCP6OptIA_NA(iaid=1)
)

さらに DHCPv6-RelayForward, RelayReply をする。下の例の src アドレスは stateful に割り当てられた時の値を抜き出している。slaac 使ってる場合は、手元で計算していれるべし。

c=sr1(IPv6(dst="ff05::1:3", src=b[DHCP6OptIA_NA].ianaopts[0].addr)
 /UDP(sport=547, dport=547)
 /DHCP6_RelayForward(linkaddr="fd00::152", peeraddr="fe80::2000:1")
 /DHCP6OptRelayMsg()/DHCP6_Solicit()
  /DHCP6OptClientId(duid=DUID_LLT(lladdr="00:11:22:33:44:55"))/DHCP6OptIA_NA(iaid=2)
)
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0