PHP恶意软件/外壳不断复活

信息安全 恶意软件 php WordPress 外壳代码
2021-08-09 12:22:46

所以我几个月来一直在与这个问题作斗争,并决定这超出了我有限的(如果有的话)服务器技能,我需要专业人士的帮助。

我有一个 VPS(具有 root 访问权限),它托管了几个不同的 PHP 网站,其中一些是基于 WordPress 的。由于MailPoet 漏洞,一些网站感染了恶意软件我清理了受感染的站点,完全删除了 MailPoet、后门帐户和相关内容,但恶意软件偶尔会复活。以下是我可以描述的:

  • 有两个恶意软件签名(对不起,如果我使用了错误的术语),它们都被注入到 PHP 页面的最顶部。一次看起来像这样<?php $ozufdqjmhx = '7825h!>!%x5c%x7825tdz)%x5c%x7825bbT-%x5c%x782vg}...随着变量$ozufdqjmhx不时变化,另一个开始<?php if(!isset($GLOBALS[\'\a\e\0... etc etc
  • 恶意软件会随机返回。有时它会在清洁后的一天,有时是一周或几周后恢复。
  • 只有以前被感染的文件/目录/网站会再次被感染新目录或未受影响的旧目录总是干净的。但是,旧受感染目录中的新文件会被感染。
  • maldet(我相信使用 ClamAV)无法检测到任何恶意软件。PHP Shell Detector可以,但由于只是一个检测器,它无法修复。

你们能帮忙,或者给我应该去的方向吗?一百万提前谢谢!

(如果这个问题不符合网站的规定,我也很抱歉。当我是 StackOverflow 的日常用户时,这是我第一次访问这个安全子网站)。

编辑:我真的很感谢你们的任何建议,但是擦除服务器并从头开始不是一种选择。如果是的话,我为什么要问这个问题,对吧?:)

编辑 2:按照@Mints97 的回答,我检查了所有打开的端口——看起来很正常:

21/tcp    open  ftp
22/tcp    open  ssh
25/tcp    open  smtp
53/tcp    open  domain
80/tcp    open  http
110/tcp   open  pop3
143/tcp   open  imap
443/tcp   open  https
465/tcp   open  smtps
587/tcp   open  submission
993/tcp   open  imaps
995/tcp   open  pop3s
3000/tcp  open  ppp
3306/tcp  open  mysql
5432/tcp  open  postgresql
8000/tcp  open  http-alt
8080/tcp  open  http-proxy
8082/tcp  open  blackice-alerts
10000/tcp open  snet-sensor-mgmt
20000/tcp open  dnp

