📜  网络数据包嗅探

📅  最后修改于: 2020-12-06 10:32:34             🧑  作者: Mango


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

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

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

可以嗅到什么?

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

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

嗅探如何工作?

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

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

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

嗅探的类型

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

被动嗅探

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

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

主动嗅探

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

以下是主动嗅探技术-

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

嗅探对协议的影响

诸如安全可靠的TCP / IP之类的协议从来没有考虑过安全性。这样的协议对潜在的入侵者没有太大的抵抗力。以下是各种易于嗅探的协议-

HTTP

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

SMTP(简单邮件传输协议)

SMTP用于电子邮件的传输。该协议是有效的,但是它不包含任何防止嗅探的保护措施。

NNTP(网络新闻传输协议)

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

POP(邮局协议)

POP严格用于接收来自服务器的电子邮件。该协议不包括防嗅探功能,因为它可能被捕获。

FTP(文件传输协议)

FTP用于发送和接收文件,但不提供任何安全功能。所有数据都以明文形式发送,可以很容易地进行嗅探。

IMAP(Internet邮件访问协议)

IMAP在功能上与SMTP相同,但是非常容易被嗅探。

远程登录

Telnet通过明文通过网络发送所有内容(用户名,密码,击键),因此可以轻松地进行嗅探。

嗅探器不是让您仅查看实时流量的愚蠢实用程序。如果您确实要分析每个数据包,请保存捕获并在时间允许的情况下对其进行检查。

使用Python实施

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

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

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

struct.unpack(fmt, 字符串)

顾名思义,此方法根据给定格式解压缩字符串。

在下面的原始套接字嗅探器IP标头示例中,它是数据包中的下一个20个字节,在这20个字节中,我们对最后8个字节感兴趣。后面的字节显示源IP地址和目标IP地址是否正在解析-

现在,我们需要导入一些基本模块,如下所示:

import socket
import struct
import binascii

现在,我们将创建一个套接字,该套接字将具有三个参数。第一个参数告诉我们有关数据包接口的信息-PF_PACKET(针对Linux)和AF_INET(针对Windows);第二个参数告诉我们这是一个原始套接字,第三个参数告诉我们有关我们感兴趣的协议-用于IP协议的0x0800。

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