远程命令执行漏洞

远程命令执行漏洞

命令执行

命令执行是指计算机程序接受用户输入的命令,并按照命令的要求执行相应的操作。命令可以执行各种操作,例如读取文件、创建文件、修改文件、运行程序、删除文件等。
命令执行通常是通过一个命令行界面或终端窗口进行的。在命令行界面中,用户可以输入各种命令来操作计算机系统,而系统会相应地执行这些命令。命令行界面通常用于系统管理员、程序员或高级用户等需要更精细控制计算机系统的人员使用。

命令执行漏洞

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

命令执行与代码执行

命令执行执行的是系统命令。代码执行执行的是程序代码。

漏洞危害

继承Web服务器程序的权限,去执行系统命令
继承Web服务器程序的权限,读写文件
反弹shell
控制整个网站

漏洞寻找

这类的漏洞不像SQL注入、文件上传那样容易发现,此类的漏洞一般可以通过以下方式进行发现:

1.代码审计
为最主要的方式,借助代码审计工具,非常方便的审计出此类的漏洞
2.已知的组件、开发框架漏洞
已知组件、开发框架有很多每年都会爆出来很多此类的漏洞
3.页面传参查找
针对页面有传入参数的地方,可以重点关注传入恶意代码尝试,概率相对较小

命令执行相关函数

  • PHP:system()、exec()、shell_exec()、passthru()、penti_exec()、popen()、proc_pen()等,此外还有反引号命令执行,这种方式实际上是调用 shell_exec()函数来执行。
  • ASP.NET:System.Diagnostics.Start.Process、System.Diagnostics.Start.ProcessStart Info等
  • Java:java.lang.runtime.Runtime.getRuntime、java.lang.runtime.Runtime.exec等
  • Python:system()、popen()、subprocess.call

PHP命令执行相关函数介绍

exec

格式:exec(string $command [, array &$output [, int &$return_var ]])
作用:执行一个外部程序,exec() 执行 command 参数所指定的命令。第二个参数是执行命令返回的结果,第三个参数用来取得命令执行的状态码,通常执行成功都是返回0。

image-20230415112346357

image-20230415112720925

exec执行命令时不会输出全部结果,而是返回结果的最后一行。

如果是exec(ipconfig)

image-20230415112811611

image-20230415112836496

system

格式:system( string $command [, int &$return_var ] )
作用:函数执行 command 参数所指定的命令, 并且输出执行结果。

system和exec的区别在于,system在执行系统外部命令时,直接将结果输出到浏览器,如果执行命令成功则返回true,否则返回false。第二个参数与exec第三个参数含义一样。

image-20230415112951532

image-20230415113002814

shell_exec

格式:shell_exec( string $cmd )
作用:通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。

image-20230415113041702

image-20230415113055593

反引号

效果同shell_exec

image-20230415113139397

image-20230415113327392

除了以上的函数可以造成命令执行之外,php中还有许多其它的函数可以造成命令执行漏洞,比如: passthru、popen()等

漏洞修复

为了防止命令执行漏洞,开发人员应该遵循以下几个最佳实践:

1.永远不要信任用户输入。所有输入都应该被视为不可信,必须进行适当的验证和过滤。
2.避免使用shell执行用户输入的任何部分。如果必须要执行shell命令,必须正确地过滤和转义所有输 入。 3.不要将用户输入直接传递给任何外部命令或程序,而是应该使用专门的API或库,这些API或库可以帮 助开发人员更安全地执行系统命令。
4.使用白名单过滤所有输入,只允许必需的字符和格式。
5.对于使用开发框架的应用程序,及时更新框架和库的版本以获得最新的安全修复。

命令执行常见绕过方式

1、cmd1;cmd2:cmd1执行完再执行cmd2,windows下无法用(;)
2、cmd1|cmd2:不管cmd1命令成功与否,都会去执行cmd2命令
3、cmd1||cmd2:首先执行cmd1命令再执行cmd2命令,如果cmd1命令执行成功,就不会执行cmd2命令;相反,如果cmd1命令执行不成功,就会执行cmd2命令。
4、cmd1&cmd2:&也叫后台任务符,代表首先执行命令cmd1,把cmd1放到后台执行再执行命令cmd2, 如果cmd1执行失败,还是会继续执行命令cmd2。也就是说命令cmd2的执行不会受到命令cmd1的干扰。
5、cmd1&&cmd2:首先执行命令cmd1再执行命令cmd2,但是前提条件是命令cmd1执行正确才会执行命令cmd2,在cmd1执行失败的情况下不会执行cmd2命令。所以又被称为短路运算符。

image-20230415203714896

CTF中一些命令执行小tips

