使用nfqueue / scapy更改TCP有效负载

发布于 2021-01-29 17:14:15

您好,我正在使用nfqueue和scapy,我的目标是在NFQUEUE上接收数据包,更改有效负载并重新发送。

我可以更改TTL之类的字段而没有任何问题,但是当涉及更改有效负载时,我遇到了麻烦。

当我更改有效负载时,我会用wireshark嗅探该数据包,并且显然我发送了已修改有效负载的数据包,但是服务器没有响应。

这是我的代码:

#!/usr/bin/env python

import nfqueue
from scapy.all import *
def callback(payload):
    data = payload.get_data()
    pkt = IP(data)

    pkt[TCP].payload = str(pkt[TCP].payload).replace("ABC","GET")

    pkt[IP].ttl = 40

    print 'Data: '+ str(pkt[TCP].payload)
    print 'TTL: ' + str(pkt[IP].ttl)

    del pkt[IP].chksum
    payload.set_verdict_modified(nfqueue.NF_ACCEPT, str(pkt), len(pkt))
def main():
    q = nfqueue.queue()
    q.open()
    q.bind(socket.AF_INET)
    q.set_callback(callback)
    q.create_queue(0)
    try:
        q.try_run() # Main loop
    except KeyboardInterrupt:
        q.unbind(socket.AF_INET)
        q.close()

main()

我为到端口80的传出流量设置了以下规则: iptables -I OUTPUT -s 192.168.1.10 -p tcp --dport 80 -j NFQUEUE

并且,要进行测试,例如,我打开telnet到google端口80,请执行a GET / HTTP/1.1,这就是我看到的内容:

TTL: 40
DATA: GET / HTTP/1.1

现在,如果我没有ABC / HTTP/1.1收到任何答复!我的telnet卡住了。

我还尝试在HTTP网站浏览器上浏览某些内容,检查Wireshark上我的TTL如何真正更改为40,然后浏览字符串“
ABC”,然后我的浏览器再次卡住。我嗅到请求已更改为GET,但未收到任何答复。

谢谢让我很头疼,如果有更多经验的人可以带领我走上正确的道路,我将不胜感激。先感谢您。

关注者
0
被浏览
50
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我添加了用于重新计算TCP校验和的行,这很有用。

    这仅在更改有效载荷但不改变其长度的情况下有效,否则,我将需要更改IP标头的字段长度,并回答自己,也许其他正在寻找此答案的人也可以实现这一点只是通过做:

    payload_before = len(pkt[TCP].payload)
    
    pkt[TCP].payload = str(pkt[TCP].payload).replace("Heading","Other string")
    
    payload_after = len(pkt[TCP].payload)
    
    payload_dif = payload_after - payload_before
    
    pkt[IP].len = pkt[IP].len + payload_dif
    

    我知道我必须更改更多字段,因为有时,如果您添加了足够的有效负载来需要分段成一个新的数据包,则必须更改更多字段。

    目前,我不知道如何有效地实现这一目标,但一点一点。希望有人发现我的更改有效载荷的解决方案有用。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看