Python Penetration Testing 简明教程

Network Packet Sniffing

嗅探或网络数据包嗅探是使用嗅探工具监视和捕获通过给定网络的所有数据包的过程。这是一种形式,其中我们可以“窃听电话线”并了解对话。它也称为 wiretapping ,可以应用于计算机网络。

如果一组企业交换机端口已打开,就有很大的可能性,他们的一名员工可以嗅探网络的全部流量。任何在相同物理位置的人都可以使用以太网电缆连接到网络,或以无线方式连接到该网络并嗅探全部流量。

换句话说,嗅探使您可以查看各种流量,包括受保护和不受保护的流量。在条件合适且实施了正确的协议时,攻击方有可能收集可用于进一步攻击或给网络或系统所有者造成其他问题的信息。

What can be sniffed?

人们可以从网络中嗅探以下敏感信息——

  1. Email traffic

  2. FTP passwords

  3. Web traffics

  4. Telnet passwords

  5. Router configuration

  6. Chat sessions

  7. DNS traffic

How does sniffing work?

嗅探器通常将系统的网卡转为混杂模式,以便它侦听其网段上传输的所有数据。

混杂模式指的是以太网硬件(尤其是网络接口卡 (NIC))的独特方式,它允许网卡接收网络上的所有流量,即使该流量不是发送到此网卡的。默认情况下,网卡会忽略所有不是发送到本网卡的流量,这通过将以太网数据包的目标地址与设备的硬件地址(MAC)进行比较来完成。虽然这非常适合网络,但非混杂模式使得很难使用网络监视和分析软件来诊断连接问题或流量记帐。

嗅探器可以通过解码数据包中封装的信息,持续监视通过网卡传输到计算机的所有流量。

Types of Sniffing

嗅探可以是主动的或被动的。我们现在将了解不同类型的嗅探。

Passive Sniffing

在被动嗅探中,流量被锁定但不会以任何方式改变。被动嗅探只允许侦听。它适用于集线器设备。在集线器设备中,流量将发送到所有端口。在使用集线器连接系统的网络中,网络上的所有主机都可以查看流量。因此,攻击者可以轻松捕获正在传输的流量。

好消息是,集线器在近来几乎已经过时了。大多数现代网络都使用交换机。因此,被动嗅探不再有效。

Active Sniffing

在主动嗅探中,流量不仅被锁定和监视,而且还可能以攻击所决定的某种方式进行改变。主动嗅探用于嗅探基于交换机的网络。它涉及将地址解析协议 (ARP) 数据包注入到目标网络中,以在交换机内容寻址存储器 (CAM) 表中泛滥。CAM 跟踪哪个主机连接到哪个端口。

以下是主动嗅探技术——

  1. MAC Flooding

  2. DHCP Attacks

  3. DNS Poisoning

  4. Spoofing Attacks

  5. ARP Poisoning

The Sniffing Effects on Protocols

诸如 tried and true TCP/IP 等协议从一开始就没有考虑到安全性。此类协议不会对潜在的入侵者提供多大阻力。以下是易于嗅探的不同协议——

HTTP

它用于发送明文信息,不进行任何加密,因此它是一个真正的目标。

SMTP (Simple Mail Transfer Protocol)

SMTP 用于传输电子邮件。此协议高效,但它不包括任何防嗅探保护。

NNTP (Network News Transfer Protocol)

它用于所有类型的通信。它的一个主要缺点是,数据甚至密码都以明文形式在网络上传输。

POP (Post Office Protocol)

POP 专门用于从服务器接收电子邮件。此协议不包括防嗅探保护,因为它可以被捕获。

FTP (File Transfer Protocol)

FTP 用于发送和接收文件,但它没有提供任何安全功能。所有数据都作为明文发送,很容易被嗅探。

IMAP (Internet Message Access Protocol)

IMAP 在其功能上与 SMTP 相同,但它极易受到嗅探的影响。

Telnet

Telnet 将所有内容(用户名、密码、击键)作为明文通过网络发送,因此很容易被嗅探。

嗅探器并不是只能让你查看实时流量的简单工具。如果你真的想要对每个数据包进行分析,请保存捕获内容并在时间允许时对其进行查看。

Implementation using Python

在实现原始套接字嗅探器之前,让我们了解 struct 方法,如下所述−

struct.pack(fmt, a1,a2,…)

顾名思义,此方法用于返回字符串,该字符串按照给定的格式打包。该字符串包含值 a1、a2 等。

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 标头。