SECCON CTF 2014 Online 予選 Write Up #5

#4までが僕が解いた問題です。少な….。他にも手をつけた問題があったので、何ができたかをかきます。できれば追記で解き終わりたい…

一番長く時間をかけたのが、Programming 400の”The Golden Gate”。

goldenGoogle Driveへのリンクがあるので開いてみると、ユニバーサル基板でできた回路の写真が!

golden_gd

 

74HC00を10個使ってでできた、8bit入力、8bit出力の暗号?化回路みたいです。配線がきたna….

なので、とりあえず回路図をEagleで復元することにしました。これが大変で、重なった配線のわかりにくいこと…

golden_sch

 

写真を印刷して、書き込みをしながら復元しました。苦行…

ここからはPythonで処理を行いました。都合のいいことにEagleの回路図データはXMLなので、普通に扱うことができます。なので、配線情報を取り込んで、セグメントの配列オブジェクトを作れるところまで実装しました。

golden_read

 

この情報は閉路のない有効グラフとして扱えるので、トポロジカルソートでランク順に並び替え、順番に出力を確定していけば最終的な出力を求めることができます。ここからは超競プロ勢の@__math先生にお願いしました。

ところが、デコードしても文字列のような結果が出てこない….というところで時間切れ。

他からの情報だと、どうやら、gzipで圧縮された結果がでてくるようで、解凍が必要だったみたいです。

 

SECCON CTF 2014 Online 予選 Write Up #4

#3に引き続き、解いたのがWeb 100の”jspuzzle”です。

jspuzzle解凍してみると、HTMLとJavascriptが入っているので開いてみます。

jspuzzle_blankどうやら、空欄を下の選択肢から埋めて、alert(1)を実行するコードを作ればいいようです。まさにパズルですね。同じ選択肢は1度しか使えません。

Scriptを読んだところ、10箇所の空欄を結合したSHA1ハッシュ値がFlagになってたので、正攻法以外では解けなさそう。なので、ちゃんとパズルとして考えていきます。

説明上、次の図のように番号を振ります。

jspuzzle_num

最初5行で辞書をつくって、関数オブジェクトをつっこみ、それを最後の行で参照して、実行していることがわかります。7,8の行が実際にalert(1)を実行する箇所ということになります。

まず、“[1]”と、“{9}”[“{10}”]() が同値でないとだめであることから考えます。JavaScriptでは、オブジェクトと辞書は一緒なので、Hoge.fuga()と書いてもHoge[“fuga”]()と書いてもおなじなので、きっと{10}は文字列オブジェクトのメソッドであることがわかります。

ということは、選択肢からtoLowerCaseが{10}で、Functionが{9}、対応してfunctionが{1}であることがわかりました。

同じ原理で、“{2}”と、r[“{7}”](pattern)が同値でなければいけません。rはRegExpオブジェクトなので、{7}は選択肢から考えると”constructor”か”exec”が入ります。constructorの戻り値はまたRegExpオブジェクトなので、違うだろうと推測し、{7}にexecを入れるとr.exec(pattern)となります。では次に{6}を考えてみると、正規表現の文法上/*^_^*/は入りません、それ以外の普通の文字列はいれてしまうと、execの返り値がリストになってしまいます。なので、{6}には^[w]$をいれます。そうするとexecの返り値はnullになります。

ここで疑問がでてきます、{2}は文字列なのに、nullはどうがんばっても入れられないじゃないか!と。ところがJavaScriptは辞書のキーは全部文字列で扱いますので、参照時に自動でキャストされるため”null”で問題ありません。(最初、これはちがうなぁと思っていたので少し時間がかかりました…)。なので、{2}はnullで決まりです。

最後、{3}{4}{5}と{8}ですが、”{3}{4}{5}”と結合すると、命令になるはずなので、で”return hogehoge”となるはずです。しかし、空白は選択肢にありませんが、なんとコメントをいれるとそこは空白扱いになるのです。したがって、{3}はreturn、{4}は/*^_^*/ですね。

ここまで考えると、この新しく生成されている関数で返るオブジェクトをHogeとすると、{8}の 部分ではこういうことになります。

Hoge.{8}(1);

これがalert(1)にならなければいけません。そこで、alertを持っている親オブジェクトを考えると、window….つまりはthisです!ということはreturn thisして、alertを呼びだせばOK

結果、{5}はthis、{8}はalertですね。

