【问题标题】:Altering packets on the fly with scapy as a MITM使用 scapy 作为 MITM 即时更改数据包
【发布时间】:2017-02-07 11:20:54
【问题描述】:

假设我设法处于客户端和服务器之间的通信中间(假设我打开了一个热点并导致客户端仅通过我的机器连接到服务器)。

如何在不中断我自己与其他服务的通信的情况下更改我的客户端发送和接收的数据包?必须有一种方法可以通过我的脚本路由客户端发送和即将接收的所有数据包(在转发给他之前)。

我认为实现这一目标的正确方向是使用iptables,但不确定究竟哪些参数适合使这项工作。我已经有了以下简单的脚本:

hotspotd start #a script that runs dnsmasq as both a DNS and DHCP server, configures and starts a hotspot
iptables -P FORWARD ACCEPT
iptables --append FORWARD --in-interface wlan0 -j ACCEPT
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE 
#wlan0 is the interface on which the hotspot is.
#eth0 is the interface that is connected to the internet

现在,这非常适用于被动 MITM - 我可以看到客户端发送和接收的所有内容。但现在我想加强并重定向他通过我发送和接收的每条消息。

我的最终目的是达到可以执行以下脚本的水平:

from scapy.all import *
from scapy_http.http import *

def callback(pkt):
   #Process the packet here, see source and destination addresses, ports, data
   send(pkt)

sniff(filter='port 666', prn=callback) #Assuming all relevant packets are redirected to port 666

如何完成重定向客户端发送和即将接收的每个数据包?

【问题讨论】:

    标签: python linux iptables scapy man-in-the-middle


    【解决方案1】:

    您可以使用具有python bindingsNFQUEUE

    NFQUEUE 是一个用户空间队列,它是一个有效的 iptables 目标。您可以将一些流量重定向到 NFQUQUE:

    iptables -I INPUT -d 192.168.0.0/24 -j NFQUEUE --queue-num 1

    然后从您的代码中访问数据包:

    from netfilterqueue import NetfilterQueue
    
    def print_and_accept(pkt):
        print(pkt)
        pkt.accept()
    
    nfqueue = NetfilterQueue()
    nfqueue.bind(1, print_and_accept)
    try:
        nfqueue.run()
    except KeyboardInterrupt:
        print('')
    
    nfqueue.unbind()
    

    注意pkt.accept() 调用。这会向 nfqueue 返回一个verdict,告诉它它应该接受数据包 - 即允许它沿着内核中的正常路由继续。要修改一个数据包,而不是 accepting 它,您需要复制它,返回一个 drop 判决,最后重新发送包含修改的数据包。

    【讨论】:

    • 似乎有效。但是如何识别哪些数据包来自设备,哪些来自我的机器?
    • 您可以使用 iptables 或您的应用程序。 1. 使用 IP 表,您可以按来源过滤数据包,并仅将相关的数据包发送到 nfqueue(或根据来源将它们发送到两个单独的 NFQUEUES)。 2. 由于您的应用程序从 NFQUEUE 接收整个数据包,因此您可以简单地检查您收到的每个数据包的 IP 地址。
    • 但是不是后期确定的吗?我的意思是来自某个本地地址的数据包我猜是可以的并且很容易确定但是数据包目的地到那个设备IP地址呢?他们到达我的外部 IP,这样的壮举行得通吗?
    • @JonSnow 我不关注。如果您知道您的 IP 地址,您可以查看每个数据包的目标 IP 地址并与您的比较。如果网络接口位于 NAT 之后,则接口的 IP 和数据包中的 IP 都是私有的。
    • 我的机器充当 MITM 攻击的热点,并且正在从接口路由(wlan0eth0,反之亦然)。当一个包用完时,我可以嗅探并查看哪个包,例如来自10.0.0.2。但是当我收到响应时,我将目标 IP 作为我的外部 IP,不是吗?
    猜你喜欢
    • 2014-08-18
    • 2021-01-16
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2015-07-14
    • 1970-01-01
    • 2014-04-20
    相关资源
    最近更新 更多