io:fwrite("Do not try it at home: Port knocking\n").


ENG ( Link to Portuguese versiao )

Before read the note please use your favorite search engine and read about Security Through Obscurity. From XIX century we should be aware of Kerckhoffs's principle. Based on Wikipedia: "The principle holds that a cryptosystem should be secure, even if everything about the system, except the key, is public knowledge".

If you have vulnerability management that results with emergency patch that are past due date 50 days this is not a moment for this exercise.

ONLY if you have effective and efficient IT processes is worth to think about obscurity as additional layer.


Let's assume that you have only one open port on your server for SSH. 1.1.1.1 - should be replaced by client IP, 9.9.9.9 should be replaced by server IP.
Default SSH port you can change in /etc/ssh/sshd_config. Remember that you must restart the service by: systemctl restart sshd. From that point you must change ssh [email protected] to ssh [email protected] -p your_port_number.


It is easy and useless due to any network scanner will just report new port of SSH demon. You can simply check it with: nmap 9.9.9.9.


For security reason: create backup of your firewall by: /sbin/iptables-save > ~/backup/iptables-works-`date +%F`.

In the following example: remember to change wlan0 to your interface and 22 to your sshd port.

You can clean up your firewall with: iptables-restore < /etc/iptables/clear.rules.

>cat /etc/iptables/clear.rules
# Empty iptables rule file
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT


To avoid funny problems (Marcin thx for help!:]): you can actively avoid IPv6. Based on Arch Wiki: add the following sysctl configuration to /etc/sysctl.d/40-ipv6.conf:

# Disable IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.wlan0.disable_ipv6 = 1


and modify /etc/dhcpcd.conf:

noipv6rs
noipv6


First, we need to allow our current connection: sudo iptables -A INPUT -i wlan0 -p tcp –dport 22 -m conntrack –ctstate ESTABLISHED,RELATED -j ACCEPT.
Next we should block traffic on 22 port. Instead ignoring packages (DROP) that will be reported as "filtered" lets use REJECT , just like a connection to an unused port would be treated: sudo iptables -A INPUT -i wlan0 -p tcp –dport 22 -j REJECT –reject-with tcp-reset.
Check iptables state with: iptables -nvL –line-numbers.

At this moment nmap should not see open/filtered ssh. Just remember to not close SSH connection ;-].

FWKNOP we can configure based on cipherdyne.org:

[1.1.1.1]$ fwknop -A tcp/22 -a 1.1.1.1 -D 9.9.9.9 --key-gen --use-hmac --save-rc-stanza 
[1.1.1.1]$ grep KEY /home/mbr/.fwknoprc
KEY_BASE64         Sz80RjpXOlhH2olGuKBUamHKcqyMBsS9BTgLaMugUsg=
HMAC_KEY_BASE64    c0TOaMJ2aVPdYTh4Aa25Dwxni7PrLo2zLAtBoVwSepkvH6nLcW45Cjb9zaEC2SQd03kaaV+Ckx3FhCh5ohNM5Q==


Keys values you should transfer to: /etc/fwknop/access.conf at your server:

[9.9.9.9]# cat /etc/fwknop/access.conf
SOURCE                     ANY
REQUIRE_SOURCE_ADDRESS     Y
KEY_BASE64                 Sz80RjpXOlhH2olGuKBUamHKcqyMBsS9BTgLaMugUsg=
HMAC_KEY_BASE64            c0TOaMJ2aVPdYTh4Aa25Dwxni7PrLo2zLAtBoVwSepkvH6nLcW45Cjb9zaEC2SQd03kaaV+Ckx3FhCh5ohNM5Q==


Now start the fwknop: systemctl start fwknopd.
On the client you can check ~/.fwknoprc and use: fwknop -n 9.9.9.9. After it you can simply ssh to the server. \\\\ If you will have problems remember to check:

[1.1.1.1]$ fwknop -n 192.168.1.239 --verbose -R
[9.9.9.9]$ journalctl -xeu fwknopd.service
[9.9.9.9]$ iptables -nvL --line-numbers



At the end lest take care about our-self.
With the fish shell:

[1.1.1.1]$ alias sshalarm "fwknop -n 9.9.9.9; sleep 2; ssh [email protected]"
[1.1.1.1]$ funcsave sshalarm


At bash:

alias sshalarm="fwknop -n 9.9.9.9; sleep 2; ssh [email protected]"



At this stage:
Your ssh port should be perceived by network scanners as closed;
You should be able to connect to the server just be typilg alias name (and touch of your YubiKey).


PT

Antes de ler a nota, por favor, use seu mecanismo de busca favorito e leia sobre Segurança Através da Obscuridade. A partir do século XIX devemos estar atentos ao princípio de Kerckhoff. Baseado na Wikipedia: "um sistema criptográfico deve ser seguro mesmo que tudo sobre o sistema, exceto a chave, seja de conhecimento público".

Se você tiver um gerenciamento de vulnerabilidade que resulte em um patch de emergência com 50 dias de atraso, este não é o momento para este exercício.

