土日の勉強ノート

AI、機械学習、最適化、Pythonなどについて、技術調査、技術書の理解した内容、ソフトウェア/ツール作成について書いていきます

picoCTF 2024:Web Exploitationの全6問をやってみた(最後の2問は解けず)

前回 は、picoCTF の picoCTF 2024 のうち、General Skills をやってみました。全10問を全部解けました。

今回は、引き続き、picoCTF の picoCTF 2024 のうち、Web Exploitation というカテゴリの全6問をやっていきたいと思います。Medium が 1問、Hard が 1問です。

それでは、やっていきます。

はじめに

「セキュリティ」の記事一覧です。良かったら参考にしてください。

セキュリティの記事一覧
・第1回:Ghidraで始めるリバースエンジニアリング(環境構築編)
・第2回:Ghidraで始めるリバースエンジニアリング(使い方編)
・第3回:VirtualBoxにParrotOS(OVA)をインストールする
・第4回:tcpdumpを理解して出力を正しく見れるようにする
・第5回:nginx(エンジンエックス)を理解する
・第6回:Python+Flask(WSGI+Werkzeug+Jinja2)を動かしてみる
・第7回:Python+FlaskのファイルをCython化してみる
・第8回:shadowファイルを理解してパスワードを解読してみる
・第9回:安全なWebアプリケーションの作り方(徳丸本)の環境構築
・第10回:Vue.jsの2.xと3.xをVue CLIを使って動かしてみる(ビルドも行う)
・第11回:Vue.jsのソースコードを確認する(ビルド後のソースも見てみる)
・第12回:徳丸本:OWASP ZAPの自動脆弱性スキャンをやってみる
・第13回:徳丸本:セッション管理を理解してセッションID漏洩で成りすましを試す
・第14回:OWASP ZAPの自動スキャン結果の分析と対策:パストラバーサル
・第15回:OWASP ZAPの自動スキャン結果の分析と対策:クロスサイトスクリプティング(XSS)
・第16回:OWASP ZAPの自動スキャン結果の分析と対策:SQLインジェクション
・第17回:OWASP ZAPの自動スキャン結果の分析と対策:オープンリダイレクト
・第18回:OWASP ZAPの自動スキャン結果の分析と対策:リスク中すべて
・第19回:CTF初心者向けのCpawCTFをやってみた
・第20回:hashcatの使い方とGPUで実行したときの時間を見積もってみる
・第21回:Scapyの環境構築とネットワークプログラミング
・第22回:CpawCTF2にチャレンジします(クリア状況は随時更新します)
・第23回:K&Rのmalloc関数とfree関数を理解する
・第24回:C言語、アセンブラでシェルを起動するプログラムを作る(ARM64)
・第25回:機械語でシェルを起動するプログラムを作る(ARM64)
・第26回:入門セキュリhttps://github.com/SECCON/SECCON2017_online_CTF.gitティコンテスト(CTFを解きながら学ぶ実践技術)を読んだ
・第27回:x86-64 ELF(Linux)のアセンブラをGDBでデバッグしながら理解する(GDBコマンド、関連ツールもまとめておく)
・第28回:入門セキュリティコンテスト(CTFを解きながら学ぶ実践技術)のPwnable問題をやってみる
・第29回:実行ファイルのセキュリティ機構を調べるツール「checksec」のまとめ
・第30回:setodaNote CTF Exhibitionにチャレンジします(クリア状況は随時更新します)
・第31回:常設CTFのksnctfにチャレンジします(クリア状況は随時更新します)
・第32回:セキュリティコンテストチャレンジブックの「Part2 pwn」を読んだ
・第33回:セキュリティコンテストチャレンジブックの「付録」を読んでx86とx64のシェルコードを作った
・第34回:TryHackMeを始めてみたけどハードルが高かった話
・第35回:picoCTFを始めてみた(Beginner picoMini 2022:全13問完了)
・第36回:picoCTF 2024:Binary Exploitationの全10問をやってみた(Hardの1問は後日やります)
・第37回:picoCTF 2024:Reverse Engineeringの全7問をやってみた(Windowsプログラムの3問は後日やります)
・第38回:picoCTF 2024:General Skillsの全10問をやってみた
・第39回:picoCTF 2024:Web Exploitationの全6問をやってみた(最後の2問は解けず) ← 今回

