ASIX/M16/UF2/EX2/4

De Lordwektabyte Wiki
Salta a la navegació Salta a la cerca
  • Port knocking és una tècnica per obrir ports mitjançant una seqüència preestablerta d’intents de connexió.
  • Si intentes connexions a una sèrie de ports amb una combinació predefinida s’obrirà el port.
  • L’ús més comú és per a SSH però també hi ha gent que l’utilitza amb altres serveis de connexió com VPN.
  • Fa una mica més segur el servidor però sobretot s’utilitza per evitar atacs de força bruta a aquells serveis.
  • Configura port knocking per SSH amb la teva pròpia seqüència d’obertura i de tancada i verifica que pots accedir-hi
  • +info
https://www.endpoint.com/blog/2009/11/16/pknocking-with-knockd (404 not found)
https://www.digitalocean.com/community/tutorials/how-to-use-port-knocking-to-hide-your-ssh-daemon-from-attackers-on-ubuntu).
  • Fes un nmap abans, durant i després a veure que passa amb els serveis.
  • Posa't una contrasenya d’aquelles que pots trobar fàcilment en qualsevol llista i executa l’script nmap per esbrinar la contrasenya SSH. T’ha funcionat?

Procediment

Preàmbul

Per a poder aplicar un sistema de port knocking al nostre servidor de prova, haurem d'instal·lar el programari knockd que ens facilitarà la configuració de regles per a poder aconseguir l'objectiu.

Per a l'exemple d'aquest exercici farem servir combinacions relativament simples; però en un cas en un entorn de proves o productiu podríem fer servir seqüències més difícils d'endevinar o fins i tot més llargues per a dissuadir possibles atacants i mitigar els intents d'accés per SSH mitjançant força bruta.

Instruccions

Primer de tot, afegirem una política per a l'interfície de loopback perquè s'acceptin les connexions entre els serveis que es troben a la mateixa màquina

iptables -A INPUT -i lo -j ACCEPT

Per a evitar quedar-nos fora de la sessió SSH que tenim oberta per a fer la pràctica, farem ús del mòdul Conntrack d'IPTables de manera que les connexions existents o relacionades amb les existents es permetin

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Després, afegirem una regla per al port 80 (web) per a permetre'l sempre. Aquestes regles es poden aplicar per a tots els serveis EXCEPTE el que volguem accedir mitjançant port knocking

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

A partir d'aquí, afegim al final la regla per a descartar tots els paquets entrants que no coincideixin amb cap regla anterior

iptables -A INPUT -j DROP

En aquest punt, si provem qualsevol connexió al servidor OpenSuse que no sigui pel port 80, no se'ns donarà resposta.


A partir d'aquí és on començarem a preparar el terreny per a dissenyar el nostre sistema de port knocking. Necessitarem instal·lar el programa iptables-persistent de manera que ens faciliti el desat i restaurat de regles del Firewall entre possibles reinicis del servidor. Podem desar les regles aplicades actualment

iptables-save > /etc/iptables.cnf

I restaurar-les des de l'arxiu en qualsevol moment

iptables-restore < /etc/iptables.cnf

Després d'això, instal·larem el software knockd

zypper in knockd

L'arxiu de configuració es troba a /etc/knockd.conf. Per defecte hi ha un exemple per a obrir i tancar el port 22 per a un servei SSH. El podem modificar per a ajustar-lo una mica a les nostres necessitats

[options]
        UseSyslog
        interface = eth1 

[opencloseSSH]
        sequence      = 1234,5678,9101
        seq_timeout   = 15
        tcpflags      = syn
        start_command = /usr/sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport ssh -j ACCEPT
        cmd_timeout   = 10
        stop_command  = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport ssh -j ACCEPT

Veiem com definim la seqüència de ports que s'han de "tocar" per a fer saltar l'start_command i que hi ha un màxim de 15 segons per a fer això enviant paquets amb el flag de SYN activat. Una vegada es compleix aquesta regla, s'insereix (diferència -I amb -A) una regla nova a IPTables per tal d'obrir el port SSH NOMÉS per a l'adreça IP que ha fet el knock. Al cap de 10 segons, s'elimina la regla; però la sessió SSH no s'interromprà perquè hi ha la regla d'ACCEPT per a les connexions que estiguin en estat ESTABLISHED.


