SOP

WebページのURL、Admin botのURL、そしてサーバのファイル一式が与えられた。

Webページにアクセスすると、PHPのプログラムが表示された。
このプログラムは、messageを設定すると、Content-Typetext/plain; charset="utf-8"に設定し、 messageの内容のうちflagを置換したものを出力するものだった。
置換先は、アクセス元のIPアドレスが指定のものであれば環境変数FLAGの内容、そうでなければbuckeye{not_the_flag}である。

Content-Typetext/plainとなるので、用意されたWebページを直接Admin botに渡すことでflagを得るのは難しそうである。
そこで、外部のページを用意し、そこから用意されたページを読み込ませてflagを得る方法を考えた。
その結果、scriptタグのsrcにすることで、読み込ませることができそうであることに気がついた。

具体的には、まず以下のプログラムを用意した。
flagに"\といった特殊な文字が含まれると上手く行かないだろうが、それは上手く行かなかった時に考えればいいとした。
なお、xxxxxxxxxxxxxの部分は、実際のRequestBin.comのエンドポイントのサブドメインを用いた。

An URL for a web page, an URL for the Admin bot, and the files for the server were given.

Accessing the web page, a PHP program was presented.
The program takes message and prints the contents with flag replaced and Content-Type set to text/plain; charset="utf-8".
If the client's IP address is what is specified, flag is replaced to the contents of the environment variable FLAG. Otherwise, it is replaced to buckeye{not_the_flag}.

It looks difficult to obtain the flag by directly putting the provided web page to the Admin bot because Content-Type is set to text/plain.
Therefore, I searched for a way to create an external page and have it load the provided page to obtain the flag.
As a result, I found that using the provided page as src of a script tag may work.

To achieve this, I firstly created this program.
This won't work if the flag contains special characters like " and \, but I decided to consider that only after I actually find it not working.
The xxxxxxxxxxxxx part should be replaced to an actual subdomain of an endpoint for RequestBin.com.

script_script.js

このプログラムをCyberChefの URL Encode でエンコードして埋め込み、以下のHTMLファイルを作成した。

I created this HTML file with encoding this program via "URL Encode" on CyberChef and embedding that.

script.html

このファイルをphp -Sコマンドとcloudflaredでインターネットからアクセスできる状態にし、 そのURLをAdmin botに渡すと、RequestBinにAdmin botからのアクセスがあった。
しかし、その内容は buckeye{not_the_flag} だった。

与えられたファイル中の docker-compose.yml を見ると、用意されたWebページのサーバの内部におけるIPアドレスは 172.16.0.10 らしいことがわかった。
そこで、このIPアドレスを使用した以下のHTMLファイルを用意した。

I made this file available from the Internet using the php -S command and cloudflared.
Then, I put the URL to the Admin bot. As a result, the Admin bot accessed to the RequestBin, but the contents was buckeye{not_the_flag}.

Reading docker-compose.yml in the given file, I found the internal IP address for the server of the provided web page is 172.16.0.10.
Seeing this, I created this HTML file using this IP address.

script2.html

このファイルのURLをAdmin botに渡すと、flagが得られた。

I obtained the flag by putting the URL for this file to the Admin bot.

buckeye{th3_l3tt3r5_0f_S0P_Ar3_1n_JS0NP}

BuckeyeCTF 2021