2

私の問題は次のとおりです。ハニーポットを刺激するためにscapyを使用してリッスンサービスを実装したい(ハニーポットは偽のIPを使用するため、OSソケットを使用できないため)、scapyを選択しました。

私は非常に単純な TCP ハンドシェイク手順を実装しましたが、1 つ不満がありました: PSH を使用して送信するパケットの 1 バイトが消費されます。

たとえば、クライアントに「abc」を送信しますが、netcat や wget などのクライアントのソケットは「bc」しか受信しません。別の例として、「HTTP/1.1 200 OK」は「TTP/1.1 200 OK」になります。パケットをキャプチャし、Wireshark は手作りのパケットを HTTP として正しく認識できますが、クライアント ソケットには 1 バイトしかありません。どうしてか分かりません。

コードは次のとおりです。192.168.1.100 は server(my) ip addr を表し、9999 はポートです。たとえば、この python スクリプトを 192.168.1.100 で実行してから、「nc 192.168.1.100 9999」を使用します。「abc」が出るはずが「bc」しか出ないのですが、Wiresharkでは問題ないようです。とても奇妙です。

    '''
    Created on Jun 2, 2012
    
    @author: root
    '''
    from scapy import all
    from scapy.layers.inet import IP, ICMP, TCP
    from scapy.packet import ls, Raw
    from scapy.sendrecv import sniff, send
    from scipy.signal.signaltools import lfilter
    import scapy.all
    HOSTADDR = "192.168.1.100"
    TCPPORT = 9999 'port to listen for'
    SEQ_NUM = 100
    
    ADD_TEST = "abc"
    
    
    def tcp_monitor_callback(pkt):
        global SEQ_NUM
        global TCPPORT
        if(pkt.payload.payload.flags == 2):
            'A syn situation, 2 for SYN'
            print("tcp incoming connection")
            ACK=TCP(sport=TCPPORT, dport=pkt.payload.payload.sport, flags="SA",ack=pkt.payload.payload.seq + 1,seq=0)
            send(IP(src=pkt.payload.dst,dst=pkt.payload.src)/ACK)
        if(pkt.payload.payload.flags & 8 !=0):
            'accept push from client, 8 for PSH flag'
            print("tcp push connection")
            pushLen = len(pkt.payload.payload.load)
            httpPart=TCP(sport=TCPPORT, dport=pkt.payload.payload.sport, flags="PA", ack=pkt.payload.payload.seq + pushLen)/Raw(load=ADD_TEST)
            'PROBLEM HERE!!!! If I send out abc, the client socket only receive bc, one byte disappers!!!But the packet received by client is CORRECT'
            send(IP(src=pkt.payload.dst,dst=pkt.payload.src)/httpPart)
        if(pkt.payload.payload.flags & 1 !=0):
            'accept fin from cilent'
            print ("tcp fin connection")
            FIN=TCP(sport=TCPPORT, dport=pkt.payload.payload.sport, flags="FA", ack=pkt.payload.payload.seq +1, seq = pkt.payload.payload.ack)
            send(IP(src=pkt.payload.dst,dst=pkt.payload.src)/FIN)
    def dispatcher_callback(pkt):
        print "packet incoming"
        global HOSTADDR
        global TCPPORT
        if(pkt.haslayer(TCP) and (pkt.payload.dst == HOSTADDR) and (pkt.payload.dport == TCPPORT)):
            tcp_monitor_callback(pkt)
        else:
            return
    if __name__ == '__main__':
        print "HoneyPot listen Module Test"
        scapy.all.conf.iface = "eth0"
        sniff(filter=("(tcp dst port %s) and dst host %s") % (TCPPORT,HOSTADDR), prn=dispatcher_callback)
        
4

2 に答える 2

1

いくつかの提案:

  1. Sniff はパケットの末尾にペイロードを追加するlen(pkt.payload.payload.load)場合があるため、実際のペイロードの長さではない場合があります。pkt[IP].len-40(40はIP + TCPの一般的なヘッダー長です)を使用できます。-len(pkt[IP].options)-len(pkt[TCP].options)より正確な結果を得るために使用することもできます。
  2. 通常、TCP の上のアプリケーション レイヤーはコマンドを区切るために改行 ("\r\n") を使用するため、次のように変更ADD_TESTした方がよいでしょう。"abc\r\n"

上記の方法がどれもうまくいかない場合は、最新の netcat にアップグレードしてからやり直してください。

于 2013-06-18T02:58:45.007 に答える
0

コードをテストしましたが、適切な tcp シーケンスを送信していません

httpPart=TCP(スポーツ=TCPPORT, dport=pkt.payload.payload.sport, flags="PA", ack=pkt.payload.payload.seq + pushLen, seq=pkt.payload.payload.ack)/Raw(load =ADD_TEST)

問題を修正する必要があります。他のパケット長の問題がある可能性がありますが、食べられた 1 バイトは、適切な tcp シーケンスが欠落していることが原因です。

于 2015-07-10T21:17:02.930 に答える