暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

CobaltStrike 插件编写入门教程

灼剑安全团队 2021-08-31
1777

                        点击上方蓝字关注我们                                    

简介

这篇文章主要以写一个判断beacon中存在的杀软进程脚本为例子来介绍如何去尝试从零开始写一个cobaltstrike插件。cobaltstrike中aggressor-script是建立在sleep脚本之上,本篇文章涉及简单的sleep脚本基础,和cobaltstrike内置函数和事件的调用。

先看效果:

参考链接:https://www.cobaltstrike.com/aggressor-script/index.htmlhttp://sleep.dashnine.org/manual/

0x01 sleep脚本基础

1.sleep脚本中的array类型

在sleep脚本中使用@关键字来定义一个array,例如定义一个@foo,即为定义一个名称为foo的array。这里的array类似于js中的array,在array中可以向里面添加int或者string甚至是一个object。

    $x = 3;
    @foo[0] = "Raphael";
    @foo[1] = 42.5;
    @foo[2] = "Donatello";
    @foo[$x] = "Michelangelo";

    上面的例子首先定义一个普通变量x的值为3,然后定义了一个名称为foo的列表。在列表中添加了string类型的Raphael、Donatello、Michelangelo的值和一个int类型的42.5。

    2.sleep脚本中的hashes类型

    在sleep脚本中,如果我们想使用类似其他语言中字典的功能,那就要用到sleep中的hashes类型,这种类型使用%符号来声明变量。

      $x = 3;
      %foo["name"] = "Raphael";
      %foo["job"] = "wasting time";
      %foo[$x] = "Michelangelo";
      println("%foo is: " . %foo);
      %foo is: %(3 => 'Michelangelo', job => 'wasting time', name => 'Raphael')

      %hash = %(a => "apple", b => "boy", c => 3 * (9 % 7));
      println("%hash is: " . %hash);


      %hash is: %(a => 'apple', c => 6, b => 'boy')

      上面的例子就是定义了一个类似于其他语言中的字典变量。当然我们需要判断beacon中的杀软进程时,一个方法就是首先定义杀软进程名以及对应的杀软名称为key和value的hashes变量。将beacon中的进程导出然后对照该字典中是否存在我们已经首先定义好的字典中的key去寻找杀软名称。

      3. replaceAt函数的使用

        replaceAt("string", "new", index, [n])

        这个函数的使用方法是用new字符串替换从指定索引开始的 n 个字符。

        例如:

          $string = "this is a test, really";
          $string = replaceAt($string, "drill", 10, 4);


          println($string);


          this is a drill, really

          这几行代码替换了string中的从第10个索引开始的4个字符,从第10个索引开始的4个字符为test,将其替换成了drill。

          4.split函数的使用

            @ split('pattern'"string", [limit])

            该函数的作用是按指定模式拆分指定字符串,然后其返回一个array数组。

            其中的string是你想拆分的字符串;pattern是定义一个你想拆分的模式,可以使用正则表达式,也可以使用特定的字符或者字符串;limit为可选参数,这个参数的作用是限制将句子分割成的段数,一般用不到。

            5.sleep中的foreach循环遍历

            在我们操作array或者hashes的时候,经常需要循环遍历其中的所有变量。和大多数一一样,sleep脚本也提供了foreach操作,该操作可以将带有键值对的变量中的key和value循环遍历出来。

              %data = %(foo => "a", bar => "b", baz => "c", jaz => "d");


              foreach $key => $value (%data)
              {
              if ($value eq "c")
              {
              $value = "coolios";
              }
              }


              println(%data);


              %(foo => 'a', baz => 'coolios', bar => 'b', jaz => 'd')
                @data = @(8, 7, 6, 5, 4, 3, 2, 1, 0);


                foreach $index => $value (@data)
                {
                if ($index == $value)
                {
                println("$index == $value !!!");
                remove();
                }
                }


                println(@data);


                4 == 4 !!!
                @(8, 7, 6, 5, 3, 2, 1, 0)

                0x02 aggressor-script中需要用的内置事件和函数

                1.beacon_bottom

                在操作beacon时,我们经常选择我们想要操作的beacon右键然后点击菜单再选择相应的menu进行插件操作,而beacon_bottom的作用就是当我们在当前beacon操作时获得我们当前beacon的ID。

                我们可以在之后的menu或者item中在再加我们想要的菜单或者是item。

                  popup beacon_bottom {
                  menu "antiVirusCheck" {
                  item "check" {
                  }
                  }
                  }

                  如上面的例子,我们就添加完成了一个菜单为antiVirusCheck,其中的item为check,效果如下所示:

                  2.bshell函数的使用

                  阅读coblatstrike官方文档可以看到,bshell函数的作用是使用beacon中的cmd.exe来执行命令,其中的参数$1即为需要执行命令的beaconID,而beaconID我们可以通过前面的beacon_bottom来获取。

                  第二个参数为需要执行的命令。例如我们想获取当前beacon的所有进程,可以使用以下方法:

                    popup beacon_bottom {
                    menu "antiVirusCheck" {
                    item "check" {
                    bshell($1,"tasklist SVC");
                    }
                    }
                    }

                    然后我们就可以在当前beacon的控制台看到我们执行了tasklist SVC 这条命令。

                    3.beacon_output事件

                    当我们从beacon中执行命令获取到了beacon的返回消息之后想要捕获这条消息来进行下一步的操作时,就需要用的beacon_output事件了,该事件的说明可以在官方文档中查看:

                    可以看到$2变量即为我们想获得的返回信息。

                      popup beacon_bottom {
                      menu "antiVirusCheck" {
                      item "check" {
                      bshell($1,"tasklist SVC");
                      on beacon_output{
                      $message = $2;
                      @array = split(" ",$message);
                      println(@array);
                      }
                      }
                      }
                      }

                      将代码修改成上述格式之后,在控制台中输出验证是否捕获到了beacon控制台的输出。将返回的message做一个简单的处理然后在脚本控制台输出:

                      可以看到,脚本确实捕获到了beacon控制台的输出,然后进行了我们的split的操作并且在脚本控制台输出了出来。只不过这里分割之后可能有些问题,不过不用担心,可以使用一系列sleep脚本的其他操作来对获得到的数据进行清洗。

                      4.elog函数

                      这个函数没什么好说的,就是在eventlog栏中输出字符串。

                      0x03 简易脚本代码

                        popup beacon_bottom {
                        menu "antiVirusCheck" {
                        item "check" {
                        %sr = %(
                        "360tray.exe" => "360安全卫士-实时保护",
                        "360safe.exe": => "360安全卫士-主程序",
                        "ZhuDongFangYu.exe" => "360安全卫士-主动防御",
                        "360sd.exe" => "360杀毒",
                        );
                        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']);
                        }
                        }



                        }
                        }
                        }


                        }

                        0x04 项目地址

                        下载地址:https://github.com/Tsojan/antiVirusCheck欢迎各位师傅Star、Issue、Fork。

                        由于杀毒软件的字典太大了,这里仅仅使用360的进程名称作为示例。具体的操作为,先执行beshell函数从beacon中获取进程列表的字符串,然后按照一定的流程对字符串进行拆分获取到单个的进程名称。然后使用单个的进程名称和我们预先定义好的字典里的杀软进程进行对比,如果存在那么就会在脚本控制台和event控制台中输出当前存在的杀软。

                        0x05 总结

                        后续会发布基于灼剑安全团队的CS插件1.0版本,请大家继续关注我们哟。欢迎各位师傅加群交流:

                        往期文章:

                        工具|Python常用小脚本

                        工具|Golang安全开发之并发TCP扫描器的实现

                        工具|Golang安全开发之NMAP格式IP解析库



                        ☆ END ☆

                        文章转载自灼剑安全团队,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                        评论