一、漏洞背景
国际知名的漏洞攻击代码发布机构 exploit-db发布了一个针对apache+php的攻击代码,作者为著名国际黑客Kingcope。详见 http://www.exploit-db.com/exploits/29290/。实际上这个漏洞在2012年5月份就被发现了,php官方也修复了这个漏洞。详见 http://eindbazen.net/2012/05/php-cgi-advisory-cve-2012-1823/
二、漏洞成因
php作为cgi模式运行的时候,接受-s -d -c 这样的参数,我们看看这些参数的功能:
-s Output HTML syntax highlighted source -d foo[=bar] Define INI entry foo with value bar
该漏洞攻击代码
char poststr[] = "POST %s?%%2D%%64+%%61%%6C%%6C%%6F%%77%%5F" \ "%%75%%72%%6C%%5F%%69%%6E%%63%%6C%%75%%64%%65%%3D%%6F%%6E+%%2D%%64" \ "+%%73%%61%%66%%65%%5F%%6D%%6F%%64%%65%%3D%%6F%%66%%66+%%2D%%64+%%73" \ "%%75%%68%%6F%%73%%69%%6E%%2E%%73%%69%%6D%%75%%6C%%61%%74%%69%%6F%%6E" \ "%%3D%%6F%%6E+%%2D%%64+%%64%%69%%73%%61%%62%%6C%%65%%5F%%66%%75%%6E%%63" \ "%%74%%69%%6F%%6E%%73%%3D%%22%%22+%%2D%%64+%%6F%%70%%65%%6E%%5F%%62" \ "%%61%%73%%65%%64%%69%%72%%3D%%6E%%6F%%6E%%65+%%2D%%64+%%61%%75%%74" \ "%%6F%%5F%%70%%72%%65%%70%%65%%6E%%64%%5F%%66%%69%%6C%%65%%3D%%70%%68" \ "%%70%%3A%%2F%%2F%%69%%6E%%70%%75%%74+%%2D%%64+%%63%%67%%69%%2E%%66%%6F" \ "%%72%%63%%65%%5F%%72%%65%%64%%69%%72%%65%%63%%74%%3D%%30+%%2D%%64+%%63" \ "%%67%%69%%2E%%72%%65%%64%%69%%72%%65%%63%%74%%5F%%73%%74%%61%%74%%75%%73" \ "%%5F%%65%%6E%%76%%3D%%30+%%2D%%6E HTTP/1.1\r\n" \
解码出来是:
%s?-d allow_url_include=on -d safe_mode=off -d suhosin.simulation3Don -d disable_functions="" -d open_basedir=none -d auto_prepend_file=php://input -d cgi.fo"rce_redirect=0 -d cgi.redirect_status_env=0 -n
可以看出Kingcope的攻击代码思路是关闭各种防护的参数,打开各种危险的参数,最后利用auto_prepend_file(或auto_append_file)这个参数把黑客需要执行的系统命令传递过去了。
三、利用条件
要利用这个漏洞,必须同时满足如下条件:
1、apache+php是用cgi模式跑的,例如apache的mod_cgid
2、php解释器需要可以从下面的url访问到,当然或许可能是其他的url,这个具体要看你的配置
/cgi-bin/php /cgi-bin/php5 /cgi-bin/php-cgi /cgi-bin/php.cgi /cgi-bin/php4
3、php版本
PHP版本小于5.3.12
PHP版本小于5.4.2
四、攻击案例:一次入侵Linux服务器的事件记录
最近,我注意到多个IP地址试图利用一个PHP漏洞攻击,所以我利用蜜罐记录了结果,此次活动让人想起早期僵尸网络疯狂的日子,用IRC命令控制,以及利用被入侵的主机作为扫描工具。
这是很有趣的,因为它表明它是一个成功针对Linux服务器的PHP漏洞,它能做什么呢,我将演示如何做一些基本的内存取证,可以使用Volatilit这种类型的事件进行总结。
以下是攻击者尝试的攻击:
这是针对一个老漏洞(CVE-2012-1823)的,它允许远程攻击者通过命令行选项HTTP查询字符串内注入任意代码。
攻击代码解码后为:
如果利用成功,将在HTTP POST的剩余部分显示。
以下是在被入侵的服务器上执行的操作:
·改变工作目录到/var/tmp中 ·从该目录删除文件名为“a.pdf”的文件。 ·从攻击者那里下载“a.pdf”文件并保存在/var/tmp目录。pdf文件实际上是一个per脚本。 ·执行per脚本,也就是“a.pdf”文件。 ·最后删除“a.pdf”文件。
此攻击者为了确保能成功下载远程脚本,他重复使用“curl”、“fetch”、“lwp-get”指令。
捕获的数据包显示了注入脚本的整体活动,在执行脚本后,休眠了一段时间,猜测可能是避开管理员的耳目。然后连接到vafel.pexit.cu的IRC C2,端口45129。
一段时间后,攻击者指示从m1.pexit.cu.cc获取另一个脚本“ins_h.sh”。
在“ins_h.sh”脚本的内容显示除其他事项外,攻击者在Linux服务器上创建隐藏目录,获取另一个工具(HC)的源代码,并编译它,然后修改保存到定时任务中。
在这之后不久,大量的各种文件将被下载到被感染的主机,这其中包括挖掘软件,开发库和编译工具,还下载了大量的linux本地权限提升利用程序。之后,攻 击者将使用他想要的方式,开始比特币和质数币的挖掘,特别值得注意的它使用Stratum Mining协议连接到服务器37.251.139.161上:
大多数服务器都被注射了这些不同的脚本然后用于各种任务,包括DDoS、漏洞扫描和利用。互联网风暴中心最近发布了条新闻,“迈纳德的情况”,探讨了被破坏的服务器被用于开采虚拟货币。
现在,让我们做一些内存取证这一特定被攻陷主机的内存图像。 我们将使用2.3.1版本分析Linux映像,为了做到这一点,你必须提供适当的Linux配置文件,创建一个配置文件是非常容易的,但它需要做适当的分 布和内核。我推荐Ken Pryor的Github网站,Ken Pryor在那里建立了一个Linux配置文件存储库。
根据分析,该系统是一个Ubuntu 10.04的服务器,内核版本2.6.32-33,我们先来看看系统上的活动进程,通过“linux_pslist”插件。
注意PID1517(httpds)和PID27157(rsyslogd)的时间戳,远远晚于它上面列出的这些进程。由于早期过程及其相对时间戳类似于Linux的启动程序,另请注意,这些进程显示一个用户ID和组ID1002,其中的Ubuntu分配给一个用户帐户。
波动插件“linux_psaux”的行为类似于Linux命令ps,所以它能够显示在流程调用使用的命令行参数:
所以进程名命名为“httpds”,PID为1517,目录/usr/bin/httpd,另外一个进程“rsyslogd”,PID为 27157,并调用命令行参数“-b -c”。如果我们获得一个破坏服务器的磁盘映像,我们会注意检查/usr/bin的“httpd”。通过研究“rsyslogd”,我们得知“- b”不是一个有效的选项,所以这个进程仍然是可疑的。当通过pslist命令列出的进程列表,找到运行的进程,“linux_pidhashtable” 可以帮我们找到隐藏的进程。
在这种情况下,它是一个很好的做法,检查服务器的网络信息,一些网络插件,这将有助于确定远程连接和启动这些进程。例如 “linux_netstat”插件的行为就像Linux的“netstat”命令,并列出活动的网络连接,以及监听套接字。在这种情况下,我们看到可疑 的进程,PID1517和PID27157与建立的网络连接的远程IP地址相关联的进程。
执行“linux_route_cache”插件,可以显示路由表的缓存。这可能表明,可以不通过“linux_netstat”插件看到任何旧的连接。
现在,我们已经建立的PID1517和27157的可疑进程,让我们所有的相关的每一个打开的文件和路径的列表。类似于在linux系统使用“lsof”的,我们将在这里使用插件“linux_lsof”。
注意,这两个进程,PID1517和27157有两个共同打开的文件。一个是[7916],另一个是在隐藏目录“/tmp/.ICE-unix/-log/”中的httpd.pid文件。
另一个插件是“linux_proc_maps”,这个插件将显示进程内存的细节,包括共享库。细节包括开始和结束的位置,每个部分的节点和标记。这事从内存中调查处的很有价值的信息。例如,在PID1517,我们得到以下内容:
我们看到前面所提到的相同的隐藏目录,但现在指的是文件名“httpds”。该文件被看作是405961,在“linux_proc_maps” 插件上有一个输出开关,允许以段列出。然而,为了恢复完整,完好的文件,我们需要从页面缓存,它保存在内存中的所有有关文件的页面。我们可以通过 “linux_find_file”插件做到这一点,这个插件会找到地址,然后让你从内存转储缓存的文件内容,所以“httpds”文件在节点 405961:
python vol.py -f /home/abc/pexit.vmem --profile=LinuxUbuntu1004_pae32-33x86 linux_find_file
-F "/tmp/.ICE-unix/-log/httpds"
然后,我们使用“linux_find_file”插件使用“- o”选项,通过索引节点的地址,以提取文件。提取后,我们可以运行“strings”,查看内容:
这些例子只是协助你如何分析被破坏主机。我希望这篇文章成功的揭示了PHP漏洞和由此产生的脚本注入的例子的一些情况,除了确保面向Internet的服 务器使用正确的修补和硬化,还要知道如何快速跟踪这样的攻击。在我的蜜罐,我每天会看到数十个,包括linux ELF,perlbots和老式炮弹攻击。这些注入perl和shell脚本是非常让人讨厌的,而且还会给我们带来最严重的破坏。
五、防护
0、升级到php的最新稳定版
1、如果你有web应用防火墙,那么可以在waf上拦截上述url及利用到的关键字,(小心黑客用一些编码技巧绕过你的规则)然后给运维充足的时间去升级。扯远一点,waf部署容易运营难,这也是为什么好些公司部署了waf但是依然web被黑的原因之一。
2、如果你没有waf,又想为升级php争取时间,可以考虑下列rewrite规则
RewriteEngineon RewriteCond%{QUERY_STRING}^[^=]*$ RewriteCond%{QUERY_STRING}%2d|\-[NC] RewriteRule.?-[F,L]
六、批量
为了能高效、准确的找出其他存在漏洞的服务器,用了用了2个小时时间,写了一款工具。本着共享精神,发出来给各位测试下自己公司的服务器是否存在漏洞(请不要用于非法,否则后果自负)。
使用多线程,速度还不错。
支持IP格式
单IP: 10.1.1.
IP段:10.1.1.1-255
如果发现存在漏洞的IP,会在程序当前目录下生成一个report.txt。没有漏洞则不生成文件.
程序使用C# .net framework 2.0开发,代码写的不专业,请见谅。
七、FAQ
Q:nginx+php fastcgi模式是否受这个攻击代码影响?
A:暂时不受公开的攻击代码影响,但有空最好还是升级一下php。
Q:nginx+php+fpm模式是否受这个攻击代码影响?
A:暂时不受公开的攻击代码影响,但有空最好还是升级一下php。
参考资料:
1、关于近期发布的apache+php cgi mod攻击代码
3、apache+php cgi mod(cve-2012-1823)批量检测工具(源码) (C#)
转载请注明:jinglingshu的博客 » apache+php cgi mod攻击代码(CVE-2012-1823)与一次入侵Linux服务器的事件记录