Scapy 中的 HTTP GET 数据包嗅探器

2023-11-25

我正在尝试在 Scapy 中编写一个简单的嗅探器,它仅使用 GET 方法打印 HTTP 数据包。这是代码:

#!/usr/bin/python
from scapy.all import *

def http_header(packet):
        http_packet=str(packet)
        if http_packet.find('GET'):
                print GET_print(packet)
        print packet
def GET_print(packet1):
        print "***************************************GET PACKET****************************************************"
        print packet1

        print "*****************************************************************************************************"


sniff(iface='eth0',prn=http_header)

这是输出:

*****************************************************************************************************
None
T��Г
     )�pEa��@@���h��#/��t
                             �}LGku���U
oTE��I(��Ͻ�9qi���S��?��
                          XuW�F=���-�k=X:�
***************************************GET PACKET****************************************************
T��Г
     )�pE���@@���h��#/��t
                               ʪLGku����
oTE��I�K��AH�*�e��>�v1#D�(mG5T�o�?��8��喷╭���Ի�"�KT^�'�mB���]�����k>
                                                                                �_x�X�����8V?�Ǽw/�Z�=���N�À��\r�����)+}���l�c�9��j;���h��5�T�9Hۖ/O��)��P
         މY�qf爂�%�_`��6x��5D�I3���O�
t��tpI#�����$IC��E��
                     �G�
J��α���=�]��vһ���b5^|P��DK�)uq�2��ț�w�
                    tB������y=���n�i�r�.D6�kI�a���6iC���c'��0dPqED�4����[�[��hGh̃��~|Y/�>`\6yP  Dq١?T��Mѵ���f�;���Җ��Ǵ  gY���di�_x�8|
