Reduir la superfície d’atac: Port Knocking

Un dels pilars en la seguretat informàtica és exposar els mínims serveis cap a l’exterior, o com s’anomena tècnicament, reduir la superfície d’atac.  I és que és de sentit comú, com menys portes siguin accessible des de l’exterior més reduïdes seran les opcions que tindrà un atacant per entrar.  I per a fer-ho res millor que un bon firewall.

Tanmateix, un cop tancats els serveis prescindibles i afinat les regles de filtratge per a que els serveis estiguin tan sols disponibles per aquells que els han d’utilitzar ens trobem amb poca cosa més a perfeccionar.  ¿Com podem protegir un servei d’accés remot, per exemple, que n”ha de fer ús un grup de gent des de IPs indeterminades? Poca cosa hi ha per filtrar aquí.

Tot i que el propi servei pugui contribuir a la seguretat tot afegint controls d’autenticació (claus, certificats, etc) el port continua estant accessible des de fora i per tant susceptible a atacs de tot tipus. Amb la tècnica que veurem avui el port quedarà totalment inaccessible des de l’exterior, a menys que coneguem una seqüència d’accions!

Tot i que el Port Knocking no és precisament una tècnica nova, és curiós veure que s’està aplicant molt poc tot i el gran grau de seguretat que ofereix.  A més, el fet que s’utilitzi poc és un doble avantatge ja que els hackers no esperaran que funcionem d’aquesta manera.

La idea darrera del Port Knocking és simple i s’inspira en el comportament de les botigues d’estraperlo que van proliferar a Estats Units durant l’època de la llei seca.  La idea és que el port que vulguem protegir estigui per defecte tancat per el firewall i tan sols si un client realitza una seqüència de “tocs” a determinats ports i en determinat ordre obrirem el port protegit, però tan sols l’obrirem per a aquell client!  Fixeu-vos doncs que a priori el port sempre estarà tancat i tan sols aquells que coneguin la seqüència correcta podran tenir-hi accés, si a més hi afegim que aquesta seqüència pot arribar a ser dinàmica, que si no sabem que el port està protegit per port knocking no veurem cap comportament sospitós i que com deia és una tècnica no gaire estesa tenim com a resultat una forma molt eficient de protegir serveis sensibles com SSH que necessàriament han d’estar exposat a l’exterior.

Com funciona el port knocking?

Com funciona el port knocking?

Com ho fem a Linux? Doncs molt senzill, tant a client com a servidor instal·lem el programa knockd que ens permetrà tant fer la gestió de les regles de iptables, per obrir i tancar el port, com fer els “tocs” des del client per a que els servidor ens obri el port corresponent.  Però anem per passes:

Al servidor

1.- Instal·lem kncokd

sudo apt-get install knockd

2.- Creem res regles de iptables pertinets (recordeu que s’han de fer permanents guardant-les i després carregant-les al inici del sistema).  Per a fer les proves tan sols crearem una política per defecte que rebutji tota connexió entrant.

sudo iptables -P INPUT DROP

3.- Activar el dimoni kncokd i indicar-hi quina interfície ha d’utilitzar per escoltar.  Això ho farem editant l’arxiu /etc/default/knockd i modificant els valors:

START_KNOCKD=1

KNOCKD_OPTS=”-i eth0″

4.- Configurem el comportament del servidor knockd, cal remarcar que aquí especifiquem en un primer lloc la seqüència de “tocs” a ports que dispara l’acció, el temps màxim per a fer la seqüència,l’acció a realitzar és una comanda arbitrària que en el nostre cas serà afegir/eliminar regles de iptables i els tipus de paquets de la seqüència de “tocs”.  Per a fer-ho haurem de modificar l’arxiu /etc/knockd.conf

En aquest exemple afegirem dos comportaments, el primer obrirà el port del SSH (port 22) per a la IP que ens ha fet els ports.  El segon el tancarà.

 [obrirSSH]

sequence = 1000,8000,2000
seq_timeout = 5
command = /sbin/iptables -A INPUT -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn

[tancarSSH]
sequence = 2000,8000,1000
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn

5.- Finalment iniciem el servei de knockd:

sudo /etc/init.d/knockd start

Des del client

El client tan sols hem d’instal·lar el mateix knockd i després emprar-lo per a fer els “tocs màgics”.

1.- Instal·ler knockd:

sudo apt-get install knockd

2.- Fem els tocs al servidor per a que ens obri el port 22 per a nosaltres.

kncok <ip_servidor> 1000 8000 2000

I ja tindríem el port 22 per al nostre ús exclusiu! Per tancar-lo el mateix però utilitzant la seqüència de tancada.

També remarcar que tenim disponibles clients per a Windows, i alguna solució per a Windows com a servidor també però que ho he tastat.

Com evadir-lo

El primer entrebanc que ens trobarem com atacants és el simple fet de detectar-lo.  Tinguem clar que inicialment tots els ports els trobarem darrera del firewall i per tant no tindrem cap mena de pista sobre l’existència del dimoni knockd.  Per tant això és part de la seguretat per ofuscament, i tan sols obtindrem pistes de la seva existència per vies “no tècniques”.

Un cop sabem que existeix el knockd el vector amb més possibilitats ‘èxit és interceptar la seqüència de tocs d’un client legítim.  Això amb un simple MitM ens funcionarà.  Però i si el servei està configurat per a utilitzar seqüències de tocs dinàmiques? La seqüència que haguem recuperat no tindrà valor de nou!!! Així doncs tan sols ens quedaria intentar fer spoofing de la sessió oberta per el client (amb un IP Spoofing per exemple) o recollir varies seqüències de tocs per intentar deduir la funció dinàmica que els genera.

¿Com atacaríem aquesta mesura de seguretat? Doncs el vector més directe seria utilitzar un MitM entre client i servidor, tot i que la dificultat podria ser exponencial si com he comentat al principi, la combinació de “tocs” fos dinàmica. En aquest últim escenari tan sols tenir accés al port protegit fent spoofing i mentre l’usuari legítim no el tanqués.

Per acabar

Com podeu comprovar es tracta d’una tècnica molt potent, flexible i fàcil de implementar.  Espero que us sigui útil.

Advertisements

~ per madyyelf a 9 Mai 2014.