バランスを取りたい

よくCTFの記事を書きます

CSAW CTF 2013 Reversing 150 Write-up

f:id:xrekkusu:20130923123414p:plain

見た感じ.NETのアセンブリだからとりあえずILSpyで開いてみます。


f:id:xrekkusu:20130923123205p:plain



あっ…(察し)



なんて騒いでないで.NETの知識を使ってガンガン進んでいきましょう。


Submitボタンを押すとClickイベントが走るのでそこに何かがあるはずです。

Clickイベントといえば (object sender, EventArgs e)ですね。

private void eval_ᜀ(object obj, EventArgs eventArgs)
{
	string strB = null;
	Assembly executingAssembly = Assembly.GetExecutingAssembly();
	ResourceManager resourceManager = new ResourceManager(executingAssembly.GetName().Name + ".Resources", executingAssembly);
	DateTime now = DateTime.Now;
	string arg_65_0 = this.eval_ᜀ.Text;
	string value = string.Format("{0}", now.Hour + 1);
	string text = "NeEd_MoRe_Bawlz";
	this.eval_ᜀ(text, Convert.ToInt32(value), ref strB);
	if (string.Compare(arg_65_0.ToUpper(), strB) == 0)
	{
		this.eval_ᜂ.Text = "";
		this.eval_ᜀ(this.eval_ᜀ(107));
		this.eval_ᜁ();
		this.eval_ᜂ.Text = string.Format(this.eval_ᜂ.Text, this.eval_ᜀ(resourceManager));
		this.eval_ᜃ.Image = (Bitmap)resourceManager.GetObject("Sorry You Suck");
	}
	else
	{
		this.eval_ᜃ.Image = (Bitmap)resourceManager.GetObject("Almost There");
		this.eval_ᜀ();
	}
}


if(string.Compare(...))なんてのが見えます。
この条件をtrueにすればフラグが表示されそうです。


ifの1行前を見ると、ref付きで何かの関数に処理を投げています。

private void eval_ᜀ(string text, int num, ref string ptr) {
  int num2 = 0;
  if (0 < text.Length) {
    do {
      char c = text[num2];
      int num3 = 1;
      if (1 < num) {
        do {
          c = Convert.ToChar(this.eval_ᜀ(Convert.ToInt32(c), num3));
          num3++;
        }
        while (num3 < num);
      }
      ptr += c;
      num2++;
    }
    while (num2 < text.Length);
  }
  ptr = this.eval_ᜀ(ptr);
}

中盤、終盤のevalはそれぞれこんな感じになってます。

private int eval_ᜀ(int num, int num2) {
  return (new int[] {
    2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113
  })[num2] ^ num;
}
private string eval_ᜀ(string s) {
  byte[] bytes = Encoding.ASCII.GetBytes(s);
  return BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(bytes)).Replace("-", "");
}


NeEd_MoRe_Bawlzを暗号化した文字列と、ユーザーから入力された文字列が一致してればいいみたいな空気です。
しかもそれは1時間ごとに変わるらしい。


ということなので手っ取り早く上のコードをうまく繋ぎあわせて入力すべき文字列が表示されるようなプログラムを作ります。



そしてフラグをゲットします。

f:id:xrekkusu:20130923131456p:plain



でもこのフラグは通りませんでした…


というのも、途中に出てくるNeEd_MoRe_BawlzをGoogleで検索すると大量のideoneがヒットして、そこを見るだけで解けてしまうっぽいです。


[追記]

実際は元の文字列が文字化けして????????...なってたのをコンバートした結果?????...のハッシュ値になってしまっていたという情報。

通らないからここからもう一捻りかと思って調べたら?????...のハッシュであることは理解してたんだけどねえ…。

======


なので"If your key isn't working PM ColdHeat on IRC"に従ってPMを送ってみると、


"how did you get the key?"


あっ…あっ…(英語ができない)


"i used ILSpy"

"describe more. go in depth"


あっ…あっ…



ってな感じで時間かけてやりとりした結果30分後にフラグを入手、150ポイントが手にはいりました。



というわけで "how did you get the key?" に対する答えでした。

WordPressへの大規模攻撃のまとめ

追記しました

@KOBA789版のまとめを参照の上この記事を読むことをおすすめします。


