
KeySweeper is a stealthy Arduino-based device, camouflaged as a functioning USB wall charger, that wirelessly and passively sniffs, decrypts, logs and reports back (over GSM) all keystrokes from any Microsoft wireless keyboard in the vicinity.
KEYSWEEPER // SIGINT // SAMY.PL // REL TO ALL // APPLIED HACKING
KeySweeper は、動作するUSB壁充電器に偽装されたステルス性の高いArduinoベースのデバイスで、周辺のMicrosoftワイヤレスキーボードからすべてのキーストロークをワイヤレスかつパッシブに傍受、復号、記録し、(GSM経由で)報告します。
すべてのキーストロークはオンラインとローカルの両方に記録されます。トリガーワード、ユーザー名、またはURLが入力されるとSMSアラートが送信され、パスワードが露呈します。コンセントから抜かれても、KeySweeperは内蔵バッテリーで動作を継続し、再通電されると自動的に再充電されます。Webベースのツールにより、キーストロークのライブ監視が可能です。
ライブデモと詳細はビデオでご覧いただけます: KeySweeper
連絡先: @SamyKamkar // [email protected] // http://samy.pl
リリース日: 2015年1月12日
ソースコード/回路図: https://github.com/samyk/keysweeper
単価: 動作内容に応じて$10〜80
ステータス: 運用可能、オープンソース、オープンハードウェア、機密解除済み。
KeySweeper は、動作するUSB壁充電器に偽装されたステルス性の高いArduinoベースのデバイスで、周辺のMicrosoftワイヤレスキーボード(独自の2.4GHz RFプロトコルを使用)からすべてのキーストロークをワイヤレスかつパッシブに傍受、復号、記録、報告します。
キーストロークは、オプションのGSMチップを介してインターネット経由でKeySweeperの運用者に送信されるか、フラッシュチップに保存され、別のKeySweeperデバイスが標的のKeySweeperのワイヤレス範囲内に入ったときにワイヤレスで転送されます。Webベースのツールにより、キーストロークのライブ監視が可能です。
KeySweeperは、特定のキーストローク(例: "www.bank.com")が入力されるとSMSアラートを送信する機能を備えています。KeySweeperがAC電源から取り外されると、シャットダウンしたように見えますが、実際には内蔵バッテリーを使用して密かに動作し続け、AC電源に再接続されると自動的に再充電されます。
KeySweeperは、goodfet.nrfプロジェクトにおけるTravis Goodspeedの研究と、KeyKeriki v2.0プロジェクトのThorsten SchröderとMax Moserの研究を発展させたものです。
$3〜30: ArduinoまたはTeensyマイクロコントローラを使用できます。私の制作では、非常に薄い形状の3.3v Arduino Pro Miniを使用しています。
$1: 私は$1のnRF24L01+ RFチップを使用しています。これは2.4GHzでGFSKを使用して通信します。詳細は後述しますが、これらのチップはeBayで最低$1から購入できます。これらのチップは独自プロトコルでのみ通信でき、傍受を目的としていませんが、後述するように、巧妙な方法でプロミスキャス(無差別)傍受に使用できます。
$6: 私は、AC電力を5V DCに変換する安価なAC USB充電器(整流器)を使用しています。リンクしたこの製品は、開けやすいネジが付いているため、分解が簡単です(私は他のいくつかを開ける過程で壊してしまいました)。GSM版のKeySweeperを使用する場合は、実際には2つのUSB充電器を使用します。小型充電器(iPhone充電器と同様)の内部と、大型USB充電器の外側ケースです。
オプション($2): キーストロークを保存するために、オプションのSPIシリアルフラッシュチップを使用できます。後述のFONA GSMボードを使用する場合は、キーストロークをインターネット経由でライブ保存できるため、これは不要です。ただし、より低コストなオプションを希望する場合は、KeySweeper内のこのチップにキーストロークを保存し、後で2.4GHzワイヤレス範囲内に別のデバイスを持ち込んで、そこからキーストロークを吸い出すことができます。
ほとんどのマイクロコントローラは、データを保存するためのメモリまたはEEPROMが非常に限られているため、これらのキーストロークを保存するフラッシュチップを備える利点があります。
オプション($45): AdafruitはFONAというボードを開発しました。これにより、2G SIMカードを使用してSMSの送受信、電話の発着信、デバイスからのインターネット直接利用が可能になります。
これを使用すれば、キーストロークが即座にバックエンドサーバーへ送信され適切にデータ収集されるため、フラッシュチップは不要です。さらに、標的のキーボードで特定のキーワードが入力された場合、指定した番号にSMSメッセージを送信して工作員に警告することができます。
オプション($3、FONA使用時のみ): FONAにはmini-SIMカード(マイクロSIMではない)が必要です。私はT-MobileのプリペイドSIMカードを使用しています。T-Mobileは2Gに対応しているため、これをお勧めします。ほとんどの他キャリアは2Gネットワークを廃止しているか廃止予定であり、FONAはインターネットに2Gのみ対応しているからです。必ず正しいサイズのSIMカードを入手してください — 詳細はFONAのSIM要件はこちらを参照してください。
オプション($5以上、FONA使用時のみ): FONAはボード上のLiPo/LiOnバッテリー再充電機能を提供します。KeySweeperがAC電源に接続されている間、バッテリーは充電された状態に保たれますが、それでもバッテリーは必須です。さらに、KeySweeperはAC電源から抜かれるとバッテリー電源で密かに動作し続け、AC電源に再接続されると再充電を開始します。
KeySweeperのソースコードはすべて、私のgithubから入手できます: https://github.com/samyk/keysweeper
KeySweeperには複数の部分があります。主要なコードはマイクロコントローラにインストールされ、jQueryとPHPを使用したWebベースのバックエンドがすべてのキーストロークを記録し、標的のキーボードをライブ監視するためのWebインターフェースを提供します。
KeySweeperには、maniacbugのRF24ライブラリから次のファイルも必要です:
RF24.hnRF24L01.hRF24_config.hファイルをkeysweeper_mcu_srcディレクトリにコピーするだけです。また、RF24.hファイル内の#include文を#include <RF24_config.h>から#include "RF24_config.h"に変更する必要があります。
新しいテキストメッセージが届いたときにFONAが通知できるようにする追加オプションを含めているため、私のバージョンのAdafruit FONAライブラリを使用してください。元のライブラリでは、期待した数よりも多くのテキストメッセージがあるかどうかを常にポーリングする必要がありますが、私のバージョンではfona.setSMSInterrupt(1)オプションを有効にでき、これにより新しいSMSメッセージが届くとRI(リング割り込み)ピンが一時的にLowになります。
Webページを通じてキーボードをライブ監視できるバックエンドツールを作成しました。jQuery Terminalプラグインにより、見た目がよりクールになります。
jQuery UI Virtual Keyboardは、KeySweeperのライブスパイインターフェースツールをクールに見せ続けます。ユーザーが実際にキーを押すと、仮想キーボード上のキーが押されたように表示されます。
Microsoftワイヤレスキーボードを入手して手元にある場合、背面を確認してFCC IDを調べることができます。私のキーボードの場合、FCC ID(米国で無線周波数を使用するすべてのデバイスに必須)はC3K1455であり、これはFCCのウェブサイトで簡単に検索できます。
FCCレポートに基づき、キーボードが2403〜2480MHzで通信していることがすぐにわかります。
これが2.4GHzデバイスであるとわかったので、wi-fi、bluetooth、zigbeeなどの一般的な2.4GHzプロトコルを使用しているか、独自プロトコルを使用しているかのいずれかと推測します。このデバイスには専用のUSBドングル(独自のFCC ID、C3K1461付き)が付属しているため、独自の2.4GHz信号である可能性が非常に高いです。
独自の2.4GHzである可能性が高いため、何らかの2.4GHz傍受方法を使用する必要があります。これは802.11ではないため、Wi-Fiスニファは役に立ちません(SkyJackで使用したようなもの)。また、RTL-SDR単体では約2.2GHzが上限のため、RFダウンコンバータを併用しない限り役に立ちません(Digital Ding Dong DitchではRTL-SDRを使用しました)。そこで、強力で安価なソフトウェア無線であるHackRFをすぐに使いたくなりますが、価格に対して非常に強力である一方、さらに安価なハードウェアで済む可能性もあります。
これまでの経験に基づくと、キーボードはNordic nRF24L01+、TI CC2500、またはCypress CYRF6936のようなものを使用していると推測されますが、さらに調査しない限り確実なことはわかりません。
キーボードのネジを外して開けると、すべてを担当する単一のチップが見えます。ラベルにはNRF 24LE1Hとあり、これはnRF24L01によく似ています(n=Nordic Semiconductor、RF=Radio Frequency、24=2.4GHz)!検索するとnRF24LE1チップがすぐに見つかり、実際にnRF24L01+ RFチップがCPU(System-on-Chip/SoC)と統合されていることがわかります。また、eBayで検索するとnRF24L01+が$1以下で届くことがわかります。
The nRF24LE1 integrates an nRF24L01+ 2.4GHz RF transceiver core, enhanced 16MHz 8-bit 8051 compatible CPU, 1kB + 256B RAM, 16kB embedded Flash, and a wide range of system peripherals
nRF24L01+データシートを見ると、これが2.4GHz RFチップであり、250kbps/1Mbps/2Mbpsで動作し、GFSK(ガウス周波数偏移変調、デジタル周波数変調/FMの一種)を使用していることがわかります。そして残念ながら、傍受のための正当なプロミスキャスモードやダイレクトモードはありません...本当にそうでしょうか?
通常ならHackRFや、デジタルダウンコンバータを備えたRTL-SDR(RTL-SDRの範囲に2.4GHzを落とし込むため)を取り出すところですが、より安価なハードウェアで傍受できればとても良いでしょう。結局のところ、すべてを現場に置いておけるデバイスにまとめたいからです。
基本的な検索を行うと、Travis Goodspeedによる驚くべきページが見つかりました。そこでは、同様のキーボード(Microsoft Comfort Desktop 5000)を傍受するだけでなく、彼のGoodFETデバイスと、goodfet.nrf Pythonアプリケーションを実行するホストコンピュータを使用して、nRF24L01+を2.4GHzスニファに変える方法も実演しています。
Travis氏は、このデバイスでの傍受は従来困難であることを発見しました。なぜなら、リッスンするチャネル(周波数)を指定するだけでなく、リッスンするMACアドレスを指定する必要があるからです。nRFチップは、その特定のMACアドレス宛てのパケットのみを配信します。さらに、nRFチップは、すでに指定したMACアドレスを教えてくれません(データシートにあるRX_ADDR_P[0-5]パイプのいずれかにあると想定されているためです)。
しかし、MACの長さを指定する際、データシートで「不正」とみなされるオプションが1つあることをTravis氏は発見しました(SETUP_AW, 0x03 set to 00)。これは実際にはMACを2バイトに設定します。さらに、MACを通常プリアンブルに見られるデータ(0x00AA or 0x0055, in binary 0000000010101010 or 0000000001010101)に設定することで、デバイスを欺いてパケットを早期に渡させ、データ部分で完全なMACアドレスを取得できます。詳細は彼の素晴らしい解説をお読みください。
テスト中はGoodFET、コンピュータ、nRF24L01+を使用して傍受できますが、最終的にはこれを安価な組み込みデバイスに搭載したいと考えています。Travis氏の素晴らしいPythonでの成果を組み込みCに移植することで、コンピュータ+GoodFETを必要とせずに、マイクロコントローラにロードできます。
さらに、いくつかの改良を実装しています。Goodfet.nrfは、次の手順でデバイスをスキャンする方法を提供します:
つまり、全周波数範囲をスキャンするには約85分かかり、正しい10秒間の傍受中に少なくとも数回のキー入力が必要です。Travis氏の研究とキーボード、KeyKerikiの研究とキーボード、そして私自身のキーボードを検討した結果、いくつかの改良を実装できます:
0xCD is 11001101)が続き、ビットを交互に保つため、プリアンブルが常に0xAA (10101010)になることを示しており、探索が半分に削減Thorsten Schröder氏とMax Moser氏は、Microsoftキーボードを傍受できる優れたデバイスKeyKerikiを発表し、復号プロセスを完全にリバースエンジニアリングして、それを行うためのデバイスを製作しました。しかしTravis氏は、彼らのデバイスはキーボードが通信する2Mbpsの速度でパケットをキャプチャおよび解析するために、2つの無線機と高性能マイクロコントローラを必要とすると指摘しています。Travis氏のプロジェクトも素晴らしいですが、ホストコンピュータが必要であり、私たちの隠密実装には大きすぎます。このシナリオでは、安価な無線機とマイクロコントローラのみを必要とすることで、これらの設計を改良します。どちらも低消費電力で非常に小型であり、コンピュータや高価な無線機は不要です。
Thorsten氏とMax氏は、キーストロークがECBモードでMACアドレスと単純にXORされていることを発見しました。これは、Travis氏のnRF24L01+を悪用して傍受とMACアドレスの露出を同時に行う方法を使用すれば傍受できます。この「暗号化」は、トランプの山を一度カットしてシャッフルしたと呼ぶのと同じ程度のものです。
さらに調査した結果、すべてのMicrosoftキーボードのMACアドレスが0xCDで始まることがわかったため、実際のキーストローク(下のオレンジ色)はMACアドレスの最初のバイト(0xCD)と偶然にも整列することがわかりました。これは、MACアドレスを知らなくてもキーストロークを復号できることを意味します。整列が変わることはなく、0xCDが常にMACの最初のバイトだからです。
さらに発見したのは、パケットの暗号化部分の長さが11バイトで、MACが5バイト、CRCが各バイトを別のバイトとXORしたもの(暗号化前)であるため、興味深いことが起こるということです。MACが2回XORされるため、MACアドレスを知らなくてもチェックサムを計算できます。これは、MACアドレスが完全な形で2回含まれており、任意の数値をそれ自身とXORする(MACとMACをXORする)と相殺されるためです。11番目のバイトは再びMACの最初のバイトであり、これが常に0xCDであることはわかっています。これにより、MACアドレスを知らなくても、キーストロークとCRCを改ざんするなどの他の攻撃が可能になります。これとその他の楽しいデモは、将来のプロジェクトで発表する予定です。
KeyKerikiのプレゼンテーションの1ページが復号プロセスを示しています:
KeySweeperのソースコードに実装されている私たちの復号メソッド:``` // decrypt those keyboard packets! void decrypt(uint8_t* pkt) { // our encryption key is the 5-byte MAC address and // starts 4 bytes in (4-byte header is unencrypted) for (int i = 4; i < 15; i++) pkt[i] ^= mac >> (((i - 4) % 5) * 8) & 0xFF; }
# (U) USB充電器の改造・乗っ取り
**警告: AC電源(主電源)に接続する機器は高電圧を扱います。私たちが作ろうとしているAC接続機器は安全ではなく、通常の電気安全基準も満たしていません。これは危険な機器であり、誤った使用方法や製作方法では、死亡事故、火災、その他の重大な損害を引き起こす可能性があります。AC電源を使用する機器を製作するのは、自分が何をしているか理解している場合のみにしてください。AC電源を使わずにこの機器の製作を続けたい場合は、バッテリーを使用するか、USBから直接給電して安全に進めてください。**
KeySweeperは、極めて低消費電力かつ低背のハードウェアを使用し、可能な限り隠密に動作します。KeySweeperはバッテリー、または約3〜20VのDC電源で動作させることができます。常時給電された状態を維持したいため、常にコンセントに挿さっていると思われる無害な壁掛けUSB充電器の中に、こっそりと設置します。
万一USB充電器がコンセントから抜かれた場合、KeySweeperは(任意の)内蔵バッテリーを使用してこっそりと動作を継続します。再びコンセントに挿し込まれた瞬間、AC電源に切り替わり、同時にバッテリーを再充電します。
GSMボード**なし**でKeySweeperを製作する場合は、一般的なAC USB壁掛け充電器にすべて収めることができます。ネジで固定されているタイプを探すことをお勧めします。ほとんどの製品は密閉されており、開けるには機器の一部を破壊する必要があるためです。
[](http://samy.pl/keysweeper/usbopen.jpg)
GSMボードを使う場合は、このタイプのUSB充電器には他の電子機器と一緒に収まらないことがわかりました。しかし、より小さなUSB充電器(iPhoneのUSB充電器に類似)を開けてみると、はるかに小型の整流器(AC→DC)と降圧コンバータ(高電圧→5V)が入っており、これにより**すべての**電子機器を大きい方のUSB充電器に収めることができました。
[](http://samy.pl/keysweeper/usbcharger1.jpg)
[](http://samy.pl/keysweeper/usbcharger2.jpg)
友人のDanaが人形用はんだごてを貸してくれました。彼女が何に使っているのかはよくわかりませんが、カミソリを取り付けられるはんだごてです。これはプラスチックや、おそらく人形を切断するのに最適です。私がこの機器が何をするのか説明したとたん、彼女ははんだごてを回収していきました。どうやら彼女はこれを支持していないようです。なぜなのかはわかりませんが、彼女のキーボードからもっとキーストロークを傍受すれば、そのうちわかるでしょう。
[](http://samy.pl/keysweeper/usbcharger3.jpg)
[](http://samy.pl/keysweeper/usbchargeropen.jpg)
**警告: 繰り返しになりますが、AC電源を扱うため、これは非常に危険です。自分が何をしているか理解している場合以外は、AC電源機器を開いたり、配線を変更したりしないでください。** AC機器を改造せずに、USB充電器、USBポート、またはバッテリーからすべてに給電するだけでKeySweeperを製作することもできます。
また、ArduinoのRAWポートを5V USB電源に正しい極性で配線することも重要です(マイナスはGNDへ、プラスはRAWへ)。ここでは3.3v Arduino Pro Miniを使用しています。RAWポートは3.35〜12vの非安定化電圧を受け入れ、オンボードの電圧レギュレータで3.3vに降圧します。nRF24L01+チップは1.9〜3.6vを必要とするため、5vを与えるのは**高すぎます!** さらに、[SST25VF016B](http://ww1.microchip.com/downloads/en/DeviceDoc/S71271_04.pdf)のようなSPIチップを使用する場合、2.7〜3.6vが必要なため、ここでも5vは**高すぎます!** Arduinoの安定化された3.3v(3.3v ArduinoのVCCピン、または5v Arduinoの3V3ピン)を使用してください。
[](http://samy.pl/keysweeper/multimeter.jpg)
*注: マルチメーターの隣に写っているUSBボードは、GSMボードも収めるために、より小さいものに交換する前のオリジナルです*
すべてのハードウェアを用意すると、充電器の中に余裕を持って収まることがわかります(配線前):
[](http://samy.pl/keysweeper/testingsize.jpg)
お遊びとして、充電器のLEDをArduinoのピン6に接続しました。LEDは同じように見えますが、実際にはキーストロークを傍受すると点滅するようにしています。これでおそらく正体がばれるでしょうが、見ていてとても楽しいです。また、AC電源が失われた場合、機器の残りの部分が内蔵バッテリーで動作し続けても、LEDが消灯するようにしています。
また、他のデバイスがUSB充電器から給電を続けられるように、USB充電器の残りの機能も動作するようにしておきます。

-----
# (U) オプションのセカンダリKeySweeper
コストを抑えるためにGSMボードを省略したい場合は、ArduinoとnRF24L01+だけを含むセカンダリKeySweeperデバイスを作成できます。セカンダリをコンパイルする際は、`#define BACKTRACER 1` のコメントを解除してください。
仕組みはこうです。セカンダリKeySweeper(BACKTRACER)が、最初のKeySweeperのワイヤレス到達範囲内(2.4GHz nRF24L01+を使用)に入ると、最初のKeySweeperの存在を自動検出し、最初のKeySweeperデバイスはそのログをBACKTRACERにダンプします。自動検出は両方のKeySweeperに組み込まれており、nRF24L01+の複数RXパイプ機能により、互いをすばやく見つけることができます。
BACKTRACERをコンピュータに接続している場合、キーログはシリアルにダンプされます。また、シリアルから'E'コマンドを送信すると、内容を取得した後、元のKeySweeperのSPIフラッシュチップの内容を消去できます。その後、元のKeySweeperにキーストロークの記録を続けさせたまま、その場を離れることができます。
-----
# (U) 回路図
拡大版(FONAベースの回路図)をクリックするか、Fritzingファイルは[ここをクリック](http://samy.pl/keysweeper/keysweeper.fzz)してください。
[](http://samy.pl/keysweeper/keysweeper2_schem.png)
-----
# (U) 連絡先
**連絡窓口:** [@SamyKamkar](https://twitter.com/samykamkar)
私の他のプロジェクトは <http://samy.pl> で見るか、<[email protected]> までご連絡ください。