自写C2,补充大脑营养,促进骨骼生长

文摘   2024-09-16 15:31   中国香港  

Cobalt Strike 是目前使用人数最多的C2框架。然而这使得它备受各大安全厂商的亲密关注最深入分析。在大多数环境中,不更改默认设置是行不通的,因为这会立即被检测到。

所以在使用此框架时必须要进行一些最低限度的基本操作才行:

配置方面:

1.将Malleable C2 配置文件中的host_stage选项设置为 false。这将阻止 Cobalt Strike 在其 Web 和 DNS 服务器上托管有效载荷阶段。这样做对 OPSEC 有很大好处。启用暂存后,任何人都可以连接到您的服务器,请求有效载荷并分析其内容以从您的有效载荷配置中查找信息。

2.使用自定义的Malleable C2-Profile:https://www.ctfiot.com/159499.html

3.C2重定向:https://github.com/wikiZ/RedGuard


代码方面:

1.Shellcode必须经过加密和混淆,但是所有的编码/混淆方法都会产生一段自修改的代码。这意味着生成的payload必须在读-写-执行 (RWE) 内存区域,所以更好的方式是在机器代码指令层面进行变异将它们转换为其他指令。

        lea rcx, [0xDEAD] ------+->  lea rcx, [1CE54]
                              +-> sub rcx, EFA7

这样,新生成的序列的组合字节足够不同,可以绕过静态检测规则,参考视频:https://www.bilibili.com/video/BV1wA4m1F7Rr/?spm_id_from=333.999.0.0&vd_source=d0c5cfc4008c14d0c490e16cf55f5b65

参考博客:https://karma-x.io/blog/post/30/

2.反沙箱

#include <Windows.h>
#include <stdio.h>
// 调用Beep 实现延迟执行
int time_Beep()
{
// 设置延迟 300000毫秒 5分钟
int wh_compter = 0;
int wh_total = 300000;

while(wh_compter < wh_total)
{
Beep(2, 1); // 2hertz, 1ms 设置低频和短暂的间隔时间实现听不见蜂鸣声
wh_compter++;
}

if(wh_compter > wh_total - 1)
return 1;

return 0;
}

int main()
{
if(time_Beep())
printf("调用Beep 延迟执行成功 \n");
else
printf("调用Beep 延迟执行失败 \n!");

return 0;
}

3.修改Cobalt Strike的默认的SleepMask。这个选项是用于Beacon加密堆和堆栈内存,以便在成功执行后对内存扫描器隐藏自己。但是这个默认的sleepmask源代码本身也被AV/EDR打了签名。

以上所有这些东西都可以通过完全自定义的 Packer/Loader 或 Arsenal Kit 来完成。

即便完成了所有上面的东西,你会发现在许多环境中,能够运行 Beacon,但在执行单个命令/模块后,就会立即呗检测到并被杀死,为什么,不为什么。因为CS是目前最受关注的框架。以这个yara为例:https://github.com/elastic/protections-artifacts/blob/main/yara/rules/Windows_Trojan_CobaltStrike.yar ,可以看到每个命令/模块都写了检测规则。所以后渗透阶段大多数都使用内存加载.Net 程序集或 Beacon 对象文件 (BOF) 作为指令而不是Windows CLI 命令。

但是这些规避技术真的有必要做吗?

从个人的观点来看,这个问题的答案其实相当简单——以上全错,土鸡瓦狗,不值一提!

为什么呢?尽管信息安全行业这些年确实推动了防御和攻击技术不断升级,但所有的规避技术归根结底仍主要用于绕过签名检测。

如果你使用的是自生成的 Shellcode,那么继续使用 Win32 API 也是可行的选择。虽然 WriteProcessMemory 或 CreateThread 可能会触发对输入参数的检测,并且可能会对 Shellcode 入口点进行分析,但如果没有已知的恶意签名,这些代码仍会正常运行,且不会被阻止。

若你使用的是内部开发的工具或经过大量修改的二开工具,AMSI(反恶意软件扫描接口)通常不会检测到你,因为它主要是通过已知签名进行匹配。

同样地,如果你采用的是经过高度混淆的开源 C2(命令与控制)框架,或者是自研框架,内存扫描工具将很难发现你的存在。

而且我们还可以用猥琐的做法使得我们的进程除非蓝屏永远不会死

让安全软件瑟瑟发抖:重生之我是天命进程


金蝉子,我又赢了—人性之懒

虽然自行开发好处多多,但在信息安全领域,很多人更倾向于依赖现成的、已知的工具,而不是花时间从头构建新的解决方案,这反映了某种程度上的“懒惰”。

这种做法值得批评,这种“懒”不仅体现在对现有工具的依赖,更体现在对创新的抗拒。依靠现成工具似乎可以快速见效,但长期来看,这会使团队变得过度依赖,失去主动探索的精神。真正的胜利不是靠重复已知,而是通过不断打破惯性、超越已有的框架,来创造全新的突破。


正本清源:其实自己开发一个C2不需要花费那么多时间

是的,你没听错,很多技术小白都犯过这样的错误。他们认为构建了一个C2必须写满各种各样的功能,比如应该添加文件上传/下载,dump凭证,键盘记录,然后过了一段时间,“想让它截取屏幕截图,获取浏览器记录”。不知不觉中,就形成了一个充满着 case switch 语句的混乱代码,而且每一项功能都伴随着巨大的隐形成本,因为每个功能都可能”会被打上签名“。所以其实不必太花哨,只需要维持一个基本的链接就行,剩下的功能不如全交给BOF吧。

这里提供了一个example,可以看见其实实现一些基本的功能根本不难,代码只有短短几百行,有空后面再慢慢拓展

示例代码复制到公众号文章太长了,放到星球,

github上还有许多开源优秀的C2项目,强烈建议读者拉下来学习,编写自己的C2提升技术能力,逃出自己的舒适圈,推荐:https://docs.mythic-c2.net/

信 安 考 证



需要考以下各类安全证书的可以联系我,价格优惠、组团更便宜

CISP、PTE、PTS、DSG、IRE、IRS、NISP、PMP、CCSK、CISSP、ISO27001...


老鑫安全
真正的大师永远都怀着一颗学徒的心,专注于渗透测试,红蓝对抗,漏洞挖掘等安全技术培训 B站:老鑫安全 知识星球:老鑫安全 官网论坛:https://www.laoxinsec.com