Download - RuCTFEに参加したよ
RuCTFEに参加したよ結果より記憶に残る大会だったよ
自己紹介Tiwtter: abend@number3to4
Webアプリケーションのセキュリティをメインでやってます。おくど 3( okudo3)で CTFなどに参加してます。
おくど 3は、つぶれてしまった格安の立ち飲み屋の名前(おくどさん)に由来します。そんなわけで、数字の「 3」は「さん」と読みます。
RuCTFEの概要 1日本時間の 12月 14日 19時から 12月 15日 4時まで 9時間(最初の 1時間は設定するための時間)で、参加チームのサーバに保存されている FLAGの奪い合うなさけ容赦ない大会。
脆弱なままのサーバだとやられたい放題。こっちが FLAGをとって、得点をゲットしたとしても FLAGを取られて得点を簡単に失う。
強者のみが生き残れるという世紀末状態を体感可能。
RuCTFEの概要 2得点は、 FLAGを取得すると得られる。 FLAGの正規表現は、 /^\w{31}=$/であるとのこと。ただ、 FLAGだけではなく SLAも求められる。
得点 = FLAGポイント × SLA
SLAは、 2分おきに主催者がチェックして、サービスが落ちていたら、 SLAが減点される。
どちらかが 0だと、得点はもう一方をどんだけ稼いでも評価されないということ。
RuCTFEのネットワーク環境VirtualBoxのイメージを 3つ配布され、以下のネットワークを構築しました。
Router
Master Test
セグメント A
踏み台サーバ Internet メンバ
PC
セグメント B
他チームMaster
FW
Routerには、 VPN設定をしてMaster同士で FLAGを奪い合う。
メンバがMasterにアクセスできるように踏み台サーバ、 RouterにSSHで多段ログインして、アクセス。
CTFが開始して 1Masterのイメージは事前にパスワードつき状態で公開されており、開始と同時にパスワードが公開される。
展開して立ち上げたのはいいが、認証情報がないのでNW設定できない。
CTFが開始して 2ログインしないと何もできないので、Masterを diskとしてmountして/etc/shadowを書き換えてログインしたらというアドバイスをもらいやってみたよ。
ちなみにこれがセットされていたよ。
root:$6$kaNpfH1w$crSf1X33TcX8MydzbFR96JyFPYrl2.lfU5YorCDUnGSk/bmF56x3bCaT4xZB1Y1FdKwt2xKf8b4IR/vcdgc3N1:15986::::::
john the ripperにかけたが、 3時間かけても終わらなかったのであきらめました。
簡単なパスワードに書き換えて、ログイン成功!!その後、NW設定変更して、全員アクセスできるようになってやっと競技開始。
サーバで稼働しているサービスいろいろと稼働しているが、 8000番で稼働するサービスがWebサービスということで、そっちを見ることに。競技上の名称は、 contacts。
0.0.0.0:22 0.0.0.0:3000 127.0.0.1:5432 0.0.0.0:18360 0.0.0.0:8000 127.0.0.1:270170.0.0.0:3306 127.0.0.1:6379 0.0.0.0:48879 127.0.0.1:280170.0.0.0:8081 0.0.0.0:4369 0.0.0.0:4242
Contactsの調査 1とりあえず、 telnetで 8000番たたくと平文で帰ってきたが、さすがにコマンドラインだけでWebアプリケーションを見て回るのは面倒だったので、ポートフォワードしてブラウザで見れるように。
Contactsの調査 2Address bookになっており、検索や登録ができる。
Contactsの調査 3登録したアドレス情報を、取得してみると・・・
Contactsの調査 4結果には、登録したパスワードも表示されていた。
パスワードの形式を見て、 Base64だなって思いながらも、それ以外に FLAGの形式もそういえばそうじゃんって思い出した。
Contactsの調査 5ブラックボックスだけではなく、手元にソースがあるのだからホワイトボックス的にも見てみようよってことで、中身を確認。
if [[ $password = *'*'* ]]; then echo Security alert returnfi
local results=`$ldapsearch -LLL -H $ldapsocket -x -b "dc=ructfe,dc=org"-s sub "(&(objectclass=inetOrgPerson)(cn=${name} ${surname})(userPassword=${password}))"`
Address bookは、 LDAPで管理されており、入力値のチェックもされておらず情報を抜き取りたい放題になっているなってことに気づく。
Contactsの調査 6平文だからというのと、うまく通るまで LDAPインジェクション試すよりも他のチームからの攻撃手法をパクって、こっちも攻撃しようと考え、 tcpdump。
/?action=info&name=*&surname=*)(%7C%20(userPassword=*&password=11)
これね。じゃあ、 FLAG取得に向けて動くか。
Contactsの調査 7スコアボードの下位チームでかつ Contactsサービスが稼働しているチームにまずは行うことに。
<div class="contact"><div class="name" style="font-size: x-large; margin-bottom: 5px"><b> Kieran Lancaster </b></div><div class="phone"> <span class="phone_text">Phone:</span> +55(909)92 783 54 </div><div class="mail"> <span class="mail_text">Mail:</span> 1RX23RHCGKPEQP2EQ8ZN8BA7YH5QGS1= </div><div class="password"> <span class="password_text">Password:</span> ZThoc2l1a3Y= </div></div>
パスワードじゃないけど、 \w[31]=に合致するので、スコアサーバに送信。
Contactsの調査 8どうやらOKだったようで。
..:: RuCTFE Get-Flags service ::..
Your team id is 66Enter your flags, finished with newline (or empty line to exit)B3UF46DO5KSQ4CHL0CMX3V83E4QDJG1=Accepted
Goodbye!
そんなわけで、同様の手法を用いて 5つの FLAGをゲットー!!
Contactsの調査 9数分で更新されて・・・
ついに、 FLAGページにチームのアイコンがのったぁー!!
Contactsの調査 10ヒャッハーって喜んだが・・・
上位チームは桁が違いすぎる。。。
色々と頑張ってみたけど色々とDoSされたり、 shellとられたりと FLAG5つくらいでは埋められないほどFLAGを取られまくってしまった。
そんな結果は、 174チーム中 66位だった・・・
まとめやられたい放題やられたので、防御する能力を向上させないとだめだなと思った。だからといって、攻める方もOKではないので、いろいろと頑張らないと思った。
ただ、日本チームで FLAGを取ったのが okudo3のみだったので、結果より記憶に残る大会だった。
あと、それ以外のサービスも、攻撃パケットを解析して、まとめようかと。