jspuzzle_ans

 

殴り書きなので、読みづらいのはスルーしてください…

 

 

SECCON CTF 2014 Online 予選 Write Up #3

#2に続いて解いたのが、Forensics 100の”Get the key.txt”です。

fore100

ファイルが提供されるだけで、なんの説明もありませんが、解凍してfileコマンドで見てみます。そうすると、EXT2ファイルシステムであることがわかります。(バイナリエディタでみなくてもここまでわかると便利ですね)

そこで、Ubuntuでマウントして、中身を見てみると数字のファイル名がいっぱい。fileコマンドでみてみると、どうやらgzipで圧縮されているようなので、”1″に”key.txt”って書いてあるので展開してみると、あっさりフラグゲットできちゃって….おしまいです。

fore100_mount

 

(じつは、gzipであることになかなか気づかずに @misodengaku に教えてもらった。けど、なぜみそでんは解凍しなかったんだ…。CTFって終わってみると、あのときなぜしなかった!っていうことが結構ある。)

 

SECCON CTF 2014 Online 予選 Write Up #2

前回 #1 に引き続き、SECCON CTF 2014 Online 予選 (2回目) のWrite Upを。

次に解いたのが、Network 300 の”Get from curious “FTP” server”です。

nw300FTPサーバを教えられるので、ftpコマンドで繋いでみると、LISTができません。

そこで、telnetで直接繋いでみて、STATコマンドを実行してみると、”key_is_in_this_file_afjoirefjort94dv7u.txt”っていうファイルが見つかるのでダウンロードしたらOKです。

ftp

 

ちなみに、MacのCyberduckで接続すると、なんの問題もなく一覧の表示とダウンロードができてしました…

 

SECCON CTF 2014 Online 予選 Write Up #1

昨日の9時から今日の17時ににかけてSECCON CTF 2014のオンライン予選(2回目)が開催されてました。

すでに、前回の予選で出場権を得ているため、今回は練習ということで出場していました。

今回のメンバーは

  • @__math
  • @aki33524
  • @misodengaku
  • @chibiegg

の4人でした。チーム名はMt. Takedashiです。今回は、みんな、映画に行ったり、バイトに行ったり、出かけたり、10時間ぐらい寝たりと、稼働率30%もないんじゃないかという状況で点数は残念な結果でしたが、出場権を気にせずに問題が楽しめて良かった感じです。

で、僕が解いた問題、そうでない問題を含めてちょっとまとめてみようかなということを(モチベーションが続けば)やってみようと思います。

途中のスクリーンショットなので全部載ってるかちょっと怪しいですが、問題一覧はこんな感じです。

SECCON CTP 2014 オンライン予選 問題一覧

まず、僕が解いた順でいきたいと思います。朝起きたじてんで結構他の人が解いてたので、まだ手がつけられていなかった”SECCON Wars: The Flag Awakens”をときました。

qr300

Youtubeの動画がわたされるので再生してみましたが、どこがQRコードに関係するのかさっぱり…

seccon_tube1

なんどか見返してると、SECCONのロゴの下にQRコードが流れているではないですか!

seccon_tube2

さっそくPhotoshopでフレームをレイヤーにして取り込み、境界線でわかりやすいようにして、少しずつ復元していきました。

qrps

で、復元したQRコードをZXingにかけて、デコードすればおしましです。

qr300

さくらのVPSでつくるHAクラスタ(その1)

ここ最近,Zabbixが動いてるサーバが止まって,障害がおきてることにすら気づかなかったり…,と冗長化しないとなぁと思うことが増えたので,Heartbeat + Pacemaker + DRBD + OCFS2 + LXC をつかってさくらのVPS二台で冗長化する構成を構築してみました.ほかのところでも使えると思うので,メモも兼ねて書いておこうと思います.

Pacemakerで管理するリソースは次のようになります.

  • LXCからインターネットに出る際のゲートウェイIPアドレス(仮想IPアドレス)
  • LXCにIPアドレスを配布するDHCPサーバとローカル用DNSサーバ(Dnsmasq)
  • DRBD
  • ファイルシステムOCFS2のマウント
  • LXCコンテナの起動

これだけ設定するとPacemakerのリソースモニタはこんな感じになります.

リソースモニタ

0 はじめに

