Knockd (bate, bate, bate na porta do céu)

Knockd é um servidor port-knock. Ele escuta todo o tráfego em uma interface Ethernet (ou PPP), procurando por "batidas" sequências de requisições. Um cliente faz requisições para o servidor enviando um pacote TCP (ou UDP) para uma porta no servidor.

[ Hits: 9.918 ]

Por: Bruno Viana em 08/05/2017 | Blog: https://myshell.blog


Configurações do cliente



Para fazer acesso, existem vários utilitários, o desenvolvedor menciona alguns clientes, porém, prefiro fazer meu próprio.

No cliente

Usando os arquivos especiais de conexão do Linux, a ideia é simples e foi explicada nesse post.

# echo > /dev/tcp/ip_do_servidor/porta

Usando essa lógica, vamos testar a se a porta está aberta:

# echo > /dev/tcp/192.168.0.21/2222 && echo "Porta aberta"

Sem resultado, logo a porta esta fechada. Para abrir, usei:

# echo > /dev/tcp/192.168.0.21/6390
# echo > /dev/tcp/192.168.0.21/7832
# echo > /dev/tcp/192.168.0.21/6276
# echo > /dev/tcp/192.168.0.21/2222 && echo "Porta aberta"

O comando acima resultou na saída: Porta aberta

Então, testei fechar:

# echo > /dev/tcp/192.168.0.21/5232
# echo > /dev/tcp/192.168.0.21/2984
# echo > /dev/tcp/192.168.0.21/6253
# echo > /dev/tcp/192.168.0.21/2222 && echo "Porta aberta"

A saída foi vazia, o que significa que a porta está fechada. Logo, tendo como abrir e fechar a porta, comecei a montar o cliente em Bash.

Script

Montei uma usagem básica, exibindo uma forma de executar o script e em baixo uma condição no qual, se um dos argumentos de 1 a 6 estejam vazios, a função printUsage será chamada.

function printUsage() {
 echo ""
 echo "$(basename "$0") -s Server_Knockd -p PORTA1 PORTA2 PORTA2 -P Pora_ssh_diferente"
 echo "$(basename "$0") -s 192.168.0.222 -p 7000 8000 9000 -P 2222"
 echo ""
 echo "-s ou --host: Especifica o servidor alvo"
 echo "-p ou --port: Especifica as portas para batida (knock)"
 echo "-P ou --port-ssh: Especifica as porta padrão, se nada for passado sera usado as padrão (22)"
 echo ""
 exit
}
if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ] || [ -z "$4" ] || [ -z "$5" ] || [ -z "$6" ];then
 printUsage
fi

Criei uma repetição que obriga ao usuário a entrar com um numero IP após o argumento "-s", ou host, uma sequência de portas depois do "-p", ou port. Um argumento opcional que o "-P", ou port-ssh que passa uma porta para testar a conexão SSH, caso não seja passado nada, a porta padrão (22) é usada.

while true ;do
 case "$1" in
   -s | --host) ip="$2"; shift 2 ;;
   -p | --port) porta0="$2"
                porta1="$3"
                porta2="$4"
                shift 4 ;;

   -P | --port-ssh) portaSSH="$2"; shift 2 ;;
   -h | --help) printUsage ; exit ;;
   *) break ;;
 esac
done

Criei uma função que verifica se as portas são válidas, testa se a porta está entre 1 e 65535:

function verificaPorta() {
 for port in "$porta0" "$porta1" "$porta2"; do
     if [ "$port" -lt 1 ] || [ "$port" -gt 65535 ];then
         echo "A porta deve ser um numero entre 1 e 65535"
         printUsage
     fi
 done
}

Para verificar a conexão após o knockd, então usei o arquivo /dev/tcp do Linux para testar.

function testaSSH() {
     timeout 1 bash -c "echo > /dev/tcp/$ip/$1"
}

A próxima função é o coração do script, a conexão que recebe o IP como argumento, um laço que recebe passa uma porta de cada vez e espera dois segundos para passar a próxima porta.

function openClose() {
  for i in "$porta0" "$porta1" "$porta2"; do
     echo > /dev/tcp/"$ip"/"$i"
     sleep 2
  done
}

E finalmente, criei o método main do script:

function main() {
  verificaPorta
  openClose
  test -z "$portaSSH" && testaSSH 22
  test -n "$portaSSH" && testaSSH "$portaSSH"
}

Onde o meu método chama a função que verifica se as portas estão entre 1 e 65535, depois faz a conexão com o servidor knockd, testa se a variável "$portaSSH" está vazia, se estiver, passa a porta padrão se não passa a porta informada.

O script final, ficou assim:

#! /bin/bash

# Knock Open Close 0.1
# @Author: Bruno Viana

function printUsage() {
 echo ""
 echo "$(basename "$0") -s Server_Knockd -p PORTA1 PORTA2 PORTA2 -P Pora_ssh_diferente"
 echo "$(basename "$0") -s 192.168.0.222 -p 7000 8000 9000 -P 2222"
 echo ""
 echo "-s ou --host: Especifica o servidor alvo"
 echo "-p ou --port: Especifica as portas para batida (knock)"
 echo "-P ou --port-ssh: Especifica as porta padrao, se nada for passado sera usado as padrao (22)"
 echo ""
 exit
}
if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ] || [ -z "$4" ] || [ -z "$5" ] || [ -z "$6" ];then
 printUsage
fi
function openClose() {
 for i in "$porta0" "$porta1" "$porta2"; do
    echo > /dev/tcp/"$ip"/"$i"
    sleep 2
 done
}
function testaSSH() {
  timeout 1 bash -c "echo > /dev/tcp/$ip/$1"
}

function verificaPorta() {
 for port in "$porta0" "$porta1" "$porta2"; do
    if [ "$port" -lt 1 ] || [ "$port" -gt 65535 ];then
       echo "A porta deve ser um numero entre 1 e 65535"
       printUsage
       exit
    fi
 done
}

while true ;do
 case "$1" in
      -s | --host) ip="$2"; shift 2 ;;
      -p | --port) porta0="$2"
                   porta1="$3"
                   porta2="$4"
                   shift 4 ;;

     -P | --port-ssh) portaSSH="$2"; shift 2 ;;
     -h | --help) printUsage ; exit ;;
     *) break ;;
 esac
done

function main() {
 verificaPorta
 openClose
 test -z "$portaSSH" && testaSSH 22
 test -n "$portaSSH" && testaSSH "$portaSSH"
}

main

# End of scrpit

Página anterior     Próxima página

Páginas do artigo
   1. Configurações iniciais
   2. Configurações do cliente
   3. Poc
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Trilhas de Certificação em Segurança da Informação - Qual caminho seguir?

Teste de vulnerabilidades com OpenVAS 3.0

Gerenciamento de segurança da informação com open source (parte 1)

Identificando dispositivos IoT usando Wireshark e criando uma estratégia interessante de visibilidade em Linux e Unix

Descobrindo chave WPA2 com Aircrack-ng

  
Comentários
[1] Comentário enviado por wagnerfs em 12/05/2017 - 11:27h

Descobri esse recurso um dia desses e por coincidência vi esse artigo. Bem interessante e útil.
_________________________
"GNU/Linux for human beings."

ºvº "Software Livre: não é pelo dinheiro.
/( _ ) É uma questão de consciência."
^ ^



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts