読者です 読者をやめる 読者になる 読者になる

Packets are too Fast

slankdevの報告

TDUCTF2015 NW500 portscan writeup

運営の皆さんお疲れさまでした、楽しかったです!!

昨日はnomukenさん率いるTDUCTFに参加してきました。

今回はNW問がそこそこに解けて12位でした。

f:id:slankdev:20170402181409p:plain

2015.09.20 若干の追記があります

writeup

ほとんどのwriteupは他の人がやってくれているので、NW500のportscanのwriteupをします。

この問題は尊敬するほよたかさん(@takahoyo)、sonickunさん(@y_hag)も解いていて、みんな違う解法でフラグをだしていました。

Network500 portscan

UDPポートスキャンのパケットが与えられて、メッセージが。。見たいなことがかいてあったので、ペイロードをみました。

UDPペイロード部は # , 空白文字, 改行コードのいずれか一つが置いてあって、それ以外は何の変哲もないUDPポートスキャンのパケットでした。

その記号の並がなんかモールス信号だったり、みたいな変な予想をたてながらもとりあえずその部分をとりだして並べるプログラムを書きました。

ソースを以下に示します。

#include <pcap.h>
#include <pgen.h>

const char* file = "file.pcap";

void func(u_char * no, const struct pcap_pkthdr *hdr, const u_char *packet){
    pgen_unknown buf(packet, hdr->len);
    if(buf.isICMP) return;

    packet += ETH_HDR_LEN;
    packet += IP_HDR_LEN;
    packet += UDP_HDR_LEN;
    printf("%c", *packet);
}


int main(){
    pcap_t* handle;

    handle = pcap_open_offline(file, NULL);
    if(handle == NULL){
        printf("err n");
        return -1;
    }

    pcap_loop(handle, 0, func, NULL);
}

プログラムはlibpcapと自作ライブラリのlibpgen を使って書きました。

2015.09.20追記

libpcapに頼らないでlibpgenだけでできようになりました。

#include <stdio.h>
#include <pgen.h>

const char* file = "file.pcap";

bool func(const u_char* packet, int len);
    pgen_unknown buf(packet, len);
    if(buf.isICMP) return;

    packet += ETH_HDR_LEN;
    packet += IP_HDR_LEN;
    packet += UDP_HDR_LEN;
    printf("%c", *packet);
}


int main(){
    pgen_t* handle = pgen_open_offline(file, 1);
    if(handle == NULL){
        pgen_perror("pgen_open_offline");
        return -1;
    }

    sniff(handle,  func);
}

実行結果は以下の様になりました。

f:id:slankdev:20170402181326p:plain

こんな感じです。

ほよたかさんはscapy、sonickunさんがtshark使って解いていていたみたいです。

やはりまだscapyの壁は高い。。

最後に

writeupを書くのが初めてだったので、汚い感じになってしまいすみません。

あまりNW問のあるCTFは多くないので、とても楽しく過ごすことができました。

今回のTDUCTFで色々いただきました。

f:id:slankdev:20170402181343j:plain

柚子胡椒げっと、ステッカーかっこいい、あとsakura internetの柿ピー。。