バージョンが最新版の3.6でも不正アクセスが発生していることを考えると、
未修正の脆弱性に対するゼロデイ攻撃、もしくはWordPressのバージョンに縛られない箇所からの攻撃であると考えられる。


ロリポップの情報によると、 http://lolipop.jp/info/news/4149/
この攻撃の対策にwp-config.phpパーミッションを400にして一般ユーザーからのファイル読み込みを防止した模様。


この情報が出た時間帯に攻撃が一度止むも、つい先程(11:30過ぎ)からまた攻撃が再開されている。
wp-config.phpパーミッションが変えられても攻撃が続行されているところが気になる。


とまぁここらへんで時間がなくなったので突然のおわり。


帰ってきたら解決してるといいですね


----


中途半端に投げておくのもアレなのできちんとまとめます。


攻撃対象はロリポップに集中しているようなのでロリポップメインの話になるかと思います。


ロリポップにて逐次情報が発信されています。
「ロリポップ!レンタルサーバー」ユーザーサイトへの第三者による大規模攻撃について


19:33時点の情報によると、午前中に確認された被害件数よりも更に多くの被害が確認されたそうですが、HACK DB等を見る限り情報の追加も止まっているようなので攻撃は止んだと思われます。


攻撃の状況について

/wp-login.phpに対するブルートフォース攻撃が確認されています。
ブルートフォースの頻度は様々であるものの、十分な強度を持ったパスワードを攻略するほどの試行回数には見えません。


パスワードの強度が弱かったアカウントが不正アクセスの被害に遭っているだけであるならば、管理者の問題だということで終わってしまうのですが、これだけ大規模となると他に何かあるのではないかと考えるのが自然だと思います。


データベースへのクラッキングの噂

@KOBA789 の指摘にもある通り、一部にはロリポップ以外のサーバーが含まれていることと、
基本的にレンタルサーバーでは外部からのアクセスを拒否しているはずなのでこの可能性は低いと考えられます。


ロリポップ公式のwp-config.phpパーミッション変更について

最初に不正アクセスを受けたアカウント上のwp-config.phpパーミッションが変更されました。
不正アクセスを受けてから変更したところであまり効果がないような気もしますが、
サーバー上のすべてのWordPressのwp-config.phpパーミッションが変更された頃からは攻撃の情報が少なくなったように思います。


この対策がどう働いたかは詳しく分からないものの、サーバーを管理している側が講じた対策なので、
不正アクセスの原因はwp-config.phpが何らかの方法で読み出されたことが原因であるのかもしれません。




妄想

(※あくまでなんとなく思いついたことをくっつけただけなので完全な妄想です。)

この一連の問題では、wp-login.phpへのブルートフォース攻撃やwp-config.phpパーミッション変更という対策が取られているため、これらの事実を強引につなげると、

WordPressへのブルートフォース攻撃をして、成功したアカウントから他ユーザーのwp-config.phpを読みだして他のWordPressへと広がっていく

ような攻撃の形式だったのかもしれません。

誰かロリポップのどのサーバーに攻撃が集中してるとか調べたりしてないのかなあ。

Project EulerをC#+LINQで解くだけ。

数学ガール1巻買いました。読み終わりました。


以前友人に借りてサクッと読んでたので、ストーリーはなんとなく覚えてたんですが、
サクッと読んだだけあってやっぱり数式の部分では忘れてるところが多かったので、新鮮な感じで読めました。


その中でオイラー先生の話が度々登場してて、そういえばProject Eulerなんてのがあったなあと思ったので、C#+LINQでProblem1,2を解いてみました。


Probrem 1

問題:1000未満の自然数で3または5で割り切れる数の総和を求めよ

int ans = Enumerable.Range(1, 999)
	.Where(x => (x % 3 == 0) || (x % 5 == 0))
	.Sum();
Console.WriteLine("The answer is " + ans);

LINQだけでサクッと書けて良い感じ。



Problem 2

問題: 400万以下の範囲のフィボナッチ数列で値が偶数の項の総和を求めよ。

long ans = Util.GetSequence(1, 1, (x, y) => x + y)
	.TakeWhile(x => x <= 4000000)
	.Where(x => x % 2 == 0)
	.Sum();