要查看flag,当cat被过滤时,可以使用如下命令代替

ca””t
ca\t
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:od指令会读取所给予的文件的内容,并将其内容以八进制字码呈现出来
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:将文本文件内容加以 ASCII 码的次序排列
uniq:用于检查及删除文本文件中重复出现的行列
file -f:报错出具体内容
paste:把每个文件以列对列的方式,一列列地加以合并
反引号+base64编码:`echo Y2F0IC9ldGMvcGFzc3dk |base64 -d`

空格被过滤

< 、<>、$IFS$9、${IFS}、$IFS、$IFS[*]、$IFS[@]等

/etc/passwd被过滤

/e?c/?asswd
/e*c/*asswd
/??c/?asswd
/??c/?assw?

组件、开发框架中的命令执行漏洞

由于新的漏洞不断被发现和修复,所以这些组件、开发框架是否存在漏洞随着时间的推移而变化。以下是一些已知的开发框架和库,它们在过去的一段时间内曾经存在过命令执行漏洞:
Apache Struts:Apache Struts是一个用于构建企业级Java Web应用程序的框架,它在过去曾经多次发现命令执行漏洞,例如2017年发现的漏洞CVE-2017-5638。

  • Ruby on Rails:Ruby on Rails是一个使用Ruby语言编写的Web应用程序框架,它在过去也曾经发现过多个命令执行漏洞,例如2013年发现的漏洞CVE-2013-0156。
  • Django:Django是一个使用Python语言编写的Web应用程序框架,它在过去也曾经发现过多个命令执行漏洞,例如2015年发现的漏洞CVE-2015-5143。
  • Laravel:Laravel是一个使用PHP语言编写的Web应用程序框架,它在过去也曾经发现过多个命令执行漏洞,例如2021年发现的漏洞CVE-2021-3129。
  • jQuery:jQuery是一个广泛使用的JavaScript库,它在过去也曾经发现过多个命令执行漏洞,例如2015年发现的漏洞CVE-2015-9251。

这里只是列举了一些已知的开发框架和库,在实际情况中,任何开发框架和库都可能存在安全漏洞,因此在开发应用程序时,需要不断关注它们的安全更新和漏洞修复。

Apache Shiro远程命令执行漏洞

Shiro

Apache Shiro是一个Java安全框架,提供了身份验证、授权、加密、会话管理等安全功能。它可以集成到任何Java应用程序中,包括Web、企业、桌面和移动应用程序。

Shiro-550

Shiro-550是Apache Shiro项目的一个问题编号,指的是一个已经被修复的漏洞。该漏洞存在于Shiro的RememberMe功能中,攻击者可以使用Cookie中的信息重新创建会话并获取未经授权的访问权限。该漏洞的CVE编号为CVE-2016-4437。

漏洞原理

Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后用户信息会经过加密编码后存储在cookie中。在 Cookie 读取过程中有用AES对 Cookie 值解密的过程,对于 AES 这类对称加密算法,一旦秘钥泄露加密便形同虚设。若秘钥可控,同时 Cookie 值是由攻击者构造的恶意Payload,就可以将流程走通,触发危险的 Java 反序列化,从而导致远程命令执行漏洞。
所以此漏洞的关键点就是密钥的泄露,一些网站使用了默认的密钥就存在泄露的风险。

漏洞复现

新建docker-compose.yml文件,将以下内容复制进去

version: ‘2’
services:
web:
image: vulhub/shiro:1.2.4
ports:
- “8080:8080”

然后执行

1
docker-compose up -d

image-20230415205921974

想要快速的对目标进行针对性的测试,首先就需要知道目标是否使用该组件。比如想要知道这个网站是否存在shiro550命令执行漏洞,那前提是目标网站有没有使用这个组件。

在访问及登录时抓包,如果响应头set-cookie中显示rememberMe=deleteMe,说明使用了Shiro组件

image-20230415211159334

除此之外,还可以自己在请求包中的Cookie处添加rememberMe=1然后查看响应头是否有rememberMe=deleteMe。

image-20230415213359912

还可以使用一些指纹识别工具进行批量的检查目标网站是否使用了shiro组件,

https://github.com/EASY233/Finger

image-20230415214025349

output

image-20230415214041202

这是批量指纹识别发现,也可以使用Burp Suite插件进行被动扫描发现,该Burp Suite插件除了能识别出目标网站是否使用Shir组件之外还能爆破其密钥

image-20230415214637929

出现记录说明使用了Shiro组件(not found shiro key为没有爆破出密钥)

image-20230415214921097

在获取到目标网站使用了Shiro之后,可以再使用其他的工具爆破密钥,运行该工具需要有java环境

image-20230415215444671