,无文件登陆的木马主要由一段可以自行定位的shellcode组成。它的特点是没有文件,可以附加到任何进程执行。一旦抓取到签名甚至只需要一次异或就可以更改签名,由于传统的安全软件都是基于文件检测,对越来越多的无文件登陆木马的检测效果很差。基于内存行为特征的检测方法,通过检测执行代码是否在正常的文件镜像段,即可识别是否为无文件木马。由于cobaltstrike等无文件木马段位于私有内存中,在执行loadimage回调时可以通过栈回溯快速确认是否为无文件木马。检测只需要40行代码:对loadimagecallback进行stacktraceback,发现是私有区域的内存,有excute权限的代码在加载dll。很有可能,很有可能是无文件木马或shellcode运行:HANDLEpProcessId,PIMAGE_INFOpImageInfo){UNREFERENCED_PARAMETER(pFullImageName);UNREFERENCED_PARAMETER(pProcessId);UNREFERENCED_PARAMETER(pImageInfo);if(KeGetCurrentIrql()!=PASSIVE_LEVEL)return;if(PsGetCurrentProcessId()!=(HANDLE)4&&PsGetCurrentProcessId()!=(HANDLE)0){if(WalkStack(10)==false){DebugPrint([!!!]CobaltStrikeShellcodeDetectedProcessName:%s\n",PsGetProcessImageFileName(PsGetCurrentProcess()));ZwTerminateProcess(NtCurrentProcess(),0);return;}}return;}堆栈返回:boolWalkStack(intpHeight){boolbResult=true;PVOIDdwStackWalkAddress[STACK_WALK_WEIGHT]={0};unsigned__int64iWalkChainCount=RtlWalkFrameChainWalkWIGHT,AddwStackWALkWIGHT1);intiWalkLimit=0;for(unsigned__int64i=iWalkChainCount;i>0;i--){if(iWalkLimit>pHeight)break;iWalkLimit++;if(CheckStackVAD((PVOID)dwStackWalkAddress[i])){DebugPrint("height:%daddress%p\n",i,dwStackWalkAddress[i]);bResult=false;break;}}returnbResult;}使用:编译驱动,加载driver,然后运行测试看:正常生成(x32和x64)测试:基于VirtualAlloc的C代码测试:测试结果:基于powershell的测试:基于python的测试:测试结果:缺点:目前已知的ngentask.exe,sdiagnhost.exe服务会触发这个检测规则(好像是为了执行一些更新服务,从微软服务器下载一些shellcode之类的来运行)。如果需要对这些特殊流程进行后续优化,比如数字签名验证Whitening操作。这是工程问题,不是这个demo的问题。一如既往,github:https://github.com/huoji120/CobaltStrikeDetected
