远程命令执行漏洞的出现一般伴随着目标系统上命令的执行。系统的类型有多种,执行的名称不同,输出的结果也不尽相同,常见的环境大概有linux,windows以及busybox,分别对应着常见的路由器环境以及服务器环境

那么为了尽可能地减少漏报的风险,就要要求我们充分分析目标web系统所能够运行的平台,统一在编写相关rules时为每一种可能都写出相关的rule

不同web系统的情况不尽相同,也许某些平台中不存在的命令在其他系统中是恒久存在的,审核时只需要需要注意判断所执行的命令在目标的系统中是否为通用的即可

例如在不同系统中读取文件时,我们读取的文件一般是不同的

linux   => 使用cat命令  => 读取/etc/passwd等系统中存在的文件
windows => 使用type命令 => 读取win.ini等文件

那么我们在对应的rule中一定要写出

rules:
	linux:
		request:
			...
			path: /dosomething?cmd=cat%20/etc/passwd
			...
		expression: response.body_string.contains("root")
	windows:
			...
			path: /dosomething?cmd=type%C://windows//win.ini
			...
		expression: response.body_string.contains("extension")
...
expression: linux() || windows()

有回显命令执行(Revealed)

对于有回显的命令执行,虽然容易测试与编写,但是请注意编写过程中的一些问题
  • 那么在执行输出命令的rule中
    • 可以且建议使用的方案
      • 可以选择使用读取文件的指令读取出系统中通用且稳定存在的文件来判断结果
      • 可以选择使用读取文件的指令读取出web系统中通用的配置文件等内容,例如java系统常见的pom.xml等(较为推荐)
      • linux中可以选择使用rev,expr等命令处理输入内容后再进行判断,对于内容的严谨性可以参阅通用部分的set内容
      • 一些web系统中可以选择在能访问的文件中直接写入文件内容,通过访问产生的文件来判断漏洞的存在(不是很推荐,会残留文件)
        • 如果使用这样的方式创建了一个文件,首先尽量不要创建脚本类型的文件,尽量是一个txt文件;其次,不要再多发一个包进行文件的删除,因为这一般就会使用rm命令,这个命令在目标系统上执行是非常危险的行为,所以宁愿留一个文件,也不要执行相关的命令
    • 不可以且一般严禁执行的方案
      • 使用echo之类的输出语句直接输出一个内容,然后在返回里查找这个内容,此类POC很容易误报和漏报
      • 尽量不要使用类似iduname这种输出不稳定的指令来进行判断,在不同的环境中输出可能会有些许的差异

同时考虑到有些32位系统整数上限可能低于2^31和数字过短可能误报,目前要求乘法两个数字的取值范围必须在 4000044800 之间,加法两个数字必须在 8000000001000000000 之间

无回显命令执行(Unrevealed)

无回显命令执行要求我们使用反连平台进行测试,只要反连平台接收到相关的请求并能正确处理就说明目标系统成功执行相关命令

需要注意,如果目标允许的情况下,使用反连平台时要尽可能地避免掉dns请求,尽量简化配置流程
漏洞如果能通过回显检测,就不要使用反连平台,鼓励将公开的无回显的POC改为有回显的。比如公开的struts2漏洞POC很多是反弹shell的POC,但几乎所有struts2的POC都可以修改为有回显的POC

一般来说,我们使用的能够发出请求的命令有这几种,这里分别引申出使用中存在的隐患问题

在linux系统中,我们一般的选择有

其他类似nc等系统中存在概率不大且不是特别常用的指令这里不再讲解,可以依照功能分别对应隐患

在windows系统中,我们一般的选择有

其他的命令例如Invoke-WebRequest可以参考上面给出的内容自我衡量,这里不多做要求

对于目标系统不出网的情况这里不多加赘述,可以参考此处

模板

远程命令执行