记得以前在公司时,经常碰到未经授权的DHCP服务器接入网络,可能是做实验,没有把虚拟机的网络与真实网络屏蔽,这样就很难搞。而且还遇到一特邪门的事情,VOIP的DHCPServer蹿入了用户网络,导致用户拿到的是IP电话的IP,通过DHCP获取IP,就有这个麻烦,谁快就拿谁的。那么,如何通过Scapy找到DHCP李鬼呢?可以自己写,也可以使用内置的函数dhcp_request()

这个工具非常简单,就是创建一个DHCP请求包,在网络中发送广播,如果接受到DHCPACK,就会返回这个ACK包,这样就可以分析到底是哪个DHCP发送的IP地址

dhcp_request()需要两个参数,iface表示使用哪个网卡接口,如果没有赋值,那么使用conf.iface所指定的网卡,这种情况对多个网卡好用,还有一个参数是conf.checkIPaddr,如果为1,那么会有提示,可能会检查IP地址,还没仔细看这个参数是干嘛用的。设置好之后,就可以直接使用了

conf.iface=0

dhcp_request(iface='wlan0')

如果留空,那么就是conf.iface指定的网口,一般留空就好了

>>>dhcp_request()
Begin emission:
.Finished to send 1 packets.
*
Received 2 packets, got 1 answers, remaining 0 packets
<Ether  dst=00:0c:29:3e:0f:dasrc=5c:63:bf:76:90:20 type=0x800|<IP  version=4L ihl=5L tos=0x0len=576 id=57084 flags= frag=0L ttl=64 proto=udp chksum=0x15f7src=192.168.1.1 dst=192.168.1.104 options=[]|<UDP  sport=bootps dport=bootpclen=556 chksum=0x5266 |<BOOTP op=BOOTREPLY htype=1 hlen=6 hops=0 xid=0 secs=0 flags=ciaddr=0.0.0.0 yiaddr=192.168.1.104 siaddr=0.0.0.0 giaddr=0.0.0.0chaddr='\x00\x0c)>\x0f\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'sname='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'file='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'options='c\x82Sc' |<DHCP options=[message-type=offer server_id=192.168.1.1 lease_time=7200subnet_mask=255.255.255.0 router=192.168.1.1name_server=192.168.1.1 end pad ... pad]|>>>>>

>>> a=_

>>>a.summary()
'Ether / IP / UDP 192.168.1.1:bootps >192.168.1.104:bootpc / BOOTP / DHCP'

>>>a.sprintf('%Ether.src%:%IP.src%')
'5c:63:bf:76:90:20:192.168.1.1'

这样就可以看出DHCP服务器的IP地址与MAC地址了,可以看看DHCP应答的包结构

>>>a[BOOTP].show()
###[ BOOTP ]###
  op= BOOTREPLY
  htype= 1
  hlen= 6
  hops= 0
  xid= 0
  secs= 0
  flags=
  ciaddr= 0.0.0.0
  yiaddr= 192.168.1.104
  siaddr= 0.0.0.0
  giaddr= 0.0.0.0
  chaddr='\x00\x0c)>\x0f\xda\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
  sname='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
  file='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
  options= 'c\x82Sc'
###[ DHCP options ]###
    options= [message-type=offer server_id=192.168.1.1 lease_time=7200subnet_mask=255.255.255.0 router=192.168.1.1name_server=192.168.1.1 end pad ...pad]

这个工具有一定的局限性,就是太模拟客户端了,如果有一个最快的DHCP返回了DHCPRequest,那么就显示这个最快的数据包

如何能找到所有的DHCP服务器呢?这个需要添加srp()的参数multi=True

等到接收到所有的DHCP应答,才返回接收到的结果

这个就不能用方便的dhcp_request()了

改写一下脚本

>>>conf.checkIPaddr = False
>>> fam,hw =get_if_raw_hwaddr(conf.iface)
>>> dhcp_discover =Ether(dst="ff:ff:ff:ff:ff:ff")/IP(src="0.0.0.0",dst="255.255.255.255")/UDP(sport=68,dport=67)/BOOTP(chaddr=hw)/DHCP(options=[("message-type","discover"),"end"])
>>> ans, unans =srp(dhcp_discover,multi=True)     # Press CTRL-C after several seconds
Begin emission:
Finished to send 1 packets.
.*...*..
Received 8 packets, got 2 answers, remaining 0 packets
>>>ans.summary()
Ether / IP / UDP 0.0.0.0:bootpc >255.255.255.255:bootps / BOOTP / DHCP ==> Ether / IP/ UDP 192.168.1.1:bootps > 255.255.255.255:bootpc /BOOTP / DHCP
Ether / IP / UDP 0.0.0.0:bootpc >255.255.255.255:bootps / BOOTP / DHCP ==> Ether / IP/ UDP 192.168.1.11:bootps > 255.255.255.255:bootpc /BOOTP / DHCP
>>> for p in ans:print p[1][Ether].src, p[1][IP].src
...
00:de:ad:be:ef:00 192.168.1.1
00:11:11:22:22:33 192.168.1.11

第二步参考

http://trac.secdev.org/scapy/wiki/IdentifyingRogueDHCPServers
其实,可以看dhcp_request()源代码的,源代码是这么写的

