Skip to content

Instantly share code, notes, and snippets.

@lumenpink
Last active September 24, 2020 09:29
Show Gist options
  • Save lumenpink/a3b58425288bba2f9341 to your computer and use it in GitHub Desktop.
Save lumenpink/a3b58425288bba2f9341 to your computer and use it in GitHub Desktop.
Knock 2015.1 - Projeto elaborado na Estácio de Sá Santa Catarina - https://docs.google.com/presentation/d/1G-kDirpN6SyehQw8KUaFqMJARwLrHhw80Y9wdXNNkXQ/edit?usp=sharing
#!/bin/bash
. /usr/local/knock/library
#Lista de portas na ordem da sequencia
ports=(34 1032 43231 456)
#Porta a Ser desbloqueada
safePort=29
#Comando tshark (wireshark para console)
#customizado para exibir apenas
#ip de origem e porta de destino
tshark -n -l -f "tcp and dst 177.70.2.30 and tcp[tcpflags] & (tcp-syn) != 0 and tcp[tcpflags] & (tcp-ack) = 0" -E separator=":" -Tfields -e ip.src -e tcp.dstport |
while read ipport
do
#Separa a saída em IP e PORTA
ip=`echo $ipport | cut -f1 -d:`
port=`echo $ipport | cut -f2 -d:`
#Converte o Ip para Decimal via funcao
#incluida na biblioteca
#porque as arrays só suportam indices decimais
#A variavel dip significa decimalIp
dip=`ip2dec $ip`
#Verifica se a conexão é na primeira porta
if [ "$port" -eq ${ports[0]} ] ; then
echo "o IP $ip concluiu o passo 1"
passo[$dip]=1
#Verifica se o IP já concluiu algum passo
elif [ ${passo[$dip]} ] ; then
#Verifica se a conexão é no passo atual
if [ ${ports[${passo[$dip]}]} -eq $port ] ; then
#Se for aumenta em um o passo
passo[$dip]=$((${passo[$dip]}+1))
#Verifica se é o ultimo passo
if [ ${passo[$dip]} -eq ${#ports[*]} ] ; then
echo "o IP $ip concluiu os passos"
#Desbloqueia o IP para a porta segura
iptables -I INPUT -s $ip -ptcp --destination-port $safePort -j ACCEPT
#Agenda desbloqueio
cat /usr/local/knock/knock-agenda |
sed 's/\^\^/'$ip'/' |
at `date --date="+2 hours" "+%H:%M %m/%d/%Y"`
#remove o IP da memória
unset passo[$dip]
else
echo "o IP $ip concluiu o passo ${passo[$dip]}"
fi
else
if [ ! ${ports[ $((${passo[$dip]}-1)) ]} -eq $port ] ; then
echo "o IP $ip nao concluiu o passo $((${passo[$dip]}+1))"
unset passo[$dip]
fi
fi
fi
done
IP=^^
if who --ips | grep -q " "$IP$ ; then
#Reagendar
cat knock-agenda |
sed 's/\^\^/'$IP'/' |
at `date --date="+2 hours" "+%H:%M %m/%d/%Y"`
else
iptables -D INPUT -s $IP -ptcp --destination-port 29 -j REJECT
fi
#Biblioteca de funcoes
#Funcao ip2dec - Transforma o ip do formato
#de 4 octetos para decimal
ip2dec() {
local ip
local decimalIp
ip=$1
#Separa os octetos do endereco IP
octeto1=`echo $ip | cut -f1 -d. `
octeto2=`echo $ip | cut -f2 -d. `
octeto3=`echo $ip | cut -f3 -d. `
octeto4=`echo $ip | cut -f4 -d. `
#Executa as multiplicacoes
decimalOcteto1=$(($octeto1*256*256*256))
decimalOcteto2=$(($octeto2*256*256))
decimalOcteto3=$(($octeto3*256))
decimalOcteto4=$(($octeto4*1))
#Soma os decimais e gera o IP em decimal
decimalIp=$((decimalOcteto1+ \
decimalOcteto2+ \
decimalOcteto3+ \
decimalOcteto4))
echo $decimalIp
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment