Shellter Lab — Secure Lab — Writeup

Renan Santana
4 min readDec 9, 2019

--

Mais um writeup, de mais um desafio, simples, do maravilhoso site Shellter Labs. Hoje faremos um script simples de força bruta em python, aprenderemos alguns conceitos simples de socket, e resolveremos o desafio Secure Lab.

O desafio começa com um endereço, uma porta e a seguinte dica:

fonte: ShellterLabs

Primeiro, vamos ver do que se trata este endereço e essa porta. Para isso, tentei fazer uma conexão simples usando o NetCat:

Primeira tentativa de conexão com o NetCat

Pela (pouca) experiência que possuo em CTFs, geralmente quando a palavra “guess” está presente, é sinal de que talvez um bom e velho ataque de força bruta já resolva. Vamos utilizar a wordlist mais famosa da internet, a rockyou.txt, para fazer um ataque. E para isso, vamos construir nossa própria ferramenta, em python, para fazer a conexão.

Se você é novo nisso tudo, vamos esclarecer alguns conceitos aqui:

  • NetCat, é uma espécie de “canivete suíço do TCP/IP”, é uma ferramenta simples porém poderosa, que permite fazer conexões TCP/UDP em portas que estejam abertas. Como o desafio me deu inicialmente somente um IP e uma porta, geralmente a primeira tentativa de conexão que faço nesses casos é pelo netcat, utilizando o comando: nc <ip> <porta>
  • Força bruta (ou bruteforce), é um ataque que tem como objetivo testar uma lista gigantesca de senhas para acessar um determinado serviço ou conta. Para que seja possível fazer um ataque de força bruta, você precisa de uma wordlist, que nada mais é que um arquivo gigantesto em txt com as senhas mais comuns utilizadas em toda a internet. A wordlist mais famosa neste meio de CTF e afins é chamada “rockyou.txt”, uma humilde lista de mais de 14 milhões de senhas. E é ela que vamos utilizar neste ataque.

O script ficou bem simples, colocarei ele aqui e explicarei logo abaixo alguns conceitos chaves:

Inicialmente definimos o endereço do desafio, a porta, e o nome da nossa wordlist. Em seguida abrimos a lista e carregamos todas as senhas dela para a variável passwords.

Após isso, utilizamos a maravilhosa biblioteca socket, que já vem nativa no python, para criar uma conexão do tipo TCP. Instanciamos o socket com conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)e nos conectamos com o comando conn.connect((hostname, port))

Como vimos no primeiro teste, ao nos conectarmos, recebemos uma mensagem de “Hi, welcome to my lab…”, vamos nos certificar que nossa conexão via python deu certo então, coletando a resposta do nosso host com msg = conn.recv(1024)(que recebe os primeiros 1024 bytes do host e os armazena em msg), e printando ela com print(msg.decode())uma vez que dê certo este teste, vamos ao ataque.

O ataque nada mais é que um laço, onde, para cada senha da wordlist, o script envia a senha com o comando conn.sendall(password)e coleta a resposta com o já conhecido recv(1024)

Como já vimos que, quando digitamos a senha errada, o host responde com um “WRONG! Try Again”, eu usei a ausência da palavra “WRONG” em if not 'WRONG' in response.decode() para saber se a senha testada deu certo ou não.

Todo o código está dentro de um try/except, pois sempre que algum erro acontece ou caso eu queira interromper o script, precisamos fechar a conexão com o comando conn.close()

Após uns 15 minutos de script rodando (ou mais), eis que uma das senhas da wordlist dará certo, o script irá printar a senha, e irá finalizar a conexão.

Este foi mais um desafio, bem simples, mas que foi bem útil para que eu pudesse aprender um pouco mais sobre a lib socket. Além de ser bem mais legal quando você faz sua própria ferramenta ao invés de utilizar algo pronto por aí.

--

--

Renan Santana

Desenvolvedor Python, que no tempo livre tenta inventar alguma coisa ou resolver desafios CTF.