def dhcp_request(iface=None,**kargs):
    ifconf.checkIPaddr != 0:
       warning("conf.checkIPaddr is not 0, I may not be able to match theanswer")
    if iface isNone:
       iface = conf.iface
    fam,hw =get_if_raw_hwaddr(iface)
    returnsrp1(Ether(dst="ff:ff:ff:ff:ff:ff")/IP(src="0.0.0.0",dst="255.255.255.255")/UDP(sport=68,dport=67)
                /BOOTP(chaddr=hw)/DHCP(options=[("message-type","discover"),"end"]),iface=iface,**kargs)

Python中的Scapy初探之六--找出非法的DHCP Server相关推荐

  1. python中false是什么意思_真==真是什么意思!=在Python中为False,如何找出?

    它叫做operator chaining.每当你有一个类似于A op1 B op2 C的表达式,并且有op1和{}的比较,它就会被"翻译"为A op1 B and B op2 C. ...

  2. python按行读字符串,python按行读取文件并找出其中指定字符串

    python怎么提取出文件里的指定内容 python读取文件内容的方法: 一.最方便的方法是一次性读取文件中的所有内容并放置到一个大字符串中: all_the_text = open('thefile ...

  3. php找出字符串不同地方,PHP中比较两个字符串找出第一个不同字符位置例子

    PHP中比较两个字符串找出第一个不同字符位置例子 一般的做法就会这样: 复制代码 代码如下: for ($offset = 0; $offset < $length; ++$offset) { ...

  4. 在数据库中, 不用max()/min()找出一个列中最大/最小值的记录

    不用max()/min()找出c1列中最大/最小值的记录 // 找出c1列中,c1是最小值的那条记录,不能用min() select * from t1 where c1 <= all(sele ...

  5. c语言 输入n*n矩阵,C语言函数 编程输入一个n*n矩阵中各元素的值,找出两条对角线上的元素之和...

    题目: C语言函数 编程输入一个n*n矩阵中各元素的值,找出两条对角线上的元素之和 用函数怎么写 解答: #include #define N 5 void main() { \x09int matr ...

  6. python将大于输出列表_python找出列表中大于某个阈值的数据段示例

    该算法实现对列表中大于某个阈值(比如level=5)的连续数据段的提取,具体效果如下: 找出list里面大于5的连续数据段: list = [1,2,3,4,2,3,4,5,6,7,4,6,7,8,5 ...

  7. python查找两个数组中相同的元素_找出两个数组的相同元素,最优算法?

    在做新旧接口交替过程中,遇到了老接口和新接口json数据有些不一致的情况,需要比较两个json对象,把相同的元素赋其中一个json对象中变量的值.而且其中一个json最后输出格式还需要改变下属性名,思 ...

  8. python中turtle什么意思,Python中的turtle初探

    turtle Python自带了一个turtle库,就像名字turtle说的那样,你可以创建一个turtle,然后这个turtle可以前进,后退,左转,这个turtle有一条尾巴,能够放下和抬起,当尾 ...

  9. python列表查找整数_Python:找出整数列表是否为coheren

    我试图找出一个整数列表是一致的还是"一次延伸",这意味着两个相邻元素之间的差必须正好是一,并且数字必须单调地递增.我found一种简单的方法,我们可以根据列表中的数字减去元素在列表 ...

最新文章

  1. HarmonyOS ScrollView 使用
  2. MySQL数据库性能优化之一
  3. python基础30个常用代码大全-Python基础小题汇总
  4. C#中使用FilleStream实现视频文件的复制
  5. 《大道至简》第四章内容总结
  6. Interesting Finds: 2008.03.24
  7. Node.js Event loop 图解
  8. RocketMQ这样做,压测后性能提高30%
  9. Guayadeque成为音乐爱好者的开源播放器的6个原因
  10. c++ websocket客户端_WebSocket协议详解与c++amp;c#实现
  11. 之江天枢正式开源!一文详解天枢核心优势
  12. 使用Keras打造一个实时可用交通标志识别App
  13. [Spark][Python]对HDFS 上的文件,采用绝对路径,来读取获得 RDD
  14. CSting的GetBuffer()和ReleaseBuffer()
  15. filter动态参数 maven_多环境下Maven项目的管理
  16. linux下文件打包、压缩详解
  17. #牛客网 2018年牛客多校算法寒假训练营练习比赛(第五场)
  18. 典型相关分析 CCA
  19. 中职学校计算机课听课记录表,中职听课记录
  20. ToolBoxFeatureDataZoomOpts:工具箱区域缩放配置项

热门文章

  1. 国科大学习资料--最优化计算方法(王晓)-期末考试真题3
  2. 数商云跨境电商平台运营总结:整合渠道+深引流量
  3. Smart200-ST20PLC输入输出接线图
  4. 高德导航免费,那他靠什么收入?
  5. linux dd copy all partitions,dd 命令详解
  6. 记STM32之PWM学习笔记 ---PWM原理
  7. 赛门铁克Backup Exec故障检修性能指南(转)
  8. 如何让ecshop做淘宝客
  9. 基于锁相环的直流电机控制系统simulink仿真
  10. 百利网总结:网店如何推广