目次
とある日
RACTF 2021に参加しました。
参加lした記録と、WriteUpを合わせて書きました。
はじめに
RACTF 2021
そして、Really AwesomeTechnologyと業界パートナーによってもたらされた2番目のCTFイベントであるRACTF2021へようこそ。今年は、新しいソフトウェア、テクニック、エクスプロイトで新しいチャレンジをお届けできることを楽しみにしています。
RACTF 2021は、8月13日金曜日の19:00UTCから8月16日月曜日の19:00UTCまで実行されます。
メンバー
- 3名
問題の振り分けは行わず好きな問題を好きに解いた感じで進めました。
結果
- 順位:715位
- Point:1200P
解答数
8問
- Web
- 0/7
- OSINT
- 6/6
- MISC
- 2/7
- Pwn
- 0/8
- Steganography
- 0/6
参加感想
全体的に難しい印象でした。
他のCTFの問題と違った志向のだと感じた。
ただ、OSINTの問題は初めてだったので意外と面白かった。
力技でも解けるので問題を解く快感を得るにはちょうどいい問題だなと思った。
ただ、現地民だと即答できるなと思ったので日本の問題でないかなと思ったりした。
Pwnの問題は、全体的な問題の理解はできたが突破口がいまひとつわからなく解けなかった。
他のWriteupを読んで知らなかった突破口があることを知った。
もっとソースコードの把握と脆弱性、手法について知る必要性がある結果となった。
Writeup
割と記録として残すので探す過程の詳細は書いてないです。
詳しく知りたい方は、下記のWriteupをご覧ください。
OSINT
Triangles
Googleで画像検索したら一発で出てきた。
Skeyline
画像検索ではヒットせず、特徴的な建物の並びから検索をして探した。
Silver Darlings
看板等の文字を検索してヒット。
John Poet
Novaを調べるもヒットせず、ショッピングセンターっぽいので条件を追加して検索でそれらしいのがヒット。
50m on the Right
道路標識の文字を翻訳するとポルトガル語だった。
手前の看板にBistro24の店舗名らしきものがあるのでそれと合わせて検索でヒット。
あとは、Google Earthで歩いて確認した。
OHSHINT
画像の詳細情報にて緯度経度情報があるので調べて付近を捜索して試してヒット。
MISC
Discord
RACTFのDiscordのgeneralのテキスト欄にあった。
意外と見つからなくて色々と捜索したが普通にあった。
ractf{so_here_we_are_again}
RSFPWS-Intercepted
箱に入るとFLAGが飛ぶらしいと表示があるので、Wiresharkで探してヒット。
解けなかった問題
Really Awesome Monitoring Dashboard
対象のIPを検索すると監視サーバのダッシュボードに飛ぶ。
色々と見てたが操作できるところが限られている。
色々と見てて、SQLを発行していることに気づいて、SQLインジェクションをするのかと思いつつ。
SQL文を入力するところもないし、編集もできないので困り果てた。
ブラウザのデベロッパーツールで色々と探ってたら、APIの通信をしているのを発見しました。
その中で、SQLを発行しているAPIもあったのでcurlとかでSQLだけ書き換えたリクエスト流せばいいと思い。
APIリファレンスを色々と調べてやって無理だった。
WriteUpを見ると、ブラウザから新しいリクエストを作成してやってたので、
Googleでやってみたができなかった。
が、APIリクエストをコピーできることがわかり対象のAPIのヘッダ情報が取得可能なことがわかった。
APIが怪しいというところに目をつけれていたので、あとはそこへの攻撃するのであと一歩だった。
Dodgy Databases
PWNの問題は、入力とフラグ変数を把握するところから始めた。
#define FLAG "ractf{fake_flag}"
fgets(username, 30, stdin);
フラグ変数を出力してるところをあとは見つける。
void users_register_user(Users* users, const User *const admin, const User *const user) { if (admin->role == ROLE_ADMIN) users_add_user(users, user->name, ROLE_USER); else if (admin->role == ROLE_GOD) puts(FLAG); else die("[users_register_user]\tInsufficient permissions to register user, exiting.\n"); }
users_register_user
関数を呼び出すことと。
admin->role
を操作することを達成すれば良さそうだと判断。
次は、関数呼び出してるところと変数定義位置を確認。
関数は、メインで呼び出してた。
typedef enum { ROLE_USER, ROLE_ADMIN, ROLE_GOD = 0xBEEFCAFE, } Role;
ROLE_ADMIN
の値をROLE_GOD
で上書きすればいいと思ったので、gdbで探してた。
でも、enum定義だからかわからないがアドレス値がうまく取得できず苦戦。
〆
もう少しで解けた問題が多くあり悔しかった。
ただ、CTFとしてはとても面白くて楽しかった。
次は、Pwnの問題などといてすっきりしたいなと思う今日このごろ。