読者です 読者をやめる 読者になる 読者になる

バランスを取りたい

バランスを取った結果特徴が消えた。

NIRVANA改SECCONカスタムを作る

これはCTF Advent Calendar 2016の14日目の記事です。今日になって何故か急に@potetisenseiポエムを投稿したので被って最悪。抜けた3日目と25日目を足して2で割って14日ってなんじゃそりゃ。

お気持ち表明

CTFの可視化って流行ってますよね。 最近SECCON本戦だけでなく、地方大会やCTF for Girls、更にはSECCON系ではないTrendMicroCTFでもCTFの可視化が行われていて「いいなー」って思うわけです。同じ感じに作っても面白くないので、ブラウザ上で動くthree.jsを使ったらどこまで行けるんだろうと勢いがあるだけやってみることにしました。

NIRVANA改SECCONカスタム (2013)

www.youtube.com

2013年のNIRVANAですが記憶に残っている人も多いと思います。これだけイケてるCTFの可視化システムは世界中を探してもSECCONくらいですね。

と、見とれるのはこれくらいにして、どうすればこれを手抜きして作れるかを考えます。パッと見て特徴的な点を挙げていくと、

  • 六角形
  • 回る
  • パケットっぽいものが飛んでる
  • 透けてる

終わり。

「突破」が足りない?問題を解いてから言いなさい。とまぁ、動画を見て抱く印象としてはだいたいこんな感じでしょう。

作ってみる

f:id:xrekkusu:20161214004200p:plain

できました

three.jsの学習にゆるゆる1週間と本体の実装に2日なのでガバガバコードです。飛んでる物体の削除が雑。3Dがよくわからん。ChromeFirefoxで描画のされ方が違うなど。

前述した4つの要素を使ってそれっぽいものを作ってみました。今のところ通信を拾ってアレコレするのが面倒だったので乱数で適当に飛ばしてます。透けてる六角柱が回ってパケットっぽいものが飛んでるだけでなんとCTFの可視化っぽくなります。

WebGLとは言えまぁまぁ重い。MBPだとRetinaGPUがファーでファンもファー。MBPはGPUを酷使すると離陸することで知られていますがTouchBarが付いたMBPはどうなんですかね。

実装的には六角柱を並べてパケットを飛ばし合う様子をカメラを回しながら見てるだけです。パケットは雑な放物線を書いたのでそれに合わせて飛ばしてます。他に書くこともあんまりないんですが乱数によりスコアっぽいものが決まって六角柱の高さが変わります。

終わりに

NIRVANA改SECCONカスタムはすごい。透ける六角柱が回ってパケットを飛ばすくらいなら簡単なのに、これをCTFの状況に応じて細かく制御したり、複数モードとその間の画面遷移を実装したり軌道を綺麗に表示したりと異常な挙動がたくさん見られるのでプロフェッショナルは強い。

CTF for ビギナーズでも可視化をやりたい気分があるのでJeopardyの可視化に自信のある人は連絡ください。

SECCON 2015 final (intercollege)

もう既に各所ニュースサイトなんかでは取り上げられてますが SECCON 2015 final (intercollege) でチーム dodododo として出場して優勝しました。

めっちゃ「 dodododo のリーダー」みたいな呼ばれ方してるんですが、本来のリーダーは akiym さんで今回は SANS Netwars で自分が出場権を取ってきたのでリーダーとして立ちまわってただけです。

適当なサイトで読めるような内容を再び書いても面白く無いので、決勝戦で何をやっていたかということについて書きます。

環境整備

環境整備の中でも特に WAF の導入をやった。

作戦として、 ModSecurity と OWASP Core Rule Set で Web アプリに対する基本的な攻撃をブロックするルールを適用して攻撃に使える時間を増やすことを考えた。

事前準備として、問題サーバが外部インターネットに繋がらない可能性を考慮して Ubuntu 用の deb パッケージの用意をしたり、 Core Rule Set の中からどのルールを適用するかを決めておいたりしたのに OS が CentOS だったため対応する rpm をダウンロードしてくる羽目になった。

vulnerable_blog の SLA チェックが安定しない

サービスは3つあり、そのうち ModSecurity が効くのは Apache 配下の vulnerable_blog と sbox2015 です。

WAF 導入後、 sbox2015 の SLA は安定しているのになぜか vulnerable_blog の SLA チェックが安定して通らない。 WAF を導入したことが原因かと思い込み、 ModSecurity のモードを DetectionOnly にしたり Off にしたりしたが状況は改善しない。

試行錯誤している間に hiromu が vulnerable_blog の脆弱性をすべて潰してくれたので WAF を外してみたものの、やはり SLA チェックは安定せず。運営しっかりしてくれ。

こうして競技時間の半分以上が溶けた。

sbox2015 の任意コード実行から vulnerable_blog の keycode を読む

任意コード実行を利用すると他のサービスの管理者パスワードをリークできるというので最後の1時間くらいはこれをやっていた。

適当に試したところ、スクリプト実行を許していてかつある程度ポイントを保持しているチーム ( security_anthem ) があったので 15 フラグくらい頂いた。

おまけ

vulnerable_blog のページ番号のパラメータのエスケープを間違えているチームが非常に多かった。

ページ番号は LIMIT 句に入ってくるので文字列としてプリペアドステートメントに突っ込んでしまうと SQL インジェクションが発生してしまう。ただ、今回は CodeIgniter が SQL のエラーをうまく表示してくれなかったのでうまく exploit に繋げられなかった。

ORDER BY , LIMIT 以降で効率よく SQL インジェクションする方法があったら教えてください。

Xmas CTF

CTF Advent Calendar 2015

CTF Advent Calendar 2015 - Adventarの25日目ですがさすがにボロボロすぎませんか???

スカスカなのはともかく、ネタまで書いておいて結局記事書いてない人って何してるんですかね。

というわけで、25日はクリスマスCTFとしてAmazonギフト付きのCTFをやります。

ルール

  • フラグは3つあり、それぞれで得点(=金額)が異なります
  • 得点は700, 500, 300で、ギフト券の額面はそのまま700円, 500円, 300円です
  • 各フラグにつき、Amazonギフト券を獲得できるのは先着1人のみです
  • ギフト券獲得者は @xrekkusu 宛にDMを送ってください。その際、フラグと簡単な解法を送信してください
  • ギフト券獲得者の名前はこの記事で発表します。その際、獲得者のTwitterへのリンクとscreen_nameを使います
  • 名前の発表を拒否する場合はギフト券を受け取ることはできません
  • 既にギフト券を獲得された問題についてはフラグを白文字等で伏せて発表し、以降その問題についてのDMの返信は行いません
  • 解答の受付期間は日本時間の2015年12月25日23:59:59までとします

問題

js+JSghJaKAq7ygqAU1EgQzA7CspSoiPD8tHQAXB5u4g4ixqiA4FwAnHRo5BwgDABE0Owg/KaKMs
5S2lj8jBiohCCwBP4O4uC8MPzQNP6K6nbOUlwEsLq6Nmz4xBreTti80D7y2n6qoto+xgqSvpxodM
rqMpJewnikmOgkjPZ+ejZ6Ltg8MFhgPOBE2NZOfohMHFQ8KPL6itbG/vjYXOgglCLCXqYahjDUgO
CA7PayEm5yDhISDgDQlID0WIzU1ChkYC5uQkYSInwgCFBUsPZ6bkyMkNrqemhcDPpejjqCYsz8wC
hYxMgg7OjQvBISymiEwGBwsIZS2v5i5oIePtgA3ODsCFa6LkjQnMzAyI4aMiZ2tih4CPCQfCREyL
hkwFh0SLRwWOoa6iZifsJK8kTAePTMpCSovDCQLM7uLsqGSjAgcNj4KPoqGjpiEhhAMFgQMAJqEn
oaUloSWioKCjIaelAwQGJKSg

ヒント

  • Stage1は2進数8ビット単位でどうにかしてデータを格納しています
  • 3つの問題と4つのランダムデータと1つの空白データがあります
  • ''.join(map(lambda x: '1' if ord(x) & MASK else '0', data))

ギフト券獲得者

フラグ

  • 700:
  • 500:
  • 300: 2015{c3f81b3e2}

XSSを報告したらちょっと不便になった

脆弱性"&'<<>\ Advent Calendar 2015

この記事は脆弱性"&'<<>\ Advent Calendar 2015の16日目の記事です。

2015年のアドベントカレンダーですが、大昔(2013年)にミスタードーナツ公式ページにあったXSSの話をします。

2013年3月

ミスタードーナツの公式サイトへ行った時、偶然にも検索画面で怪しい文字列を発見してしまいました。最近ではあまり見かけなくなった ie=utf-8&oe=utf-8 のようなパラメータです。

XSS界隈の人なら恐らくこんな感じのパラメータを見たらちょっと変えてみてどのような挙動を起こすか試したくなるはずです。

実際にoe=utf-8を変えたらそれに対応する値がmetaのcharsetに入るようでした。当時のことを詳しく覚えていませんが、ここから直接XSSしたわけじゃないので多分値はエスケープされていたと思います。

エンコーディング周りでは当時UTF-7が終わりを迎える時期でしたが幾つかのUTF-7 XSS記事が出回っていたためそれを試してみると、IE8なんかでは普通にcharset=UTF-7として認識されました。

というわけでレアケースなUTF-7 XSSが確認できたのでIPA経由で報告し、1ヶ月後には修正されたのですが修正方法がちょっと残念でした。

検索ボックスがそのまま消えた

奇跡的にInternetArchiveで検索ボックスが消える様子が確認できたのでそのスクリーンショットを貼ります。

報告前2月18日

f:id:xrekkusu:20151215144006p:plain

修正後5月3日

f:id:xrekkusu:20151215144048p:plain

サイト内の検索が無くなったため、若干アクセシビリティは減ったはずです。

回避はできなかったのか

当時送信したIPAへの届け出のメールを見たところ、当時のフォーマットには回避策の欄が(多分)無かったようです。そのためどのように修正するのが最善かがうまく伝わらなかったと思われます。今のフォーマットには回避策の欄があるので、脆弱性を報告するときは現状の機能を損なわないように的確に修正案を書きましょう。

--

14:35 追記 間違えてソフトウェアの方と比較してしまったらしく、今もWebの脆弱性報告には回避策の欄はないようです。脆弱性を報告して機能が消えるのはつらい…。

PayloadGenerator

CTF Advent Calendar

片手で気合で埋めてくCTF Advent Calendar 2015の4日目です。

書いてくれたのむ。

Pwn、やってますか

時々Pwnの問題を解いているとき、ポインタの扱いでちょっと困るときがある。

例えば、リターンアドレスから既知のバッファ上に設置されたシェルコードへ飛びたい場合、大体次のようなコードを書く。

payload = 'A' * 40 + p32(buf_addr + 100)
payload = payload.ljust(100, '\0')
payload += sc

まぁ特に問題ない気がするけど、60文字弱のパディングを入れるのは微妙。もっと調節してもいいけど計算するのは面倒。

どういうことかっていうとこんな感じに書きたい。

payload = PayloadGenerator([
    'A' * 40,
    Ptr32(sc),
]).generate(base=buf_addr)

できました。

payload_generator.py · GitHub

bss = 0x804a000
execve = 0x48484848

a = PayloadGenerator([
    p32(execve),
    'AAAA',
    Ptr32('/bin/sh\0'),
    Ptr32([
        Ptr32('/bin/sh\0'),
        p32(0)
    ]),
    Ptr32(p32(0)),
])
print a.generate(base=0).encode('hex')
print a.generate(base=bss).encode('hex')

こういうコードを書くと、

4848484841414141140000001c000000300000002f62696e2f736800140000000000000000000000
484848484141414114a004081ca0040830a004082f62696e2f73680014a004080000000000000000

こんな感じに帰ってくる。

雑さ

だいぶ雑に書いてるので多分バグる

多分便利なんだろうけどこれを使うほどの問題に遭遇してない気がするし必要ないっぽい。

よろしく

CTFのススメ

CTF Advent Calendar

CTF Advent Calendar 2日目の記事です。

1日目を取りそこねてしまったので 2日目 で導入記事を書きます。ちなみに今日は12/3です。

CTF とは

この記事を読んでいる人の多くは恐らくCTFを知っていると思いますが、CTFとはコンピュータ全般の技能にどの程度習熟しているかを競う競技です。

競技方式は複数あって、

  • Jeopardy
  • Attack & Defense
  • 変則 Attack & Defense (King of the Hill)

が代表的です。

Jeopardy

Jeopardyはアメリカのクイズ番組の形式が元になっていて、ジャンルごとに分けられたクイズ形式の問題を解いていきます。ジャンルとしてはReverse Engineering, Exploitation, Cryptography, Web, Forensic, Steganographyなど多岐にわたります。順位は解いた問題の総得点と解いた早さで決まります。

Attack & Defense

Attack & Defenseでは各チームにサーバーが割り当てられ、そのサーバー上で稼働するサービスをお互いに攻撃します。攻撃が成功すると攻撃を受けたチームのポイントの一部が攻撃チームに移動します。攻撃を続けつつ、サービスの脆弱性を塞いだり通信を監視したりしなければならないため、かなり忙しい展開になります。

変則Attack & Defense (King of the Hill)

変則Attack & Defenseは普通のAttack & Defenseとは異なり各チームにサーバーが与えられることはありません。運営が管理する問題サーバーに対して攻撃を行いフラグを盗み出します。このフラグをSubmitするとチームにAttackポイントが与えられます。一方、Defenseというのはサーバーを自チームの管理下に置くことを指していて、サーバーを占領していることを示す特定の文字列を問題サーバーに書き込んでおくと時間経過によりチームにDefenseポイントが与えられます。

最終的にはAttackポイントとDefenseポイントの和で順位を決定します。2014年度までのSECCON FinalsやTrendMicro CTF Finalsでこの変則Attack & Defenseが採用されました。

CTFに参加する

常設CTF

常に問題を解くことができるように常時開催中のCTFです。常時開催中のため、解法を公開するのは控えましょう。

イベント型CTF

24時間や48時間など一定期間のみ開催するCTFです。常設CTFに比べると難易度の高い問題が出題されることが多いです。

CTFtimeという便利なサイトがあるのでいつCTFが開催されるかをこまめにチェックしましょう。ちなみにCTFtimeに表示される時間は間違っていることが 非常に 多いため、時間はCTFの公式サイトで確認した方がいいです。

おわりに

超おすすめ書籍情報です。

疲れたのでこれくらいにします。

2000円NUC 近況

買ったまでは良かったけど使い道が無いみたいな話のある2000円NUCの現在をお知らせします。

パーツ類

  • 本体: BLKDCP847SKE (2000円)
  • ACアダプタ: 19V75W (2500円くらい)
  • メモリ: 2GB * 2 (iMac 2011 Mid から)
  • ブート用USBメモリ: Transcend 8GB (600円くらい?)
  • miniPCIe to USB3.0 x2 (BuyMoreでジャンク扱い500円)
  • USB3.0 ピンヘッダ to USB3.0ポート (800円)
  • AC to IDE電源 (1300円)

とまぁこんな感じで多分まだ余裕で1万円超えてないと思います。メモリを使いまわせたのが割とデカい。

ただ、19Vやら12V/5Vを供給できるようないい感じの電源がなく、それぞれACアダプタを買ってしまったので全体に対するACアダプタへの支出が非常に大きいですね。

用途

  • iMacに刺さっていた500GBのHDDをUSBで繋いでMBPのTimeMachineとして
  • Twitterの各種イベントをPushover経由で端末に通知する
  • さくらVPS+OpenVPNでアパートのネットワークの外側から入る

今後

  • 録画サーバー化したいが金がない
  • Ubuntuのmini.isoからよくセットアップするのでaptミラーを置きたいがHDDを買う踏み切りがつかない。

総評

  • うちにはサーバーがなかったので適当に何かを動かすときに便利。
  • サーバーマシンがないので適当に刺さってるATX電源から分岐して電源を持ってくるみたいなことができなくてつらい。