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でシャットダウンしました。

Can you crack it?

Can you crack it? クリア

イギリスの政府通信本部(GCHQ)が現在採用活動の一環として、「Can you crack it?」と題して暗号解読クイズページを公開しています。

イギリス人であればこれをクリアするとエントリーフォームからエントリーできるみたいです。

Can you crack it?

Can you crack it?

で、先日大学の友達と相談しながらクリアしました。

Can you crack it? クリア

Can you crack it? クリア

実はこれ、表示されてる問題をクリアしたと思ったらstage 2 of 3が出て来ます(笑)。

面白かったので、解答までの流れをブログに書きたいのですが、期日まであと1日ちょっとあるので、その後にします。

stm32f10x_can.c のバグについて

前回の投稿と打って変わって組込系の話題を。

最近STM32でCANとか使っているのですが、時々送信に失敗してしまうという問題がありました。

たまになので問題ないのですが、気になったので調べてみるとSTMicroが用意しているSTM32F10x standard peripheral libraryのバグでした。バージョンは04/16/2010 のV3.3.0と古いやつですが。

具体的に言うと、現在送信しようとしているメッセージの状態を確認する関数

CAN_TransmitStatus にあります。

ここでは CANxのTSRレジスタのTSS_RQCP0、TSR_TXOK0、およびTSR_TME0ビットの値を見て、

CANTXPENDING(送信中)、CANTXFAILED(失敗)、CANTXOK(成功)を返しています。

が、こんな風にレジスタにアクセスするようなコードになってます。

switch (TransmitMailbox)
  {
    case (0): state |= (uint8_t)((CANx->TSR & TSR_RQCP0) << 2);
      state |= (uint8_t)((CANx->TSR & TSR_TXOK0) >> 0);
      state |= (uint8_t)((CANx->TSR & TSR_TME0) >> 26);
      break;
    case (1): state |= (uint8_t)((CANx->TSR & TSR_RQCP1) >> 6);
      state |= (uint8_t)((CANx->TSR & TSR_TXOK1) >> 8);
      state |= (uint8_t)((CANx->TSR & TSR_TME1) >> 27);
      break;
    case (2): state |= (uint8_t)((CANx->TSR & TSR_RQCP2) >> 14);
      state |= (uint8_t)((CANx->TSR & TSR_TXOK2) >> 16);
      state |= (uint8_t)((CANx->TSR & TSR_TME2) >> 28);
      break;
    default:
      state = CANTXFAILED;
      break;
  }

これでは、レジスタに3回アクセスしてしまっており、アクセスとアクセスの間でレジスタの値が変わってしまうと変なstatusになってしまいます。その結果 default で CANTXFAILED がセットされてしまうというのが送信失敗の原因です(実際にはこの瞬間に成功しているが、失敗したと判断してしまう)。

最も修正量の少ない解決策は簡単で、CANx->TSRの値を一旦変数に入れてやればいいのです。

uint32_t _tsr =  CANx->TSR;
switch (TransmitMailbox)
  {
    case (0): state |= (uint8_t)((_tsr & TSR_RQCP0) << 2);
      state |= (uint8_t)((_tsr & TSR_TXOK0) >> 0);
      state |= (uint8_t)((_tsr & TSR_TME0) >> 26);
      break;
    case (1): state |= (uint8_t)((_tsr & TSR_RQCP1) >> 6);
      state |= (uint8_t)((_tsr & TSR_TXOK1) >> 8);
      state |= (uint8_t)((_tsr & TSR_TME1) >> 27);
      break;
    case (2): state |= (uint8_t)((_tsr & TSR_RQCP2) >> 14);
      state |= (uint8_t)((_tsr & TSR_TXOK2) >> 16);
      state |= (uint8_t)((_tsr & TSR_TME2) >> 28);
      break;
    default:
      state = CANTXFAILED;
      break;
  }

こんな風に。

で、最新のV3.5.0ではちゃんと修正されてました。

switch (TransmitMailbox)
  {
    case (CAN_TXMAILBOX_0):
      state =   CANx->TSR &  (CAN_TSR_RQCP0 | CAN_TSR_TXOK0 | CAN_TSR_TME0);
      break;
    case (CAN_TXMAILBOX_1):
      state =   CANx->TSR &  (CAN_TSR_RQCP1 | CAN_TSR_TXOK1 | CAN_TSR_TME1);
      break;
    case (CAN_TXMAILBOX_2):
      state =   CANx->TSR &  (CAN_TSR_RQCP2 | CAN_TSR_TXOK2 | CAN_TSR_TME2);
      break;
    default:
      state = CAN_TxStatus_Failed;
      break;
  }

一度でアクセスするようになってます。でも返値変わってて、最新版に置き換えるのは大変そう…