これを実現するまでに,次の手順を踏みました.

  1. さくらのVPSを2台,同一リージョンで契約
  2. Ubuntuのインストール
  3. ローカル接続を使って2台のVPSを接続
  4. LXC用のブリッジインターフェースの作成と接続
  5. HeartbeatとPacemakerのセットアップ
  6. DRBDのセットアップ
  7. OCFS2のセットアップ
  8. LXCのセットアップ
  9. Dnsmasqのセットアップ
  10. アプリケーションの用途毎のコンテナの作成とNAPT等の設定

結構長くなると思うので,いくつかの記事にわけようと思います.

1 さくらのVPSの契約

まずはさくらのVPSを借りないと始まらないので,契約します.このときローカル接続するために同一リージョンで契約します.
また,データベース等,ディスクアクセスが多いアプリケーションを稼働させる場合にはSSDプランを選択したほうが良いと思います.

さくらのVPSプラン一覧

SSDプランの時点で石狩DC確定ですね.SSD 2Gプランを2台用意しました.

と,ここで出かける時間になったので続きはその2で.

RTX1200でDHCPとDDNS

自宅のネットワークの上流にはRTX1200が居るのですが,DHCPサーバや,静的なレコードを登録できるDNSサーバになれるので,DHCPサーバとかDNSサーバを別途立てるのはめんどくさいけど,或る程度細かく設定したいという場合に大変便利です.

しかし,DHCPとDNSが互いに連携していないので,DHCPで配布したアドレスをホスト名で名前解決をすることはできません.

そこで,LuaスクリプトでSYSLOGを監視し,DHCPでIPの払い出しを行ったら,show status dhcp summaryからホスト名を検索し,静的DNSレコードを自動で登録するようにしてみました.

公式のサンプルのおかげで初めてでもあっという間にできました.

--[[

  ●DHCPによるDDNS
  DHCPDのSYSLOGを監視し、検出したら当該のホスト名とIPアドレス対を
  静的DNSレコードとして登録

]]

--------------------------##  設定値  ##--------------------------------

-- 検出したい SYSLOG の文字列パターン
ptn = "%[DHCPD%]"

-- MACアドレス検出の文字列パターン
ip_ptn = "%d+%.%d+%.%d+%.%d+"
mac_ptn = "%x%x:%x%x:%x%x:%x%x:%x%x:%x%x"
base_dn = "hogehoge.local"

-- 出力する SYSLOG のレベル (info, debug, notice)
log_level = "info"        -- ★

------------------------------------------------------------
-- ホスト名検索                                             --
------------------------------------------------------------
function search_host_by_mac(mac)

        rtn, str = rt.command("show status dhcp summary")
        ipaddr, host = string.match(str, "("..ip_ptn.."):%s+"..mac..",%s+([%a%w%p]+)")

        return ipaddr, host
end

function search_host_by_ip(ipaddr)

        rtn, str = rt.command("show status dhcp summary")
        host = string.match(str, ipaddr..":%s+([%a%w%p]+)")

        return ipaddr, host
end

------------------------------------------------------------
-- メインルーチン                                         --
------------------------------------------------------------
local rtn, str
local buf

while (true) do
        rtn, str = rt.syslogwatch(ptn)
        ip,mac = string.match(str[1], "("..ip_ptn.."):%s+("..mac_ptn..")")
        if (mac) then
                ipaddr, host = search_host_by_mac(mac)

                if (host == nil) then
                    ipaddr, host = search_host_by_ip(ip)
                end

                if (host) then
                        buf = host .. "@" .. ipaddr
                        rt.syslog(log_level, "[Lua] Host detect " .. buf)

                        rt.command("no ip host "..host.."."..base_dn)
                        rt.command("ip host "..host.."."..base_dn.." "..ipaddr)
                        rt.command("clear dns cache")
                end
        end
end

このスクリプトをschedule at 2 startup * lua /dhcp_ddns.luaのように自動実行するようにしておけば,hostname.hogehoge.local等の名前解決ができるようになります.

居なくなったホストの削除が無いので流動的な環境では一定期間で削除するような処理が要るかも…

こうやって拡張出来るのがいいですねー

  • ホスト名に数字が含まれていると途中で切れる問題を修正しました
  • ホスト名登録後DNSのキャッシュをクリアするようにしました

とびだせ!QRコード

とびだせ!QRコード

お久しぶりです,関西電力計画停電配信システムの紹介から5ヶ月,全く何も更新してませんでした.すいません.

