网络数据包嗅探


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

如果一组企业交换机端口打开,那么他们的一名员工很可能可以嗅探网络的整个流量。位于同一物理位置的任何人都可以使用以太网电缆插入网络或无线连接到该网络并嗅探总流量。

换句话说,嗅探允许您查看各种流量,包括受保护和未受保护的流量。在适当的条件下并采用适当的协议,攻击方可能能够收集可用于进一步攻击或给网络或系统所有者带来其他问题的信息。

可以嗅什么?

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

  • 电子邮件流量
  • FTP密码
  • 网络流量
  • 远程登录密码
  • 路由器配置
  • 聊天会话
  • DNS流量

嗅探是如何工作的?

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

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

嗅探器可以通过解码数据包中封装的信息来连续监视通过 NIC 到计算机的所有流量。

嗅探的类型

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

被动嗅探

在被动嗅探中,流量被锁定,但不会以任何方式改变。被动嗅探仅允许监听。它与集线器设备一起使用。在集线器设备上,流量被发送到所有端口。在使用集线器连接系统的网络中,网络上的所有主机都可以看到流量。因此,攻击者可以轻松捕获经过的流量。

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

主动嗅探

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

以下是主动嗅探技术 -

  • MAC洪泛
  • DHCP 攻击
  • DNS 中毒
  • 欺骗攻击
  • ARP中毒

嗅探对协议的影响

经过验证的 TCP/IP这样的协议在设计时从未考虑过安全性。此类协议对潜在的入侵者没有太大的抵抗力。以下是易于嗅探的不同协议 -

HTTP协议

它用于以明文形式发送信息,无需任何加密,因此是真实的目标。

SMTP(简单邮件传输协议)

SMTP 用于传输电子邮件。该协议很有效,但它不包含任何针对嗅探的保护。

NNTP(网络新闻传输协议)

它用于所有类型的通信。这样做的一个主要缺点是数据甚至密码都是以明文形式通过网络发送的。

POP(邮局协议)

POP 严格用于从服务器接收电子邮件。该协议不包括针对嗅探的保护,因为它可能被捕获。

FTP(文件传输协议)

FTP 用于发送和接收文件,但它不提供任何安全功能。所有数据均以明文形式发送,可以轻松嗅探。

IMAP(互联网消息访问协议)

IMAP 的功能与 SMTP 相同,但很容易受到嗅探。

远程登录

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

嗅探器并不是只允许您查看实时流量的愚蠢实用程序。如果您确实想分析每个数据包,请保存捕获的数据并在时间允许时进行查看。

使用Python实现

在实现原始套接字嗅探器之前,让我们了解如下所示的结构方法 -

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

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

struct.unpack(fmt, 字符串)

顾名思义,该方法根据给定的格式解包字符串。

在下面的原始套接字嗅探器 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)

以下代码行将返回一个具有三个十六进制值的元组,由binascii模块中的hexify转换-

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