很久之前看到一篇文章,利用远程加载+加密传输+混淆对shellcode进行免杀,免杀效果貌似不错,现在有时间复现一下。
文章链接如下:https://www.secpulse.com/archives/151899.html看源码加上作者的注释,理解起来其实并不难,主要是他的环境要求,我花了很长时间才搭好。
还有一些其他的shellcode免杀技巧:https://www.cnblogs.com/-qing-/p/12234148.html
python环境搭建
python2
pywin32选择pywin32-227.win-amd64-py2.7.exe
下载地址:https://github.com/mhammond/pywin32/releases
pyinstaller,选择3.0
下载地址:https://github.com/pyinstaller/pyinstaller/releases
有几个安装问题
- 如果要python2和python3并存,可以用anaconda,安装、配置完并创建完虚拟环境后,用
conda activate 你的环境名
进行切换,很方便 - 先安装pyinstall3.0,他会自动帮你安装pywin32-228,之后打包的时候会提示
importError No module named pywintypes
,需要自行卸载pip uninstall pywin32
(我不知道会不会降低版本,我是直接卸了的)
错误信息:
pyinstaller3.0的自动安装:
- 最好用管理员权限安装pywin32,因为他需要把pywintype27.dll复制到C:\System32\里
- 如果以前有安装过py2后面卸载了(pywin32的安装路径和环境变量里设置的路径不一样的时候),可能导致pywin32安装至原来的文件夹中(原来的文件夹没有了就直接安装失败,不用finish直接退出了)。需要进注册表
计算机\HKEY_CURRENT_USER\SOFTWARE\Python\PythonCore\2.7\
中修改路径 - 版本要一致,不然我也不知道会有哪些奇奇怪怪的bug(比如上面
loader代码及原理
下面的解释来自
http://cn-sec.com/archives/261734.html
1 | #!/usr/bin/python |
ctypes库
使用ctypes库可以很方便地调用C语言的动态链接库,并可以向其传递参数。(大伙应该也都看出来了,基本都是kernel32.dll里的函数)
VirtualAlloc
用来申请动态内存,VirtualAlloc函数原型和参数如下:
1 | LPVOID VirtualAlloc{ |
RtlMoveMemory
从指定内存中复制内容至另一内存里,参数作用如下:
1 | RtlMoveMemory(Destination,Source,Length); |
CreateThread
创建进程
WaitForSingleObject
用来检测线程的状态
总的来说就是,申请一块内存,将代码字节存入该内存,然后开始运行该内存储存的程序,并让该程序一直运行下去。
发散
既然是远程加载shellcode,那么不出网时,有两种利用方法:第一种,shellcode放在内网可以访问到的靶机上;第二种,shellcode放在其他文件中,第三种,shellloader的原理为创建进程的话,是否可以利用其它exe的内存进行执行呢
第一种方法,和上面其实一样,不过多赘述
主要是第二种方法:今天在github上看到一篇go写的shellloader,网址如下:
https://github.com/Hangingsword/HouQing
原理看起来也比较简单,将shellcode和两个数进行异或,再将生成的shellcode进行base64编码,编码完后插入图片最尾部。利用shellloader时,再反向操作即可,也是一种不错的思路,不过python利用可能会更困难一些。(毕竟据学长说,python已经被杀烂了)
再小小的发散一下,原作者说类似花指令的免杀思维进行免杀,可以根据这里的50.2进行进一步免杀,但他使用的只是插入了垃圾代码,我们还可以用goto(pip install goto-statement
,和C语言的goto相同,要配合label使用,试了一下,不是很友好),来打乱执行流程等其他操作
第三种,就是dll劫持白加黑方式免杀,不会写dll,不过问题不大,因为关键的是劫持,劫持用工具即可,这就触及到我的知识盲区了,学会了再写吧
测试后的小问题
这段代码打包的exe已经过不了火绒了(测试时间为2021/09/28,360随便过,defender可以过静态,每次打包exe都不拦,动态一跑就G),经过测试,火绒会检测shellloader,但也很好绕过,对于shellloader部分的代码,进行hex或其他编码,再解码利用exec()
执行即可。而且火绒没法动态查杀。
总结
该学二进制了
顺带推荐一个系列的文章,讲了许多免杀的方法,不过原理部分和如何防御还是得自行琢磨:
https://github.com/TideSec/BypassAntiVirus
- 本文作者: Sn1pEr
- 本文链接: https://sn1per-ssd.github.io/2021/09/28/shellcode免杀之远程加载/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!