2011-02-27
■[ctf]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は秘密ですが、それを推測する問題ではないです。
あくまでも暗号の問題です。
暇なときにでも考えてみて下さい、ではー
2010-12-24
■[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!!
2010-10-25
■[MacOSX]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の日記を参照
2010-10-24
■[Windows] WindowsでTPMを使ってみる。

WindowsでTrusted_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はめんどくさい


いきなりの質問ですが、勇士Qさんが始めて呼んだハッキング関連の本って何ですか?
デフコンには関心があったのでとりあえずおめでとうございますと書いておきますb