Activarem el servei creant l'arxiu /etc/default/knockd i posant el següent contingut

START_KNOCKD=1

Després d'això, el podem posar en marxa com qualsevol altre servei

systemctl start knockd

Prova de funcionament

Previ

Des del Kali Linux mateix podem provar d'obrir una sessió SSH al servidor normalment

ssh root@10.16.2.10
^C

Ens farà un timeout perquè el Firewall del servidor està aplicant la regla política de DROP dels paquets; ja que en aquest moment no hi ha cap regla per a permetre connexions entrants pel port 22 del servidor.

Ara bé, si prèviament fem la seqüència de knock correcta, podrem obrir una sessió sense problemes.

Costat client

Primer executarem nmap en els ports concrets en l'ordre concret sense paràmetres (per defecte usa SYN)

###########
# STAGE 1 #
###########
root@kali-gsb:~# nmap -p 1234 10.16.2.10 
Starting Nmap 7.70 ( https://nmap.org ) at 2019-02-28 20:45 CET
Nmap scan report for 10.16.2.10
Host is up (0.00074s latency).

PORT     STATE    SERVICE
1234/tcp filtered hotline
MAC Address: 08:00:27:64:8E:09 (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 1.51 seconds

###########
# STAGE 2 #
###########
root@kali-gsb:~# nmap -p 5678 10.16.2.10 

Starting Nmap 7.70 ( https://nmap.org ) at 2019-02-28 20:45 CET
Nmap scan report for 10.16.2.10
Host is up (0.00074s latency).

PORT     STATE    SERVICE
5678/tcp filtered rrac
MAC Address: 08:00:27:64:8E:09 (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 1.51 seconds

###########
# STAGE 3 #
###########
root@kali-gsb:~# nmap -p 9101 10.16.2.10 
Starting Nmap 7.70 ( https://nmap.org ) at 2019-02-28 20:45 CET
Nmap scan report for 10.16.2.10
Host is up (0.00074s latency).

PORT     STATE    SERVICE
9101/tcp filtered jetdirect
MAC Address: 08:00:27:64:8E:09 (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 1.51 seconds

Una vegada tocats els ports, podem llançar la connexió SSH com sempre i podrem accedir

root@kali-gsb:~# ssh root@10.16.2.10
Password: 
Last login: Thu Feb 28 16:26:57 2019 from 10.16.2.2
Have a lot of fun...
banner-grabbing:~ # 
Costat servidor

Paral·lelament, si des del propi servidor mirem els logs que genera knockd mentre s'executa (desat a /var/log/knockd.log podem veure el comportament des que s'arrenca el servei de port-knocking, el registre de cada etapa detectada (stage) i la comanda que executa per a permetre la connexió SSH durant 10 segons. Una vegada passat el cmd_time-out, executa la comanda d'IPTables per a eliminar la regla de permetre la connexió SSH. Tot i així, com que hi ha una política que preval que permet connexions ja establertes, la connexió llançada no es tancarà fins que nosaltres fem un logout des del client.

[2019-02-28 18:06] starting up, listening on eth1
[2019-02-28 18:07] 10.16.2.11: opencloseSSH: Stage 1
[2019-02-28 18:07] 10.16.2.11: opencloseSSH: Stage 2
[2019-02-28 18:07] 10.16.2.11: opencloseSSH: Stage 3
[2019-02-28 18:07] 10.16.2.11: opencloseSSH: OPEN SESAME
[2019-02-28 18:07] opencloseSSH: running command: /usr/sbin/iptables -I INPUT 1 -s 10.16.2.11 -p tcp --dport ssh -j ACCEPT

[2019-02-28 18:07] 10.16.2.11: opencloseSSH: command timeout
[2019-02-28 18:07] opencloseSSH: running command: /usr/sbin/iptables -D INPUT -s 10.16.2.11 -p tcp --dport ssh -j ACCEPT