网络数据包嗅探

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

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

换句话说,嗅探可以让您看到各种流量,受保护和不受保护.在适当的条件下并且使用正确的协议,攻击方可能能够收集可用于进一步攻击的信息或导致网络或系统所有者的其他问题.

什么可以被嗅探?

可以从网络中嗅探以下敏感信息 :

  • 电子邮件流量

  • FTP密码

  • 网络流量

  • Telnet密码

  • 路由器配置

  • 聊天会话

  • DNS流量

嗅探是如何工作的?

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

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

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

嗅探类型

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

被动嗅探

在被动嗅探中,流量被锁定,但在任何情况下都不会改变办法.被动嗅探只允许听力.它适用于Hub设备.在集线器设备上,流量将发送到所有端口.在使用集线器连接系统的网络中,网络上的所有主机都可以看到流量.因此,攻击者可以轻松捕获通过的流量.

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

主动嗅探

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

以下是主动嗅探技术 :

  • MAC Flooding

  • DHCP攻击

  • DNS中毒

  • 欺骗攻击

  • ARP中毒

对协议的嗅探效果

等协议尝试和真正的TCP/IP 从来没有考虑到安全性.这些协议对潜在的入侵者没有太大的抵抗力.以下是不同的协议,可以轻松嗅探 :

HTTP

它用于以明文形式发送信息,无需任何加密,因此一个真正的目标.

SMTP(简单邮件传输协议)

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

NNTP(网络新闻传输协议)

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

POP(邮局协议)

POP是严格用于接收来自服务器的电子邮件.此协议不包括防止嗅探的保护,因为它可以被捕获.

FTP(文件传输协议)

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

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

IMAP与其中的SMTP相同功能,但它很容易被嗅探.

Telnet

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

嗅探器不是那些只允许你查看实时流量的哑工具.如果你真的想要分析每个数据包,请保存捕获并在时间允许时进行检查.

使用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]

使用以下代码行,我们使用

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