分析嵌套、混淆的PHP文件...
作者:Sec-Labs | 发布时间:
原文地址
https://www.hexacorn.com/blog/2023/06/03/analyzing-nested-obfuscated-php-files/
正文部分
许多PHP webshell以许多不同的方式被加密、编码、混淆,但大多数使用基本的方法,依赖于重复地调用相同的代码“隐藏”程序,这些程序依赖于对各种组合的_gzinflated_、_base64_–_decoded_和有时为_rot13-decoded_数据块的_eval_调用。在某些情况下,这可能会一直持续下去,多达10次以上…
去混淆这样的脚本是一项烦琐、枯燥的工作-您必须手动逐层进行。枯燥!
幸运的是,我们可以使用一些自动化来帮助这个过程...
以下Perl脚本可以在Windows操作系统上运行,前提是您已经安装了Php在c:\php。
use strict;
use warnings;
my $f=shift || die ("Gimme a file name!\\n");
my $cnt=0;
my $nf=$f;
while (1)
{
print "$cnt\\n";
open F,"<$nf";
binmode F;
read F,my $data,-s $f;
close F;
last if $data !~ /\[\\s\\@\]eval/s;
$data=~s/(\[\\s\\@\])eval/$1echo/sg;
$data=~s/X-Powered-By: .\*?><\\?//sg;
$nf = sprintf("$f.%04d.php",$cnt);
if ($data !~/<\\?/)
{
$data = "<?php\\n$data\\n";
}
open F,">$nf";
binmode F;
print F $data;
close F;
system ("c:\\php\\php.exe $nf > $nf.txt");
$nf=$nf.".txt";
$cnt++;
}
脚本的作用是:将一个输入PHP文件读取,找到其中的_eval_表达式,并将其替换为_echo_,然后将修改后的脚本写入一个新文件中,然后将此新文件作为脚本在_php.exe_二进制文件下执行。结果解码/解密的脚本保存到一个新的文本文件中。然后,这个新的文本文件成为同一过程的输入,直到最终文件中没有_eval_引用为止...
如果你够幸运,最后一个文件将持有解码的脚本。
当然也有一些注意事项。
更高级的情况依赖于潜入一些非_evaled_变量,这些变量在连续的层中被引入,然后稍后被使用/引用,有时甚至被最终层所使用。上面的脚本不处理这种情况,但是,您仍然可以通过浏览生成的.txt文件来解决这种情况-您很快就会发现信息丢失的地方,并进行调整,最后-在手动编辑一个中间文本文件后,重复整个自动化过程。
另一个注意的情况是依赖于_preg_replace(“/。*/e”技巧的脚本。它没有被处理掉,但是为什么要处理掉呢?它自PHP 5.5起就已经被弃用,并在PHP 7.0中删除。如果您看到一个使用这个函数混淆的脚本,那么它很可能是一个非常古老的代码。您仍然可以手动或半自动地去混淆它(使用上述脚本的部分去混淆),但是,让我们说实话-很不可能你能找到这样的烟枪... 如果有人仍然在使用这么老的PHP版本,可能会出现更大的问题...
根据我的经验,该代码适用于大多数编码不良的php webshell,如果有时不适用-只需要微调一两个以解决一些随机/意外的美学问题。
有时,您只需在已经某种程度上去混淆的脚本上运行脚本:
for %k in (.php*) do (perl __decode.pl "%k")
下面是 test.php 脚本的示例结果:
