服务器第二次被攻陷,无法定位攻击源

信息安全 linux 网络服务器 php nginx
2021-08-19 00:33:03

我需要一些帮助来追踪我服务器上的漏洞。我的服务器第二次受到病毒感染的下载文件的威胁。

根据文件系统日期,在 45 分钟内,我服务器上的 4 个 exe 文件被相同病毒的重命名版本替换。

我的 Web 服务器正在运行内核版本为 2.6.32-31-generic 的 Ubuntu 10.4.3 LTS,并保持完整的补丁和最新状态。

访问 shell 的唯一方法是通过 SSH 和我随身携带在 USB 记忆棒上的受密码保护的私钥。密码 SSH 登录被禁用,服务器日志(我知道可以修改,但我有充分的理由相信他们没有)表明没有使用 SSH 登录服务器。

Web 服务软件堆栈非常复杂。有带 Suhosin v0.9.29 的 PHP (5.3.3-1)、nginx 1.0.9(现在更新到 1.0.10)、Tomcat(在监狱中,我怀疑没有关联)和 MySQL 5.1.41。

我承认,在第一次攻击时,为了缓解头痛,我已经满足于愉快地 chmod -R 777 我的 web 目录。现在我运行了一堆乱七八糟的 PHP 脚本,包括但不限于 WordPress、vBulletin 和几个自制产品;其中前两个始终是最新的,而后者在编写时非常小心,以逃避或规范任何用户输入的值。

鉴于文件权限较弱,但服务器访问受到强烈限制,我很想怀疑在允许执行随机代码的众多 PHP 脚本之一中存在漏洞。

我已经完全锁定了文件权限。nginx/php 都作为 www-data:www-data 运行,所有文件仅授予执行和读取权限 ( chmod -R 550 /var/www)。

然而今天,在这一切之后,我的服务器再次遭到入侵。

问题是,被替换的文件仍然有550权限,SSH 日志显示没有登录,我完全不知道下一步该做什么或尝试。

我试图在被一个非常基本的 PHP 脚本替换的路径上重新创建攻击:

$file = fopen('/var/www/mysite.com/path/to/file', 'w');
fwrite($file, 'test');
fclose($file)

但这给了我适当的权限被拒绝错误。

任何人都可以请告诉我接下来在哪里寻找这个漏洞的来源?我的文件权限是否遗漏了什么?

我知道服务器一旦受到攻击,就几乎永远“消失”了。但这不是一个真正的选择。我已经递归地搜索了我的整个 /var/log 文件夹以查找受影响的文件名,希望能找到一些东西,但什么也没出现。

我还搜索了 cron 文件夹或其他地方的任何脚本,这些脚本可能在第一次攻击时放置在以后再次攻击,但是 (a) 什么也没找到,并且 (b) 不应该找到任何东西,因为/etc/ 中的文件不能被 www-data 修改(假设是 nginx/PHP 渗透点)。

我应该补充一点,我两次都在 nginx 访问日志(组合样式)中找到了受感染文件的名称,但什么也没找到。但是,我确实理解/意识到存在许多从我的 grep 中隐藏文件名的方法。

4个回答

一些试图找出攻击者如何进入的技术:

  1. 查看您知道攻击者更改的任何文件上的时间戳,然后查看您的所有日志以查找尽可能接近每个时间戳的条目。正如其他人所说,Web 访问日志和 Web 错误日志最有可能包含原始攻击向量的证据,但其他日志文件也可能包含线索。错误日志通常拥有最好的线索。所有网络可访问的守护进程的日志也是查看的好地方。
  2. 寻找与您知道的时间戳接近的其他文件也可能是值得的。 /etc/passwd很明显,但如果日志文件有不​​寻常的时间戳,它们甚至可能是可疑的。如果 logrotate 每天都在同一时间运行,并且您的一个日志文件的时间戳与这次不匹配,那么它可能已被更改以掩盖他的踪迹,现在您对他所做的事情有了更多的了解。不要忘记.bash_history用户主目录中的文件。find命令应该能够为您处理这个问题。
  3. 在您的网络访问日志上运行头皮。最初的攻击可能发生在文件出现之前的一段时间。Scalp 会产生误报,但它应该缩小潜在的可疑日志条目,以便您手动分析违规行为。它也可能完全错过攻击——它并不完美——但它可能会有所帮助。

