のいじーメモ

勉強したことを忘れないうちにメモしていくためのブログ

ICMPで遊ぶ

クリスマスなのでリア充っぽい機能を作成しようと思います。 ICMPリクエストのペイロードに "I love you"という文字列をのっけて送信すると
"I love you too."をペイロードに乗っけて返信してくれるサーバーを作りましょう。
iptablesでecho-requestのICMPパケットをNFQUEUEターゲットでキューに入れ、それをpythonで処理します。

from scapy.all import *
from netfilterqueue import NetfilterQueue

def icmp_fake(pkt):
    ip = IP()
    icmp = ICMP()
    ip.src = pkt[IP].dst
    ip.dst = pkt[IP].src
    icmp.type = 0
    icmp.code = 0
    icmp.id = pkt[ICMP].id
    icmp.seq = pkt[ICMP].seq
    print (ip.src + "=>" + ip.dst)
    print(pkt[ICMP].load)
    if pkt[ICMP].load == "I love you.":
        send(ip/icmp/"I love you too.")
    else:
        data = pkt[ICMP].load
        send(ip/icmp/data)

def is_icmp(pkt):
    packet = IP(pkt.get_payload())
    proto = packet.proto
    if proto == 0x01:
        if packet[ICMP].type == 8:
            icmp_fake(packet)
            
            
nfqueue = NetfilterQueue()
nfqueue.bind(1, is_icmp)
try:
    nfqueue.run()
except KeyboardInterrupt:
    print('')

nfqueue.unbind()

iptablesの設定はこんな感じ

iptables -A INPUT -p icmp --icmp-type echo-request -j NFQUEUE --queue-num 1

クライアントからICMPパケット送信

 $sudo scapy
 >>>sr1(IP(dst="192.168.11.52")/ICMP()/"I love you.")
    Begin emission:
..Finished to send 1 packets.
...................................................................................*
Received 86 packets, got 1 answers, remaining 0 packets
<IP  version=4L ihl=5L tos=0x0 len=43 id=1 flags= frag=0L ttl=64 proto=icmp chksum=0x5a27 src=192.168.11.52 dst=192.168.11.50 options=[] |<ICMP  type=echo-reply code=0 chksum=0x8638 id=0x0 seq=0x0 |<Raw  load='I love you too.' |<Padding  load='\x00\x00\x00' |>>>>

ちゃんと愛されていますね。まぁ誰にでも"I love you too."と送るようなビッチですが居ないよりはマシでしょう。