Python渗透测试之流量分析:流量嗅探工具编程

Python渗透测试之流量分析:流量嗅探工具编程,第1张

Python渗透测试之流量分析:流量嗅探工具编程

​ 不少人存在这样的观点:只要计算机安装各种专业的安全软件,系统及时更新补丁,密码尽可能复杂,那么计算机就会避免遭到入侵。当然这样的确不容易被入侵,但那也只是对传统的病毒、木马而言,在流量攻击面前,这些防护就会显得无能为力。无论何时,当你与其他设备进行通信时就会产生流量,当这些流量脱离了你的计算机后,其安全就不能得到有效的保障,然而这些流量中却包含着你的敏感数据,攻击者完全可以在不入侵你计算机的情况下获得你的敏感数据,这个过程叫流量嗅探。

实验环境:

OS:

​ macOS Monterey Version 12.3.1(英文版)

​ Kali: Linux kali 5.10.46 (英文版)

​ Windows: Win10

IDE:PyCharm 2020.1

1. 工作原理

​ 互联网中的流量都是以数据包的形式传送的,流量嗅探是对数据包中的流量进行数据分析的一种手段。通过网络嗅探工具可以捕获到目标计算机网络的数据包,数据包中的数据是根据所采用的协议的要求来组织的,只要能够掌握协议的格式,就能够分析出这些数据所表示的意义。互联网中大部分数据都没有采用加密方式进行传输。例如我们常接触的HTTP、FTP、Telnet等协议传输的数据都是明文传输的。本例访问本机apache服务,端口8080,如下图:

2. 工具编写

知道流量嗅探的原理,我们可以使用Scapy模块编写一个流量嗅探工具来嗅探本机网卡上的流量。需要使用到Scapy中的sniff()函数,该函数提供了多个参数,先了解几个重要的参数的含义:

​ § iface :指定在哪个网络接口上抓包

​ § count:表示要捕获数据包的数量。默认值为0,表示不限制数量

​ § filter:流量都过滤规则。使用的是BPF(Berkeley Packet Filter, 柏克莱封包过滤器)的语法

​ § prn:定义回调函数,通常使用lambda表达式来写回调函数。当符合filter的流量被捕获时,就会执行回调函数

备注:filter是最常用的函数。因为如果不过滤,就会捕获到大量的流量数据,很难从里面找到需要的数据库。

下面举几个常见的用例,帮助理解BPF语法:

  • 只捕获与网络中某一IP的主机进行交互的流量:host 192.168.68.1
  • 只捕获与网络中某一MAC地址的主机交互的流量:ether src host dc:d8:7c:28:b2:14
  • 只捕获来源于网络中的某一个IP的主机流量:src host 192.168.68.1
  • 只捕获去往网站中某一IP的主机的流量:dst host 192.168.68.1
  • 只捕获80端口的流量:port 80
  • 只捕获除80端口以外的其他端口的流量:!port 80
  • 只捕获ICMP流量:ICMP
  • 只捕获源地址为192.168.68.1且目的端口为80的流量:src host 192.168.68.1 && dst port 80

下面用实例说明,实时显示捕获到的数据包,要加上prn选项,这里用lambda表达式编写,具体内容为prn=lambda x:x.summary(),如下图(kali系统环境)目标地址192.168.68.242所示:

也可以进一步输出源IP和目的IP,更改一下lambda表达式,(macOS系统,目标主机kali系统)命令如下:

(venv) (base) liuxiaowei@MacBookAir % sudo python3
Password:
Python 3.9.9 (v3.9.9:ccb0e6a345, Nov 15 2021, 13:29:20) 
[Clang 6.0 (clang-600.0.57)] on darwin
>>> from scapy.all import *
WARNING: No IPv4 address found on en4 !
WARNING: No IPv4 address found on ap1 !
WARNING: more No IPv4 address found on en2 !
>>> sniff(filter='dst 192.168.68.248', prn=lambda x:x[IP].src+'---->'+x[IP].dst) # 源IP ,目的IP

结果如下图:

如果需要更详实的输出,则需要更多代码,可以定义一个回调函数,然后让prn调用即可,定义一个CallBack()函数,代码如下:

>>> from scapy.all import *
>>> def CallBack(packet):
...     print(f'Source:{packet[IP].src}---->Target:{packet[IP].dst}')
...     print(f'TTL:{packet[IP].ttl}')
...     print(packet.show())
... 
>>> sniff(filter='dst 192.168.68.248', prn=CallBack)

结果如如下图:

除了显示这些数据包,我们还可以将这些数据包保存,用专业的工具查看、分析这些数据包。保存数据包的格式很多种,目前最为通用的格式为pcap。可以借助wrpcap()函数进行数据包的保存,示例代码如下:

>>> from scapy.all import *

>>> packet=sniff(filter='dst 192.168.68.248', count=4)
>>> wrpcap('bruce_liu.pcap', packet)

把存储的包用Wireshark工具查看,如下图所示:

3. 编写网络嗅探工具

根据用户传入的IP地址、数据包总数来捕获相应的数据包,并保存为pcap格式。示例代码如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 创建时间   :4/23/22 10:51 PM
# 文件      :sniff_pcap.py
# IDE      :PyCharm

from scapy.all import *
import time
import optparse


# 时间戳转换函数
def TimeStamp2Time(timeStamp):
    timeTmp = time.localtime(timeStamp)
    myTime = time.strftime("%Y-%m-%d %H:%M:%S", timeTmp)
    return myTime

# 回调输出函数
def PackCallBack(packet):
     print("=" * 30)
     # 打印源IP,源端口,目的IP,目的端口
     print(f"[{TimeStamp2Time(packet.time)}]Source:{packet[IP].src}:{packet.sport}--->Target:{packet[IP].dst}:{packet.dport}")

     # 打印输出数据包
     print(packet.show())
     print("=" * 30)

if __name__ == '__main__':

    hostIP = input('请输入目的IP地址:')
    fileName = input('请输入保存的文件名:')
    packetCount = input('请输入捕获的数据包总数:')
    defFilter = "dst " + hostIP
    packets = sniff(filter=defFilter, prn=PackCallBack, count=int(packetCount))
    # 保存输出文件
    wrpcap(fileName, packets)

备注:监听网络接口要root权限,普通用户需要在命令前加sudo,否则会报错。

开启两个终端,一个终端进行监听,另一个终端使用curl命令如下所示:

监听终端:

(venv) (base) liuxiaowei@MacBookAir 流量分析 % sudo python sniff_pcap.py 
Password:
WARNING: No IPv4 address found on en4 !
WARNING: No IPv4 address found on ap1 !
WARNING: more No IPv4 address found on en2 !
请输入目的IP地址:112.80.248.76
请输入保存的文件名:bruce_liu.pcap     
请输入捕获的数据包总数:6

使用curl命令终端:

(base) liuxiaowei@MacBookAir ~ % curl 112.80.248.76

抓包效果如下:

目录下会多出一个名为bruce_liu.pcap文件,我们用Wireshark工具查看,如下图所示:

正好是六个数据包

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/723939.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存