sakのノート

興味のあることについて色々と

LinuxでBadUSBを用いた(実質)二段階認証

以前 セブンペイの事件をきっかけに二段階認証に注目が集まりましたが、今回はその時にたまたま思いついた BadUSBを(実質)物理鍵として使い二段階認証を行う方法について紹介したいと思います。

 

一応先に書いておきますが、悪用厳禁です!

 

BadUSBとは

BadUSBとは  USBのファームウェアに、検出不能な状態でマルウェアを送り込み ファームウェアを書き換えることなどができるUSBの設計上の脆弱性が存在し、これを悪用するハッキング手法を指します。

 

上記の脆弱性を利用してUSBデバイスをキーボードとして認識させることで 接続したPCに対してキーストローク・インジェクション攻撃をすることができます。

今回はこれをうまく利用し、USBにブルートフォースでは破れない強度のパスワードを入力させることで(実質)物理鍵として使います。

 

BadUSBについて詳しくは下記の動画を参考にしてください。


BadUSB - On Accessories that Turn Evil by Karsten Nohl + Jakob Lell

 

必要なもの

BadUSBといえばHAK5GEARの USB Rubber Ducky が有名ですが、用意するのが大変なため、今回はBadUSBに代用できて安価かつ比較的容易に入手できるDigisparkを使います。

f:id:sak-39:20190820154611j:plain

DigisparkはAmazonなどで1個約300円程度で購入できます。

 

 

 

Arduino IDEの導入

こちら からインストーラをダウンロードします。

Arduino IDEを用いてDigisparkへの命令の書き込みを行います。

 

ペイロード

下記のスケッチをDigisparkに書き込みます

パスワードは数字、英文字、記号を含めた40字以上が望ましいです。

 

#include "DigiKeyboard.h"

void setup() {
// put your setup code here, to run once:
  DigiKeyboard.delay(2000);
  DigiKeyboard.print("ここにパスワード");
  DigiKeyboard.delay(300);
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(500);

}

void loop() {
// put your main code here, to run repeatedly:

}

 

 

ディスク暗号化したLinux

最後にディスク暗号化したLinuxをインストールします。

ディストロは何でも構いません

 (例: Debian)

f:id:sak-39:20190820155545p:plain

f:id:sak-39:20190820155611p:plain

インストールする際に暗号化オプションを選択して、Digisparkに書き込んだものと同じパスワードを設定してください。

 

完成するとこんな風になります

 

注意点

キーボード配列の問題

Digisparkは標準ではUSキーボードの動作をするため、日本語配列のキーストロークを送る場合は "DigiKeyboard.h" の内容をいじる必要があります。

qiita.com

 

セキュリティの問題

作成したUSB鍵はパスワード入力画面以外(テキストエディタ上など)で使うとパスワードがバレてしまうので、注意が必要です。(そのための二段階ですが)

 

 

それではより良いLinuxライフを!