ASIX/M16/UF2/EX2/4
- 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
- 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?
Contingut
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