[CTF]OverTheWire Natas Level 0〜9

#はじめに
[OverTheWire(Wargames)](http://overthewire.org/wargames/) NatasのWriteUpです。
前回やっていたBanditが終わったので(WriteUpはまだ書いてませんが、、、)次はNatasに手を出してみました。
公式サイトによると

>Natas teaches the basics of serverside web-security.

だそうです。
Bandit同様、僕のようなCTF初心者には取り組みやすいレベルになっていると思います。

#Level 0
htmlのソースに書いてあります。

#Level 1
Lv.0と同じくソースの中にあります。
ただ右クリックができないようになっているので、ブラウザの機能とかを使って見ましょう。

#Level 2
"このページにはない" だそう、、、
ソースを見てみると`<img src="files/pixel.png">`との記述が。
というわけで"http://natas3.natas.labs.overthewire.org/files" にアクセスしてみると"users.txt"というファイルがありました。
中を見てみるとnatas3のパスらしきものがあったので試してみたらビンゴでした。

#Level 3
またしても "このページにはない" と
ソースを見ると "No more information leaks!! Not even Google will find it this time..."
と書いてあった。
まあGoogle使うんだろうな〜と思ってとりあえずページのURLをGoogle検索かけたら
"http://natas3.natas.labs.overthewire.org/s3cr3t/" というディレクトリのサイトが一番上に出てきました!
その中の"users.txt"に書いてあるパス入力して終わり。

#Level 4
問題文を見るに、どうやら今回は"natas5"からこのページにアクセスすることでしかパスをゲットできないようです。
ページにある"Refresh page"というリンクをクリックすると、
You are visiting from "http://natas4.natas.labs.overthewire.org/"
となりました。リンククリック時のURLを取得している感じですかね。。。

こういう問題で役に立つのがお馴染み<b>BurpSuite!!</b>
BurpSuiteはいわゆるローカルプロキシツールで、Webの脆弱性診断などを行うことのできる様々な機能が入っています。
今回はBurpSuiteの<b>Proxy</b>という機能を使いました。
この機能ではローカルへの通信をキャプチャし、ヘッダーなどの値を確認したり任意のものへ置き換えたりすることができます。
"Refresh page"のリンクをクリックした時の通信をBurpSuiteで見てみるとこんな感じ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/145097/75c3439d-6fe6-d2a4-31c6-71b3cf556218.png)

これは取得したヘッダーの一部ですが、この中の"Referer"という要素が<b>どこからリクエストが来たのか</b>を表しています。というわけで今回はこれを、、、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/145097/58441c0b-c50f-5867-3c40-3f0fb16feb45.png)

こんな感じにします。
これでリクエストを送ると無事パスがもらえました！

#Level 5
"お前はログインできていない"だそう。
前回同様BurpSuiteで通信をキャプチャしてみると、Paramsに"loggedin"という名前のパラメータがvalue"0"でセットされていました。
このvalueを"1"にしてリクエストを送ってみるとパスがもらえました。

#Level 6
ページには"Input secret"というフォームと"View sourcecode"というリンクが。
ひとまず適当な文字列をフォームから送信してみると当然"Wrong secret"
というわけでリンクからソースコードを見てみると

```html+php
<?
include "includes/secret.inc";

    if(array_key_exists("submit", $_POST)) {
        if($secret == $_POST['secret']) {
        print "Access granted. The password for natas7 is <censored>";
    } else {
        print "Wrong secret";
    }
    }
?>
```

こんな感じのコードが埋め込まれていました。
どうやら"includes/secret.inc"にある\$secretの文字列と同じものをフォームから送信してあげれば良いよう、、、
じゃあ"includes/secret.inc"みてみようということでアクセスしてみました。
ページには何も表示されませんでしたが、ページのソースを見ると\$secretの値が確認できたのでこれを送信して終わり。

#Level 7
ページには"Home"と"About"というリンクが。
それぞれクリックするとメッセージが出るだけでした。
ソースを見てみると

```html+php
<a href="index.php?page=home">Home</a>
<a href="index.php?page=about">About</a>
```

"index.php"にアクセスするときの"page"というパラメータの値で表示する文字が変わっているようです。
さらにソースには`<!-- hint: password for webuser natas8 is in /etc/natas_webpass/natas8 -->`とご丁寧に書いてありました。
というわけで、"http://natas7.natas.labs.overthewire.org/index.php?page=/etc/natas_webpass/natas8" にアクセスしてパスをもらいました。

#Level 8
ページには"Input secret"というフォームが。
とりあえずソースを見てみると以下のプログラムがありました。

```html+php
<?
$encodedSecret = "3d3d516343746d4d6d6c315669563362";

function encodeSecret($secret) {
    return bin2hex(strrev(base64_encode($secret)));
}

if(array_key_exists("submit", $_POST)) {
    if(encodeSecret($_POST['secret']) == $encodedSecret) {
    print "Access granted. The password for natas9 is <censored>";
    } else {
    print "Wrong secret";
    }
}
?>
```
要は、フォームから送信した文字列を

1. base64でエンコードして
2. 文字列を逆にして
3. バイナリから16進数にしたもの

が、<b>$encodeSecretと同じ文字列</b>ならパスがもらえる ということ。
つまり送信すべき文字列は$encodeSecretについて、

1. 16進数からバイナリにして
2. 文字列を逆にして
3. base64でデコードしたもの

ということになります。
僕はこんな感じのpythonプログラムで正解文字列を導きました。

```python
import binascii
import base64

encSecret = "3d3d516343746d4d6d6c315669563362"
print base64.b64decode(binascii.a2b_hex(encSecret)[::-1])
```

#Level 9
"Find words containing"という文字とともに入力フォームがありました。
ソースコードを見るとこんな感じのphpコードがありました。

```html+php
<?
$key = "";

if(array_key_exists("needle", $_REQUEST)) {
    $key = $_REQUEST["needle"];
}

if($key != "") {
    passthru("grep -i $key dictionary.txt");
}
?>
```
どうやらphpのpassthru関数を使って、dictionary.txtの中にフォームから送信された文字列がないかをgrepコマンドで検索しているようです。
当初はdictionary.txtの中にパスがあるのかと思い正規表現を使って探しましたが見つからず、、、
せっかくコマンド実行系の関数を使っているのでOSコマンドインジェクションかなーという結論に至りました。
と、ここでLv.7において"http://natas7.natas.labs.overthewire.org/index.php?page=/etc/natas_webpass/natas8 "にアクセスしてパスをゲットしたことを思い出したので、以下の文字列を送信してみるとパスもらえました:)))
`; cat /etc/natas_webpass/natas10;`
サニタイズは基本ですが大事ですね、、、


#最後に
Banditとはまた違った感じで面白いですね！
これから難易度も上がっていくとは思いますが、時間のあるときに楽しんでやりたいと思います！！