编辑 3:这是针对@QuestionOverflow:在搜索您在其他答案中提到的 4 个域时,我遇到了一个脚本来消除此处的恶意软件。在代码中我们可以看到if (preg_match('/^<\?php \$[a-z]{10} = \'/', $fh_str)) {,它完全针对第一个签名。我现在会说它是相同的恶意软件,或者至少来自同一个人通过相同的漏洞。非常有趣。

编辑 4:第二个恶意软件已经在这里讨论过,如果它可能有帮助,是的,显然两者都从 4 个域中随机获取一些有效负载:“33db9538.com”、“9507c4e8.com”、“e5b57288.com”、“54dfa1cb。 com”。我已将所有 4 个添加到我的hosts文件中,指向127.0.0.1. 让我们看看接下来会发生什么。

编辑 5:一些人认为这个问题已经在这里得到了回答,你如何向管理层和用户解释“将它从轨道上发射”的必要性?. 老实说,我看不到其他问题如何回答我的问题。我问的是如何消除恶意软件,而不是向我的老板解释我为什么要重新安装服务器。

4个回答

我将启用auditd来监视您希望被后门的文件的更改。您将能够确定负责进行这些更改的帐户和流程。

安装auditd(不是所有系统都默认安装pr)后,就可以开始监控文件的变化了。为此,只需运行以下命令:

auditctl -w /var/www -p wa

此命令会将所有文件更改记录到 auditd 日志文件。通常您会在 /var/log/audit/ 中找到它,但它取决于系统。

如果您担心攻击者可能会注意到这一点(并且可能会删除规则),您可以通过运行以下命令来锁定它:

auditctl -e 2

在系统重新启动之前,不能对审计规则进行进一步的更改。在执行此操作之前,请确保上述审计规则不会生成大量日志。

最后,审计日志有点神秘。一旦您发现系统再次被后门,您可以使用以下命令搜索审计线索:

ausearch -f /var/www/backdoored_file.php

我希望这将为您提供有关正在发生的事情的线索。祝你好运!

额外的:

要使审核规则在重新启动后仍然有效,您必须在 /etc/audit/audit.rules 中定义它们

我最初将此作为评论发布,但我认为这可以做一些解释。

根据我对网站接管场景的经验,当一个 shell 被上传到一个网站时,黑客要么设法利用服务器中的漏洞,获得 root 访问权限,后门你的 SSH 并破坏服务器上的所有其他站点,要么他根本没有t 管理这个并使用一个简单的外壳。我认为,就您而言,这是第二种情况,因为您说 VPS 上只有一个网站被感染。

现在看看shell是如何“复活”的。如果您的服务器没有“root”,那么我能想到的只有四个其他选项:

  1. 绑定端口”后门
  2. “反向连接后门(罕见)
  3. 您的一个PHP 文件中的自定义后门或“下载器”
  4. 具有文件访问和远程登录权限受损 MySQL 帐户。

让我们先谈谈前两个以及如何处理它们。“bindport”和“backconnect”是两个小程序,通常是 Perl 脚本,传统上是随 web shell 一起提供的。它们通常在文件夹中创建(并从其执行),该/tmp文件夹可写入所有内容。要找到它们,您可以监视所有进程中是否存在奇怪的脚本或程序,并仔细查看/tmp文件夹。此外,建议设置防火墙。

“Bindport”为传入连接打开一个新端口,并为任何敲门的人提供 Unix shell 访问(通常受密码保护)。要找到它,请寻找奇怪的开放端口(许多黑客只是让它开放端口31337或类似的东西)。

“Backconnect”完全符合它的名称 - 它打开到远程服务器的连接,同时授予 shell 访问权限。它比“bindport”使用得更少,主要是因为大多数黑客都懒得使用它。他们通常仅在“bindport”由于某种原因(如防火墙设置)失败时才使用此方法。

现在,关于自定义后门和“下载器”这些很少使用,因为攻击者至少需要了解 PHP 才能使用它(而今天的大多数站点劫持者只不过是 skriptkiddies 或制作不良的机器人)。它们大多是独立的文件,例如简单的 shell,或者是注入到您的一个脚本中的几行额外代码。它们要么执行给它们的命令(PHP 代码、shell 命令),要么使用传递给它们的数据进行简单的文件写入(可能是另一个后门)。您可以尝试查找具有 PHP 代码的文件,例如,eval修饰符, , , /和其他文件函数等。但是,处理这些东西的最好和最确定的方法就是简单preg_replaceeexecsystemfopenfwrite从备份中恢复整个网站如果您决定这样做,请确保事先从服务器上清除所有其他站点文件,以防您错过了独立外壳程序或后门程序。

最后一个非常不可能但仍然可能的情况。如果您一直在使用 MySQL root 用户(或仅具有文件写入权限的用户)运行 WordPress,或者只是使用具有足够权限的用户来查看另一个具有文件写入权限的用户的密码哈希,并且该用户具有文件写权限有权从任何地方连接到数据库,嗯......你明白了。我建议更改所有 MySQL 密码。

现在来看看为什么只有一组特定的目录会被感染有两种可能的情况:要么黑客未能“root”服务器,但只能使用有限数量的可用目录(可能是您网站的所有目录),或者他们可以访问其他目录但根本不这样做不要使用它们。

如果是后一种情况,我敢打赌,要么你是在和一个白痴打交道,要么是一个非常懒惰的人。或与机器人。是的,这可能会让您失望,但我怀疑您的网站对于经验丰富的黑客来说是否真的足够重要:它可能被用来从您的用户那里获取几次点击、托管恶意软件或只是在几次次。您要么与脚本小子打交道,要么与试图从点击交易和垃圾邮件中赚取几分钱的没有经验的傻瓜打交道,或者与机器人打交道。然而,我认为它更有可能是一个活人:这可以解释贝壳“复活”的不规则性。

我管理的一个网站也发生了非常相似的事情。在删除恶意代码并在大约 2 周后出现之后,我发现了这一点:

我记下了所有文件被修改的日期戳,然后我查看了那一分钟的访问日志。我看到请求的某个页面看起来很可疑,因为它是一个未激活的 wordpress 主题的 404.php。我检查了那个页面,看到一行基本上是eval($_POST['php'])用 base64 编码的。

所以我没有删除代码,而是更改了它,保存了发送到该页面帖子的任何内容的日志。果然 2 周后,我的网站仍然安全,但一个日志文件记录了一些发送给它的有趣代码。

听起来攻击者已经在您的服务器上安装了 rootkit。即使一切看起来很干净,rootkit 也可以提供后门。

我认为现在最好的方法是擦除服务器并从头开始重新安装。修补网站以消除漏洞。如果您需要从备份中恢复(您有备份,对吗?:))确保它是干净的。

设置一个脚本来查找感染痕迹(例如 ID 10001 用户),以防除了 MailPoet 问题之外还有其他一些漏洞。