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

作者: 飞天魔鬼
免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责。

引言

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

先看之前的效果:
在这里插入图片描述
之前的版本是将杀软信息输出到了eventlog中,这样在工作的时候会导致eventlog消息太多,看起来太杂乱。

0x01 思路

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

我注意到其中有一个名为BEACON_SBAR_LEFT的设置。
在这里插入图片描述
可以看出来这个函数就是用来设置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的状态栏之中输出出来。以达到我们的目的。

效果如下:
在这里插入图片描述
要实现这个效果就需要在监听到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 $+ ]";
                            }
                        }

看看效果
在这里插入图片描述
已经有那味儿了

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

在这里插入图片描述

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/

0x04 了解更多安全知识

欢迎关注我们的安全公众号,学习更多安全知识!!!
欢迎关注我们的安全公众号,学习更多安全知识!!!
欢迎关注我们的安全公众号,学习更多安全知识!!!
在这里插入图片描述

Guess you like

Origin blog.csdn.net/weixin_42282189/article/details/121090055