自动重构Meterpreter绕过杀软( 三 )
隐藏API导入调用由外部库导出的函数会使链接器向导入地址表(IAT)写入一个条目 。最终函数名称将在二进制文件中以明文形式显示,因此在无需执行恶意文件的情况下,可以静态恢复函数名 。当然,有些函数名称相比其他名称更可疑 。一个更明智的做法是隐藏所有可疑二进制文件,同时,保留大多数合法二进制文件中存在的文件 。
例如,在Metepreter的kiwi扩展中,可以找到以下行:
enumStatus = SamEnumerateUsersInDomain(hDomain, &EnumerationContext, 0, &pEnumBuffer, 100, &CountRetourned);该函数由samlib.dll导出,因此链接器会使字符串samlib.dll和SamEnumerateUsersInDomain出现在已编译的二进制文件中 。
要解决此问题,可以在运行时使用LoadLibrary/GetProcAddresss导入API 。当然,这两个函数都适用于字符串,因此也必须对其进行混淆 。因此,我们希望按如下所示自动重写上述代码段:
typedef NTSTATUS(__stdcall* _SamEnumerateUsersInDomain)(SAMPR_HANDLE DomainHandle,PDword EnumerationContext,DWORD UserAccountControl,PSAMPR_RID_ENUMERATION* Buffer,DWORD PreferedMaximumLength,PDWORD CountReturned);char hid_SAMLIB_01zmejmkLCHt[] = {'S','A','M','L','I','B','.','D','L','L',0};char hid_SamEnu_BZxlW5ZBUAAe[] = {'S','a','m','E','n','u','m','e','r','a','t','e','U','s','e','r','s','I','n','D','o','m','a','i','n',0};HANDLE hhid_SAMLIB_BZUriyLrlgrJ = LoadLibrary(hid_SAMLIB_01zmejmkLCHt);_SamEnumerateUsersInDomain ffSamEnumerateUsersInDoma =(_SamEnumerateUsersInDomain)GetProcAddress(hhid_SAMLIB_BZUriyLrlgrJ, hid_SamEnu_BZxlW5ZBUAAe);enumStatus = ffSamEnumerateUsersInDoma(hDomain, &EnumerationContext, 0, &pEnumBuffer, 100, &CountRetourned);Rewriting syscalls
重写系统调用默认情况下,在运行Cylance的计算机上使用Meterpreter的migration命令会触发杀软检测(请谨慎) 。Cylance会使用用户界面hook检测进程注入 。为了避开检测,可以去掉hook,这似乎是现在的主流趋势,或者可以完全避免使用hook 。我们发现,读取ntdll,恢复系统调用号并将其插入随时可以调用的Shellcode中更为简单,这可以有效地绕过任何杀软用户区的钩子 。迄今为止,我们尚未找到可以将从磁盘读取的NTDLL.DLL的行为识别为可疑的蓝队 。
实现上述所有想法都可以在基于libtools的源代码重构工具中实现 。本节说明我们是如何做到这一点的,这是在时间和耐心之间的妥协 。因为缺少libtools文档,所以此处还有改进的空间,如果你发现了什么,那可能是我们希望得到的反馈 。
抽象语法树101编译器通常包括几个组件,最常见的是解析器和词法分析器 。当将源代码提供给编译器时,它首先从原始源代码(程序员编写的代码)中生成一个解析树,然后将语义信息添加到节点(编译器真正需要的) 。此步骤的结果称为抽象语法树 。维基百科展示了以下示例:
while b ≠ 0if a > ba := a − belseb := b − areturn a这个小程序的典型AST如下所示:

文章插图
在编写需要理解其他程序属性的程序时,这个数据结构允许使用更精确的算法,因此执行大规模代码重构是一个不错的选择 。
Clang的抽象语法树由于我们需要正确修改源代码,因此我们需要熟悉Clang的AST 。好消息是Clang公开了一个命令行开关,以漂亮的颜色转储AST 。坏消息是,对于除”玩具项目”以外的所有项目,设置正确的编译器标志都非常棘手 。
现在,让我们做一个现实而简单的翻译测试单元:
#include <windows.h>typedef NTSTATUS (NTAPI *f_NtMapViewOfSection)(HANDLE, HANDLE, PVOID *, ULONG, ULONG,PLARGE_INTEGER, PULONG, ULONG, ULONG, ULONG);int main(void){f_NtMapViewOfSection lNtMapViewOfSection;HMODULE ntdll;if (!(ntdll = LoadLibrary(TEXT("ntdll")))){return -1;}lNtMapViewOfSection = (f_NtMapViewOfSection)GetProcAddress(ntdll, "NtMapViewOfSection");lNtMapViewOfSection(0,0,0,0,0,0,0,0,0,0);return 0;}然后,将以下脚本插入.sh文件中:WIN_INCLUDE="/Users/vladimir/headers/winsdk"CLANG_PATH="/usr/local/Cellar/llvm/9.0.1"#"/usr/lib/clang/8.0.1/"clang -cc1 -ast-dump "$1" -D "_WIN64" -D "_UNICODE" -D "UNICODE" -D "_WINSOCK_DEPRECATED_NO_WARNINGS""-I" "$CLANG_PATH/include""-I" "$CLANG_PATH""-I" "$WIN_INCLUDE/Include/msvc-14.15.26726-include""-I" "$WIN_INCLUDE/Include/10.0.17134.0/ucrt""-I" "$WIN_INCLUDE/Include/10.0.17134.0/shared""-I" "$WIN_INCLUDE/Include/10.0.17134.0/um""-I" "$WIN_INCLUDE/Include/10.0.17134.0/winrt""-fdeprecated-macro""-w""-fdebug-compilation-dir""-fno-use-cxa-atexit" "-fms-extensions" "-fms-compatibility""-fms-compatibility-version=19.15.26726" "-std=c++14" "-fdelayed-template-parsing" "-fobjc-runtime=gcc" "-fcxx-exceptions" "-fexceptions" "-fseh-exceptions" "-fdiagnostics-show-option" "-fcolor-diagnostics" "-x" "c++"
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 利用WebHook实现PHP自动部署Git代码
- 烘鞋器耗电吗 烘鞋器会自动断电吗
- 点火 自动挡汽车应用驾驶操作练习-启动发动机操作规范
- MySQL在CentOS上执行自动备份
- 19套工作计划进度管理必备,自动Excel甘特图模板推荐
- 焊底盘塔架用什么自动焊接流水线?苏州安嘉
- 雨伞自动和手动哪个耐用 自动伞耐用还是手动伞耐用
- 蚂蚁合花是正规平台吗 蚂蚁合花会自动扣钱吗
- 淘宝店铺注销多久生效 淘宝网店会自动注销么
- TuSimple找到合作伙伴 帮助其打造自动驾驶半卡车队
