そろそろ、スライド発表会があるのでやばい…(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分も読んでない気がする…難しい。

〜寝る(明日続き書きます)〜