eo�p�xW9��=���vŅYe�}�T�ۨɑy�^�C
-�_(�<�{����}�������r
$��J�k-�9����}�Ϡf�27��QKԛ�`�GY�8��Sh���Y@8�E9�Rϔ�&a�/vkф��6�DF`�/9�I�d( ��-��[A
                                                                                     ��)pP��y\ռj]���8�_���vf�b����I7�������+�P<_`
*****************************************************************************************************

我期待的是:

GET / HTTP/1.1
    Host: google.com
    User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20140722 Firefox/24.0 Iceweasel/24.7.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate
    Cookie: PREF=ID=758a20b5fbd4eac9:U=2b2dedf6c84b001f:FF=0:TM=1412150291:LM=1415430021:S=Q-QemmrLqsSsEA9i; NID=67=mRdkPVhtImrOTLi5I1e5JM22J7g26jAcdiDEjj9C5q0H5jj0DWRX27hCM7gLJBeiowW-8omSv-1ycH595SW2InWX2n1JMMNh6b6ZrRsZ9zOCC2a-vstOQnBDSJu6K9LO
    Connection: keep-alive

我该怎么做才能获得预期的输出?


您需要使用sprintf功能数据包而不是打印数据包本身。您还需要拆分从它返回的字符串,然后用换行符将其重新连接在一起,否则它会将其全部吐出在一行上:

#!/usr/bin/python
from scapy.all import *

def http_header(packet):
        http_packet=str(packet)
        if http_packet.find('GET'):
                return GET_print(packet)

def GET_print(packet1):
    ret = "***************************************GET PACKET****************************************************\n"
    ret += "\n".join(packet1.sprintf("{Raw:%Raw.load%}\n").split(r"\r\n"))
    ret += "*****************************************************************************************************\n"
    return ret

sniff(iface='eth0', prn=http_header, filter="tcp port 80")

我还添加了 TCP 端口 80 的过滤器,但如果需要,可以将其删除。

输出示例:

***************************************GET PACKET****************************************************
'GET /projects/scapy/doc/usage.html HTTP/1.1
Host: www.secdev.org
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36
Referer: https://www.google.co.uk/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-GB,en;q=0.8,en-US;q=0.6
If-None-Match: "28c84-48498d5654df67640-gzip"
If-Modified-Since: Mon, 19 Apr 2010 15:44:17 GMT

'
*****************************************************************************************************

Pierre指出你可以取消http_header功能完全通过使用lfilter论证sniff()。同时我冒昧地让代码变得更加简洁:

#!/usr/bin/python
from scapy.all import *

stars = lambda n: "*" * n

def GET_print(packet):
    return "\n".join((
        stars(40) + "GET PACKET" + stars(40),
        "\n".join(packet.sprintf("{Raw:%Raw.load%}").split(r"\r\n")),
        stars(90)))

sniff(
    iface='eth0',
    prn=GET_print,
    lfilter=lambda p: "GET" in str(p),
    filter="tcp port 80")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scapy 中的 HTTP GET 数据包嗅探器 的相关文章

随机推荐

  • Flask(带有 Flask-RESTful)不解析 JSON 有效负载

    I m creating a frontend in Angular and the backend in Flask with the RESTful extension By default Angular likes to send
  • 如何在 Oracle PL/SQL where 子句中使用变量

    我似乎无法让变量在 Oracle PL SQL where 子句中工作 我有 Microsoft SQL Server 背景 这很容易 例如 执行类似以下操作所需的所有步骤是什么 declare var int set var 1 sele
  • 尝试理解/确定基本的 Git 工作流程

    我一直在读这个流行文件一遍又一遍地尝试起草我自己的 git 工作流程 我想我已经明白了 但我还是有点失落 这是我目前的理解 我们有两个分支机构将始终保持活跃 Master 这是我将推送实际部署到我的生产服务器并由我的用户使用的代码的地方 开
  • 从父目录导入脚本

    如何导入位于父目录中的模块 python 文件 两个目录都有一个 init py文件 但我仍然无法从父目录导入文件 在此文件夹布局中 脚本 B 尝试导入脚本 A Folder A init py Script A Folder B init
  • 使用javascript上下滚动iframe

    是否可以使用按键或 JavaScript 从父窗口滚动 iframe 窗口 iframe 内容来自另一个域 与父窗口不同 由于 iframe 内容来自另一个域 因此出于安全原因您将无法更改它的 DOM 尽管您可以使用箭头键滚动它 但当您激活
  • 如何在Eclipse中查看Javadoc?

    我正在使用第三方库 我已将其包含到我的项目中 它包含应用程序的类 但没有源代码或 Javadoc 正如预期的那样 将鼠标悬停在导入的对象上不会显示 javadoc Note This element neither has attached
  • Android .aidl 中的单向声明是否保证该方法将在单独的线程中调用?

    我正在为 Android 手机设计一个客户端 服务器应用程序框架 我对 Java 和 Android 都很陌生 但对一般编程 特别是线程编程并不陌生 有时我的服务器和客户端将位于同一进程中 有时它们将位于不同的进程中 具体取决于具体的用例
  • 在基本构造函数中使用 lambda 表达式的极端情况

    在我们正在构建的框架中 我们需要以下模式 public class BaseRenderer Func
  • 通过 JavaScript 打开应用程序 (iOS/Android),并回退重定向到 App/Play 商店(2016 版)

    给定 网站 iOS 和 Android 应用程序 注册 urlscheme myapp 目标 在网站上显示一个指向已安装应用程序的 iOS Android 设备的链接 单击该链接应打开应用程序并调用特定逻辑 由应用程序处理 本质上类似于苹果
  • 将表单中的标签与输入旁边对齐

    我有非常基本且已知的表单场景 我需要正确对齐输入旁边的标签 但是我不知道该怎么做 我的目标是标签与右侧的输入旁边对齐 这是所需结果的图片示例 为了您的方便并澄清我现在所拥有的内容 我做了一个小提琴 http jsfiddle net WX5
  • Dispatcher.Invoke 之后应用程序冻结

    我的这个应用程序在调用任何控件的dispatcher invoke 时都会冻结 当我在单选按钮 网格 图像等中调用调度程序时 应用程序冻结但没有给出错误 请帮忙 谢谢 我调用线程 Method RunClient private void
  • Knockout 和 jQuery Mobile:将数据绑定到选择列表

    我在同一个项目中同时使用 Knockout 版本 2 0 和 jQuery Mobile 版本 1 0 1 问题在于将数据绑定到选择列表 jQuery Mobile 以看似选定的值和实际列表是单独元素的方式呈现选择列表 这是通过执行来修复的
  • 什么是索引单子?

    What is 索引单子这个单子的动机是什么 我读到它有助于跟踪副作用 但类型签名和文档并没有引导我到任何地方 有什么例子可以说明它如何帮助跟踪副作用 或任何其他有效的例子 一如既往 人们使用的术语并不完全一致 有各种受单子启发但严格来说并
  • Python 用函数的输出替换字符串模式

    我有一个Python字符串 比如说The quick red fox jumps over the lame brown dog 我正在尝试替换以 以及以单词作为参数的函数的输出 def my replace match return ma
  • 从另一个java类调用静态方法

    我最近从 PHP 工作转向 Java 工作并有一个查询 想要强调一下我是Java的初学者 本质上 我正在文件 A 具有 A 类 中工作 并且想要引用文件 B B 类 中保存的静态方法 使用 A 类时是否需要引用文件 B 我正在沿着PHP中的
  • 如何在 Windows 上取消 select() 中的等待

    在我的程序中 有一个线程 接收线程 负责从 TCP 套接字接收请求 并且有许多线程 工作线程 负责处理接收到的请求 处理请求后 我需要通过 TCP 发送答案 这是一个问题 我想在用于接收数据的同一个线程中发送 TCP 数据 该线程接收数据后
  • Windows 容器无法访问互联网,但 Linux 容器可以访问互联网 - VPN 客户端在主机上处于活动状态

    我的主机上安装了 Stonesoft VPN Client 和 Docker for Windows 我的 Windows 容器似乎无法解析任何主机 甚至是 www google com 然而我的 Linux 容器工作得很好 当我禁用网络适
  • 如何在 r 中为 ggplot 自定义调色板?

    我使用此代码绘制北美温度变化地图 ggplot maps aes y Latitude x Longitude z variable ggtitle title scale fill brewer palette Spectral geom
  • Java运行时环境与.NET框架在编译过程方面如何比较?

    我正在通过以下方式学习源代码到机器代码的转换 NET and JRE构架 首先 我做了一些研究 比较了这两个过程并创建了这个图 我需要一些帮助来批评它的正确性 更重要的是添加我错过的任何严重的事情 以更好地理解编译路径 NET 和 Java
  • Scapy 中的 HTTP GET 数据包嗅探器

    我正在尝试在 Scapy 中编写一个简单的嗅探器 它仅使用 GET 方法打印 HTTP 数据包 这是代码 usr bin python from scapy all import def http header packet http pa