我最近开始使用python 2.x的scapy库,我发现关于sniff()函数的文档很少。我开始玩弄它,发现我可以在一个非常低的层次上隐藏TCP包。到目前为止,我只找到了信息数据。例如:
这是我放在scapy终端的东西:
A = sniff(filter="tcp and host 216.58.193.78", count=2)
这是向google.com请求主页的请求:
<Ether dst=e8:de:27:55:17:f3 src=00:24:1d:20:a6:1b type=0x800 |<IP version=4L ihl=5L tos=0x0 len=60 id=46627 flags=DF frag=0L ttl=64 proto=tcp chksum=0x2a65 src=192.168.0.2 dst=216.58.193.78 options=[] |<TCP sport=54036 dport=www seq=2948286264 ack=0 dataofs=10L reserved=0L flags=S window=29200 chksum=0x5a62 urgptr=0 options=[('MSS', 1460), ('SAckOK', ''), ('Timestamp', (389403, 0)), ('NOP', None), ('WScale', 7)] |>>>
以下是回应:
<Ether dst=00:24:1d:20:a6:1b src=e8:de:27:55:17:f3 type=0x800 |<IP version=4L ihl=5L tos=0x0 len=60 id=42380 flags= frag=0L ttl=55 proto=tcp chksum=0x83fc src=216.58.193.78 dst=192.168.0.2 options=[] |<TCP sport=www dport=54036 seq=3087468609 ack=2948286265 dataofs=10L reserved=0L flags=SA window=42540 chksum=0xecaf urgptr=0 options=[('MSS', 1430), ('SAckOK', ''), ('Timestamp', (2823173876, 389403)), ('NOP', None), ('WScale', 7)] |>>>
使用这个函数,有没有一种方法可以从响应中提取HTML代码?
另外,这些包是什么样子的?
最后,为什么这两个包几乎相同?
最佳答案
示例中的段“几乎相同”,因为它们是TCP SYN和SYN-ACK段,它们是TCP handshake的一部分,HTTP请求和响应在连接过程中(通常在已建立状态下,但使用TCP快速打开选项时除外),因此需要查看SEGM握手后获取感兴趣的数据。
SYN
C ---------------> S
SYN-ACK
C <--------------- S
ACK
C ---------------> S
HTTP request
C ---------------> S
ACK
C <--------------- S
HTTP response
C <--------------- S <= Here is the server's answer
ACK
C ---------------> S
...
在您的情况下,可以使用scapy的
Raw
层来提取tcp之上的数据(例如pkt[Raw]
)