Wat kun je doen tegen botnets van geheime diensten?

Noud van Kruysbergen
0

Nu inlichtingendiensten grootschalige poortscans uitvoeren en kwetsbare systemen naar hun hand kunnen zetten, is het tijd om opnieuw over het internetprotocol TCP na te denken. Met technische middelen kun je je in ieder geval nog ten dele verweren tegen de overname van het internet. We laten zien hoe je je in ieder geval nog een beetje kunt verdedigen tegen botnets van geheime diensten.

tcpstealth01Het scannen van poorten is voor beveiligingsonderzoekers een bekende manier om zwakke plekken in systemen te vinden. Uit een analyse van de werkwijze van de Britse geheime dienst GCHQ en diens partners in de Five-Eyes-club blijkt duidelijk dat het scannen van open poorten in de netwerken van complete landen voor geheime diensten tot de dagelijkse praktijk hoort. Alle diensten gebruiken dit standaard om het internet te scannen om zo systemen te zoeken die ze vervolgens kunnen overnemen. Zodoende bouwen ze botnets op die ze gebruiken voor eigen surveillance- en sabotagedoeleinden. Bij veel netwerkbeheerders zou het sluiten van open poorten dan ook allang op de todo-list moeten staan. ‘Port knocking’ (het aankloppen bij het opbouwen van een TCP-verbinding) en de hier beschreven uitbreiding TCP Stealth bieden een eerste directe antwoord op het wegsluizen van informatie door de scans van geheime diensten.

TCP Stealth

TCP Stealth is bij de Internet Engineering Task Force (IETF) ingediend als voorstel om poorten te camoufleren. Dat gebeurde bij de eerste publicatie van de achtergronden van Hacienda, Mugshot, Operational Relay Boxes en andere documenten van de geheime diensten van Five Eyes uit de VS, Groot-Brittannië, Canada, Australië en Nieuw-Zeeland (zie ‘NSA/GCHQ: The HACIENDA Program for Internet Colonization’ via de link aan het eind van dit artikel).

De techniek is momenteel alleen geïmplementeerd onder Linux. Met TCP Stealth kunnen netwerkbeheerders ervoor zorgen dat hun servers afgeschermd worden tegen poortscans. Waar het juist heel moeilijk is om je te beschermen tegen gerichte aanvallen op onbekende zwakke plekken in openbare netwerkdiensten (zero days), is het veel eenvoudiger om de zichtbare ‘voetafdruk’ en daarmee de aangrijpingspunten voor overheidsdiensten te verkleinen.

tcpstealth02

De Britse geheime dienst GCHQ is een van de drijvende krachten achter de programma’s waarmee de geheime diensten van Five Eyes een soort botnet maken. Je kunt je in sommige scenario’s in ieder geval verdedigen met een technische oplossing.

Zwakke plek in TCP

TCP, het Transmission Control Protocol, is het meest gebruikte protocol op internet. Poortscanners maken gebruik van een structureel probleem in TCP om te bepalen welke diensten er op een systeem actief zijn. Daarom worden die scans al heel lang door aanvallers gebruikt om kwetsbare servers te vinden.

Communicatie tussen een TCP-client en -server wordt altijd voorafgegaan door een three-way handshake. Poortscanning is mogelijk dankzij een fout in het concept van dit ‘handen schudden’ door de twee deelnemers. De server geeft daarbij namelijk altijd prijs of een bepaalde dienst beschikbaar is zonder vooraf te controleren of de aanvragende client wel het recht heeft om die dienst te gebruiken.

Bij een TCP-handshake stuurt de host die een verbinding wil maken een TCP SYN-pakket. De doelserver antwoordt met SYN/ACK als hij de aanvraag accepteert. De aanvragende host rondt de three-way handshake af met een tweede ACK-pakket. Daarmee is de opbouw van de verbinding voltooid. Precies die handshake maakt het voor een aanvaller mogelijk om te achterhalen of er via de betreffende poorten TCP-diensten aangeboden worden. Als een TCP-poort gesloten is, antwoordt de server op het eerste SYN-pakket met een RST-pakket (‘reset’). Voor een aanvaller is het dan een makkie om de aanwezige internetdiensten in kaart te brengen.

Klop, klop

