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.890 ]

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

OpenPGP - Tradução da man page

Implementação de um sistema de arquivos criptografado transparente ao usuário

Autenticação de servidores CentOS/Red Hat 6 em Windows 2008

Introdução a criptografia

Aplicação do firmware intel-microcode no Slackware

  
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