で,今回は新しく開発したサービス「とびだせ!QRコード」を紹介します.

11月に任天堂から発売された3DS用ゲームソフト「とびだせ どうぶつの森」がかなりヒットしているみたいですね.で,ゲームの詳細は省略しますが,このゲーム,以前の作品からですが,看板や,衣装など,自分でデザインする機能「マイデザイン」がついています.

この機能を使うと,例えばこんなかんじで,好きなデザインの服をつくることができます.

マイデザイン

マイデザイン

前作まではここまでなのですが,今作から作った「マイデザイン」をQRコードにして他の人にプレゼントすることができます.

今回の新サービス「とびだせ!QRコード」はこのQRコードを投稿し,みなさんが「マイデザイン」を共有できるサービスです.アクセスはこちらから!

とびだせ!QRコード   トップページ

とびだせ!QRコード トップページ

これまでも,画像を投稿して,画像掲示板のように共有できるサイトはありましたが,タイトルで検索したり,マイデザインを編集できるようなサイトはありませんでした.

そこで,マイデザインのQRコードを解析し,QRコードからタイトルや作った人の名前などを抽出できるようにしただけではなく,タグ付けもできるようにし,できるだけ「マイデザインの共有」に特化した使いやすいサービスにしてみました.

また,投稿だけでなく,画像ファイルからマイデザインを作成する機能もつけてありますので,是非つかってみてください.

編集については,まだタイトルの編集しかできませんが今後デザイン自体の編集も可能にできるようにする予定です.

まだまだできたてのサービスですが,みなさんどんどん投稿して使ってください!

P.S. 3DSに搭載されている「インターネットブラウザ」からも,投稿できます!是非気軽に投稿してみてください.

とびだせ!QRコード(3DSのブラウザ)

とびだせ!QRコード(3DSのブラウザ)

関西電力計画停電(閲覧とWebAPI)

関西電力の計画停電の予定を閲覧できるシステムを作りました.(http://kteiden.chibiegg.net/)

ブラウザから今日・明日の停電予定を見る事ができます.

計画停電予定(サンプル)

計画停電予定(サンプル)

また,JSON.JSONP及びXMLで取得できるWebAPIも用意しています.詳細はこちらをご覧ください.

計画停電WebAPI

計画停電WebAPI

また,これらの情報はTwitter(@kteiden)でも配信しています.「翌日予定」「当日予定」をその都度配信していますのでご活用ください.

 

Seagete ST32000542ASのファームウエアアップデート

自宅のファイルサーバーのHDDのチェックをしていて、たまたま気づいたのですが。

うちで8台利用しているSeagateのST32000542ASのファームウエアが、「突然電源が切れる」「電源が入らなくなる」など、不具合のあるバージョンCC34でした。

恐ろしいので、アップデートすることに。

アップデータのダウンロード

http://seagate.custkb.com/seagate/crm/selfservice/search.jsp?DocId=213915&NewLang=en

このサイトからアップデータCDのISOイメージをダウンロードします。これをCDに焼いて使います。

アップデート

アップデートに利用するPCにアップデート対象のHDDだけを接続し、CDを入れた状態で起動します。この時、USB変換とか使ってはいけません。SATAで直接接続してください。

無事CDから起動すると、READMEが表示されるのでESCを押すと、次のようなメニューが表示されます。

メニュー

メニュー

Lを押すとこのCDが対象としているHDDの型番とバージョンのリストが閲覧できます。

まず、HDDが正しく認識されているか、Sでチェックします。

HDD Scan

HDD Scan

Sを入力してしばらくすると、写真の様に認識されたHDDの一覧が表示されるので型番とバージョンが対象のものである事を確認します。確認できたらESCでメニューに戻ります。

で、メニューからアップデートできれば良いのですが、できないらしいので、「Ctl+C」「y」と入力して、メニューを終了するとプロンプトが表示されます。

コマンド入力

コマンド入力

ここに、写真のように、

FDL486A.EXE -m Hepburn -f HECC358H.LOD -s -x -b -v -a 20

と入力しEnterを入力すると、ファームウエアのアップデートが始まります。ここから完了するまで、電源を切ったり、キーの入力はしないでください。

下のように、プロンプトが表示されれば完了です。

アップデート完了

アップデート完了

「FLASH-M.BAT」と入力すると、メニューに戻れるのでZでシャットダウンしました。