Console.WriteLine("The answer is " + ans);
public static class Util {
	public static IEnumerable<long> GetSequence(long first, long second, Func<long, long, long> relation) {
		Queue<long> q = new Queue<long>(new long[2] { first, second });
		while (true) {
			long n = q.Dequeue();
			q.Enqueue (relation(n, q.Peek()));
			yield return n;
		}
	}
}


LINQだけじゃ数列は生成できないので3項間漸化式から値を順番に返す関数を作ってUtilに突っ込みました。
ついでに2項間漸化式のも作ったり。

数列が生成できたら400万以下まで取得して奇数潰してSumするだけですね。


Problem 3以降…

素数問題がバリバリ出てきてるので素数列を生成する綺麗なコードが書けるまで保留。

春季将棋大会まとめ

いろいろと放出したいことがあるからここに書こう。


1日目、団体戦。


優勝校が全国大会に出られるガチ勢向けのA級に先鋒として参加。


2回戦で優勝校と激突してトーナメント敗退。

その後敗者リーグ(C級)で2戦して、チーム成績は2勝2敗、個人成績は3勝1敗。


A級にエントリーしただけあってうっかり出来ない対局ばかりでした。

負けた1局はうっかりして金銀の両取りと角成が受からない状況になって残念感半端ない感じに。




2日目、個人戦B級。


前大会とルールが変わってB級内1~3組とあったのが全部くっつけて124人が戦う方式に。

と言ってもスイス式だから5戦となると大体32ずつ切れてて変わってない気がした。


第1局からあっさり勝たせてくれるという感じじゃなくて、苦しい展開が続く将棋がずっと続いてて、
自分の知ってるB級じゃない!って数えられないくらい連呼してました。


結果はなんとか4勝1敗、B級内順位は5位と苦しい将棋が続いたお陰で最終順位はよい感じになりました。
(勝数が同じ場合は相手の勝数を考慮するため)



以下各対局の一言まとめを覚えている範囲で書いて、それを反省として終わりにします。

団体戦

A1: はっきり言ってしまえば相手の団体が弱かったという感じ。団体で全勝。


A2:
前述したように優勝校と当たる。大将と先鋒が兄弟でめちゃくちゃ強い。
序盤は自分ペースだったものの凡ミスをして一気に形勢がゴミになった。


C1:
前にも対局したことのある相手。速攻で位を取ってくるタイプだったため、
途中で明らかな劣勢になるも下段に飛車がいることに気づかず相手が角をうち数手後に相手は投了。


C2:
大将が個人で全国出場しているチーム。
相手の攻めを受け流しうまく反撃することが出来たが、しっかりと受けられていたら切れ勝ちを狙うしか無くなっていたと思う。お互いが認めるいい将棋だった。


個人戦

1:
あとの対局がキツすぎてあんまり覚えていない。右玉でうまく立ち回っていたら時間が切れて勝った。


2:
対矢倉。角銀交換して53銀打の筋で、金で桂馬を払うという一番警戒していた手を指され、一気に劣勢に。

中飛車打から詰み筋があったのに途中で詰まない筋に流してしまったためそのまま負けた。


3:
1勝1敗の成績でなぜか2勝の成績の人と当たって焦る。

一直線に右四間にしてきたため、こちらは四間に振ってから右玉を目指したが相手の攻めが圧倒的に早かった。
しかし、相手が天守閣美濃に組んでいたため終盤の詰まされるギリギリから長い連続王手の末勝利。時間も無かったため一番苦しんだ一局だった。


4:
先手番+対四間という今の自分がかなり得意にしているタイプの相手。
ガッチリ棒金が決まったのかな?(忘れた)危なげなく勝てた一局。


5:
先手番+対向かいとこれまた棒金でなんとかなりそうな組み合わせ。中盤初めまでは相手の持ち駒がほぼ無く、行けると思っていたらその油断のせいか攻めがかなり深いところまで入ってきてしまった。

間一髪で龍を追い返してからは、自玉に危機が迫ること無くなんとか勝てた。




とまあここまで書いてみると危なっかしい将棋しかしてないことがよくわかります。


右玉は相手の攻めがうまく繋がらなくて切れたところからカウンターするイメージなのに攻めを切らすのに苦戦していてまだまだ難しいなという感じでした。


ただ電王戦があったくらいのころからモチベーションが一気に上がって将棋ウォーズをしまくったおかげで、右玉の駒の立ち回りがやっと体に染みこんできた気がします。


あとはなぜか個人最終局を指した相手の高校が自分の右玉が最強戦法だと勘違いしたらしく全力で対策するとか騒いでいてめっちゃ面白かったですね。

確かに普通の本じゃ見かけない戦法だし対策しなきゃと思うのは普通の考えなんですがね…。

セキュリティキャンプ2012いってきた

ずっとキャンプの感想書けてなかったのでそろそろ書きます


コミュ障だからキャンプ初日のランチセッションのうちに知り合いと合流して耐性つけようと思ってたのにまさか雨が降るなんて。


9割揃ってる状態のところにそろそろと静かに入って静かに座ったけどパッと見知ってる人がいない。
そして目が悪いから半径5mくらいしか人物の認識ができない。


そしてそれなりに進んで休憩が入った頃にそれっぽいなーと思ってたすのーの方に接近してみた。




ばれた。




それからあおたんとか枠の人とかスリッパとかがじわじわと集まり始めたっぽいんだけど、
そのときは大体誰がなんだかわからなかったし、スリッパは普通に高校生っぽくみえた


まぁそんなこんなで1日目はどうにかなったらしい。
途中すっごい眠くてみむらさんにミンティアもらったけど。



2日目からはクラス別の講習。
例年キチガイみたいなXSSをはせがわさんが見せてくれるかなーと思ったら


_人人人人人人人人人人_
> 突然のハッカソン <
 ̄^Y^Y^Y^Y^Y^Y^Y^Y^ ̄


テーマはもちろんXSSで、
XSS検査システムを作ってもいいし、XSS Challengesみたいのを作ってもいいし、XSS対策のライブラリ作ってもいいよ、
みたいなことを言われる。



というか既にXSS検査システム作ってる人がいた。こわい



数人で開発するらしいのでそれっぽく分かれた結果、巨大な6人グループが誕生。


XSS対策はSQLi等の他の脆弱性を対策するよりも大変であることから、
まずはXSSに興味を持ってもらい、どんな対策をすればいいかを示すサイトを作ろう、ということに決まる。


これ、すっげー大変



分かりやすいサンプルコードとその解説が求められるし、
人に見てもらうっていう都合上、体裁もしっかりしないと読んでもらえない。



その上XSSを体験してもらおうっていうページを作るのに引退プログラマーの自分がPHPと奮闘してたり、
gitが使えない上にコミットメッセージがカオスな人がいたり、(ex. git commit -m 'いろいろ' )


関係ないところで時間を浪費しました。


多分今年中に公開するんじゃないかな。
それ過ぎたらみんなモチベどっか行ってるだろうしきっと消滅する。


CTFでは何故かスタート直後に変なロックが掛かってすごい腹立った。


おかげさまでfirst prizeとか2問しか取れてないからね!


ロックされたときなんかどっかがfirst prize取ったら一定時間ロックされんのかなーとか思ってたんだけど、
聞いた話によるとブルートフォースとかの違反行為を行ったらロックされるらしいです。


それで開始1時間だかそれ以上経った頃に運営からロックを強制解除してもらったものの、
あんまり答え送信しすぎたらヤバいっていう恐怖心からすっごい慎重に入力したり、
3回くらい失敗してるし時間あけてまたやるか、とかやったり普通にしてました。



が終了後、某氏に聞いてみたところ、


「え、俺すげー速度で送信しまくってたよ」


との返事。



一体なんだったんだろうあの苦労は。


あとはUSBメモリ探す奴で全然見つからなくて放置したり。


最後の1つは他チームの電源タップの裏に付いてたから近づいたら妨害行為になるし、講師の人に教えてもらわなかったら絶対無理だった。



そして最終日には各自がやったことを発表するということで、
雷のタイミングのいい効果音の中発表したり発表を聞いてたりしました。



休憩時間にちょっと歩きまわると、どう考えてもCTFの景品なHHKBとか、
ウイルスバスターだとかが陳列されてて、1つくらいパクりたかったなー、と。


まぁ全員に技術書/雑誌が3冊限定で本の山の中から面白い本を見つけだして逃げるゲームが行われて、
それなりの収穫はあったので満足してます。



以上がセキュリティキャンプの勝手なまとめです。


※このエントリは9月に書いた下書きに少し手を加えたものです