不要在受感染系统的取证上花费太多时间。正如其他人所指出的,攻击者有机会删除原始攻击的所有证据并添加一个 rootkit 以隐藏他的持续存在。如果他错过了什么,或者他甚至没有尝试过,上述任务可能会奏效,但如果他隐藏得很好,那么你只是在浪费宝贵的时间。

如果您未能找到攻击源,请擦除并重新安装有问题的服务器,但要添加一些内容,以便下次抓住他。

  1. 使用 syslog 的某些变体将您的日志发送到不同的服务器。( rsyslogsyslog-ng是推荐的选择) 最好,这个服务器应该只接收日志,并且不应该与任何其他服务器共享登录密钥或密码。目标是确保您的日志不会被篡改或删除。
  2. 添加超出默认值的额外日志记录。Jeff 已经提到过 AppArmor,因为您使用的是 Ubuntu,这可能是最佳选择。确保将其日志发送到日志记录框。
  3. 安装并打开审计守护进程确保将其日志发送到日志记录框。
  4. 运行 IDS,例如 Snort、PHP-IDS 或 mod_security。(或不止一个,这些工具并不都做完全相同的工作)一些硬件防火墙带有 IDS/IPS 模块。确保将来自 IDS 的日志发送到日志记录框。
  5. 添加文件完整性监控系统,例如AIDETripwire确保将来自这些工具的日志发送到日志记录框。
  6. 监控您的日志。缺少商业 SIEM 系统,可以免费安装 Splunk 之类的东西,并且可以分析有限数量的日志。设置规则以匹配您的服务器的正常情况并将它们过滤掉。剩下的一切都值得仔细检查。

如果您有时间和金钱,您可以做更多的事情,例如完整的网络数据包捕获,但实际上,这几乎是一个单独的系统管理员可以处理的所有事情。如果攻击者再次出现,您将更有可能找到攻击向量,并且更有可能在攻击发生后立即检测到他。

@Iszi 在这里绝对正确。您需要彻底清除并重建,因为一个好的 rootkit 会阻止您看到任何关于它存在的证据。

否则很有可能你现在所做的任何事情都是毫无意义的。在任何情况下,您都不能再信任服务器。

Muhammad,在某些情况下,我看到攻击是由利用系统上的漏洞(通常是 PhpMyAdmin)并将文件上传到服务器(主要是 /tmp)的机器人进行的。发生的情况是,这些文件保留在那里并且管理员不会注意到,直到攻击者检查他们的机器人日志并开始构建第一个被破坏的文件。

PhpMyAdmin 或 vBulletin 或您正在使用的某些脚本中的漏洞很可能被利用。后来您更新了易受攻击的应用程序,但妥协已经发生。

如果您不进行重建,那么攻击者留下的文件再次被用来破坏您的系统。在您的系统上安装 OSSEC 并监控关键文件/文件夹将帮助您检测此类活动并让您更快地采取行动。

只是为已经提供的评论添加一些想法。正如@symcbean 所说,第三方代码可能是问题的根源。

如果我冒险猜测,我会将 Wordpress 应用程序和相关插件视为您妥协的可能来源。最近在 Wordpress 插件中发现了大量安全问题,其中许多正在被积极利用,因此如果您安装了该插件并且不是 100% 最新的,您很可能会遇到问题。

在解决您的问题的 Wordpress 方面,您可以查看wpscan,它是一个 wordpress 安全扫描器,也是安全的 wordpress 插件