Port knocking is een beproefde methode om servers minder zichtbaar te maken op het netwerk. Het basisidee is niet meer dan dat een TCP-server op een SYN-verzoek alleen antwoordt als de aanvragende server eerder eerder al een ‘knock’-pakket heeft gestuurd. Aankloppen met een geheim klopteken zorgt dan voor meer veiligheid omdat een aanvaller die een aanvraag doet zonder het klopteken geen TCP-verbinding kan opbouwen en daardoor ook de achterliggende dienst niet kan identificeren en al helemaal niet kan aanvallen.

Bij traditionele port-knocking wordt alleen geen rekening gehouden met een interne aanvaller. Als de service wordt aangevraagd vanuit een netwerk waarop de aanvaller het dataverkeer al kan meelezen, dan kan hij ook meteen concluderen dat die dienst bestaat. Een interne aanvaller kan zelfs al het verkeer van een TCP-client bekijken en dan een man-in-the-middle-aanval uitvoeren om te spioneren. Met een man-in-the-middle-aanval via een gecompromitteerde router kunnen aanvallers een TCP-verbinding meteen na de handshake overnemen.

Een ervaren hacker die de router onder controle heeft, kan ook slecht vermomde port-knocks identificeren door ongebruikelijk dataverkeer te analyseren. Je mag er nog wel van uitgaan dat een aanvaller ‘normaal’ TCP-verkeer niet als verdacht zal markeren omdat hij daar teveel hits mee zou genereren.

Verborgen

TCP Stealth is een bij de IETF ingediende Request for Comment voor een eenvoudig te implementeren, stille port-knocking-variant. Daarbij kun je aan de TCP-data niet zien dat er port knocking gebruikt wordt. Het uitgangspunt is dat een client en server een geheimp keyword delen dat al bij het opbouwen van de TCP-communicatie wordt gebruikt. Voor algemeen toegankelijke servers, die zorgen voor openbaar toegankelijke diensten zoals websites, e-mail of dns, is dat natuurlijk geen haalbare technische beveiligingsmaatregel. Iedere bestaande client zou dan immers dat geheim moeten weten. TCP Stealth kan echter wel beveiliging bieden voor servers die bedoeld zijn voor interne communicatie of voor servers die wel op internet aangesloten zijn, maar niet bedoeld zijn voor de openbaarheid.

Bij TCP Stealth bevat het allereerste pakket dat een client naar de server stuurt (de SYN in de three-way handshake) meteen al een tekenreeks die op basis van het gedeelde geheim berekend wordt. Die tekenreeks wordt conform het protocol in de TCP-header ingevoerd als Initial Sequence Number (ISN). De server kan daaraan herkennen dat de aanvraag van een client komt waarmee hij het geheim deelt. SYN-pakketten zonder juist ISN behandelt hij net als een SYN-pakket op een poort waar geen dienst op draait. In geval van twijfel stuurt hij dus geheel TCP-conform een reset-pakket (RST). Als je het geheim niet weet, kun je dan niet meer vaststellen op welke poorten er diensten actief zijn aangezien je altijd een reset-pakket terugkrijgt.

Omdat het opbouwen van een TCP-verbinding en het genereren van TCP-pakketten onder Linux uitgevoerd wordt door kerneldrivers, moet voor TCP Stealth de kernel van de client aangepast worden. Daarmee kan hij in plaats van willekeurig gekozen ISN’s dan het juiste authenticatie- ISN in het pakket inbouwen. Daarnaast zijn er uitbreidingen nodig voor programma’s als Firefox die de kernel laten weten dat een verbinding TCP Stealth moet gebruiken en op basis van welk geheim de ISN berekend moet worden. Aan de serverkant zijn ook uitbreidingen in de userspace nodig voor het beheer van de TCP-Stealth-geheimen, plus kerneluitbreidingen om de ISN-controle te implementeren.

In tegenstelling tot normale port knocking is TCP Stealth lastig te ontdekken omdat het verstopt zit in de klassieke three-way handshake. Het dataverkeer bij de verbindingsopbouw blijft onveranderd. TCP Stealth werkt met IPv4 en IPv6 en is te gebruiken voor elke dienst waarvan de gebruikersgroep zo klein is dat er een passphrase onder de gebruikers uitgewisseld kan worden. Voorbeelden zijn SSH- en FTP-toegang voor servers, Tor-bridges, persoonlijke POP3- en IMAP-servers en peer-to-peer-, overlay- of friend-to-friend-netwerken. Voor de Linuxkernel is TCP Stealth beschikbaar in de vorm van de ‘Knock’-patch. Als de kernel gepatcht is, kan de ondersteuning voor TCP Stealth in bestaande programma’s simpelweg geactiveerd worden door de functie setsockopt() aan te roepen. Als alternatief kunnen bestaande programma’s TCP Stealth gebruiken door met LD PRELOAD de dynamische bibliotheek libknockify te gebruiken.

