SECCON2014 オンライン予選 writeup

次の問題に対して簡単にコメントしています。

  • パケット解析
  • WebMoney
  • GIFアニメ
  • あみだくじ

パケット解析

配布パケット

f:id:nmfproducer:20140719211617p:plain

概要

FTPでflag.txtを転送している様子

解法

転送されてる内容を見て、BASE64ぽいのでデコード

WebMoney

提供環境

f:id:nmfproducer:20140719212333p:plain
(注) 画像中のモザイクは投稿者がマスク

概要

チャットが出来るインタラクティブな環境

解法

ミソ

実際の手口でも、画像URLを貼ると踏んでくれるという事を利用します。

(画像のように)適当に誘う

受け側マシンでは次の二つを準備

送信ファイル
$ cat responce
HTTP/1.1 200 OK
ContentType: image/png

$ cat seccon_logo.png >> responce
httpdぽいもの
$ while(true) ; do  cat responce | sudo nc -l 80; done
HEAD /hoge.jpg HTTP/1.1
User-Agent: MyVNCpasswordIs**********
Accept: */*
Host: **********
Via: 1.1 = (squid/3.3.8)
X-Forwarded-For: **********
Cache-Control: max-age=259200
Connection: keep-alive

(注) **********は投稿者がマスク

tcpdump
$ sudo tcpdump -i eth0 tcp port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
17:53:31.876580 IP **********.53520 > **********.http: Flags [S], seq 1072712001, win 29200, options [mss 1460,sackOK,TS val 36432457 ecr 0,nop,wscale 7], length 0

(注) **********は投稿者がマスク

引っかかった点

リクエストヘッダがsquidで、X-Forwarded-ForにグローバルIPが埋め込んであったので、そちらが接続サーバーかと勘違いした点

あとはVNC

実際にパケットが飛んできたIPに5901とかで接続するとWinXPが見え、フラグゲット

GIFアニメ

提供物

f:id:nmfproducer:20140719213410g:plain

解法

  • 各フレームで白のORをとる
  • QRコードがでて、フラグゲット

あみだくじ

(注) 解けていません解けました (7/21 21:00 追記)

提供物

$ file amida
amida: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for GNU/Linux 2.6.24, stripped
$ ./amida
No.1
1 2 3 4 5 6 7 8
|-| |-| | | |-|
| | | | | |-| |
| | | | | | |-|
|-| | |-| | | |
| | |-| |-| |-|
|-| | |-| | | |
| |-| | |-| |-|
|-| |-| | | | |
| | | | |-| | |
| | |-| | | |-|
|-| | | |-| | |
| | |-| | |-| |
| | | | |-| | |
| |-| | | |-| |
| | |-| | | |-|
| | | | | |-| |
| |-| | |-| |-|
|-| |-| | | | |
| | | | | |-| |
              *
?

解法

プログラムを作成

回答すべき選択肢が1--8なので、全探索します。

use utf8;
use Data::Dumper;

use FileHandle;
use IPC::Open2;

$candidate = $ARGV[0];

while(1){
    $pid = open2(*Reader, *Writer, "./amida");
    $num = 1;

    while(<Reader>){
        print;
        if(m/No.(\d+)/){
            if($1 != $num){
                if( ! -f "$num"){
                    open(FH, "> $num");
                    print FH "$candidate\n";
                    close(FH);

                    print Dumper $num;
                    print Dumper $candidate;
                }
                $candidate = $ARGV[0];
            }
            $num = $1;
        }
        if(m/\*/){
            if(-f "$num"){
                open(FH, "< $num");
                $ans = readline FH;
                close(FH);

                print Writer $ans, "\n";
                print $ans, "\n";
            }
            else{
                $candidate ++;
                $candidate -= 8 if $candidate > 8;
                print $candidate, "\n";
                print Writer $candidate, "\n";

            }
        }
    }
}
実行 (バカ並列)
$ perl hoge.pl {1..8}
結果

No.291まで探索しましたけど何も出てこず
(7/21 21:00 追記)
上記8パラで探索すると11時間で最後まで到達。上手くスレッド間同期をすることで、高々1000*8スレッドで一挙に探索できるはず。