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."と送るようなビッチですが居ないよりはマシでしょう。