日々のいろいろ

【picoCTF】WebのEasy問題に挑戦しました

投稿日: 5/31/2025

今回は、picoCTFの常設されている練習問題のうち、WebのEasyを解きました。
ほとんどWtiteUpを見ずに、今までの知識経験を活かして解けた問題もあったので、ちょっとだけ成長した感じ。

ただ、HTMLにそのままフラグが書いてあるような、超簡単な問題は今回は省略します。

n0s4n1ty 1

問題

A developer has added profile picture upload functionality to a website. However, the implementation is flawed, and it presents an opportunity for you. Your mission, should you choose to accept it, is to navigate to the provided web page and locate the file upload area. Your ultimate goal is to find the hidden flag located in the directory./root

アップローダー機能の脆弱性を突いた攻撃ですね。

画像

ソースを見ると、ファイルの選択要素(input)にはただfile属性として指定されているだけで、画像以外のファイルも許容するようになってしまっています。
サブミット時に実行されるJSにも、バリデーション処理はないようです。

画像

ちなみに、アップロードすると丁寧にパスも教えてくれます。

画像

上記から、WebShellをアップロードしてflagを探すのが最適解になりそうです。

まずはWebShellを用意するために、こちらのファイルを利用させていただきました。

webshell.php、アップロード成功です。

画像

/uploads/webshell.phpにアクセスすると、実行コマンドを送信できるPHPのページが返されます。

画像

whoamiコマンドを実行したところ、現在コマンドを実行できるユーザーは「www-data」であることがわかりました。
Apacheのシステムユーザーですね。

画像

uploadsディレクトリから2階層上に移動cd ../../すると、rootディレクトリがありました。

画像

しかし、rootディレクトリは現在の「www-data」ユーザーでは権限不足でアクセスできません。

「www-data」ユーザーにディレクトリの権限を変更する権限があるかを、sudo -lを実行して調べます。

画像

(ALL) NOPASSWD: ALLですが、これは
(ALL) → すべてのユーザーとして実行できる
NOTPASSWD → パスワード入力不要
ALL → すべてのコマンドを実行できる
という非常に強力な権限であることがわかります。

つまり、「www-data」ユーザーの状態でrootディレクトリの権限を変更します。
所有権を変える方法もありますが、権限を「777」に変更します。
sudo chmod 777 root

flagゲットです。

画像

head-dump

問題

Welcome to the challenge! In this challenge, you will explore a web application and find an endpoint that exposes a file containing a hidden flag.
The application is a simple blog website where you can read articles about various topics, including an article about API Documentation. Your goal is to explore the application and find the endpoint that generates files holding the server’s memory, where a secret flag is hidden.

比較的コンテンツが多いページです。

画像

問題文では、記事のAPIドキュメントを使ってエンドポイントにアクセスして、フラグを見つけることが大まかな道筋であることが記載されてます。

APIドキュメントのリンクを発見したので、アクセスします。

画像

/heapdumpへのアクセス方法が記載されていました。

WSL2で、アクセスして返されるデータをファイルに書き込み、「picoCTF」を抽出したらflagをゲットできました。

画像

Cookie Monster Secret Recipe

問題

Cookie Monster has hidden his top-secret cookie recipe somewhere on his website. As an aspiring cookie detective, your mission is to uncover this delectable secret. Can you outsmart Cookie Monster and find the hidden recipe?

クッキーモンスターバグのことかな?と思いながら画面を開くと、ログインフォームが表示されました。

画像

適当なデータをつっこんでログインすると、Cookieが発行されました。

画像

cGljb0NURntjMDBrMWVfbTBuc3Rlcl9sMHZlc19jMDBraWVzX0RFN0E1RTc2fQ%3D%3Dがちょっと怪しいので、CyberChefにかけてみたところ、Base64のデコードでフラグをゲットできました。

画像

Bookmarklet

問題

Why search for the flag when I can make a bookmarklet to print it for me?

ページにアクセスすると、Javascriptのコードが書かれたRead-Onlyの要素があります。

画像

        javascript:(function() {
            var encryptedFlag = "àÒÆÞ¦È¬ë٣֖ÓÚåÛÑ¢ÕӗԚÅКٖí";
            var key = "picoctf";
            var decryptedFlag = "";
            for (var i = 0; i < encryptedFlag.length; i++) {
                decryptedFlag += String.fromCharCode((encryptedFlag.charCodeAt(i) - key.charCodeAt(i % key.length) + 256) % 256);
            }
            alert(decryptedFlag);
        })();

この処理を実行できればフラグがゲットできそうです。

ヒントを見ると、画面を開く以外に、Javascriptのコードを実行する方法があるそうです。

調べてみたら、開発者ツールの「Console」タブで実行ができるようです。

コードをコピペしてエンターを押すと、フラグをゲットできました。

画像

Local Authority

問題

Can you get the flag?
Go to this website and see what you can discover.

ログインフォームが表示されます。

画像

ローカルでの認証、的なタイトルなのでCookieやSession/Localストレージにヒントがあるのかと思いましたが、
適当なデータでログインしても特に情報は入ってませんでした。

調査していると、ネットワークタブに、送信後のレスポンスとしてPHPとJSのソースコードが返されてました。

画像
画像

とりあえずJSのソースコードにハードコードされている認証情報を使ったらフラグをゲットできました。

