Python Penetration Testing 简明教程
Network Packet Sniffing
嗅探或网络数据包嗅探是使用嗅探工具监视和捕获通过给定网络的所有数据包的过程。这是一种形式,其中我们可以“窃听电话线”并了解对话。它也称为 wiretapping ,可以应用于计算机网络。
如果一组企业交换机端口已打开,就有很大的可能性,他们的一名员工可以嗅探网络的全部流量。任何在相同物理位置的人都可以使用以太网电缆连接到网络,或以无线方式连接到该网络并嗅探全部流量。
换句话说,嗅探使您可以查看各种流量,包括受保护和不受保护的流量。在条件合适且实施了正确的协议时,攻击方有可能收集可用于进一步攻击或给网络或系统所有者造成其他问题的信息。
What can be sniffed?
人们可以从网络中嗅探以下敏感信息——
-
Email traffic
-
FTP passwords
-
Web traffics
-
Telnet passwords
-
Router configuration
-
Chat sessions
-
DNS traffic
How does sniffing work?
嗅探器通常将系统的网卡转为混杂模式,以便它侦听其网段上传输的所有数据。
混杂模式指的是以太网硬件(尤其是网络接口卡 (NIC))的独特方式,它允许网卡接收网络上的所有流量,即使该流量不是发送到此网卡的。默认情况下,网卡会忽略所有不是发送到本网卡的流量,这通过将以太网数据包的目标地址与设备的硬件地址(MAC)进行比较来完成。虽然这非常适合网络,但非混杂模式使得很难使用网络监视和分析软件来诊断连接问题或流量记帐。
嗅探器可以通过解码数据包中封装的信息,持续监视通过网卡传输到计算机的所有流量。
Types of Sniffing
嗅探可以是主动的或被动的。我们现在将了解不同类型的嗅探。
The Sniffing Effects on Protocols
诸如 tried and true TCP/IP 等协议从一开始就没有考虑到安全性。此类协议不会对潜在的入侵者提供多大阻力。以下是易于嗅探的不同协议——
Implementation using Python
在实现原始套接字嗅探器之前,让我们了解 struct 方法,如下所述−
struct.unpack(fmt, string)
顾名思义,此方法根据给定的格式解包字符串。
在原始套接字嗅探器 IP 标头以下示例中,它是数据包中的下一个 20 个字节,在这 20 个字节中,我们对最后 8 个字节感兴趣。后一个字节显示源和目标 IP 地址是否正在进行解析 −
现在,我们需要导入以下一些基本模块 −
import socket
import struct
import binascii
现在,我们将创建一个包含三个参数的套接字。第一个参数告诉我们数据包接口 − Linux 特有的 PF_PACKET 和用于 Windows 的 AF_INET;第二个参数告诉我们它是一个原始套接字;第三个参数告诉我们我们感兴趣的协议 −0x0800 用于 IP 协议。
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket. htons(0x0800))
现在,我们需要调用 recvfrom() 方法来接收数据包。
while True:
packet = s.recvfrom(2048)
在以下代码行中,我们正在截取以太网标头 −
ethernet_header = packet[0][0:14]
使用以下代码行,我们正在解析并解包标头,方法是使用 struct 方法 −
eth_header = struct.unpack("!6s6s2s", ethernet_header)
以下代码行将返回一个具有三个十六进制值的元组,由 hexify 转换为 binascii 模块 −
print "Destination MAC:" + binascii.hexlify(eth_header[0]) + " Source MAC:" + binascii.hexlify(eth_header[1]) + " Type:" + binascii.hexlify(eth_header[2])
我们现在可以通过执行以下代码行来获取 IP 标头 −
ipheader = pkt[0][14:34]
ip_header = struct.unpack("!12s4s4s", ipheader)
print "Source IP:" + socket.inet_ntoa(ip_header[1]) + " Destination IP:" + socket.inet_ntoa(ip_header[2])
同样,我们还可以解析 TCP 标头。