勇士Qの日記 このページをアンテナに追加 RSSフィード

2011-02-27

[]X'masのやつのヒント的なもの 18:04 X'masのやつのヒント的なものを含むブックマーク X'masのやつのヒント的なもののブックマークコメント

Kernel/VM Advent Calendar 18日目: CTF 暗号問題 - 勇士Qの日記のやつを誰も解けてないのでヒントとしてソースコードの一部を挙げて見る。

secret = '??????????'

cookie = Cookies(self)
webauth = urllib.unquote_plus(cookie[key])
if webauth.count('|') == 1:
    tmp, hash = webauth.split('|')
    id = base64.b64decode(tmp)
    if id.count('|') == 1:
        user, role = id.split('|')
        if hashlib.sha1(secret + id).hexdigest() == hash:
            if user != 'admin':
                self.response.out.write('adminでログインしてください')
                return
            else:
                if role == '0':
                    self.response.out.write('admin権限がありません')
                    return
                else:
                    self.response.out.write('ANSWER!!!!!!!')
                    return
    self.response.out.write('無効なCookieです')

見て分かる様に、roleを0以外にしてハッシュ値を一致させるだけの簡単な問題ですね!

あとsecretは秘密ですが、それを推測する問題ではないです。

あくまでも暗号の問題です。

暇なときにでも考えてみて下さい、ではー

トラックバック - http://d.hatena.ne.jp/ucq/20110227

2010-12-24

[] Kernel/VM Advent Calendar 18日目: CTF 暗号問題 00:35  Kernel/VM Advent Calendar 18日目: CTF 暗号問題を含むブックマーク  Kernel/VM Advent Calendar 18日目: CTF 暗号問題のブックマークコメント

この記事はカーネル/VM Advent Calendar : ATNDのネタです。


すっかり放置してたCTFの復習 - 勇士Qの日記ですが、ログを見た感じ誰も解いてないしクリスマスプレゼントがてら問題として出題してみようと思います。

解答はすでに用意できてるので来月のはじめには公開しますね。

はじめに

まず、http://ucq-ctf.appspot.com/crypto/アクセスしましょう。

ログイン画面っぽいので、とりあえず「guest」とでもいれてみてください。無事にログインできるかと思います。

そして、このページをもう一度開いてみましょう。「adminでログインしてください」と言われます。

adminでログインしたいとこですが、ログアウトできないので、ログイン状態を保持してそうなCookieを削除しちゃいましょう(べ、べつにログアウトボタンないのは手抜きなんかじゃないんだからね!)。

再度、ログインできる状態になったので「admin」でログインを試みると成功しちゃいますが、まだクリアじゃないです。開き直すと今度は「admin権限がありません」と言われます。まだ続きがあるようです。

権限ってなんだろと思って、先ほど何気なく削除したCookieの中身をみると、なにやら怪しい、Base64っぽい文字列ハッシュ値が・・・

試しにBase64デコードしてみると「admin|0」と見えます。「0」というのが気になりますね、先ほどのメッセージからこれはadmin権限のフラグじゃないかなーとピンときますよね!

ハッシュ値の方もやってみましょう。長さ的にsha1っぽいので、「admin|0」やら「admin」などでいろいろ試してみて下さい。しかし、おそらくヒットしないことでしょう。

でも、ここまでくれば何をすればいいのかだいだいわかるかと思います。


問題

「admin権限を取得しフラグをゲットせよ!」

ヒント:ハッシュ値の計算は「sha1(secretkey+"user|privilage")」のsalt付きハッシュ値です。privilageはadmin権限のこと。secretkeyはもちろん秘密☆

Happy Merry CTF!!

トラックバック - http://d.hatena.ne.jp/ucq/20101224

2010-10-28

[]もっと簡単に/dev/kmemが使えた件について 17:12 もっと簡単に/dev/kmemが使えた件についてを含むブックマーク もっと簡単に/dev/kmemが使えた件についてのブックマークコメント

前回Mac OS Xに/dev/kmemを追加してみた(追記あり) - 勇士Qの日記なんて記事を書きましたが、もっと簡単にできることに気づきましたorz

ブート時の引数にkmem=1というのを追加すると使えるようになるみたいです。


sudo nvram boot-args="kmem=1"

で追加してrebootしてやると、/dev/kmemと/dev/memが使えるようになってます。

うろたんけじんもつやうろたんけじんもつや 2010/11/24 23:36 新聞の記事読みました。
いきなりの質問ですが、勇士Qさんが始めて呼んだハッキング関連の本って何ですか?

VARRELVARREL 2010/11/25 01:03 俺も朝日新聞で見ました
デフコンには関心があったのでとりあえずおめでとうございますと書いておきますb

トラックバック - http://d.hatena.ne.jp/ucq/20101028

2010-10-25

[]Mac OS Xに/dev/kmemを追加してみた(追記あり) 23:46 Mac OS Xに/dev/kmemを追加してみた(追記あり)を含むブックマーク Mac OS Xに/dev/kmemを追加してみた(追記あり)のブックマークコメント

ここのKernelMemoryAccessを使って/dev/kmemを導入してみた時のメモ。

情報が古いこともあり、そのままではコンパイルできないので少々手を加える必要があるので忘れうちに書いとく。


まず、http://www.osxbook.com/book/bonus/chapter8/kma/から KernelMemoryAccess-1.0.tar.gzを、

http://www.opensource.apple.com/release/mac-os-x-1058/からxnu-1228.15.4.tar.gzをそれぞれダウンロードしましょう。最新のバージョンのxnuだとコンパイルできないので注意

xnuのバージョンが大事です。これで結構はまりました・・・

それぞれ適当な場所に展開したあと、KernelMemoryAccessを展開したフォルダにあるKernelMemoryAccess.cの25行目を先ほど置いたxnuのパスに変更します。

ここまでくればあとはサイトの通りにやればビルドできるのですが、環境によってはsdkのバージョンでエラーになるようなので適当に変更してあげて誤摩化しちゃいましょう。

例えば以下のような感じでやればおk。

$xcodebuild -configuration Release -sdk macosx10.5
$cp -pr build/Release/KernelMemoryAccess.kext /tmp
$sudo chown -R root:wheel ~/tmp/KernelMemoryAccess.kext
$sudo kextload -v ~/tmp/KernelMemoryAccess.kext

これで正常に読み込まれれば、/dev/kmemが見えてるはずです。

いじょ。



おまけ

せっかくなのでSYNjuku-ACK1h4baraに書いてあるnsysentでも覗いてみます。

$sudo dd if=/dev/kmem bs=1 count=4 skip=8591344|hexdump -C
4+0 records in
4+0 records out
4 bytes transferred in 0.000025 secs (159783 bytes/sec)
00000000  b2 01 00 00                                       |....|
00000004

おんなじものが見えた!やったね!



追記:

より簡単に導入したい場合はもっと簡単に/dev/kmemが使えた件について - 勇士Qの日記を参照

トラックバック - http://d.hatena.ne.jp/ucq/20101025

2010-10-24

[] WindowsTPMを使ってみる。 14:58  WindowsでTPMを使ってみる。を含むブックマーク  WindowsでTPMを使ってみる。のブックマークコメント

WindowsTrusted_Platform_Moduleを扱うAPIとかないかなーと思って探してみたら、 TPM Base Services (Windows) と呼ばれるAPIで操作が出来るようなので、簡単なコードを書いてみました。

TPM仕様書はここらへん→ http://www.trustedcomputinggroup.org/resources/tpm_main_specification


TPM_GetRandomを使用して、乱数を取得するだけの簡単なコードです。

このAPIはWindws Vista以降で使用可能で、管理者権限がないとTbsi_Context_Createでこけるので注意。

あらかじめTPM初期化する必要があるようで詳しくはGoogleにでも聞いて下さい。


#include <windows.h>
#include <tbs.h>
#include <tchar.h>
#include <stdio.h>

#define OFFSET 14

int _tmain(int argc, TCHAR** argv) {
	TBS_CONTEXT_PARAMS ContextParams;
	TBS_HCONTEXT hContext;
	TBS_RESULT tRet;

	if (argc != 2) {
		_tprintf(TEXT("Usage: %s bytes\n"), argv[0]);
		return 1;
	}

	UINT8 bytesRequired = _ttoi(argv[1]);

	//TPM_GetRandom
	BYTE data[] = {
		0x00, 0xc1,			// TPM_TAG_ROU_COMMANDO
		0x00, 0x00, 0x00, 0x0e,		// Total number of input bytes including paramSize and tag
		0x00, 0x00, 0x00, 0x46,		// Command ordinal, fixed value of TPM_ORD_GetRandom
		0x00, 0x00, 0x00, bytesRequired	// Number of bytes to return
	};
	BYTE buf[128] = {0};
    UINT32 buf_len = sizeof(buf);

	ContextParams.version = TBS_CONTEXT_VERSION_ONE;

	tRet = Tbsi_Context_Create(&ContextParams, &hContext);
	if (tRet != TBS_SUCCESS) {
		_tprintf(TEXT("Error:%08X\n"), tRet);
	}
    tRet = Tbsip_Submit_Command(
		hContext,
		TBS_COMMAND_LOCALITY_ZERO,
		TBS_COMMAND_PRIORITY_NORMAL,
		data,
		sizeof(data),
		buf,
		&buf_len);
    tRet = Tbsip_Context_Close(hContext);
	
	_tprintf(TEXT("Random Bytes: "));
	for (unsigned int i=0; i < bytesRequired; i++) {
		_tprintf(TEXT("%02X "), buf[OFFSET+i]);
	}
	return 0;
}

エラーチェックはてきとーです。

コンテキストハンドルを作って、コマンド送って、コンテキストハンドルを閉じて、表示という流れです。

コマンドは仕様書の通りのデータを用意してあげて、Tbsip_Submit_Commandで送ってやります。

送信したコマンドの結果はbufに入ってるけど、OFFSETの位置から取得したい乱数のデータが入ってるのでその分だけずらしてます。詳しくは仕様書を。


とまぁ、コマンドを送るのにいちいち仕様書参照しないといけなくて実に面倒なので、libtpmのようなライブラリ使った方がいいかと思います(※自分はつかったない)

結論:TPM Base Servicesはめんどくさい

トラックバック - http://d.hatena.ne.jp/ucq/20101024