我试图在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
我该怎么做才能得到预期的产出?
编辑:
请注意,
Scapy-http
现在已被弃用,并包含在Scapy 2.4.3+中。使用import scapy.layers.http
或load_layer("http")
启用它。回答:
有一个scapy http模块,可以通过运行pip install scapy-http
来安装。安装后,您可以通过运行import scapy_http.http
导入它。这与您的scapy模块是分开的,但它为scapy添加了功能,因此您仍然需要像往常一样导入scapy。导入后,将筛选行更改为
我删除了
filter="tcp and port 80"
选项,因为使用http lfilter将返回所有http请求查询,而不考虑端口,除了SSL,原因很明显,在通常情况下无法嗅探它。出于性能原因,您可能希望保留filter
选项。我曾评论过一种改进方法,但我决定制定一个更完整的解决方案。这将不会有星号数据包中断,而只是打印标题作为漂亮的印刷字典,所以这可能对你有用,也可能不,但你也可以自定义它,以满足你的需要。除了格式化,这似乎是目前为止关于这个问题的最有效的方法,您可以委托一个函数来添加格式化并进一步解构dict
您需要使用数据包的^{} function 而不是打印数据包本身。您还需要拆分从中返回的字符串,并将其与换行符连接起来,否则它会将其全部吐出到一行:
我还为TCP端口80添加了一个过滤器,但是如果需要的话,可以删除它。
示例输出:
Pierre指出,完全可以通过对
lfilter
参数使用sniff()
来消除http_header
函数。我冒昧地同时使代码更简洁了一点:相关问题 更多 >
编程相关推荐