MNCTF2019 暗証保護

#問題

http://mnctf.info/mnctf2019/tasks.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/298995b2-11b7-e550-5e79-cca3bbb5d4e3.png)

#解いてみた

サイトにアクセスするとindex ofに。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/14a8377e-c37a-d34a-8411-0ae64889ee98.png)

パスワードがありそうなpassword.phpをクリックしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/5fd1857d-8aed-aa83-8b62-cf5680948abb.png)

とのこと。
phpファイルをダウンロードしてソースを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/86a6f0cd-d5b2-81a3-37b8-edd1a4570a3e.png)

ソースがダウンロードできるのかと思ったらphpファイル自体はダウンロードできないみたいです。
恐ろしく長い文字列だと思ったら、とても長いbase64だったのでこれをデコードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/981b7ed1-9465-f20e-8bb4-83e1053d7f1b.png)

どうやらPNGファイルのようなのでファイルとしてダウンロードして開いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/4498224e-7009-695e-c3ad-eadd77e78441.png)

まさかのこの画像でした。
ということでほかの方法を探ります。
index ofにあったもう一つのphpが気になるので開いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/402b20fe-960c-d489-f119-c402a8bf8b09.png)

サイトのチェックができるようです。
問題文でパスワードにアクセスできるのはローカルからだけと書かれているのでここからアクセスしたらローカルからアクセスしたことになりそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/71bc4406-182f-f05e-dac2-e03e30b983b6.png)

494aが答え。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/9677f59f-3292-22f2-2d45-b34faf5d5368.png)

答えではありませんでした。
bodyの数バイトしか表示しないと書いてありましたね。

PHP/5.3.3に脆弱性でもないか調べてみます。
[【重要】PHP5.2及びPHP5.3の脆弱性への緊急対応につきまして - 2012年 ...](https://lolipop.jp/info/news/3807/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/a3aea0d4-6da4-7c04-9531-8f8830da45a2.png)

ここを見るとパラメータに「-s」を付けるとソースが表示されるらしい。
password.php?-sにしてアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/555f931a-47ef-c6a0-fbed-4f551ea741a5.png)

残念ながらソースは表示されないようです。

WebCheckerに「-s」を入れてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/0b6cc449-03f9-0302-7a1f-8fa563884909.png)

これも変わりありません。
Apache/2.2.15の脆弱性も調べてみましたが、あまり良いものに巡り合えず。

ローカルからのアクセスというのはドメインをlocalhostにするということなのか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/db8ab6d3-03eb-eb99-ee6a-9da049fdb25e.png)

進みました！
が、最初の方しか表示されないのでほしい情報にはたどり着けず。
さっきと文字数も違うので指定文字数を表示する仕様ではないようです。
区切り文字とかが出てくるまででしょうか。

いずれにせよ、その先を出す方法が分からないのでいろいろ調べてみます。
RANGEっていうのを指定すると指定したバイト数を取得できるようです。
本来はビックデータを分割して取得したりするときに使用するようですが。

例えば区切り文字を「|」だとすると

```
AAA|BBB|CCC|DDD
```

のようなデータがあって、さっき出てた「Admin Page」はAAAにあたる。
ここでflagがBBBだとするとRANGEで5～を指定すれば次の区切り文字まで表示されるはずなのでBBBが表示されるという算段です。

curlでRANGEを指定できるようなので以下やってみます。

```
curl http://mnctf.info/mnctf2019/task/admin/webchecker.php?host=localhost\&path=%2Fmnctf2019%2Ftask%2Fadmin%2Fpassword.php
※パラメータの間にある「&」は\でエスケープする必要がありました。
```

これをやると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/0a4fbe66-5d8e-6271-1f6a-6995c1f8a6d5.png)

さっき画面で見たものと同じものが返ってきました。
適当にRANGEを指定して実行してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/fb67742e-60ce-7179-878e-ea94b9b3c757.png)

ああ、大きな間違いをしていました。
ここのRANGEはクライアントとwebchecker.php間の話でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/8c6481bc-a633-dcb0-3b41-2d596beebea2.png)

この図でいう④に対してRANGEされていました。
今RANGEしたいのは③です。

どうやってURLに組み込む？？？

リクエストヘッダに注目します。

```
  <h2>Request</h2><pre>
GET /mnctf2019/task/admin/password.php HTTP/1.1
Host: localhost
User-Agent: ShinoWebChecker 1.0
Connection: Close
```

さっき実行したときはこんな感じになってましたが、Rangeを入れた場合は

```
  <h2>Request</h2><pre>
GET /mnctf2019/task/admin/password.php HTTP/1.1
Host: localhost
Range: bytes=100-200
User-Agent: ShinoWebChecker 1.0
Connection: Close
```

というような感じでしょうか。
ここでやれることはさっきの図の①のときにパラメータに改行コードを挟みつつrangeを書いてやることくらいですかね。
単純に文字を書けばいいのか？？？

「Admin Page」が10文字なので11～100くらいとっておけば何か見えますかね。
ということを考慮すると

```
curl http://mnctf.info/mnctf2019/task/admin/webchecker.php?host=localhost\&path=%2Fmnctf2019%2Ftask%2Fadmin%2Fpassword.php%0D%0ARange%3Abytes%3D11-100%0D%0A
```

という感じでしょうか。
改行は%0D%0Aです。
:は%3Aです。
=は%3Dです。

やってみると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/2837427c-a921-f873-166e-8863db90a746.png)

ああそうか。
単純に改行するだけだとpassword.phpのあとにHTTP/1.1が入るから

```
GET /mnctf2019/task/admin/password.php
Range:bytes=11-100
 HTTP/1.1
```

となってしまうんですね。
とか思ってたら下に答えが出ていた？？？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/e43a6b53-ec6b-8355-952e-11c00ffd495e.png)

しかもRange指定で消えるはずの「Admin Page」が消えてないからRangeは適用されていないはずなのに。
いろいろ試してみたんですが、なんでそうなっているのかわからず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/a10e28c9-faa0-92f8-e332-3e0b55c14910.png)

これで全問正解できた。