Python渗透测试编程技术
一、网络嗅探与欺骗
如果想要彻底了解一个网络,那么最好的办法就是对网络中的流量进行嗅探。这些嗅探工具可以用来窃取网络中明文传输的密码,监视网络中的数据流向,甚至可以收集远程登录所使用的NTLM数据包(这个数据包中包含登录用的用户名和使用Hash加密的密码)。
1.网络数据嗅探
1.1编写一个网络嗅探工具
在Scapy中提供了一种专门用来捕获数据包的函数 sniff( ),使用help函数来查看一下它的使用方法help(sniff)。
1.2函数sniff()中可以使用多个参数
1.3.Sniff()还支持过滤器的使用
这个过滤器使用了一种功能非常强大的过滤语法——“伯克利包过滤”语法。
这个规则简称为BPF,利用它可以确定该获取和检查哪些流量,忽略哪些流量。
BPF可以帮助我们通过比较各个层协议中数据字段值的方法对流量进行过滤。
BPF的主要特点是使用一个名为“原语”的方法来完成对网络数据包的描述, 例如,可以使用“host”来描述主机,“port”来描述端口,同时也支持“与”“或”“非”等逻辑运算。可以限定的内容包括地址、协议等。
1.4.使用这种语法创建出来的过滤器被称为BPF表达式,每个表达式包含一个或多个原语。每个原语中又包含一个或多个限定词,主要有三个限定词:Type、Dir 和 Proto。
(1)Type用来规定使用名字或数字代表的类型,例如host、net和port等。
(2)Dir用来规定流量的方向,例如src、dst和src and dst等。
(3)Proto用来规定匹配的协议,例如ip、tcp和arp等。
“host 192.168.169.133”就是一条最为常见的过滤器,它用来过滤掉除了本机和192.168.169.133以外的所有流量。如果希望再将范围限制小一些,例如,只捕获tcp类型的流量就可以使用“与”运算符,如“host 192.168.169.133 && tcp”。
1.5一些常见的过滤器
(1)只捕获与网络中某一个IP的主机进行交互的流量:host 192.168.1.1”。
(2)只捕获与网络中某一个MAC地址的主机交互的流量:“ether host 00-1a-a0-52-e2-a0”。
(3)只捕获来自网络中某一个IP的主机的流量:“src host 192.168.1.1”。
(4)只捕获去往网络中某一个IP的主机的流量:“dst host 192.168.1.1”,host也可以省略。
(5)只捕获23端口的流量:“port 23”。
(6)捕获除了23端口以外的流量:“!23”。
(7)只捕获目的端口为80的流量:“dst port 80”。
(8)只捕获ICMP流量:“icmp”。
(9)只捕获type为3,code为0的ICMP流量:“icmp[0] = 3 &&icmp[1] = 0”。
1.6使用Sniff()来捕获一些数据包并显示出来
如果希望即时显示捕获的数据包,就可以使用prn函数选项(利用prn就可以不断地打印输出捕获到的数据包的内容), 函数的内容为prn=lambda x:x.summary()
这个函数可以实现很多功能,例如输出其中的某一个选项:使用 x[IP].src 输出IP报文的目的地址
在开启 sniff 的时候, 访问目标主机的目标端口
这些捕获到的数据包可以使用wrpcap函数保存起来,保存的格式很多,目前最为通用的格式为pcap。
1.7调用WireShark来查看数据包
二、ARP的原理与缺陷
1.之所以这里特别提到这个协议,是因为目前网络中大部分的监听和欺骗技术都是源于这个协议。但是这个协议存在一个重大缺陷,就是这个过程并没有任何的认证机制。
2.也就是说如果一台主机收到ARP请求数据包,并不会对这个数据包进行真伪判断,无论这个数据包是否真的来自源主机,都会将其添加到ARP表中。 因此黑客就可能会利用这个漏洞来 冒充网关等主机。
3.现在arpspoof完成了对目标主机的欺骗任务,可以截获到目标主机发往网关的数据包。
但是这里有两个问题: 首先arpspoof仅仅是会截获这些数据包,并不能查看这些数据包,所以还需要使用专门查看数据包的工具打开WireShark,就可以看到 受害者所发送的数据包
第二点就是主机不会再将这些数据包转发到网关,这样将会导致目标主机无法正常上网, 所以需要在主机上开启转发功能
这样就可以将截获到的数据包再转发出去,被欺骗的主机就可以正常上网了,从而无法察觉到受到攻击。
4.中间人欺骗
使用Scapy库来完成这个任务,再来看一遍ARP数据包的格式
这里需要设置的值主要有三个:op、psrc 和 pdst。其中,op对应的是ARP类型,默认值已经是1,就是ARP请求,无须改变;psrc的值最关键,psrc对应前面的源IP地址
5.使用Socket来实现中间人欺骗
5.1查看ARP数据包的格式(精确到每一位表示的含义)
5.2使用socket来产生一个数据包要远比Scapy麻烦,这个数据包要分成如下多个部分
(1)以太网目的地址,长度为6位。
(2)以太网源地址,长度为6位。
(3)帧类型,长度为两位。
(4)硬件类型,长度为两位。
(5)协议类型,长度为两位。
(6)硬件地址长度,长度为1位。
(7)协议地址长度,长度为1位。
(8)op,长度为两位。
(9)发送端以太网地址,长度为6位。
(10)发送端IP地址,长度为4位。
(11)目的以太网地址,长度为6位。
(12)目的IP地址,长度为4位。
5.3利用这个库实现中间人欺骗的原理和前面一样,也是通过向目标发送一个伪造了的ARP请求数据包来实现的
可以按照如下来填充这个数据包。
(1)以太网目的地址:00:0c:29:2D:7F:89,这个表示要欺骗的主机的硬件地址,也可以是广播地址ff:ff:ff:ff:ff:ff。
(2)以太网源地址:00:0c:29:12:dd:23,这是本机的硬件地址。
(3)帧类型:0x0806表示ARP类型,使用两位十六进制表示为\x08\x06。
(4)硬件类型:1表示以太网,使用两位十六进制表示为\x00\x01。
(5)协议类型:8表示IPv4,使用两位十六进制表示为\x08\x00。
(6)硬件地址长度:\x06,表示6位的硬件地址。
(7)协议地址长度:\x04,表示4位的IP地址。
(8)op:1表示请求,2表示回应,使用两位十六进制表示为\x00\x01。
(9)发送端以太网地址:00:0c:29:12:dd:23。
(10)发送端IP地址:192.168.169.2。
(11)目的以太网地址:00:0c:29:2D:7F:89。
(12)目的IP地址:192.168.169.133。
在构造数据包的时候需要注意一点,网络中传输IP地址等数据要使用网络字节顺序,保证数据在不同主机之间传输时能够被正确解释