SOMENTE se você tiver processos de TI eficazes e eficientes, vale a pena pensar na obscuridade como camada adicional.

Vamos supor que você tenha apenas uma porta aberta em seu servidor para SSH. 1.1.1.1 - deverá ser substituído por IP do cliente, 9.9.9.9 deverá ser substituído por IP do servidor. Porta SSH padrão que você pode alterar em /etc/ssh/sshd_config. Lembre-se que você deve reiniciar o serviço por: systemctl restart sshd. A partir desse ponto, você deve alterar ssh [email protected] para ssh [email protected] -p your_port_number.

É fácil e inútil porque qualquer scanner de rede apenas relatará a nova porta do demônio SSH. Você pode simplesmente verificar com: nmap 9.9.9.9.

Por motivo de segurança: crie backup do seu firewall em: /sbin/iptables-save > ~/backup/iptables-works-`date +%F`.

No exemplo a seguir: lembre-se de alterar wlan0 para sua interface e 22 para sua porta sshd.

Você pode limpar seu firewall com: iptables-restore < /etc/iptables/clear.rules.

>cat /etc/iptables/clear.rules
# Arquivo de regra iptables vazio
*filtro
:ENTRADA ACEITAR [0:0]
:ENCAMINHAR ACEITAR [0:0]
:SAÍDA ACEITAR [0:0]
COMPROMETER-SE


Para evitar problemas engraçados (Marcin obrigado pela ajuda!:]): você pode evitar ativamente o IPv6. Com base no Arch Wiki: adicione a seguinte configuração sysctl a /etc/sysctl.d/40-ipv6.conf:

# Desabilita IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.wlan0.disable_ipv6 = 1


e modifique /etc/dhcpcd.conf:

noipv6rs
noipv6


Primeiro, precisamos permitir nossa conexão atual: sudo iptables -A INPUT -i wlan0 -p tcp –dport 22 -m conntrack –ctstate ESTABLISHED,RELATED -j ACCEPT.
Em seguida, devemos bloquear o tráfego na porta 22. Em vez de ignorar os pacotes (DROP) que serão relatados como "filtrados", vamos usar REJECT , assim como uma conexão com uma porta não utilizada seria tratada: sudo iptables -A INPUT -i wlan0 -p tcp –dport 22 -j REJECT –reject- com tcp-reset.
Verifique o estado do iptables com: iptables -nvL –line-numbers.

Neste momento, o nmap não deve ver o ssh aberto/filtrado. Apenas lembre-se de não fechar a conexão SSH ;-].

FWKNOP podemos configurar com base em cipherdyne.org:

[1.1.1.1]$ fwknop -A tcp/22 -a 1.1.1.1 -D 9.9.9.9 --key-gen --use-hmac --save-rc-stanza
[1.1.1.1]$ grep KEY /home/mbr/.fwknoprc
KEY_BASE64         Sz80RjpXOlhH2olGuKBUamHKcqyMBsS9BTgLaMugUsg=
HMAC_KEY_BASE64    c0TOaMJ2aVPdYTh4Aa25Dwxni7PrLo2zLAtBoVwSepkvH6nLcW45Cjb9zaEC2SQd03kaaV+Ckx3FhCh5ohNM5Q==


Valores de chaves que você deve transferir para: /etc/fwknop/access.conf em seu servidor:

[9.9.9.9]# cat /etc/fwknop/access.conf
FONTE                     QUALQUER
REQUIRE_SOURCE_ADDRESS     S
KEY_BASE64                 Sz80RjpXOlhH2olGuKBUamHKcqyMBsS9BTgLaMugUsg=
HMAC_KEY_BASE64            c0TOaMJ2aVPdYTh4Aa25Dwxni7PrLo2zLAtBoVwSepkvH6nLcW45Cjb9zaEC2SQd03kaaV+Ckx3FhCh5ohNM5Q==


Agora inicie o fwknop: systemctl start fwknopd. No cliente, você pode verificar ~/.fwknoprc e usar: fwknop -n 9.9.9.9. Depois disso, você pode simplesmente enviar via ssh para o servidor.

Se tiver problemas lembre-se de verificar:

[1.1.1.1]$ fwknop -n 192.168.1.239 --verbose -R
[9.9.9.9]$ journalctl -xeu fwknopd.service
[9.9.9.9]$ iptables -nvL --line-numbers


No final, para não cuidarmos de nós mesmos.
Com a casca do fish:

[1.1.1.1]$ alias sshalarm "fwknop -n 9.9.9.9; sleep 2; ssh [email protected]"
[1.1.1.1]$ funcsave sshalarm


Na bash:

alias sshalarm="fwknop -n 9.9.9.9; sleep 2; ssh [email protected]"


Nesta fase:
Sua porta ssh deve ser percebida pelos scanners de rede como fechada;
Você deve ser capaz de se conectar ao servidor apenas digitando o nome do alias (e tocando em seu YubiKey).

Last modification: 2022-11-27 Sun 21:49

By Ziółkowski Michał

License: Atribution-ShareAlike 4.0 International (CC BY-SA 4.0)