2015年11月9日月曜日

SECCON福島大会 サイバー甲子園に参加しました

2015年11月07日(土)に福島の会津で開催されたサイバー甲子園(SECCON予選)に出場しました。10チームが抽選で選ばれ、私(ptr-yudai)のチーム名はinsecureで、theoldmoon0602殿と一緒に参加しました。

結果は2位で決勝の出場権を貰いました。以下が上位3位までの最終スコアです。
 CTF事情を知っている方によると、どうやら1位の方はプロだそうです。
以下は得点の推移です。(上位3チームまでチーム名を残しています)

とりあえず、自分が解いた問題の中で、覚えているもののwriteupを書こうと思います。

binary100
Linuxの32bit実行ファイルが渡されたので、gdbで起動しました。スタックに1を入れて、直後にその値が2より大きいかを調べて分岐しています。setでEIPを変更して続行すると「SECCON{Can Uread me?」と表示されましたが、送信してもポイントゲットならず。色々試して、「SECCON{Can U read me?}」を送ったら正解でした。

binary200:
Linuxの32bit実行ファイルが渡されたので、gdbで起動しました。重要な部分をCっぽく直すと、

gets(s);
for(i=0; i<32; i++) {
  tmp = esp_2C + s[i];
  foo = 0xFF ^ (char)tmp;
  bar = cipher[i];
  if ( bar == foo ) // OK
}


つまり、入力から1文字ずつNOTをとり、それを予め用意されたデータ(cipher)と比較しています。cipherをメモリから出力し、pythonでNOTをとるとフラグになりました。「SECCON{XOR_encryption_message}

network100
パケットデータが渡されます。ファイル無いので覚えてないですが、認証みたいなのがあるので、見るとBase64文字列があります。デコードしたらフラグでした。(たぶん)

network100
パケットデータが渡されます。なんかエラーが連なっているところがあったので、そこらへんのIPの192.168.44.161でSYNフラグが立っている部分をwiresharkでフィルター(ip.src==192.168.44.161 && tcp.flags.syn==1)します。出て来たパケットを上から見ると、各パケットのオフセット0x12に連続してフラグが1バイトずつ書かれていました。「SECCON{Data_is_included_NOT_ONLY_in_payload_but_also_header_field.}

net300
パケットデータが渡されます。wiresharkで見るとメールのプロトコルが使われており、中にいくつか送信されたデータがありました。まず目に止まったのが、何行にもわたるbase64文字列です。メールの添付ファイルだなと思ってデコードすると、zipファイルが出てきます。解凍しようとするとパスワードが求められます。メールの送信データの中にパスワードっぽいフレーズがいくつかあったので、試すと開きました。中にあったファイルはComposite Document Fileというもので、theoldmoon0602殿の助言でLibreで開くと、またパスワードを求められます。これもメール内の別のフレーズで試すと開き、フラグが表示されました。「SECCON{Sending_File_Password_with_Followed_Mail_is_bogus.}


crypt100
「U0VDQ09Oe1VyOXdnbWZZWXh5N2VvOFFnTDJWfQ==」というbase64文字列が渡されるので、デコードすると「SECCON{Ur9wgmfYYxy7eo8QgL2V}」になります。


programming100
turtleとかいうライブラリを使用したpythonのコードが渡されます。windowsのpythonには標準で入っていたので、draw_flag関数を実行すると、亀が絵を書き始めます。ちょっと遅かったので早くし、最後に停止ルーチンを挟むと、国旗が表示されました。theoldmoon0602殿がすぐにミャンマーの国旗であると知らせてくれました。「SECCON{MYANMAR}


web100
アクセスすると同じページがロードされるので、wiresharkで見るとフラグが受信されていました。

web100
ログインページでしたが、何を入力してもサーバー側でエラーになります(出題ミス?)。Fiddlerで見ると、レスポンスの最後にgzipデータがあったので、抽出して展開するとフラグのページが現れました。

misc100
Excelデータの各セルの背景色が色分けされており、SECCONの「突破」マークがドット絵みたいになっていました。Libreで開くと中央らへんに左三角がたくさん並んでいました。調べた結果から、excelのリスト機能と思って調査しました。とりあえず重たいので背景色を全て削除し、リスト内に「#」が書いているところと書いていないところを区別しようと閉じて、再度開くとなぜか三角が減っており、それらがフラグをAAのように表示していました。「SECCON{NIRVANA_KA1}


misc100
「作者は誰か」という問題で、短いアルファベット羅列が渡される。ダブルクオーテーションで囲って調べると、たくさんのサイトがヒット。一番上のサイトを読むと、ベートーベンの楽曲のリズム(だったかな?)であることが判明。形式が指定されていなかったので、いろいろ入力しましたが、最終的にtheoldmoon0602殿が正しい形式で送ってくれました。


感想
CTF歴は1年ちょっとで、SECCON決勝を大きな目標として必死に勉強してきましたが、初の予選で決勝への出場権を貰えて嬉しいです。これからしばらくはAttack&Defenceの勉強をする予定です。
問題はちょうど良い難易度で、CTF4bでの講義が結構役に立ちました。
theoldmoon0602殿のプログラミング力は凄く、何やってるのか分かりませんでした。
まだまだ勉強しないと......

2015年10月26日月曜日

TUMCTFに参加しました

2015年10月24日の22:00(日本時間)から24時間開催されたTUMCTFにオンラインで参加しました。
3人でチームを組んで、睡眠も取って15時間以上は参加できたと思います。
世界から455チームが挑戦して(最低でも244チームは1問以上解いていました)、私達のチームは65ポイントで58位でした。

問題はCrypt, Web, Rev, Recon, Misc, Exploitから各5,6問程度ずつ出ました。今回は、私が解いた問題の内、覚えているwhitebox, bad_appleについてwriteupを書きます。

whitebox crypt - rev - 20[pt]
問題文:
Do not panic, it's only XTEA! I wonder what the key was...
ctf.link/assets/downloads/rev/xtea
問題ファイルをobjdumpで見ると、まずstrlenでargv[1]が16文字かをチェックしています。
そこで適当な16文字を渡していき、ブラックボックス的にテストすると、後半の8文字は出力に影響が無いことが分かりました。
さらに、問題文のXTEAで調べると、wikipediaに辿り着き、これを参考に解析を開始します。
wikiによると、暗号化の途中で sum + key[sum & 3] を行うのですが、keyがバレないように、この値は全て予め書き込まれています。
こんな感じ:
  4005a7:       89 ca                   mov    edx,ecx
  4005a9:       89 c8                   mov    eax,ecx
  4005ab:       c1 ea 05                shr    edx,0x5
  4005ae:       c1 e0 04                shl    eax,0x4
  4005b1:       31 d0                   xor    eax,edx
  4005b3:       01 c8                   add    eax,ecx
  4005b5:       35 68 78 70 7b          xor    eax,0x7b707868
  4005ba:       03 07                   add    eax,DWORD PTR [rdi]
  4005bc:       41 89 c2                mov    r10d,eax
  4005bf:       89 c2                   mov    edx,eax
  4005c1:       c1 e0 04                shl    eax,0x4
  4005c4:       41 c1 ea 05             shr    r10d,0x5
  4005c8:       41 31 c2                xor    r10d,eax
  4005cb:       41 01 d2                add    r10d,edx
  4005ce:       41 81 f2 2e ea 58 1b    xor    r10d,0x1b58ea2e
  4005d5:       45 8d 1c 0a             lea    r11d,[r10+rcx*1]



ということで、この sum + key[sum & 3] にあたる値を収集しました。

そのあと、なぜかこのencipherをC言語で書いたのですが、sumやkeyは入力に影響しないと気付いて、すぐにkeyの計算に取りかかりました。
wikiのdecipherを参考に、
・delta = 0x9E3779B9 で固定。
・sum = delta * num_round でnum_roundは今回の場合32個分あった。
・sum -= delta を繰り返す。
・keyは4要素ある32bit整数の配列
と分かりました。
すぐに解読コードを書きました:
#include <stdio.h>
#include <stdint.h>


int main()
{
  int num_rounds = 32, i;
  uint32_t delta = 0x9E3779B9, sum = delta * num_rounds;
  uint32_t l[64] = {0x7b707868, 0x1b58ea2e, 0xba9ae30, 0x9bd661db, 0x9bd661db, 0x4818a1a2, 0x57c7dda0, 0xf44e5f4c, 0xf44e5f4c, 0x9285d905, 0x84879514, 0x326e4acb, 0x14b448bf, 0xb2ebc278, 0xd0a5c484, 0x5f2e023f, 0x6d2c4630, 0xb63bfe9, 0xfd657bf8, 0xa99b39a2, 0x8d922fa3, 0x4983ab68, 0x4983ab68, 0xca012315, 0xe60a2d14, 0x764362dc, 0x764362dc, 0x147adc95, 0x6701687, 0xc0b09a3f, 0xc261924c, 0x60990c05, 0x5ee813f8, 0xe11683b2, 0xef2149c0, 0x8d58c379, 0x7f4dfd6b, 0x2b903d32, 0x3b3f7930, 0xd7c5fadc, 0xd7c5fadc, 0x77ae6ca, 0x67ff30a4, 0xf82be44f, 0xf82be44f, 0xa46e2416, 0xb41d6014, 0x42a59dcf, 0x50a3e1c0, 0xeedb5b79, 0xe0dd1788, 0x8ec3cd3f, 0x7109cb33, 0xf4144ec, 0x2cfb46f8, 0xad78bea5, 0xc981c8a4, 0x59bafe6c, 0x59bafe6c, 0x5f0bc16, 0xe9e7b217, 0xa5d92ddc, 0xa5d92ddc, 0x2656a589};
 
  uint32_t key[4] = {0,0,0,0};
 
  for(i = 0; i < num_rounds; i++) {
    key[(sum >> 11) & 3] = l[63 - i*2] - sum;
    sum -= delta;
    key[sum & 3] = l[62 - i*2] - sum;
  }

  printf("%08x %08x %08x %08x\n", key[3], key[2], key[1], key[0]);

  return 0;
}


出力結果をasciiにし、エンディアンを直したら、}!pu_gnimr4w{pxhとなりました。
これを逆にして、hxp{w4rming_up!}

bad_apple - Crypt -  15[pt]
問題文:
Baby's 1st

ctf.link/assets/downloads/cry/bad_apple.tar.xz

try:
    ncat 1.ctf.link 1027 < good.bin
expect:
    "hello"
xzにはgood.binとbad_apple.pyが含まれていました。
以下がbad_apple.pyです:
#!/usr/bin/env python3
import sys, binascii
from Crypto.Hash import SHA256

key = open('key.bin', 'rb').read()

message = sys.stdin.buffer.read(0x100)
if len(message) < SHA256.digest_size:
  print('len')
  exit(0)

tag, message = message[:SHA256.digest_size], message[SHA256.digest_size:]

if SHA256.new(key + message).digest() != tag:
  print('bad')
  exit(0)

if b'hello pls' in message:
  print('hello')
elif b'flag pls' in message:
  print(open('flag.txt', 'r').read())
送信されたファイルをハッシュ(tag)と文字(message)に分け、sha256(key + message)とtagの値が等しいことを確認します。
さらにmessageが"flag pls"ならフラグが取得できます。
不明な文字を足してハッシュを取る、というプログラムの時点で頭の中はhashpumpだけだったので、hashpumpを使う方向で解きました。
さて、good.binの中の前半のハッシュは「2628455f6617ecea024895a48578ebce00fa9204983d09b6d1757d05dc430567」で、文字は「hello pls」でした。
これを元に、flag plsを付け足したハッシュを作ります。
keyの長さが分からなかったのでpythonでループしました:
import commands
import binascii
i = 32
for i in range(1, 1024):
    ret = commands.getoutput("hashpump -s 2628455f6617ecea024895a48578ebce00fa9204983d09b6d1757d05dc430567 -d \"hello pls\" -a \"flag pls\" -k " + str(i))
    get = ret.split("\n")
    _hash_ = binascii.unhexlify(get[0])
    data = get[1].decode('string_escape')
    buf = _hash_ + data
    f = open("data", "wb")
    f.write(buf)
    f.close()
    ret = commands.getoutput("nc 1.ctf.link 1027 < data")
    print(str(i) + " : " + ret)
    if ret == "len" : continue
    if ret == "bad" : continue
    if ret == "hello" : continue
    break
32回目でフラグが返ってきましたとさ...。
hxp{M3rkL3_D4mg4rd_h4s_s0m3_Pr0bl3mZ}

全体を通して難しかったです。Web30とRev10とExploit10が解けなかったのが非常に悔しいです。あとは上級者向けが多く、1人〜3人程度しか解いていない問題ばかりで、難易度がすごい分かれていました。
もしかしたら暗号が向いているのかなぁ...

CTFで思ったのは、まず、Reconを予告しておきながら、最後の最後で0[pt]の答え無しのページにした運営に驚きました。あと、web20の問題の答えが後半でIRCに書き込まれたせいか、20[pt]にも関わらず145人もの人が後半でこのポイントを獲得しています。

ちょっと難しかったですが、解けたときは楽しかったです。

2015年10月4日日曜日

Arduino UNOを使ってみた

入門者向けキット付きのArduino UNOの互換ボードを安く買ったので、使用してみました。osoyooという所のを買ったのですが、URLのリンクが切れていました。環境はCent OS 7です。
とりあえず公式サイトからlinux 64bitsのIDEをダウンロードして解凍します。arduinoというELFファイルがあったので、実行したらそのまま動作しました。

Arduino自体が電子回路などの入門者向けで、簡単に回路を作ることが可能です。そのため僅か数時間で液晶ボードに文字を表示させるに至りました。いくつか詰まった点を適当に書いていきます。

まず、IDEはルート権限で起動しないと書き込めませんでした。それから、プロジェクトを「main」という名前にしていたらコンパイルできませんでした。その辺で一旦つまづいたところで、まずはLEDを点滅させる回路を作りました。LEDを13番とGNDに直で繋ぎ、プログラムを書き込みます。
書き込む前にメニューバーの「ツール」->「ボード」みたいなところを選択しておかないといけません。届いたキットにマニュアルは付いていないし、製造元サイトも閉鎖されてたので困りましたが、どうやら普通のarduinoと全く同じ方法でやればいいようです。

void setup() {
  pinMode(13, OUTPUT);
}
void loop() {
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(1000);
}

言語仕様も非常に分かり易いです。コンパイルして書き込みすると、LEDが点滅しました。わーい。
それだけでは物足りなかったので、セットに付いていたI2D 1602 LCDに文字を表示させようと考えました。かなり前にPIC kitとマイコンでやろうとして、一瞬で挫折した記憶があるLCDに挑戦です。
まずはライブラリをいれます。こちらからライブラリをダウンロードして展開します。これを、~/Arduino/にフォルダごといれ、IDEを再起動するとライブラリが使用できます。
その後もいろんなサイトを参考にしながら、
VCC - 5V
GND - GND
SDA - Analog 4
SCL - Analog 5
に接続して、サンプルのHello, world!を書き込みましたが、液晶画面が光だけで何も起こりません。ここで暫く詰まったのですが、いろいろ見ていると、LCDのアドレスとやらを調べないといけないらしいです。こちらのコードを書き込んで、シリアルモニタでアドレスを確認します。サンプルは0x27だったのに対し、自分のは0x3Fでした。これに書き換えて最初のHello, world!を書き込みました。すると、初期化処理で画面が暗くなる反応を見せたものの、文字は表示されません。さらに調べると、裏にコントラスト調整用の部品がありました。これを回転させると文字が表示されました。

最後に作った電光掲示板もどき。初めての言語なので汚いコードかもしれません。使用する際はLCDのアドレスや画面サイズを適宜変更してください。
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

void display(String buf, int y);
LiquidCrystal_I2C lcd(0x3F,16,2);

int offset = 0;

void setup()
{
  lcd.init();
  lcd.backlight();
}

void loop()
{
  lcd.clear();
  display("Hello, world!", 0);
  delay(300);
}

void display(String buf, int y)
{
  lcd.setCursor(16 - offset, y);
  if ( offset > 16 ) {
    lcd.print(buf.substring(offset - 16));
  } else {
    lcd.print(buf);
  }
  offset = (offset + 1) % (16 * 2);
}

参考:
http://arduino.umemoto.org/home/i2c-lcd
http://forum.arduino.cc/index.php?topic=128635.0






2015年9月13日日曜日

ctf4b熊本に参加しました

2015年09月12日(土)に熊本の東海大学熊本キャンパスで開かれた「ctf for ビギナーズ 熊本」に参加しました。55人が参加しており、学生から大人までいろんな人が参加されていました。
WebとNetworkの講習があり、資料や問題としてはBinaryジャンルもありました。
講習では、CTFの問題を解くにあたっての説明や、各種ツールの使い方などを分かり易く説明していただきました。
CTFでは問題を解いたらランプが点灯しブザーが鳴るようになっていたので、ブザーが鳴るたびに焦りました。あとTDUよりは少なかったですが、変な動画も流れました。

さて、この記事ではCTFの方で問題が残っているものや、覚えているもののWriteupをします。
まず、最終のスコアボード:

わたしはptr-yudaiで2位でした。1〜3位までは同得点なので1位という扱いになりました。正直こんなにとれるとは思ってませんでした。

Other

1:練習問題 (100pt)

ctf4b{〜〜}みたいなのが書いてあるので、そのまま送信します。

6:Universal Web Page(笑) (500pt)

php://filterを使うのかと思ったのですが、上手くいかずに諦めました。500ptだからもっと難しいのでしょうが、誰も解けてませんでした。

Web

2:Can you login as admin? (100pt)

定番のSQLiで、「' OR '1'='1」をパスワードとして入力するとadminになりました。1番上をadminにしている作者さん優しいです。

3:Find the flag (200pt)

どんな問題か忘れました。ディレクトリトラバーサルだったかな?

4:1M4G3 V13W3R (300pt)

私の苦手なファイルアップロード問題です。php送ったりタイプをimage/jpegに偽装したりしましたが、できませんでした。ディレクトリトラバーサル等も確認できず、分かりませんでした。

5:SQL Injection Level 2 (400pt)

SQLiですが、ORが使えません。ORを削除していると予想して「' OORR '1'='1」を送ったら通りました。ちなみに正攻法はUNION SELECTする方法です。

Binary
7:matryoshka (100pt)
問題ファイルはこれです。fileコマンドで種類を調べるとisoだったので、mountでマウントすると、flagというファイルが出てきました。flagはzipだったので解凍すると、またflagが出てきました。これはmicrosoft cabinet的なファイルだったので、linuxのファイルマネージャで開くと、またファイルが出てきました。今度はPNGだったので、見ると、フラグが見つかります。

8:読めますか? (200pt) 【たぶんこんなタイトル】

問題ファイルはこれです。PNGファイルなのですが、Linuxでは開けませんでした。(解説のときはフラグがギリギリ見えない画像が映ってました)中身はぐちゃぐちゃだったので、しばらく悩みましたが、stringsでctfを探すとフラグが見つかりました。

9:Jump (300pt)

問題ファイルは後であげます。実行ファイルなのでIDA Proで見ると、argvを確認しているらしき部分がありました。順番に「ctf」「is」「so」「fun」(だったかな?)をチェックしているので、argvだなと思って、引数を指定して起動するとフラグが表示されました。

10:Readit (400pt)

アセンブリが渡されて、結果の数字を答える問題。疑似言語みたいなのに訳して、面倒そうだったので飛ばしたら最後までやりませんでした。
これです:
mov     [ebp+var_4], 0
mov     [ebp+var_8], 0
jmp     loc_40101F

loc_40101F:
cmp     [ebp+var_8], 0C8h
jge     short loc_40103C
mov     ecx, [ebp+var_4]
add     ecx, [ebp+var_8]
mov     [ebp+var_4], ecx
mov     edx, [ebp+var_4]
sub     edx, 0Ah
mov     [ebp+var_4], edx
jmp     short loc_401016
mov     eax, [ebp+var_8]
add     eax, 1
mov     [ebp+var_8], eax
jmp    loc_40101F:

loc_40103C:
mov     eax, [ebp+var_4]
push    eax
push    offset Format   ; "%d"
call    ds:printf

11:Checkit (500pt)

問題ファイルはこれです。フラグを入力したら正解かを確認するプログラムです。これに時間をとられてしまった上に解けませんでした。丁度このときにタイタニックの笛の動画が流れ始めて、投げ出しました。

Network

12:Insecure Protocol (100pt)

問題ファイルはこれです。telnetしてたので、telnetを見ると、フラグが書いてました。

13:Insecure Protocol 2 (200pt)

問題ファイル無いです。12番のtelnetと同じですが、フラグの部分が埋められていました。そこで、telnet先のサーバーにtelnetで接続して、パケットから抽出したユーザー名とパスワードを入力するとフラグが返ってきました。

14:File Transfer Protocol (300pt)

これも問題ファイル無いです。たしか、FTP-DATAを見たらフラグが見つかったような......。

15:This quiz is a NETWORK challenge (400pt)

問題ファイルはこれです。実行すると、しばらくして文字が表示されたので、ネットに接続していると予想し、wiresharkでパケットを取得しました。すると、basic認証でwebからファイルを取得していたので、ブラウザでアクセスしてbasicを認証して、フラグのファイルへアクセスしました。なんと逆解析して難読化されたコードを読んだ猛者もいました。

16:Oldies Communication (500pt)

パケットファイルなのですが開けませんでした。ヘッダが壊れていたので、別問題のヘッダを参考に修復して開きました。TCPで何かしているのですが、何をしているのか分からず、フラグもスペースで上書きされていて、IPも存在しなかったので解けませんでした。

以上、概要だけですが、writeupでした。
今回、会場に集まるようなCTFはTDUに続き2回目でしたが、好成績を修められてよかったです。とはいえ、SECCONではもっと難しい問題が出るので、まだまだ勉強するつもりです。

お疲れさまでした。

2015年5月2日土曜日

ホストCentOS 7上のゲストWindows 7の3D Accelerationを有効にする

最近メインのデスクトップPCをWindows 7からCentOS 7にし、VMware上にWindows 7を入れかえました。ところが、ホストのWindows 7上でUnityが動かないことからDirectなんたら(Direct X? Direct 3D)が使えないことに気づきました。CentOS関連の記事が少なくて、直すのが結構面倒だったのでメモ程度に書いておきます。

環境:
ホスト:CentOS 7 x64
ゲスト:Windows 7 SP1 x64
グラボ:GTX 640だったかな?あまり関係無いと思います。

症状:
VMwareからWindows 7を起動すると、「3D Accelerationが無効になりました」とか「デバイスが読み込めませんでした」とかのメッセージが表示され、3D Accelerationの機能が使えません。

対処法:
1.driconfを入れてS3TC Texture Compressionとやらを有効にする
まず、このリンク先からdriconfをダウンロードします。解凍してインストール。
tar xfvz driconf-0.9.1.tar.gz
cd driconf-0.9.1
python setup.py install
わーい、driconfが入った〜、と思うとエラーが起きます。
driconf
>〜〜〜
>UnboundLocalError: local variable 'j' referenced before assignment
>〜〜〜
どうやらpythonコードでエラーが発生している模様。
cd /usr/lib/driconf
vi driconf_simpleui.py
viエディタで、260行目あたりに以下の水色の文を追加します。
:
i = chars
j = i
while i >= chars/3:
:
保存すれば、エラーが発生しないと思います。driconfをもう一度実行します。
driconf
すると「Direct Rendering Preferences」というウィンドウが表示されます。
「Image Quality」タブの「Enable S3TC texture compression even if...」をクリックして「はい(Y)」にします。
下部の「Expert Mode」をクリックしてDefaultに保存します。
これで1つ目完了。

2.libtxc_dxtnをインストールする
以下のコマンドを実行してインストールします。
yum install libtxc_dxtn
以上。

3.ホストの設定を変える
ホストがシャットダウンしている状態で、vmxファイルを編集します。(Win7仮定)
cd /home/[username]/vmware/Windows7/
vi "Windows 7.vmx"
以下の文章がなければ追加してください。
mks.enable3d = "TRUE"
mks.gl.allowBlacklistedDrivers = "TRUE"
svga.vramSize = "67108864"

保存します。
最後に、ゲスト(CentOS)の再起動をしてください。

再起動が完了したらVMwareからホストを起動してください。エラーが発生せずに起動できたら成功です。フルスクリーンゲームとかやるひとはmouseの部分の設定も要るみたいですが、調べたらすぐに出てくるのでここには書きません。

-- 追記(2015/05/03) --
翌日起動したら
Vmware Player unrecoverable error: (svga)
Unexpected signal: 11
というエラーが発生しました。
書くのを忘れていましたが、ゲストを起動する前に、3D Accelerationのウィンドウを出しておく必要があります。
driconf &
これで「Direct Rendering Preferences」ウィンドウを一度起動させておかなければいけません。
1つのアプリケーションがグラフィックボードの機能を使った後に、他のソフトが使おうとするとVMwareが同じエラーで落ちることがあります。少なくともCentOSからの3D Accelerationはあまり良い機能を持っていませんね・・・

参考文献:
http://useranswaser.com/answer/how-to-fix-3d-acceleration-for-vmware-workstation-9/
http://ameblo.jp/yukisku/entry-11777593255.html
http://sourceforge.net/p/driconf/bugs/3/

2015年3月31日火曜日

TDU CTF 2014 Satellite in ConoHaへ行ってきました(writeup的な)

2015年03月29日に渋谷で開催された初心者向けCTFのTDU CTFに参加してきました。(CTF後に山梨で予定があったので書くのが遅くなりました。)初心者向けといいながらも上級者が来るんだろうなぁと思っていたら、やっぱり来ました(恐怖)。どこかに集まってやるCTFは今回が初めてだったので問題が解けるか不安でした。CTFには80人弱ほどの方が参加されていました。始めに運営の方々がXSSとかSQLiとかいろんな分野のプレゼンを少しされました。

では、解けた問題について書きます。スコアサーバーには自分の解けた問題や誰が解けたか、問題の点数などが書かれていないので、本当はもっと解いた問題、解けなかった問題があると思いますが、とりあえず思いついただけ。

web
・Easy SQLi Test
何かを検索するフォームがあります。適当に入力してもヒットしません。SQLi苦手なんですが、Easyと書いてあるのでテンプレで
" or 1=1;--
と入力すると全部出てきました。一番最後にフラグが書かれていました。この問題には複数のフラグがあり、flagTableに次のフラグが~みたいなのが書かれていましたが、ここで断念。

・Simple Uploader
ファイルをアップロードできるサイト。これもテンプレでphpをアップロードすると動きました。
<?php phpinfo(); ?>
を送るとphpinfoを見ることが出来、そこにフラグも書かれていました。この問題も複数のフラグがあるということで、
<?php system("cat /etc/passwd"); ?>
を送るとパスワードの中にフラグが。
<?php system("ls"); ?>
するといろいろあったので見てみるとこんな画像ファイルが。モザイクが掛かって見られないのですが、これはフラグなのかな?解けませんでした。もしかしたら誰かがアップロードした妨害用のファイルかもしれません。分かりません。
(追記:03/31/2015)他の方のwriteupを見るとこれと同じような画像ファイルがありました。そちらはモザイクが掛かっていなかったので、別の場所にこのファイルの元画像があったと思われます。

binary
・Trip Picture
ほしい方はダウンロード
何かのストラップの写真があるので、バイナリエディタで見ると最後に
Flag is TDU{LoveLiverInKyoto!}
と書かれていました。私の知識不足でLoveLiverというものが何なのかが全く理解できていません。(アニメ?)

・読めない文字1
base64っぽいのでecho ~|base64 -dでデコード。またbase64っぽいのが出てきたのでもう一回デコード。終わり。

・ASCII Art
ほしい方はダウンロード
zipが渡されるものの開けないのでバイナリエディタでみるとフラグがAAで書かれている。
TDU{HEXEDIT!}

・ string_compare
ほしい方はダウンロード
exeが渡されるので、IDA送り。TDUで検索するとprintfの前に「TDU{%s_is_very_cutie}」とあったので、%sにあたるアドレス[ebp+var114]を探すと「MinamiKotori」と書いていたので
TDU{MinamiKotori_is_very_cutie}
がフラグでした。(´・ω・`)知らんがな

forensic
・ Evidence
ほしい方はダウンロード
運営のnomukenさんが殺されたので、犯人グループの作戦名を掴んでくれ、みたいなフォレンジック問題。私はフォレンジック問題好きなので期待していたのですが、forensicカテゴリの問題は結局最後までこれ1つだけでした。(´・ω・`)
いつもはTSK使ってるのですが、TDU CTFで紹介されていたFTK Imagerというのを使ってみると、削除されたフォルダかな?にpdfが入っていたので開くとフラグがありました。
作戦名:TDU{OIL_SARDINE}


crypt
・我が同胞に告ぐ
単一漢字変換やシーザー暗号などを思わせる文字列があるのですが、すぐにvimだと判明。入力すると
vimisawesome
なのでTDU{vimisawesome}がフラグでした。
私は基本Emacsです。(たまにvimも使いますが)

network
・ 柚子胡椒 Vol.1
ほしい方はダウンロード
pcapが渡されるので見るとフラグが送られていました。
TDU{bLu3T00tHDeTH}
TDU{PiNC0De2}
の2つがあったのですが、どっちがフラグだったか忘れました。


misc
・(タイトル忘れました)
TwitterアカウントのURLがあるので、TwitterIDをフラグにするだけ。

・Mini Quiz#1
何かの文章が問題として書かれています。意味分からなかったのですが、何かの引用かと思い調べてみると「ThinkPad X300が~」とあり、ちょうど穴埋めになっていた所がX300なので
TDU{X300}
でした。

・Mini Quiz#2
[単語]->[数字]の形式が並んでおり意味不明だったので、単語部と数字部を並べて調べるとOS Xのバージョンだと判明。Leopardとやらについて聞かれていたので、小数点を抜いて
TDU{105}
でした。




ここから先は解けなかった問題たち。
・unknown file
ほしい方はダウンロード。 
ファイル内が全部0x20で埋まっており意味不明。ファイル名に意味がありそうでしたが分かりませんでした。他の方のwriteup見るとTDUで検索したら出てきたとあるので、運営サイトのネットワークの問題?始めはおかしいと思い何回もダウンロードし直したんですけど、よく分かりません。

・Developper! Developper! Developper!
ほしい方はダウンロード
zipファイルはパスワードかかっているのですが、ヒントに「無圧縮」とあったので調べるも解けませんでした。pkcrackというソフトで中のファイルと手持ちのファイルを平文攻撃することでパスワードが分かるとか。とても参考になりました。

・Omikuji
ほしい方はダウンロード
おみくじができる実行ファイル。 TEMPに何か作ってるのは分かったのですが、どうやらネットワークで通信しているようです。

・(タイトル忘れました。string encoderだったかな)
ほしい方はダウンロード
IDAで見るとメモリ上にフラグが見つかりそうな予感だったので起動しようと思ったのですが起動できませんでした。VC++2013再頒布入れたのに起動しませんでした。隣の方も起動できずに悩んでいる様子でした。次からはgccでstaticするか、VC++は知りませんが、必要なライブラリは全部埋め込んでほしいです。あと要望といえば、スコアサーバーでフラグ入力しても何も起こらないことが多々ありました。Javaだからかな。

・(タイトル忘れました。Phoneなんたらだったかな)
ほしい方はダウンロード
まったく分からず。

・かっこいいフラグたち
なんと表示されているフラグを入力するだけでptがもらえるというかっこいいフラグがありました。入力する文字によって、-5000ptから-200ptくらいまで、かっこいい点数を獲得できます。かなり上級者向けの問題だったので解けませんでした。



他にもたくさん問題はありましたし、特にweb系では見つかっていないフラグがたくさんあると思います。
結果920ptを獲得して順位は20位でした(´・ω・`)初めて参加したにしては良い方かな・・・それに上級者多かったし・・・。まぁ次は10位くらいにはなれるように頑張りたいです。

とにかく、CTFってこんな感じなんだなぁ、というのが分かりました。問題を解くだけでなく、一体どこから拾ってきたんだというくらいの膨大な量の妨害用のBGM・動画が常に流れる会場も、貴重な経験になりました。

参加者・運営の皆さんお疲れ様、ありがとうございました。

2015年3月1日日曜日

セキュリティ体験講座 - ハッカーになってみよう、やってみよう -

02月28日に、兵庫県立大学大学院で開かれたセキュリティ体験講座の中の1つ、ザッカーリ・マシスさんの「ハッカーになってみよう、やってみよう」に参加しました。

前半はハッキングとは何か、過去から今までにどのようなハッカーがいたか、その目的はなにか、どのように攻撃するか、など幅広く説明して頂きました。短い時間の中で、さまざまな攻撃方法が説明されました。特に今回は一般向けなので、分かりやすかったです。
宿題(?)も出されました。
・ ・ ・
・ ・ ・
・ ・ ・
この9つの点を直線で一筆書きで結んだとき、4本や3本の線で結ぶ書き方はあるだろうか、というものです。答えは説明されませんでしたが、何が言いたいかと、その答えもたぶん分かりました。

後半は実際にコンピュータへ侵入する演習でした。ゲストのKali LinuxからゲストのDe-Iceサーバーへ侵入します。一般向けなのでCTFなどとは違い、一応簡単な説明を受けながら行いました。とはいえ、どのようなツールを使うべきか、などから自分で探していきます。(3人で2台のパソコン)
ということで、覚えている限りで、どのように侵入したかを書いておきます。
まずnetdiscoverで攻撃先のIPアドレスを特定します。
 netdiscover -i eth0
そしたら、定番のnmapで開いているポートを調べます。あとOSの種類も調べたいので-A指定もしておきました。(IPは192.168.1.100でした)
 nmap -Pn -A -p 0-65535 192.168.1.100 
そうすると、http, sshなど複数のポートが開いており、Linuxやカーネルのバージョンまで調べることができました。
ここで、metasploitのsearch及びsearchploitを使って、使用されているサービスの脆弱性情報を調べます。
(例)
 msfconsole 
 msf>searchploit openssh 
今回は脆弱性のあるサービスはなく、ただ侵入したいだけなのでDoSで落とすことなどは考えませんでした。
使われているサービスはたくさんありましたが、特に問題のあるバージョンのものや、脆弱性は見つかりませんでした。
そこで、hydra及びmedusaを使って総当り攻撃をすることにします。
まず、ユーザー名とパスワードのリストを作らなければなりません。攻撃先のホームページ(今回は192.168.1.100)を見ると、いわゆる社員情報的にメールアドレスがたくさん書かれていました。adamsa@~~~とか十人くらいの名前があったので、これがユーザー名ではないかと思いリスト化。パスワードリストは用意してくれてたのですが、展開すら面倒だったのでKali付属のnmap.lstを使いました。ここでhydraを使用しましたが、なかなか成功する気配がありませんでした。
そこでマシスさんから2つヒント(?)が与えられました。
adamsaやpatrickpなどに対し、ユーザー名はaadamsやppatrickなども考えられるよね、ということ。それと、こちらは時間の問題もあって答えにグッと近づけるものなのですが、ユーザー名とパスワードが同じだよということ。
ということで、ユーザーリストにaadamsなどいろいろ追加し、medusaでsshに仕掛けてみます。
 medusa -U users -e ns -h 192.168.1.100 -M ssh | grep SUCCESS 
すると見事にhoge(ユーザー名忘れたのでここからhogeにします。)が当たりました。
早速sshで接続
 ssh hoge@192.168.1.100 
 hoge' password : hoge 
 [hoge@192.168.1.100]$ 
はい入れました。
早速/etc/passwdや/etc/groupを取っていったのですが、ここで問題発生。/etc/shadowが取れない、つまりルート権限ではなかったのです。私はこれ以上進むことはできませんでしたが、非常に面白かったです。前でマシスさんがadams(root権限)で入ってて、いつの間にっ、という感じでした。
あと、ここまでには書きませんでしたが、ツールを使ったら、wiresharkでどんな通信が行われているかを確かめるなど、具体的な動作も確かめることができたので良かったです。

今回はサーバーへ侵入するという設定で行い、演習に来ていた他の方々も、甘いセキュリティに侵入することがいかに簡単かということを強く実感されたそうです。私は家で自分でセットした環境でしか侵入をしたことがないので、実際にホワイトハッカーの方の経験などを教えてもらい、侵入のコツをつかめたような気がします。大変有意義な講義、演習でした。
またこのような講義、演習があれば是非参加したいです。

2015年2月18日水曜日

セキュリティ・キャンプ・フォーラム2015

02月14日の土曜日に品川で開かれたセキュリティ・キャンプ・フォーラム2015に行ってきました。
本当は、13日に兵庫県立大学院でセキュリティ体験講座を受けてから行く予定だったのですが、夜行バスの時間を間違えてしまい、体験講座の方はVODで諦めるということにしました。

さて、フォーラムは、前半はキャンプ卒業生、協賛企業、政府からのメッセージなどでした。
キャンプ卒業生で起業をした人など、面白い 話を聞くことができて参考になりました。企業の方からは、企業内でのセキュリティ部門はどのような働きをするかなど、実際の現場について説明してもらいました。政府からは、セキュリティ人材の不足や、省庁のセキュリティの実情などが話されました。午前の話は個人的には将来に関わる内容が多かったです。
午後は、CTF、XSS、VM/カーネルを受けました。CTFはネットで開催しているものを除き初めてだったので、本当に短い時間とはいえ、わくわくしました。問題はリバースエンジニアリングのもので、出題者は簡単簡単と言うものの、結局時間内に解けたのは1人だけのようでした。リバースエンジニアリングは苦手分野でありながら、問題のファイルが環境変数を使っていることなど内部の動作がそこそこ分かったので、ほんのちょっと自信が付きました。ASCIIがたくさんあるところを探したのですが、結局"Flag:"の部分しか出てきませんでした。(そんな簡単なわけあるか。)
Shibuya XSSでは、最新のXSS事情や、XSSから少し離れたweb系の面白い話、また実際に攻撃から守る仕事をした人の話など、XSSだけでなく色々なことが聞けました。Web系の脆弱性には割と興味があって以前から勉強していたので、知らないことがたくさん知れてよかったです。
VM/カーネルは私には少し難しかったようにも思えます。始めにロボット関連のセキュリティの話があり、パソコン以外のデバイスのセキュリティも勉強してみようかなという気になりました。SECCONの決勝戦でサーバーを管理している方の話は、なんとなく分かったような感じです。やっぱりSECCONともなると、運営も高度な技術を求められるようです。VMの話では、VMを検出するマルウェアや、新しいマルウェア解析のアプローチなど低レイヤーの話をされました。私ができるようなことではありませんが、非常に興味深い内容でした。

今回のフォーラムでは、セキュリティやその他もろもろの分野で有名な方の話、また実際にセキュリティに関する実話など貴重な話を聞くことができて、とてもよかったです。

あとキャンプ卒業生は協賛企業からいろいろプレゼントを貰いました。ありがとうございます。