そろそろ、スライド発表会があるのでやばい…(Scapy)
【はじめに】
そろそろ、とある3箇所でScapyを使ったファジングについて
発表しなきゃいけないので、今から頑張ろうと思います。
いや最近ずっとWebやってたので、、(言い訳
【メソッド】
1.プロトコルの内容を見る
2.類似したプロトコルがScapyでどういう関数が使われてて、どのように書かれてるか見る
3.実際書いてみる
をやってみよう…
【内容】
とりあえず、ブログに学んだ内容ぶち込んでいこうと思います。
プロトコルはDNP3.0とHARTっていうのが面白そうですが、
今回はDNP3.0に挑戦したいと思います。
【プロトコルの内容を見る】目標時間120分
このサイトを参考にしたいと思います。
えっと…プロトコルの中身が全部載ってるサイトずっと探してるのに
全く見つからない…ヤバイ
まぁいいや
1時間ぐらい、DNSとDNP3.0を見比べてるんですが、
うーんっていう感じですね…。
class DNS(Packet): name = "DNS" fields_desc = [ ShortField("id",0), BitField("qr",0, 1), BitEnumField("opcode", 0, 4, {0:"QUERY",1:"IQUERY",2:"STATUS"}), BitField("aa", 0, 1), BitField("tc", 0, 1), BitField("rd", 0, 1), BitField("ra", 0 ,1), BitField("z", 0, 3), BitEnumField("rcode", 0, 4, {0:"ok", 1:"format-error", 2:"server-failure", 3:"name-error", 4:"not-implemented", 5:"refused"}), DNSRRCountField("qdcount", None, "qd"), DNSRRCountField("ancount", None, "an"), DNSRRCountField("nscount", None, "ns"), DNSRRCountField("arcount", None, "ar"), DNSQRField("qd", "qdcount"), DNSRRField("an", "ancount"), DNSRRField("ns", "nscount"), DNSRRField("ar", "arcount",0) ] def answers(self, other): return (isinstance(other, DNS) and self.id == other.id and self.qr == 1 and other.qr == 0) def mysummary(self): type = ["Qry","Ans"][self.qr] name = "" if self.qr: type = "Ans" if self.ancount > 0 and isinstance(self.an, DNSRR): name = ' "%s"' % self.an.rdata else: type = "Qry" if self.qdcount > 0 and isinstance(self.qd, DNSQR): name = ' "%s"' % self.qd.qname return 'DNS %s%s ' % (type, name) dnstypes = { 0:"ANY", 255:"ALL", 1:"A", 2:"NS", 3:"MD", 4:"MD", 5:"CNAME", 6:"SOA", 7: "MB", 8:"MG", 9:"MR",10:"NULL",11:"WKS",12:"PTR",13:"HINFO",14:"MINFO",15:"MX",16:"TXT", 17:"RP",18:"AFSDB",28:"AAAA", 33:"SRV",38:"A6",39:"DNAME"} dnsqtypes = {251:"IXFR",252:"AXFR",253:"MAILB",254:"MAILA",255:"ALL"} dnsqtypes.update(dnstypes) dnsclasses = {1: 'IN', 2: 'CS', 3: 'CH', 4: 'HS', 255: 'ANY'} class DNSQR(Packet): name = "DNS Question Record" show_indent=0 fields_desc = [ DNSStrField("qname",""), ShortEnumField("qtype", 1, dnsqtypes), ShortEnumField("qclass", 1, dnsclasses) ] class DNSRR(Packet): name = "DNS Resource Record" show_indent=0 fields_desc = [ DNSStrField("rrname",""), ShortEnumField("type", 1, dnstypes), ShortEnumField("rclass", 1, dnsclasses), IntField("ttl", 0), RDLenField("rdlen"), RDataField("rdata", "", length_from=lambda pkt:pkt.rdlen) ] bind_layers( UDP, DNS, dport=53) bind_layers( UDP, DNS, sport=53)
をみて、なんで、わざわざ3つに分ける必要があるんだ…ってことで、
しゅーとくんに聞いてみました。(返事待ち)
DNSってメッセージヘッダ、質問欄?、リソースレコードって分かれてるじゃないですか? 要は、DNSには3つのプロトコルが存在するってことですか? Scapyは、3つのプロトコルに分けてるんですけど、実際のDNSの概念自体、3つに分けてるんですか?
眠くて日本語のゲシュタルト崩壊も起こってるけど、仕方ないし、
わかってもらうしかない。これは。
辛くなったので、
Scapyのサイトを参考にすることにしました…
本当は自分だけでやりたかったんですけどね、、
予定変更
【Adding Protocol黙読】目標時間120分
def vlenq2str(l): s = [] s.append( hex(l & 0x7F) ) l = l >> 7 while l>0: s.append( hex(0x80 | (l & 0x7F) ) ) l = l >> 7 s.reverse() return "".join(map( lambda(x) : chr(int(x, 16)) , s)) def str2vlenq(s=""): i = l = 0 while i<len(s) and ord(s[i]) & 0x80: l = l << 7 l = l + (ord(s[i]) & 0x7F) i = i + 1 if i == len(s): warning("Broken vlenq: no ending byte") l = l << 7 l = l + (ord(s[i]) & 0x7F) return s[i+1:], 1
ココらへんで撃沈。
何言ってるかわからん。
それまでは9割分かりました。
2時間どころか、40分も読んでない気がする…難しい。
〜寝る(明日続き書きます)〜