De details over de ontwikkeling van TCP Stealth, de implementatie in servers en clients en het gebruik, zijn door Julian Kirsch beschreven in zijn masterscriptie ‘Improved Kernel-Based Port-Knocking in Linux‘.

In de kernel

Aangezien de ‘Knock’-patch momenteel niet in de hoofdontwikkeltak van de Linuxkernel zit, moet de kernel op de computer waar ‘Knock’ op moet werken gepatcht worden. Bij Linux-distributie Parabola Linux zit Knock-ondersteuning standaard in de kernel en kunnen de userspacetools makkelijk met een packetmanager geïnstalleerd worden. Voor alle andere distributies zul je de patch zelf moeten installeren:

1. Voor een standaard kernel moet je de broncode van de gewenste kernel downloaden van www.kernel.org. Daarbij moet je erop letten dat veel distributies de kernel aanpassen en eigen broncode aanbieden. In zo’n geval moet je dan die aangepaste kernel gebruiken. Hoe je dat doet, lees je op de site van je distributie.

2. Als je de broncode hebt, moet je de Knock-patch binnenhalen van gnunet.org/knock. Als de kernelversie niet expliciet op de Knock-website vermeld wordt, is het aan te raden het te proberen met de meest verwante versie.

3. Ga naar de directory met de kernelcode (vervang ‘<your-version>’ door de betreffende versie van de kernel en van de patch) en voer de patch uit:

$ cd linux-<your-version>/

~/linux $ patch -p1 <

/path/to/knock/patch/tcp_stealth_<your-version>.diff

4. Vervolgens moet je de configuratie van de huidige kernel kopiëren. Bij Debian en verwante distributies staat die in de map /boot. Het configuratiebestand kan makkelijk naar de kernelcode gekopieerd worden.

~/linux $ cp /boot/config-$(uname -r) .config

Bij veel andere distributies heb je de mogelijkheid om de configuratie van de actieve kernel via het /proc-bestandssysteem uit te lezen.

~/linux $ zcat /proc/config.gz > .config

Als je geen van deze mogelijkheden hebt, kun je het met de standaardconfiguratie proberen.

~/linux $ make defconfig

Die methode zal echter geen bijzonder stabiele en krachtige kernel opleveren.

5. Alle parameters die niet in de huidige configuratie ingesteld zijn, moeten teruggezet worden naar de standaardwaarden. Een andere kernelversie zou nieuwe configuratieopties kunnen vereisen voor de compilatie.

~/linux $ yes "" | make oldconfig

6. Nu kun je Knock voor de huidige configuratie activeren via het menu ‘Networking Support / Networking Options / TCP/ IP networking / TCP: Stealth TCP socket support’.

~/linux $ make menuconfig

7. Nu kun je de kernel met alle extra modules compileren:

~/linux $ make bzImage && make modules

Op machines met meer dan één processorkern kun je met de optie -j bij de twee make-commando’s het aantal buildthreads aanpassen.

8. Als het compileren gelukt is, kun je de kernel en alle modules installeren en automatisch een nieuwe initramdisk voor de nieuwe kernel laten maken.

~/linux $ sudo make modules_install && sudo make install

9. Als je de computer dan opnieuw opstart, boot hij met de nieuwe kernel en heeft de machine Knock.

Programma’s

Je kunt Knock gebruiken zonder de broncode van het betreffende programma te wijzigen. Om Knock bij bestaande programma’s te gebruiken, heb je de dynamische bibliotheek libknockify tot je beschikking. In principe is het heel makkelijk om het met libknockify gedeelde object te gebruiken om Knock in te zetten voor het programma ‘example program’:

KNOCK_SECRET="shared secret"

KNOCK_INTLEN=42

LD_PRELOAD=./libknockify.so

/example_program

Als het programma ‘example program’ vervolgens via TCP communiceert, stelt libknockify de benodigde socket-options in om het gebruik van Knock in de kernel te activeren. In het voorbeeld wordt de gedeelde passphrase uit de tekst ‘shared secret’ gehaald. De integriteit van de inhoud is beperkt tot de eerste 42 bytes van de checksum in de TCP-datastroom. Als de variabele KNOCK_INTLEN niet ingesteld is, wordt de integriteitscontrole gedeactiveerd.