picoCTF の公式サイトは以下です。英語のサイトですが、シンプルで分かりやすいので困らずに進めることができます。

picoctf.com

それでは、やっていきます。

picoCTF 2024:Web Exploitation

ポイントの低い順にやっていきます。

Bookmarklet(50ポイント)

Easy の問題です。サーバ(インスタンス)を起動するところから始まるようです。

Bookmarklet問題
Bookmarklet問題

サーバを起動すると、1つのリンクが表示されます。クリックすると、Webページが表示されます。そこには、ブックマークレットがあります。それを Chrome に登録して、登録したブックマークレットを実行するとフラグが表示されます。

一応、ブックマークレットの手順だけ書いておきます。Ctrl+Shift+B を押して、ブックマークバーを表示します。ブックマークバーの空いてるところを右クリックして、「ページを追加...」をクリックします。URL のところに、ブックマークレットのソースコード(JavaScript)を貼り付けて、保存をクリックすると、ブックマークレットの完成です。あとは、ブックマークを表示するのと同じように、登録したブックマークレットをクリックするだけです。

WebDecode(50ポイント)

Easy の問題です。サーバ(インスタンス)を起動するところから始まるようです。

WebDecode問題
WebDecode問題

サーバを起動すると、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 の問題です。サーバ(インスタンス)を起動するところから始まるようです。

IntroToBurp問題
IntroToBurp問題

サーバを起動すると、1つのリンクが表示されます。タイトルにあるので、BurpSuite でアクセスしてみます。

Register画面で、Full NameUsernamePhone NumberCityPassword を入力します。その後、2fa authentication画面になり、Enter OTP を入力します。

2FA とは、2要素認証のことで、パスワード以外に、もう1つの要素で認証することのようです。例えば、OTP であれば、SMS で確認コードが送られてきて、それを入力するようなものです。

OTP に適当な文字列を入れても、Invalid OTP が返ってくるだけです。

BurpSuite で、HTTP の通信内容を見ていますが、これと言って変なところはありませんので、改変していきます。まずは、エラーが出てる原因になってる「otp=xxx」を、BurpSuite で削除して送らないようにします。あ、フラグが表示されました。

Unminify(100ポイント)

Easy の問題です。サーバ(インスタンス)を起動するところから始まるようです。

Unminify問題
Unminify問題

サーバを起動すると、1つのリンクが表示されます。アクセスしてみます。フラグは既に受信してる、というようなメッセージが表示されます。ソースコードを見てみます。1行に圧縮されてます。

VSCode で、ソースを整形します。フラグがありました。

<!DOCTYPE html>
<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 の問題です。サーバ(インスタンス)を起動するところから始まるようです。

Trickster問題
Trickster問題

サーバを起動すると、リンクが 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 にしてアップロードしてみます。

#!/bin/bash

# xxx.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 もあります。

elements問題
elements問題

解凍すると、400MB 以上ありました。ちょっと容量が足りないので、インストールできないです。この問題については、writeup を見させて頂いて、勉強させてもらうことにします。

writeup を見ましたが、正直言って見ても全然分かりません(笑)。Web については、基礎が足りてないようです。

おわりに

今回は、picoCTF の picoCTF 2024 のうち、Web Exploitation というカテゴリの全6問をやりました。最後の 2問は解けませんでしたが、苦手な Web問題の良い経験になりました。

最後になりましたが、エンジニアグループのランキングに参加中です。

気楽にポチッとよろしくお願いいたします🙇

今回は以上です!

最後までお読みいただき、ありがとうございました。