导语:渗透测试工作人员或者红队人员往往会在攻击过程中遇到不同的复杂环境,碰到不同的检测入侵机制。一些入侵方法虽然很容易进行攻击,但是往往会犯小错误导致被发现。
我和我的伙伴@tifkin_最近在商议渗透测试过程中如何自动化的来帮助攻击者处理避免这些粗心的小错误。在平常攻击过程中,攻击者必须需要保持强烈的情景意识,否则一点小错误都会被发现。但是当你遇到一些无法解决的难题时,你往往会忘掉隐藏自己,使用一些容易被发现的攻击方法。在平常渗透测试过程中,我们经常使用cobalt strike 进行操作,于是我们将改进目标放在限制了cobalt strike的攻击载荷上面。我们很快的提出了一种使用Aggressor Script的方法限制攻击者在给定的目标环境中运行已知被查杀的攻击方法,我们将这种限制方法叫做OPSEC。我们编写的依据主要是依赖于@armitagehacker发布的文章:https://blog.cobaltstrike.com/2017/06/23/opsec-considerations-for-beacon-commands/
opsec的配置文件已经部署到了github上:https://github.com/bluscreenofjeff/AggressorScripts/tree/master/OPSEC%20Profiles 。github仓库中目前包含了限制cmd,powershell,产生新线程,线程注入,创建新服务等功能。同时仓库中还包括了一个模版文件,你可以根据他创建适合当前环境的限制内容。
这些配置文件就是一个Aggressor脚本,它使用代码块设置或者启用beacon命令并且阻止不允许运行的命令,并且显示错误。如果运行没有限制的命令,则不会受任何影响。通过选择适当的限制命令,就可以防止cobalt strike运行当前环境不允许运行的命令形式。
使用方法
开始使用
要开始使用配置文件,需要像加载其他脚本一样,选择你要加载的配置文件加载到cobalt strike里面去。要加载脚本,点击cobalt strike顶部的菜单栏,选择Script Manager。点击Load,会弹出一个文件浏览器,会允许你加载OPSEC配置文件。
加载之后配置文件立马生效,任何被配置限制的命令都不能够运行,并且运行会显示错误信息。需要注意的是OPSEC配置文件限制了beacon和右键菜单中的命令。他不会对其他界面的按钮做任何限制,比如进程模块中的进程注入就不会被限制。OPSEC的本意就是降低攻击者运行危险文件的风险,不过不是运行OPSEC脚本就是百分之百安全的。
同样需要注意的是,OPSEC配置文件和一般的Aggressor脚本只会加载到当前的客户端中,如果你同时使用多个客户端,那么需要在每个客户端中都要加载这一脚本。
OPSEC命令
OPSEC配置文件会在beacon中添加一个新的命令:opsec。这一命令会输出一个关于当前限制情况的列表:
比如:
beacon> opsec [+] The current opsec profile has the following commands set to enable/block: [*] browserpivot - enable [*] bypassuac - block [*] cancel - enable [*] cd - enable [*] checkin - enable [*] clear - enable [*] covertvpn - block [*] cp - enable
移除配置文件
移除配置文件你可以采用以下两种方法:
1.取消载入这脚本,并且载入defalt.cna脚本 2.取消载入这脚本,重启cobalt strike。
如果你正在cobalt strike中加载其他的脚本,那么你将OPSEC配置文件取消载入后,你需要重新加载这些你正在使用的脚本。
可以使用的配置文件
下面的配置文件可以在github仓库中找到:
1. cmd-execution.cna:阻止依赖于cmd.exe的命令 2. powershell.cna:阻止依赖于powershell的命令 3. process-execution.cna:阻止产生新进程的命令 4. process-injection.cna:阻止使用进程注入命令 5. service-creation.cna:阻止产生新服务的命令 6. template.cna:包含脚本中所有命令的开和关选项,根据当前的环境需要进一步设定。
自定义配置
template.cna配置文件目的就是为了方便进行自定义的配置,要定制符合当前环境的脚本,只需要修改要控制命令的值即可。例如,以下代码禁用了bypassuac和covertvpn:
%commands["browserpivot"] = "enable"; %commands["bypassuac"] = "block"; %commands["cancel"] = "enable"; %commands["cd"] = "enable"; %commands["checkin"] = "enable"; %commands["clear"] = "enable"; %commands["covertvpn"] = "block"; %commands["cp"] = "enable"; %commands["dcsync"] = "enable";
配置文件还可以对自定义的命令进行控制。只需要在配置文件中加简简单单的一行:
%commands["COMMAND-NAME"] = "block";
下方命令就是对’get-da’命令进行限制:
%commands["get-da"] = "block";
如果要阻止GUI命令,你需要对脚本进一步修改,请参阅115-366行,了解配置文件如何防止阻塞的内置命令运行的。这部分模块配置是基于defualt.cna脚本。
例如,下方自定义弹出菜单的代码:
popup beacon_bottom { item 'Run "jobs"' { binput($1, "jobs"); bjobs($1); } }
下方代码会当它运行时进行阻止:
popup beacon_bottom { item 'Run "jobs"' { if (%commands['jobs'] eq 'block') { operror($1); } else { binput($1, "jobs"); bjobs($1); } } }
修改后的代码检查是否将jobs命令设置为禁止,如果是,则执行operror函数。运行函数运行openOrActivate并将错误消息打印到日志。
作为参考,这是完整的错误功能代码:
sub operror { openOrActivate($1); berror($1,"This command's execution has been blocked. Remove the opsec profile to run the command."); }
DEMO
下方图片就是禁用powershell命令的demo:
就像你看到的,脚本加载之前,powershell命令执行成功,一旦脚本加载之后,再执行就会输出错误。因此配置文件在命令传递到目标之前就已经执行,所以不会在目标主机上运行。
总结
渗透测试人员和红队人员通常需要在评估期间管理多个攻击路径,多路径通常意味着测试人员可以更全面的评估目标,但是也往往会导致犯一些错误。这种错误可能包括在高度监控的目标环境下运行已经会被查杀的命令。Cobalt Strike OPSEC配置文件就是为了防止攻击者犯此类错误。这些配置文件可以满足您特定的需求,并且可以轻松拓展管理自己的Aggressor脚本。