Scavenger Hunt

問題

There is some interesting information hidden around this site http://mercury.picoctf.net:5080/. Can you find it

シンプルなページです。

画像

まず、HTML内でフラグの最初の部分を発見。

画像

次に、CSSファイル内で、フラグのパート2を発見しました。

画像

JSファイルを確認したところ、How can I keep Google from indexing my website?という文言がありました。

画像

インデックス化は、GoogleのSearchConsoleでSEO用に設定したりするアレですね(当ブログサイトもインデックス化しましたが、実際中身はどうなっているのかわかりません...)

robots.txtやsitemap.xmlを使って、クローリングやサイトマップ等を検索エンジン側で認識しやすくすることが方法として考えられます。

上記のrobots.txtなど、外部からアクセスできるようにする必要があるのでブラウザからアクセスしてみます。

sitemap.xmlは404だったのですが、robots.txtにはフラグのパート3が書かれてました。

画像

また、I think this is an apache server... can you Access the next flag?というヒントも記載されています。

Apacheで稼働しているとのことで、色々調査に時間を費やします。

robots.txtに記載しているindex.htmlは、どうやら最初のページだそうです。

ディレクトリ、パスのトラバーサルを試していたところで、
/index.html/hogeのようにindex.htmlの後に任意の文字列を付与してアクセスしてみると、index.htmlが返されます。
ここで、リダイレクトといえば.htaccess、という連想でひらめきました。

画像

なぜApacheがヒントなのかとその時は疑問でしたが、今思うと、.htaccessはApacheで利用するファイルだからなのですよね。
ただ、.htaccessの利用はApacheが公式で非推奨としているはずです。
パスの検索のパフォーマンスの問題があったりして、.htaccessに該当するディレクティブの設定はapache側の設定ファイルでも実現が可能ですし。

話が逸れましたが、/.htaccessにアクセスしたらフラグのパート4が見つかりました。
そして、I love making websites on my Mac, I can Store a lot of information there.というヒントも記載されています。

画像

MacOSでの開発で、思いつくのは.DS_Storeですね。
こればっかりはよくディレクトリに残っているのを仕事でも見るので、すぐ思いつきましたね。

/.DS_Storeにアクセスして最後のフラグをゲットできました。

画像

logon

ログインフォームが表示されます。

適当なデータでログインしてみると、Cookieが発行されました。
画像

adminをTrueに変更して、リロードするとフラグがゲットできます。
画像

ここからは、解けなかった問題について、解答を参考にしたWriteUpです

SSTI1

入力されたデータを表示する、シンプルな機能です。

画像

SSTIについて調べたところ、Webフレームワークで、ページを返す際にテンプレート変数として埋め込む処理において、入力データの検査不備により意図しない情報を表示してしまう脆弱性を利用した攻撃のようです。

とはいえ、Webフレームワークはたくさんあり、テンプレート変数の表記も多種多様なのでいろいろ試してみたところ、Jinjaというテンプレートエンジンであることがわかりました。

Jinjaのテンプレート変数は{{ hoge }}のように二重波カッコで囲う記法です。

こちらを参考に、Jinjaの設定データの出力など試したものの、フラグはありませんでした。

ギブアップ。

解答

参考にしたサイト:https://medium.com/@Kamal_S/picoctf-web-exploitation-ssti1-e2363b1885a0

Pythonで、OSコマンドインジェクションのような感じで出力をテンプレートに渡します。

{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('whoami').read() }}

whoamiコマンドをインジェクションしてみると、結果が表示されます。

画像

次に、{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('ls -la').read() }}ls -laコマンドで現在ディレクトリの一覧を取得させます。

ちょっと見づらいですが、「flag」というファイルがあることがわかります。

画像

{{ self._TemplateReference__context.cycler.__init__.__globals__.os.popen('cat flag').read() }}で「flag」の中身を出力することでフラグがゲットできます。

Cookies

ワードで検索?するような機能を持つ画面のようです。

画像

Cookieを確認すると、「-1」という値をもつ「name」というデータがあることがわかります。

画像

値を「0」にしてリロードすると、画面が変わりました。
「I love snickerdoodle cookies!」と表示されました。

画像

そんな感じで、インクリメント(いや、2分探索的に)しながら確認していくと、
「28」までは、表示されるクッキーの種類がそれぞれ表示されました。

画像

そして「29」からは、クッキーの種類が表示されず、エラーっぽいモーダルが出ました。

画像

おそらく、デフォルト(何も検索していない状態)を「-1」として、0~28まで各クッキーの種類と紐づいているような感じです。

※ちなみに、-2からも試しましたが、変化はありませんでした

ここらでギブアップです。

解答

参考:https://cyb3rwhitesnake.medium.com/picoctf-cookies-web-39d8fedd345f

18番目がフラグだそうです。。
ちゃんと1つずつ試していくか、スクリプトで自動化すべきですね。。

GET aHEAD

画面は、ボタンを押すことで色を変えられるようです。

画像

ソースを確認すると、赤の場合はGET、青の場合はPOSTで送信しています。

画像

いろいろ調査してみるも、これ以外にヒントは見つからずギブアップ。

解答

HTTPのHEADメソッドでアクセスすることでフラグをゲットできました。
タイトルがヒントでしたね。

画像


コメント

まだコメントがありません

コメントする
0 / 1500 文字