使用Python 的 Socket 模块构建一个 UDP 扫描工具
2017-9-7 13:29:36

当涉及到对一些目标网络的侦察时,出发点无疑是首先发现宿主主机。这个任务还可能包含嗅探和解析网络中数据包的能力。
几周前,我曾经谈到了如何使用Wireshark来进行数据包嗅探,但如果你没有wireshark,你如何去监控网络流量呢?
这一次,Python提供了几种解决方案,今天我将一步步演示如何建立一个UDP主机发现工具。首先,我们要看我们如何处理原始套接字来编写一个简单的嗅探器,它能够查看和解析网络数据包。然后,我们将在子网内多线程运行该进程,结果将在我们的扫描仪上。
原始套接字酷之所在是它能够访问底层网络的信息。比如,我们可以用它来检查IP和ICMP报头,这是在OSI模型的第三层(网络层)。
使 用UDP数据报最酷的事情是:当发送信息穿越子网时,不同于TCP,它不太多的开销(还记得TCP握手吧)。我们需要做的就是等待ICMP回应,对方主机 是否可用或关闭(不可访问)。记住,ICMP协议本质上是一个特殊的控制协议,它指示错误报告和控制机器数据传输的的行为。
编写网络包嗅探器
我们从一个小功能开始:用 Python 的 socket 库来编写一个简单的网络包嗅探器。
在这个嗅探器中,我们创建一个原始 socket 并将它绑定到一个外部网卡。这个网卡要启用混淆模式(promiscuous mode),也就是说获经过这个网卡的所有数据包都会被捕获,包括那些目标地址不是它的数据包。
使用 Windows 时要注意一点:我们需要发送一个 IOCTL 包才能将网卡设置为混淆模式。另外,虽然 linux 需要使用 ICMP,Windows 却可以以一种独立于协议的方式来嗅探收到的数据包。
import socket
import os
# host to listen
HOST = '192.168.1.114'
def sniffing ( host , win , socket_prot ) :
while 1 :
sniffer = socket . socket ( socket . AF_INET , socket . SOCK_RAW , socket_prot )
sniffer . bind (( host , 0 ))
# include the IP headers in the captured packets
sniffer . setsockopt ( socket . IPPROTO_IP , socket . IP_HDRINCL , 1 )
if win == 1 :
sniffer . ioctl ( socket . SIO_RCVALL , socket_RCVALL_ON )
# read in a single packet
print sniffer . recvfrom ( 65565 )
def main ( host ) :
if os . name == 'nt' :
sniffing ( host , 1 , socket . IPPROTO_IP )
else :
sniffing ( host , 0 , socket . IPPROTO_ICMP )
if __name__ == '__main__' :
main ( HOST )
在终端中运行如下命令进行测试:
$ sudo python sniffer.py
在另一个终端中 ping 或 traceroute 某些地址,如 www.google.com 会得到如下结果:
$ sudo python raw_socket . py
( 'E\x00\x00T\xb3\xec\x00\x005\x01\xe4\x13J}\xe1\x11\xc0\xa8\x01r\x00\x00v\xdfx\xa2\x00\x01sr\x98T\x00\x00\x00\x008\xe3\r\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01234567' , ( '74.125.225.17' , 0 ))
( 'E\x00\x00T\xb4\x1b\x00\x005\x01\xe3\xe4J}\xe1\x11\xc0\xa8\x01r\x00\x00~\xd7x\xa2\x00\x02tr\x98T\x00\x00\x00\x00/\xea\r\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01234567' , ( '74.125.225.17' , 0 ))
很明显需要对这些头信息进行解码。
IP ICMP层解码
IP 头
典型的 IP 头有如下结构,每个字段都对应一个变量 (这个头最初是用 C 编写的):
ICMP头
同样,ICMP 由于内容的不同其消息类型也不同,但每个消息都包括三个一致的元素:type,code (告知接收主机这个 ICMP 消息的解码类型)和 checksum。 
对于我们的扫描器,如果得到的 type 和 code 值是3,这意味着 Destinati

下一页
返回列表
返回首页
©2021 艾叔编程|大数据学习网|大数据学习的精选知识仓库 电脑版