In de code

Ontwikkelaars van programma’s kunnen ondersteuning van TCP Stealth rechtstreeks in hun code integreren. Dan kan gecontroleerd worden welke TCP-verbindingen TCP Stealth gebruiken.

Om TCP Stealth in principe te activeren met een kernel die Knock ondersteunt, hoeft het programma alleen setsockopt() aan te roepen. Vervolgens wordt de TCPSocket gegenereerd.

char secret[64] = "shared secret";

setsockopt (sock, TCP_STEALTH, secret, sizeof (secret));

De grenzen van de techniek

De meeste eindapparaten zitten achter gatewayrouters die aan Network Address Translation (NAT) doen. TCP Stealth is zodanig ingesteld dat informatie die door NAT-boxen veranderd is niet gebruikt wordt, maar sommige NAT-boxen veranderen ook TCP-timestamps en ISN. Daarmee verhinderen ze TCP Stealth.

TCP Stealth is bovendien beperkt tot de 32 bit in het TCP-ISN-header-field. Een agressieve aanvaller kan die beperking misbruiken en door toeval of een bruteforceaanval zijn doel toch bereiken. TCP Stealth biedt echter adequate bescherming tegen aanvallers die ongericht scannen, zoals Hacienda en vergelijkbare activiteiten van de geheime diensten. Je kunt het risico op toevalstreffers door actieve poortscanners verder beperken door netwerkmanagementdiensten naar niet-standaard poorten te migreren.

Daarnaast kun je met TCP Stealth integriteitsbeveiliging realiseren voor het eerste pakket van de payload. Het gebruik van integriteitsbeveiliging met TCP Stealth is een technische optie. Port knocking en TCP Stealth bieden zonder zo’n beveiliging echter weinig bescherming tegen een aanvaller die het dataverkeer in het netwerk kan bekijken en verbindingen omleidt nadat de TCP-handshake afgerond is. Toekomstige ontwikkelingen bij transportprotocollen moeten er daarom voor gaan zorgen dat er meteen aan het begin sleutels uitgewisseld worden.

De politiek

In principe geldt ook voor TCP Stealth dat het op de lange termijn waarschijnlijk onmogelijk is om alleen met technische maatregelen de alomvattende bezetting van het internet voor te blijven. Dergelijke technische oplossingen, die de ontwikkelingen van de geavanceerde geheime diensten op de voet proberen te volgen, zijn wel een manier voor netwerkbeheerders om hun systemen te wapenen door niet-openbare TCP-diensten te beschermen tegen toegang door aanvallers.

De IETF heeft zich als standaardisatieorgaan voor internetprotocollen sinds de onthullingen van Edward Snowden voortdurend beziggehouden met het verzet tegen de massale bezetting van internet, die makkelijker wordt door technische lekken. De autoriteiten, met name uit de VS (NSA, NIST), houden de IETF op hun beurt nauwlettend in de gaten en worden ervan beschuldigd dat ze juist op het terrein van versleuteling proberen om directe invloed uit te oefenen.

Naast alle technische oplossingen zijn er dus dringend politieke antwoorden nodig. Voor nu moeten ontwikkelaars van besturingssystemen en netwerkbeheerders het beste van de situatie proberen te maken door de modernste en vooral beste veiligheidsoplossingen te gebruiken die ze kunnen krijgen. TCP Stealth voor Linux – en hopelijk snel varianten voor andere besturingssystemen – is een eerste stap in de goede richting.

Door: Julian Kirsch, Christian Grothoff, Monika Ermert, Jacob Appelbaum, Laura Poitras, Henrik Moltke  (Herman Heringa, hhe@ct.nl, gepubliceerd in c’t 12/2014, p.93)

Deel dit artikel

Lees ook

Waarom 5G zoveel sneller is

Het nieuwe 5G mobiele netwerk belooft een gegevensoverdracht met snelheden tot 10 Gbit/s. Die snelheidswinst is alleen mogelijk dankzij nieuwe technie...

DDR4 geheugen snelheid – verschillen getest in de praktijk

Als het coderen van video’s op je pc traag gaat, games haperen of het lang duurt voordat programma’s laden, is het dan zinvol om snel, overklokbaar DD...

Interessant voor jou

0 Praat mee

avatar
  Abonneer  
Laat het mij weten wanneer er