| ![[Klaus Mueller]](../../common/images/KlausMueller.png)  door  Klaus Müller
 <Socma(at)gmx.net>
 
 Over de auteur:
 Op het moment is "Klaus Müller (ook bekend als "Socma")
    nog altijd student, hij is bezig met linux programmeren en
    met beveiliging-gerelateerde onderwerpen.
 
 Vertaald naar het Nederlands door:
 Guus Snijders <ghs(at)linuxfocus.org>
 
 Inhoud:
 | 
 
| IDS - Intrusion Detection System, Deel II![[Illustratie]](../../common/images/illustration292.jpg)  Kort:
 
    In Part I richtten
    we ons op typische aanvallen op Intrusion Detection Systems
    (inbraak detectie systemen). Deel II introduceert methoden
    voor het ontdekken ervan en onze reacties - waaronder de
    toepassing van signatures (profielen) en filters. Ten
    slotte introduceren we Snort en LIDS.
    
_________________ _________________ _________________
 
 | 
     
Analyse Mogelijkheden
    Eerder keken we naar aanvallen om IDSsen en verschillende andere
    systemen tegen te beschermen. Vervolgens bekeken we methodes
    voor de analyse en hoe een IDS bepaalt of er een aanval plaats
    vond, respectievelijk of de aanval succes had, of niet. 
    
    In principe maken we onderscheid tussen Misbruik Detectie en
    Anomaly Detectie. Misbruik Detectie gebruikt specifiek
    gedefinieerde patronen om een aanval te ontmaskeren. Deze
    patronen worden "signatures, profielen" genoemd, en zullen
    besproken worden in een eigen sectie. Voor het moment is het
    genoeg om te weten dat we signatures kunnen definiëren die
    het netwerk verkeer doorzoeken naar bepaalde strings (bijvoorbeeld
    /etc/passwd), toegangsvragen voor bepaalde bestanden afwijzen en
    een alarm in werking stellen. Het voordeel van Misbruik Detectie
    is de lage waarschijnlijkheid van false alarms daar de zoek
    criteria van signatures zeer strak gedefiniëerd kan worden.
    De nadelen zijn ook erg duidelijk, nieuwe aanvallen worden vaak
    gemist omdat ze niet gedefinieerd zijn (zie sectie... over
    signatures). 
    
    De andere methode is Anomaly Detectie. Dit betekend gewoon dat
    er een profiel van de normale activiteiten van de gebruiker is
    vastgelegd. Als het gedrag van de gebruiker teveel afwijkt van
    het profiel, wordt er een alarm afgegeven. De eerste stap van
    deze analyse is het aanleggen van de profielen (database) van
    "normale" activiteiten van de gebruiker. Een aantal stappen kan
    worden vastgelegd: Hoe vaak voert de gebruiker specifieke
    commando's uit? Wanneer voert hij specifieke commando's uit?
    Hoe vaak opent hij specifieke bestanden? ... Een kort voorbeeld:
    - Gebruiker "Voorbeeld" voert su drie keer per dag uit.
    Plotseling - op een dag - voert gebruiker "Voorbeeld" su
    zeven keer op een dag uit, meer dan twee keer zoveel als normaal.
    Anomaly Detectie zou dit "abnormale" gedrag opmerken en de
    beheerder waarschuwen over gebruikers "Voorbeeld" zeven keer
    uitvoeren van su tegen drie keer "normaal" gemiddelde.
    De nadelen van deze procedure werden me duidelijk toen ik begon
    met de implementatie ervan (zie voorbeeld aan het einde - COLOID).
    De methode om een database op te zetten voor gebruikersactiviteiten
    is nogal belastend voor het systeem. We monitoren, bijvoorbeeld,
    hoe vaak de gebruiker tien specifieke bestanden heeft geopend.
    Met ieder open() commando moet gecontroleerd worden of het
    een van de tien specifieke bestanden is en als het resultaat
    positief is, gaat de teller met een omhoog. Desalniettemin, is
    dit een goede mogelijkheid om nieuwe aanvalstechnieken te
    achterhalen, daar ze meestal zullen opduiken als "abnormaal".
    Verder kan de beheerder zelf aangeven welke afwijking wordt
    beschouwd als "abnormaal", een afwijking van 10% of zelfs 75%
    ... Door methode te gebruiken moeten we oppassen dat we de
    gebruikers profielen genereren in een "veilig" netwerk, anders
    zou het gedrag van een aanvaller als normaal kunnen worden gezien
    en het gedrag van een legitieme gebruiker als abnormaal. 
    
    In het algemeen omvat Anomaly Detectie de volgende procedures:
    
    
      - Threshold Detection = in dit gebied worden tellers gebruikt,
      welke bijhouden hoevaak wat wordt uitgevoerd, geopend, gestart...
      Deze statistische analyse kan worden gebruikt met de zogenoemde
      Heuristic Treshold Detection.
- Rule-Based Detection = (NL: Detectie gebaseerd op regels),
      zou het gebruik de regels overtreden wordt er een alarm gestart.
      
- Static Measure = (Statisch meten) het gedrag van gebruikers/
      systemen voldoet aan een profiel welke ofwel was
      voorgedefinieerd, of op een andere manier gegenereerd.
      Een programma om normale gebruikers activiteiten te monitoren
      voor de profielen is vaak inbegrepen.
Heuristic Threshold Detection, in dit geval de teller (hoe
    vaak wat mag worden uitgevoerd), wordt in het begin niet op een
    statische, maar op een dynamische waarde gezet. Voert een gebruiker
    normaal gesproken /bin/login 4 keer per dag uit, kan de
    teller op 5 worden gezet...
    De Protocol Anomaly Detection representeerd een sub-group van de
    anomaly Detectie. Dit is een relatief nieuwe techniek, het werkt
    in principe net als de Anomaly Detectie. Ieder protocol heeft een
    "voor-gedefinieerd" profiel (zie bijbehorende RFC's). Het doel
    van de Protocol Anomaly Detectie is om uit te vinden of het gedrag
    van het protocol overeenkomt met het voor-gedefinieerde, of niet.
    Er zijn waarschijnlijk meer aanvallen gebaseerd op protocol misbruik
    dan de lezer zich kan voorstellen, deze subgroep is daarom nogal
    belangrijk voor IDS'sen. Terugkijkend op de sectie over scannen
    kunnen we misschien wat indicators vinden voor Protocol Anomaly
    Detectie. 
    
      - Controleer of er parameters voorkomen (NULL scan)
- Controleer of alle parameters voorkomen (XMas scan)
- Controleer op "onzin" combinaties van parameters, zoals
      SF
- .......
De juiste specifieken zijn te vinden in de gerelateerde RFCs,
    alsmede welk gedrag niet zou moeten voorkomen, resp. welk soort
    reactie zou moeten voorkomen op specifieke gebeurtenissen. Verder
    is er Application Anomaly Detection (werkt ongeveer gelijk aan
    Application Based IDSs). In sommige literatuur vond ik een indicatie
    in die richting, dus keek ik er verder naar. Natuurlijk heeft een
    programma "normaal" gedrag, bijvoorbeeld hoe het reageert op
    gebeurtenis X... Y of als de invoer van een gebruiker fout is.
    Veel voorkomende binaries (bijvoorbeeld ps, netstat, enz
    worden aangepast voor invoer van de gebruiker, in geval van
    ps om bepaalde processen te verbergen. Met behulp van
    Application Anomaly Detection is het mogelijk om "abnormaal" gedrag
    van een programma te ontdekken. Sommige applicatie gebaseerde IDS'en
    werken op deze manier, maar ik heb er weinig ervaring mee.
    
    Tenslotte een andere nieuwe methode van ID-systemen: Intrusion
    Prevention (inbraak afweren). Het wordt gebruikt in sommige nieuwe
    ID-systemen, en verschilt van de beschreven methoden van intrusion
    detection. In plaats van logbestanden van het verkeer te
    analyseren, en dus om aanvallen te ontdekken nadat deze zijn
    voorgekomen, proberen ze aanvallen tegen te gaan. 
    
    In tegenstelling tot de klassieke IDS'sen worden er geen
    profielen gebruikt om de aanval te ontdekken. Het volgende is een
    korte uitleg van hoe IPS'en werken, hun functionaliteit wordt
    duidelijk met de volgende voorbeelden: 
    
    
      - Monitor applicatie gedrag
- creëer applicatie regels
- Waarschuw bij overtredingen
- Vergelijk met andere gebeurtenissen
- Grijp in op systeemaanroepen (system calls)
- ......
    
    'Monitor applicatie gedrag' komt dicht bij Applicatie-gebaseerde
    IDS'en, oftewel het gedrag van een applicatie wordt geanalyseerd
    en gelogged, zoals welke data normaal gesproken wordt opgevraagd,
    welke bronnen het gebruikt. Net als Anomaly Detectie probeert het
    uit te vinden hoe een programma normaal opereert, respectievelijk
    wat het toe gestaan is te doen.
    
    Het derde punt ('Waarschuw bij overtredingen') zou geen uitleg
    nodig moeten hebben, het is alleen van betekenis in geval van een
    afwijking. Dit kan resulteren in een simpele log entry of
    geblokeerde bronnen. 
    
    Bij de tweede stap ('creëer applicatie regels') wordt een
    zogenoemde applicatie regelset samengesteld, gebaseerd op informatie
    van de analyse in Stap 1 ('Monitor applicatie'). Deze regelset
    levert informatie over wat een applicatie is toegestaan te doen
    (welke bronnen gebruikt mogen worden) en wat de applicatie niet is
    toegestaan. 
    
    'Vergelijk met andere gebeurtenissen' betekend het delen van
    informatie met samenwerkende sensoren, dit levert betere bescherming
    tegen aanvallen.
    
    Applicatie
        |
        V
       Actie
        |
        V
  -----------------------
  | Realtime beslissing |
  -----------------------
       /       \
    Sla af   Sta toe
       /           \
   Alarmeer    voer actie uit
    
    
    Dit vereenvoudigde diagram verduidelijkt het proces nog een
    keer. Voordat er een actie wordt uitgevoert, wordt er een
    'Realtime beslissing' uigevoerd (de activiteit wordt vergeleken
    met de regelset). Als de activiteit illegaal is (het programma
    vraagt data op of probeert deze te veranderen, zonder dat het
    is toegestaan om systeemdata te veranderen), wordt er een alarm
    in werking gesteld. In de meeste gevallen zullen de andere
    sensoren (of een centrale console) ook geïnformeerd worden.
    Dit voorkomt andere computers in het netwerk bij het openen van
    openen/uitvoeren van specifieke bestanden. Als de activiteit
    overeenkomt met de regelset, zal het worden toegestaan en zal het
    verwerken eindelijk verder gaan.
    
    Tenslotte het laatste punt op onze lijst: 'Grijp in op
    systeemaanroepen'. Gemanipuleerde systeemaanroepen (bijvoorbeeld
    rootkits) worden vaak gedetecteerd. De benadering voor het
    ingrijpen van system calls is nogal eenvoudige: voordat een system
    call wordt "geaccepteerd", wordt hij grondig onderzocht. Onderzoeken
    betekend, bijvoorbeeld het stellen van de volgende vragen (zie ook
    [5]): 
    
    
      - wie riep de system call aan (welk programma) ?
- met welke gebruikers authorisatie loopt het proces (root...)
      ?
- wat probeert de system call te benaderen?
    
    Dit maakt het monitoren van pogingen tot wijzigen van belangrijke
    configuratie/systeem bestanden mogelijk, we hoeven "alleen maar"
    te controleren of de system call overeenkomt met de gedefinieerde
    regelset, of niet... 
    
              Programma
                   |
                   V
             System call
                   |
                   V
            System call Interceptie
                 /          \
             Weiger           Toestaan
               |               |
	    roep de          Kernel
	    systemcall
	    niet aan
    
    
    Daar Intrusie Preventie in vergelijking met andere methoden
    relatief nieuw is, zal er meer informatie over dit onderwerp
    verschijnen. 
    
     Als conclusie een hint voor OKENA, een erg potente IPS. In de
    white paper sectie van www.okena.com kun je meer informatie over
    Storm Watch vinden. Om meer te leren over de tekortkomingen van
    Storm Watch, zie [6]. 
    
     
Profielen
    
    
    Nu zullen we het gebruik van profielen op IDS'en bespreken, het
    tweede deel zal gaan over hun zwakheden. 
    
     
Concept
    Met behulp van profielen kunnen bekende aanvallen worden herkend.
    Een profiel zoekt naar een bepaald patroon in het data verkeer.
    Dit patroon kan gebruik maken van een variatie van dingen als strings,
    verdachte headers (met ongebruikelijke parameter combinaties),
    poorten die vaak door trojans worden gebruikt. De meeste aanvallen
    hebben bepaalde karakteristieken, bijvoorbeeld specifieke
    parameters die zijn gezet, of bepaalde strings in de lading. Met
    profielen wordt geprobeerd om een aanval via deze karakteristieken
    te ontdekken. 
    
    Ik zou willen beginnen met de zogenoemde Payload Signatures.
    Hier is een deel van pakket payload (lading van het pakket): 
00 00 00 00 E9 FE FE FF FF E8 E9 FF FF FF E8 4F    ...............
0 FE FF FF 2F 62 69 6E 2F 73  68 00 2D 63 00 FF FF .../bin/sh.-c...
    
    
    Zoals we later in de bechrijving van de SNORT regels zullen zien,
    zijn er een paar opties voor wat te doen. Vaak wordt de inhoud van
    de lading onderzocht op specifieke strings (in SNORT met 'content'
    of 'content-list'). Stel dat iemand probeert een wachtwoord bestand
    probeert te openen (bijvoorbeeld /etc/passwd), de lading kan
    worden doorzocht (op /etc/passwd) als het pakket deze string
    bevat, kunnen tegenmaatregelen worden genomen, zoals: 
    
 alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS 80        \
 (msg:"WEB-MISC/etc/passwd";flags: A+; content:"/etc/passwd"; \
 nocase;classtype:attempted-recon; sid:1122; rev:1;)
    
    
     Een andere mogelijkheid is de detectie van pakketten die niet
    een specifieke string bevatten. 
    
    Een andere beveiliging tegen een mogelijk buffer overflow is de
    controle van de pakket grootte op specifieke poorten. Het is
    meestal mogelijk om de bron poort en de doel poort aan te geven,
    vragen van specifieke poorten of naar specifieke poorten kunnen
    worden afgewezen. String profielen in het algemeen zijn payload
    profielen. Payload profielen controleren de payload van een
    pakket, dat wil zeggen dat het string profiel van de lading wordt
    doorzocht op een specifieke string... 
    Wat zou er verder kunnen worden gedetecteerd met profielen? Om de
    lading te controleren op specifieke strings is niet altijd het
    beste. Om het profiel te laten zoeken naar flag (parameter)
    combinaties van de TCP header is een andere mogelijkheid. Als in
    een pakket zowel de SYN als de FIN bit zijn gezet, representeerd
    dit een anomaly welke een aanvaller zou kunnen gebruiken om
    specifieke eigenschappen van het os (besturingssysteem) (of het
    os zelf) te achterhalen. Zoals genoemd in het begin, zijn er
    specifieke poorten waarvan bekend is dat ze vaak door trojans
    worden gebruikt. Voorbeelden van zulke poorten zijn 31337 of
    27374.
    
    Misschien wordt het duidelijker als ik het proces uitleg met een
    voorbeeld. Laten we eens kijken naar de typische eigenschappen
    van een synscan aanval: 
    
    
      - verschillende bron IPs
- TCP bron en doel Poort is 21
- TOS (Type Of Service) 0
- IP id 39426
- SF set (SYN en FIN)
- verschillende volgnummers gezet
- verschillende ack (bevestiging) nummers gebruikt
- TCP Window grootte van 1028
    
    In gevallen als dit zou het de functie van een profiel moeten zijn
    om het onderscheid te maken tussen "normaal" en "abnormaal" gedrag
    van een verbinding. Sommige IDS'en gebruiken speciale databases met
    informatie, zoals boven weergeven, zullen ze deze doorzoeken naar
    overeenkomsten. 
    In principe kunnen afwijkingen in het synscan voorbeeld worden
    gedetecteerd door profiel controle: 
    
      - Bron en Doel Poort zijn 21 (File Transfer Protocol - ftp).
- Gelijke bron en doel poort duiden niet uitsluitend op de
      dreiging van een aanval, alleen de waarschijnlijkheid er van. 
- SF gezet, zoals boven genoemd, dit zou niet moeten gebeuren
      daar men geen verbinding opzet en afbreekt op hetzelfde moment. 
- Ack nummer is ongelijk aan 0, zelfs als alleen SF en niet
      ACK zijn gezet. Als ACK niet gezet is, zou het ACK nummer 0 moeten
      zijn. 
- IP ID is altijd 39426, zelfs al zou dit nummer niet constant
      moeten blijven (volgens de RFC), maar dit duidt niet uitsluitend
      op een synscan aanval - hetzelfde gaat op voor de constante window
      grootte...
    
    De ontwikkeling van het profiel voor de detectie van een synscan
    aanval dient met meer rekening te houden dan de bovengenoemde
    criteria. Het doel van het profiel zou de detectie van zowel
    bekende als nieuwe versies van aanvallen moeten omvatten. Voor
    deze reden zouden generale en speciale karakteristieken moeten
    worden gecombineerd om de waarschijnlijkheid van de aanval detectie
    te vergroten. Zelfs als het mogelijk zou zijn om een nieuw profiel
    voor iedere versie van een aanval te schrijven, zou dit ons meer
    bezig houden dan andere, belangrijker dingen. Daarom dienen we
    aandacht te besteden aan het profiel om zoveel mogelijk aanvallen
    (en versies ervan) te detecteren zonder dat we het profiel moeten
    aanpassen. 
    
    profielen zouden geschreven moeten worden om specifieke aanvallen
    te detecteren, maar er moeten algemene profielen zijn om afwijkingen
    te vinden. Een voorbeeld vna een profiel voor de detectie van een
    specifieke aanval is hierboven weergegeven (synscan aanval). Een
    algemener profiel zou bijvoorbeeld de volgende criteria kunnen
    controleren: 
    
    
      - ACK nummer ongelijk aan 0, zelfs al is ACK niet gezet 
- abnormale flag combinaties in de TCP header (SYN en FIN) of
      andere (zie de beschrijving van de scans)
- ....
    
    Profielen welke in het algemeen zoeken naar afwijkingen in
    protocollen worden Protocol analyse gebaseerde profielen genoemd,
    terwijl een andere groep bekend staat als "Packet Grepping".
     
Zwakheden
    
    Hoewel de methode van lading profielen (inclusief string profielen)
    betrouwbaar lijkt, zijn er manieren om deze te omzeilen. Mogelijk
    schrijf ik zelf een paper over hoe je Snort regels om de tuin kunt
    leiden, maar hier zal ik me beperken tot het essentiële. Een
    profiel, zoals oven weergegeven, zoekt naar "/etc/paswwd",
    met nocase, hoofdletters worden genegeerd. Echter, als we
    /etc/passwd niet direct maar indirect benaderen, bijvoorbeeld
    als de aanvaller gebruikt maakt van
    ' /etc/blablabla/.../.../\passwd ', zou het profiel dan
    alarm slaan? Nee, omdat het zoekt naar /etc/passwd (en andere
    hoofdletter/kleine letter versies). Een andere limiet van deze
    profielen is de detectie van de meest bekende aanvallen en het
    zoeken naar bekende zwakheden. Nieuwere versies van specifieke
    aanvallen worden vaak niet ontdekt... Andere profielen - welke
    gespecialiseerd zijn in specifieke aanvallen - of algemene profielen
    hebben het voordeel van het vinden van nieuwe aanvallen. Men dient
    echter voorzichtig te zijn met het maken van nieuwe profiel regels.
    Een profiel dat is gespecialiseerd in het detecteren van een
    specifieke aanval, zal falen in het vinden van een licht aangepaste
    variatie (in plaats van een constante IP ID waarde van 39426, kan
    de nieuwe aanval een variabele waarde gebruiken...).
    Bij het maken van algemene profielen (protocol analyse gebaseerde
    profielen) dienen we zeker te zijn dat de regels echt globaal zijn
    gedefinieerd, dat betekend dat ze in staat zijn om afwijkingen te
    vinden die anders niet of nauwelijks zouden voorkomen. 
    
    Een ander falen duikt op in nauwkeuriger onderzoek van de Unicode
    aanval (zie [4]). Hier is een typische beschrijving van een
    beveiligingsgat in MS IIS welke mogelijk was door de Unicode
    aanval: 
    
    "kort samengevat:
    Een fout in Microsoft Internet Information Server (IIS) staat remote
    gebruikers toe om directory lijsten te tonen, bestanden te bekijken,
    bestanden te verwijderen en commando's uit te voeren. Aanvallers
    kunnen de Unicode karakterset gebruiken om URLs samen te stellen om
    bronnen via IIS te benaderen, die anders onbereikbaar zouden zijn.
    Alle recente versies van IIS zijn getroffen door deze zwakheid.
    Exploitatie van deze zwakheid is triviaal. ISS X-Force is op de
    hoogte van wijdverspreide exploitatie van deze zwakheid." 
    
    Een probleem voor IDS'sen zit in het feit dat karakters in UTF-8
    verschillende codes voor hetzelfde resultaat kennen, bijvoorbeeld
    "A" : U+0041, U+0100, 
    
    U+0102, U+0104, U+01CD, U+01DE, U+8721. Daar MS IIS case sensitive
    (hoofdletter gevoellig) is, zijn er vele mogelijkheden om verschillende
    karakters weer te geven (er zijn bijvoorbeeld 83.060.640 verschillende
    mogelijkheden om AEIOU weer te geven). 
    Since MS IIS is case
    
    Als een aanvaller, bijvoorbeeld,
    "http://victim/../../winnt/system32/cmd.exe" aanvraagt, genereert IIS
    een fout. Echter, door "../.." met een UTF-8 equivalent te vervangen
    wordt er geen fout gegenereerd:
    "http://victim/..%C1%9C../winnt/system32/cmd.exe". Verder maken de
    zogenoemde UN-escape UTF-8 codes het mogelijk om pagina's te openen
    waartoe we geen toegang zouden moeten hebben. Een NIDS heeft
    mogelijkheden om deze aanvallen te detecteren daar de gebeurtenis
    plaats vind op de applicatie laag - in zo'n geval zou de toepassing
    van een HIDS beter zijn. Encryptie vormt meestal een probleem voor
    sensors - dat feit wordt ondertussen vaak misbruikt. De voortgang
    van sommige "IDS-Producers" toont duidelijk de limieten van profielen,
    de beschikbare profielen detecteren sommige bekende Unicode aanvallen,
    maar worden na kleine aanpassing van de aanval waardeloos.
    Alleen NetworkICE heeft met succes profielen ontwikkeld die dit type
    aanvallen ontdekken (Snort en ISS Real Secure hebben profielen
    ontwikkeld die, echter, alleen de bekende Unicode aanvallen
    detecteerden). 
    
     
Reacties
    
    Zoals eerde uitgelegd, analyseren IDS'en de activiteiten op de PC
    en op het net - maar hoe bruikbaar zou een IDS zijn als het niet
    zou reageren en ons waarschuwen? Een IDS zou waardeloos zijn,
    een verspilling van machine performance. 'Response' (reactie) kan
    worden opgedeeld in Active Response (actieve reactie) en Passive
    Response (passieve reactie). We zullen de verschillen bekijken in
    de specifieke sectie. 
    Geïnteresseerde lezers kunnen ook kijken naar OPSEC 
Secured by Check Point' appliances are security solutions that integrate
Check Point VPN-1/FireWall-1 technology onto our partners' hardware
platforms.
    
    
    Dit systeem staat de integratie toe van bestaande systemen in
    Fire Wall-1. Een bijkomend voordeel is de wereldwijde herkenning
    (het heeft zo'n 300 partners). Als je een aanval herkent kun het
    IP adres van aanvaller uitsluiten (alleen als een mogelijke
    reactie) ... Als geïnteresseerd bent in OPSEC, lees
    "Deployment Platforms", hier zul je ooko de condities vinden om
    "lid" te worden van het systeem (partner worden). 
    
     
Actieve Reactie
    Actieve reactie betekend automatische reactie als de IDS een
    aanval (of een poging tot) herkend. Afhankelijk van de ernst
    van de aanval, bieden de meeste IDS'en meerdere opties voor
    de reactie. 
    1) Neem actie tegen de potentiële indringer. 2) Verzamel
    "simpelweg" aanvullende data (over de indringer en zijn aanval,
    resp. de implicaties). 3) Pas de configuratie aan 
    De eerste gechikte reactie zou de initiatie van stappen tegen
    de aanvaller zijn. Dit kan een variëteit van stappen omvatten,
    zoals de persoon's toegang uitschakelen of aanvallen tegen de
    indringer starten. Zoals uitgelegd bij de honeypots is het vaak
    niet alleen lastig om directe aanvallen tegen de indringer te starten
    maar vaak ook illegaal. In deze context duikt ook vaak het
    zogeheten "Third Party Effect" op. Wat is dit effect? Een grafische
    weergave van een Third Party Effect ziet er als volgt uit:
    
 -------------               ----------------             -------
 | Indringer | ------------> | Onschuldige  | ----------> | JIJ |
 -------------               ----------------             -------
    
    Het Third Party Effect betekend dat een onschuldig persoon (of
    onschuldig netwerk) met succes was aangevallen door de indringer,
    en vervolgens gebruikt door indringer om ons netwerk (en mogelijk
    andere netwerken) aan te vallen. Dus, wat is het probleem?
    Het probleem is dat ons netwerk een 'onschuldig' netwerk zou
    ontmaskeren als zijnde de indringer, en deze vervolgen aanvallen,
    alleen omdat de indringer dat netwerk gebruikte om ons netwerk
    aan te vallen. Als resultaat van onze aanval (onder de foute aanname
    dat we de indringer te pakken hebben) zou onherstelbare schade
    kunnen worden aangericht op het onschuldige netwerk. Als de
    indringer slim genoeg was om zijn sporen te verbergen, zullen wij
    aansprakelijk worden gehouden voor de schade, en niet de indringer.
    
 
    De tweede optie (aanvullende informatie verzamelen) is minder
    problematisch. Zou er een potentiële aanval/inbraak gedetecteerd
    worden, wordt "alleen" aanvullende informatie over de gebruiker en
    zijn aanval worden verzameld. Als een IDS vastgesteld dat een specifieke
    gebruiker met succes zijn privileges heeft uitgebreid (of er een ander
    soort aanval plaatsvondt), wordt de observatie van die gebruiker
    uitgebreid, bijvoorbeeld het loggen van commando's (indien nog niet
    geactiveerd), waar de gebruiker op inlogt, wanneer logte hij in,
    wanneer en hoef vaak logt hij de komende paar dagen in, probeert
    hij om specifieke binaries over te zetten (FTP)... Op deze manier
    wordt er een profiel van de indringer samengesteld. Hiermee hebben
    we het voordeel dat we in staat zijn om gedetailleerde logs te
    analyseren en potentiële gaten te dichten, het stelt ons ook
    in staat eventueel juridische stappen te ondernemen. 
    Als een derde optie zie ik de modificatie van het systeem, de firewall,
    enz. Als de indringer specifieke IP adressen gebruikt, kunnen we
    de gebruiker uitsluiten van inloggen op het netwerk via dit IP.
    Natuurlijk kunnen we andere toegangspogingen van verdachte locaties
    blokkeren en loggen. In specifieke gevallen kunnen we simpelweg
    alle toegang tot het eigen netwerk blokkeren (of alle vragen aan
    specifieke TCP poorten, van specifieke netwerk interfaces...). Een
    andere mogelijkheid van Active Respons is om een TCP verbinding af
    te breken (ook bekend als TCP kill). Om de verbinding met een andere
    computer te verbreken, sturen we een RST (Reset Flag), dit "killed"
    de sessie. Normaal gesproken wordt een RST verstuurd als er een fout
    optreed in de verbinding..., in dit geval kan het gebruikt worden
    door een IDS (zoals ISS RealSecure) om de sessie met een een andere
    computer te beëindigen (voor Win-NT bestaat er een tool met
    dezelfde naam). 
    
 " tcpkill - kill TCP connections on a LAN
   .......
   tcpkill  kills specified in-progress TCP connections (use-
   ful for libnids-based applications which  require  a  full
   TCP 3-whs for TCB creation). "
    
    Dit is een gedeelte uit 'man tcpkill' ... 
    Zoals je kunt zien, zijn er echt omvangrijke mogelijkheden om
    te reageren op aanvallen. Het lijkt aantrekkelijk om een tegenaanval
    te starten, maar zou niet moeten worden uitgevoerd. 
     
Passieve Reactie
    
    Vergeleken met Active Response worden meestal alleen waarschuwingen
    gelogt, deze dienen gemonitord te worden door de admin/gebruiker.
    Hier zijn de opties om te reageren: 
    
    1) waarchuwingen, hints...logging 
    2) genereren van zogenoemde rapporten welke de systemen monitoren
    voor een bepaalde tijd en een account produceren. 
    
    Bijna iedere IDS is in staat om waarschuwingen te genereren of om
    indicaties te sturen naar de gebruiker/browser. Als het wordt
    geprobeerd - bijvoorbeeld - om een belangrijk systeembestand te
    wissen, specifieke services te starten (waarvan het gebruik niet
    toegestaan zou moeten zijn) ... een waarschuwing, het incident melden,
    kan gegenereerd worden, alsook wie er deel aan nam en op welke tijd.
    Ondertussen hebben steeds meer IDS'en de optie om zogenoemde rapporten
    te genereren. De status van het systeem kan gemonitord worden over
    uitgebreide perioden, activiteiten kunnen gelogd worden en een status
    rapport kan gegenereerd worden. Bijna alle IDS'en bieden de optie van
    passieve reactie. 
     
Filter
    Filters worden gebruikt om aanvallen aan de hand van hun handtekening
    te herkennen. Dit profiel is indirect gerelateerd aan de eerder
    genoemde profielen, Hier kijken we naar de typische karakteristieken
    van een aanval (zoals doel/bron poorten, bron/doel IPs
    ...) In een ander deel van deze sectie zal ik met N-code een aantal
    voorbeelden van filters voor bekende aanvallen introduceren. Aan het
    eind van het artikel is een pagina te vinden (advanced users guide
    - nfr) welke een uitleg biedt van N-code - als je er niet bekend mee
    bent. 
    land:
# Dit is een voorbeeld van hoe een land
# aanval te detecteren in N-code
 filter pptp ip () {
        if(ip.src == ip.dest)
        {
                record system.time,
                        eth.src, ip.src, eth.dst, ip.dest
                to land_recdr;
        }
 }
    Omdat er onbekende variabelen zijn gebruikt, hierbij een korte
    uitleg : 
    
      - ip.src = het bron-IP adres
- ip.dest = the doel-IP adres
- eth.src = MAC adres van de "doel-machine"
- eth.dst = MAC adress van de "bron-PCs"
- record system.time = logt het punt in tijd wanneer de
      condition ip.src == ip.dest was gevonden
    
    zoals je kunt zien, kent N-code ook de == operator, als je de
    Advanced User's Guide leest zul je ook andere overeenkomsten
    (met andere hogere talen) vinden, zo kent N-code de operators
    + , - , * ... of samengestelde operators als >=, != ....
    of zoals boven weergegeven ==. Xmas Scan (kerstboom scan): Zoals
    je je wellicht herinnerd van "Typen Aanvallen" zijn in een Xmas
    Scan alle flags gezet. Daardoor moet het aannemelijk zijn om te
    verifiëren of ze alle zijn gezet, of niet. Hiervoor moeten
    we de waarden van de individuele bits weten: 
    bits: 
 Bit                    Value
 --------------------------------------
 F-FIN                  1
 S-SYN                  2
 R-RST                  4
 P-PSH                  8
 A-ACK                  16
 U-URG                  32
---------------------------------------
    filter xmas ip() { if(tcp.hdr) { $dabyte = byte(ip.blob,13);
    if(!($dabyte ^ 63)) { record system.time,
    ip.src,tcp.sport,ip.dest, \ tcp.dport, "UAPRSF" to
    xmas_recorder; return; } } } 
    Hier komen weer een paar onbekende variabelen voor, deze zijn: 
    
      - tcp.hdr = if tcp.hdr == 0, het pakket bevat geen geldige TCP
      Header, als tcp.hdr == 1 is dit wel het geval 
- tcp.dport = TCP doel poort
- tcp.sport = TCP bron poort
- ip.blob = inhoud van de lading van een pakket (zonder header)
      
- "UAPRSF" betekend dat URG,ACK,PSH,RST,SYN en FIN zijn gezet
    $dabyte is een lokale variabele, toegewezen aan byte (ip.blob,13).
    Om de "byte expressie" uit te leggen, is hier een kleine demonstratie
    van de TCP code bits: 
| Src Port | Dest Port | Seq Number | ACK Number | HDR Length | Flags |\
URG | ACK | PSH | RST | SYN | FIN | Win Size | Chksum | Urg Off | Opt |
    We realiseren waarom 13 bytes in byte() zijn gespecificeerd, omdat
    13 bytes voldoende zijn om de flags te bevatten. Voordat we kunnen
    begrijpen hoe byte werkt, eerst een paar opmerkingen over blob.
    Als je refereert aan Hoofdstuk 3 van de Advanced User Guide, blob
    is een "serie bytes van willekeurige grootte". Een "byte" geeft
    een byte van de gespecificeerde offset van een blob, de syntax ziet
    er als volgt uit: byte (str blob_om_te_zoeken, int offset).
    Het eerste argument specificeert de blob om te doorzoeken (hierboven:
    ip.blob), het tweede argument definieert de offset (in
    'blob_om_te_doorzoeken') van de gezochte byte. Met 'if(!($dabyte
    ^ 63))' wordt gecontroleerd of alle flags zijn gezet, dit zou moeten
    resulteren in 63 als de waarden van alle flags worden opgeteld
    (32+16+8+4+2+1), als iemand het wil weten: met ^ wordt een bit voor
    bit XOR uitgevoerd. 
    
    Behalve de genoemde opties, biedt N-ocde veel omvangrijke mogelijkheden.
    Het is bijvoorbeeld mogelijk om te controleren: 
    
      - of het pakket een IP pakket is (ip.is)
- de lengte van het IP pakket (ip.len)
- het gebruikte protocol van het IP pakket (ICMP, TCP of UDP)
      (ip.protocol)
- 
      
- het controle getal van een ICMP pakket (icmp.cksum)
- de inhoud van de lading van de ICMP pakket ( in blob)
      (met icmp.blob)
- of het pakket een geldige ICMP header bevat (icmp.hdr)
- of het pakket een ICMP pakket is (icmp.is)
- het type ICMP pakket, zoals Echo Reply, Destination
      unreachable... 
- ..... enz .....
    
    Aanvullende informatie over N-code is te vinde in de
    
    Advanced User's Guide Guide
    op:http://www.cs.columbia.edu/ids/HAUNT/doc/nfr-4.0/advanced/
    advanced-htmlTOC.html 
    
    IN toekomstige versies van deze papers zullen meer filters worden
    besproken, controleer regelmatig op nieuwe versies ;)
    
     
Standaarden
    
    In deze sectie zal ik verschillende "standaarden" introduceren,
    en een aantal lijsten/overeenkomsten welke worden gedeeld door
    veel tool "experts". 
     
CVE
    CVE staat voor Common Vulnerabilities en Exposures (veel voorkomende
    zwakheden), welke niets meer is dan een lijst met zwakheden in
    beveiligingen. Op het eerste oog lijkt het misschien grappig, maar
    kan later van pas komen. Verschillende tools gebruiken verschillende
    termen voor gevonden zwakheden, door CVE te gebruiken kan een
    uniforme beschrijving verschillende zwakheden worden gegeven, welke
    voor iedereen begrijpbaar is. Daardoor is het niet langer nodig
    dezelfde tools als anderen te gebruiken. 
    
    CVE levert een naam voor een specifieke zwakheid/blootstelling en
    een uniforme (en gestandiseerde) beschrijving, en voorkomt zo
    miscommunicaties tussen gebruikers van verschillende systemen.
    CVE beschijft zwakheden (vulnerabilities) als "problemen die meestal
    worden beschouwd als zwakheden in de context van alle redelijke
    beveiligings beleiden" en exposures ("blootstellingen") als "problemen
    die alleen overtredingen zijn van bepaalde beveiligings beleiden".
    In CVE is het verschil tussen zwakheid en blootstelling fundamenteel.
    Voorbeelden van zwakheid zijn, bijvoorbeeld, phf, door iedereen
    beschrijfbare password bestanden... Voorbeelden van blootstellingen
    zijn het gebruik van programma's die kunnen worden aangevallen met
    brute kracht (brute force) of het gebruik van services die in het
    algemeen aangevallen kunnen worden. Bij definitie en met deze
    voorbeelden zou het eenvoudig moeten zijn om onderscheid te maken
    tussen zwakheden en blootstellingen (in CVE). Het fundamentele
    verschil zou kunnen zijn dat de aanvaller de mogelijkheid heeft
    om commando's uit te voeren als een andere gebruiker of om bestanden
    te lezen/schrijven zelfs al zou dit niet mogelijk moeten zijn (door
    bestands permissies). 
    In contrast, stellen blootstellingen een gebruiker in staat om
    aanvullende informatie over het syteem (en de status) te verkrijgen,
    deze activiteiten lopen in de achtergrond... Blootstellingen komen
    voort uit slechte beveiligingsinstellingen welke "gerepareerd" kunnen
    worden. Zwakheden kunnen gezien worden als gaten in de beveiliging van
    de "normale" beveiliging (welke de mogelijkheid zou moeten bieden om
    het risico van potentiële aanvallers te beperken door controle
    op permissies). Deze "lijst" zou bijgehouden moeten worden, maar niet
    iedere zwakeheid of blootstelling wordt onmiddelijk "geaccepteerd".
    Nadat een zwakheid/blootstelling is gedetecteerd ontvangt het eerst
    een "candidate number" (dit gebeurt door de CNA - Candidate Numbering
    Authority). In aansluiting zal deze worden gepubliceerd op het bord
    (door de CVE Editor) en bediscussieerd of de zwakheid/blootstelling
    geaccepteerd moet worden. Als het bord besluit om de kandidaat niet
    te accepteren (op het moment) wordt de reden hiervoor gepubliceerd
    op de website. Als de kandidaat wordt geaccepteerd, wordt hij
    toegevoegd aan de lijst (en zo officieel onderdeel van de CVE).
    Nu zou het duidelijker moeten zijn dat iedere (potentiële)
    zwakheid eerst een "kandidaat nummer" krijgt, omdat het eerst
    bediscussieerd moet worden of de kandidaat wordt geaccepteerd, of
    niet. De zwakheid krijgt het 'kandidaat nummer' om deze te
    onderscheiden van de officiële ingangen in de lijst. Iedere
    kandidaat heeft 3 basis velden (de "identificeren" hem): 
    
      - Number (nummer)
- Description (beschrijving)
- References (referenties)
    
    In deze context is het nummer de eigenlijke naam van de kandidaat,
    samengesteld uit "jaar van onstaan", een toegevoegd nummer, welke
    onthuld welke sequentiële kandidaat in een jaar het is: 
        CAN-Year - sequential candidate of the year
    
    Zoals eerder aangegeven wordt een geaccepteerde kandidaat toegevoegd
    aan de lijst. Als een resultaat wordt het 'CAN-YEAR- Candidate number',
    'CVE-Year-Candidate number'. Een voorbeeld: 'CAN-2001-0078' wordt
    'CVE-2001-0078' in de lijst. 
    
    Dat is het, voor meer informatie, zie de officiële web pagina van
    CVE. 
     
Voorbeelden
    
    In dit laatste deel worden een paar IDS'en voorgesteld. 
     
Snort
    Omdat Snort erg bekend is en veel opties biedt, zal ik deze in
    meer detail beschrijven dan de andere IDS voorbeelden.
    In principe kan Snort worden gebruikt in een van drie modi:
    Sniffer, Packet Logger en Network Intrusion Detection System.
    In Sniffer mode genereerd Snort pakketten op de console, in Packet
    Logger mode logt hij ze op de harde schijf en de Network Intrusion
    Detecion mode analyseert pakketten. Ik zal me vooral op de laatste
    modus concentreren, maar hier is een korte introductie in de
    Sniffer en Packet Logger mode: 
    In Sniffer mode kan een variëteit van pakket informatie worden
    gelezen, zoals TCP/IP pakket header: 
 [Socma]$ ./snort -v
    
    Als output krijgen we alleen de IP/TCP/ICMP/UDP header. Er is een
    groot aantal opties, een paar zullen hier besproken worden.
    
 -d = geeft de pakket data
 -e = geeft de Data Link Layer weer.
    
    Packet Logger Mode: 
    In tegenstelling tot de Sniffer mode kan de Packet Logger mode
    pakketten loggen naar de harde schijf. We hoeven alleen een
    directory toe te wijzen waarnaar Snort moet loggen en het zal
    automatisch naar Packet Logger mode gaan:
 #loggingdirectory must exist:
 [Socma]$ ./snort -dev -l ./loggingdirectory
    Met "-l" gebruikt Snort soms het adres van de remote computer
    als de directory (om logs naartoe te schrijven), soms wordt
    het lokale host adres gebruikt. Om te loggen naar het thuis
    netwerk specificeren we het thuis netwerk in de opdrachtregel:
[Socma]$ ./snort -dev -l ./loggingdirectory -h 192.168.1.0./24
    Een andere mogelijkheid is om te loggen in TCP-DUMP formaat:
 [Socma]$ ./snort -l ./loggingdirectory -b
    Nu wordt het volledige pakket gelogged, niet alleen specifieke
    secties, dit elimineert de noodzaak van verdere opties. Het is
    mogelijk om programma's als tcpdump te gebruiken om de bestanden
    te vertalen naar ASCII tekst, maar Snort kan het ook zelf:
 [Socma]$ ./snort -dv -r packettocheck.log
    Network Intrusion Detection Mode: om naar NIDS mode te gaan,
    kunnen we een commando als het volgende gebruiken:
 [Socma]$ ./snort -dev -l ./log -h 192.168.1.0/24 -c snort.conf
    In dit geval is snort.conf het configuratie bestand. Het wordt
    gebruikt om Snort te laten weten waar het zijn "regels" kan
    vinden om uit te maken of het een aanval is, of niet, of de
    vraag is toegestaan... De regels, zoals gedefinieerd in snort.conf
    zullen worden toegepast op het pakket om deze te analyseren. Als
    er geen specifieke uitvoer directory was opgegeven wordt de standaar
    /var/log/snort gebruikt. De uitvoer van snort is afhankelijk van de
    alert modus - afhankelijk hiervan is de informatie wat vroeger of
    wat later beschikbaar.
    
 ----------------------------------------------------------------
 |      Modus   |  Hoe/wat wordt weergegeven                    |
 ----------------------------------------------------------------
 | -A fast      |  Tiid, Bron en Doel IPs/poorten,              |
 |              |  het waarschuwings Bericht                    |
-----------------------------------------------------------------
 | -A full      |  Standaard instelling                         |
-----------------------------------------------------------------
 | -A unsock    |  verstuurd de Waaarschuwingen naar            |
 |              |  een UNIX socket                              |
-----------------------------------------------------------------
 | -A none      |  Stopt de Waarschuwingen                      |
-----------------------------------------------------------------
    
    Zoals we hebben gezien, kunnen we met -b loggen in binary mode,
    met -N wordt packet logging afgebroken. Maar dit is niet alles,
    zo kan Snort bijvoorbeeld berichten sturen naar syslog.
    Standaard instelling hiervoor is LOG_AUTHPRIV en LOG_ALERT. OM
    berichten naar syslog te sturen, geven we alleen "-s" op, voorbeeld
    volgt. Verder hebben we de mogelijkheid om berichten te sturen
    naar smbclient of Win-pop-up waarschuwingen naar een Windows
    computer. Om deze "feature" te gebruiken, moeten we
    "-enable-smbalerts" opgeven tijdens de configuratie van Snort.
 [Socma]$ ./snort -c snort.conf -b -M MYWINWORKSTATION
    Hierbij een voorbeeld van het gebruik van de alert modes:
 [Socma]$ ./snort -b -A fast -c snort.conf
    Behalve de beschreven opties, zijn er andere als de volgende:
 -D = start Snort in daemon mode
 -u usersnort= start Snort met UID 'usersnort'
 -g groupsnort = start Snort met GID 'groupsnort'
 -d = log ook data van de applicatie laag
    
    
    Snort biedt veel opties, als je een probleem tegenkomt, kun je
    gewoon "snort -h" gebruiken, of op de mailing lijsten kijken of
    jouw probleem elders ook is opgetreden. De volgende sectie gaat
    over Snort regels, als het je niet uitmaakt om de bestaande regels
    te begrijpen, of je eigen regels te schrijven, kun je deze sectie
    overslaan. Zoals ik aangeef aan het eind van dit deel (over snort)
    is de Snort Users Manual te vinden op www.snort.org, het is onze
    echte bron voor dit. 
    
    Snort Regels: 
    Voor een beter begrip van Snort is het belangrijk de Snort Rules
    te kennen. Snort gebruikt soms specifieke variabelen welke
    gedefinieerd kunnen worden met 'var':
   var: <name> <wert>      var
   MY_NET [192.168.1.0/24,10.1.1.0/24]
   alert tcp any any -> $MY_NET any (flags:S;msg: "SYN packet";)
    Er zijn andere manieren om de variabele naam op te geven:
$variable = definieert de Meta variable
$(variable) = hier wordt de waarde van de variabele 'variable' opgegeven
$(variable:-default) = als 'variable' niet gedefinieerd is, wordt de
waarde 'default' gegeven.
$(variable:?msg) = geeft de waarde van de variabele 'variable' of, indien
niet gedefinieerd, het bericht 'msg'.
    
    Als je al eerder met shell programmeren hebt gewerkt, zou het volgende
    niet je onbekend moeten voorkomen: 
 [Socma]$ shelltest=we
 [Socma]$ echo hello $shelltestlt
 hello
 [Socma]$ echo hello ${shelltest}lt
 hello world
    De toepassing van $(variable)in Snort en ${variable} in de shell
    is identiek. Er bestaan ook andere equivalenten (of vergelijkbare
    termen) in shell programmering:
 [Socma]$ shelltest = bash
 [Socma]$ echo ${shelltest:-nobash}
 bash
 [Socma]$ echo ${notdefined:-nobash}
 nobash
    De toepassing van de term '$(variable:-default)' verschilt alleen
    in het feit dat de shell { en } gebruikt, in plaats van ( en ).
    De laatste term bestaat ook in shell:
 [Socma]$ shelltest = bash
 [Socma]$ echo ${shelltest:?"then csh"}
 bash
 [Socma]$ echo ${notdefinedvariable:?"not defined or nil"}
 not defined or nil
    
    Het doel van deze korte excursie was om "kennis te associ&eum;ren",
    ik was in staat om me de syntax van Snort sneller te herinneren door
    in gedachten te refereren aan de termen van de shell die ik me
    herinnerde. 
    Veel opdrachtregel opties kunnen gezet worden het configuratie bestand.
    hiervoor wordt 'config' gebruikt: 
        config <aanwijzing> [: <waarde> ]
    
    De belangrijkste 'aanwijzingen' zijn: 
    alertfile = veranderd het bestand waarin de waarschuwingen worden
    opgeslagen 
    daemon = start het proces als daemon ( -D) 
    reference_net = zet het thuis network (-h) 
    logdir = zet de logging directory (-l) 
    nolog = schakel logging uit 
    set_gid = veranderd GID (-g) 
    chroot = chroot'ed in de opgegeven directory (-t) 
    set_uid = zet UID (-U) 
    
    
    Als je bijvoorbeeld het alertbestand wil wijzigen in "mylogs" kun
    je als volgt verder gaan:
        config alertfile : mylogs
    
    Terug naar de eigenlijke regels (hier een voorbeeld van deel
    van een ftp.rules bestand): 
alert tcp $EXTERNAL_NET any -> $HOME_NET 21 (msg:"FTP EXPLOIT overflow";\
flags: A+; content:"|5057 440A 2F69|";\
classtype:attempted-admin; sid:340;rev:1;)
    
    In principe bestaan Snort regels uit twee delen: de regel header
    en de regel opties. De regel header informeerd over twee dingen:
    
    
      - bron en doel IP addressen
- protocol
- de acties die ondernomen moeten worden door de regel
    In de ftp regel boven de header is het volgende deel: 
 Actie         bron ip           doel ip
    |              |                |
 alert tcp $EXTERNAL_NET any -> $HOME_NET 21
         |                |               |
        Protocol    vanaf iedere poort   Poort
    
    Zoals je kunt zien eindigt de regel header bij het eerste ( en
    beginnen de regel opties hierna. Er zijn meerdere mogelijke acties
    (in dit geval 'alert') welke kunnen worden gestart als de Snort
    regels iets verdachts opmerken: 
    
      - alert = afhankelijk van welke alert methode er wordt gebruikt
      (standaard is 'alert full'), wordt er een waarschuwing afgegeven
      en het bijbehorende pakket gelogged
- log = alleen het pakket wordt gelogt 
- pass = resultaten in het pakket worden genegeerd
- activate = genereert een alert en keert terug naar een
      andere dynamische Snort regel (zodadelijk meer hierover)
- dynamic = de regel blijft inactief tot hij wordt geactiveerd
      door een andere regel, waarna deze werkt als 'log' (zie hierboven).
      
    Het tweede veld (protocol - hier tcp) specifieceert het protocol
    om te analyseren. Mogelijkheden zijn: tcp, udp, icmp en ip (in
    de toekomst kunnen dit er meer worden ... zoals ARP, GRE).
    
    In combinatie met het volgende veld (bron ip) komen we vaak de !
    operator tegen (negatieve operator). 
 alert tcp !$EXTERNAL_NET any -> $HOME_NET 21
    
    Als resultaat van de negatieven operator wordt ieder pakket dat
    niet afkomstig is van $EXTERNAL_NET gelogd. Er zijn meer
    mogelijkheden om een aantal IP adressen op te geven, zoals een
    lijst van IP adressen. De adressen worden gescheiden door een
    komma en ingesloten door [ ]. 
        alert tcp ![ip address,ip address] any -> ....
    
    Een ander alternatief is het gebruik van "any", dat ieder IP
    adres bevat. 
        log tcp any any -> ...
    
    Het laatste deel van de regel header is de specificatie van de
    poorten, in ons voorbeeld ftp. Het is niet alleen mogelijk een
    specifieke poort te monitoren, maar ook een specifiek bereik
    (meerdere poorten). Hier zijn de opties: 
 :portnumber                     -> alle poorten kleiner of gelijk
				 aan portnumber
 portnumber:                     -> alle poorten groter of gelijk
                                 aan portnumber
 fromportnumber:toportnumber     -> alle poorten tussen fromportnumber
                                 en toportnumber
    Natuurlijk is het mogelijk om de negatieve operator te gebruiken,
    met de consequentie dat alle poorten worden gemonitord behalve de
    opgegeven, bijvoorbeeld .
       !:21            -> alle poorten dien niet kleiner dan of gelijk
                             aan 21
    Iets dat nog niet uitgelegd is maar al wel de hele tijd gebruikt is
    de richting (direction) operator "->".
                "bron" -> "doel"
    Echter, er is een andere variant <> :
                 "bron" <> "doel"
    Dit betekend dat Snort ook de bron zal doorzoeken als het doel
    voor het adres. 
    Zoals ik al noemde, is er de stap 'activate', deze genereerd een
    alert en geeft een dynamische Snort regel. 
    Als een specifieke regel zijn acties compleet heeft kan deze een
    andere regel activeren. In principe is het verschil tussen normale
    regels en "geactiveerde" regels het feit dat alleen een specifiek
    veld geactiveert moet worden: "activates". Dynamische regels, echter
    werken als logs (zie boven), verschil: "activate by" moet worden
    opgegeven. Een ander veld moet worden opgegeven: "count". Nadat
    "activate rule" zijn werk heeft gedaan, wordt de dynamische regel
    geactiveerd, maar alleen voor "count" pakketten (oftewel, 40 pakketten
    als count = 40). 
activate tcp !$HOME_NET any -> $HOME_NET 143 (flags : PA;  \
  content : "|E8C0FFFFFF|\bin|;activates : 1; msg : "IMAP buf!";)
dynamic tcp !$HOME_NET any -> $HOME_NET 143 (activated_by : 1; \
  count : 50;)
    
    Sommige van de opties, zoals de regel opties, zijn nog niet
    geïntroduceerd, deze zal ik nu uitleggen, maar deze zullen
    later duidelijker worden. Merk de velden activates en
    activated_by op in ons voorbeeld hierboven. De eerste
    regel roept een dynamische regel aan nadat de eerste regels zijn
    werk heeft voltooid, dit wordt ook aangegeven door het statement
    activated_by = 1 van de dynamische regel. 
    
    Nu het tweede deel van de Snort regels: de regel opties.
    Laten we weer de eerste ftp.rule nemen: 
    
alert tcp $EXTERNAL_NET any -> $HOME_NET 21 (msg:"FTP EXPLOIT
overflow"; flags: A+;\
content:"|5057 440A 2F69|";classtype:attempted-admin;\
sid:340; rev:1;)
    
    
    De eerste regel optie in dit geval (de regel header stopt bij
    de eerste "): 
    
 (msg:"FTP EXPLOIT overflow";\
flags: A+; content:"|5057 440A 2F69|";\
classtype:attempted-admin; sid:340; rev:1;)
    
    
    Er zijn 34 sleutel woorden, ik zal mijn uitleg beperken tot de
    belangrijkste en/of meest voorkomende. Voor een overzicht van
    alle mogelijke sleutelwoorden, zie de Snort Users Manual.
    
    msg - geeft de alarm berichten en logt ze in de Packet Logger Mode 
    logto - logt de pakketten in een specifiek bestand 
    dsize - vergelijkt de pakket grootte met een specifieke waarde v
    flags - controleert de TCP flags voor specifieke waarden 
    content - zoek naar een specifiek patroon/string in een pakket 
    content-list - zoek naar een specifiek patroon/string in een pakket 
    nocase - maakt geen onderscheid tussen grote en kleine letters in
    gezochte strings 
    react - actieve reactie (blokkeert websites) 
    sid - Snort regel id 
    classtype - sorteert de potentiële aanvallen in groepen 
    priority - zet de gevoeligheid 
    Ok, maar hoe werken de individuele regels? msg:
    
    We komen regelmatig 'msg' tegen als we de regels doorlezen, deze
    optie is verantwoordelijk voor het genereren van alarmen en de
    logging er van. 
   msg:"<text>";
    t "<text>" is het bericht dat wordt geschreven/weergegeven in
    alertfile 
    logto: 
    Ieder pakket, waarvoor de regel van toepassing is, wordt gelogged
    in een specifiek bestand.
    logto: "<filename>";
    In dit geval is "<filename>" het bestand waar de bestanden
    zullen zullen worden gelogged. 
    dsize: 
    Dit wordt gebruikt om de grootte van een pakket aan te geven.
    Als we de grootte van de buffer van een bepaalde service kennen
    kan deze optie gebruikt worden om te beschermen tegen een mogelijke
    buffer overflow. Vergeleken met 'content' is het iets sneller, en
    daardoor meer gebruikt om te testen op buffer overflows.
        dsize: [>|<] <size>;
    De twee optionele operators > en < geven aan dat de pakket
    grootte groter resp kleiner zou moeten zijn dan de opgegeven
    grootte: 
    Dit controleert welke flags zijn gezet.  Op moment zijn er 9 flags
    beschikbaar in Snort:
 F      FIN
 S      SYN
 R      RST
 P      PSH
 A      ACK
 U      URG
 2      Bit 2 assigned
 1      Bit 1 assigned
 0      no TCP flags set
    
    Er zijn additionele logische operators om criteria op te geven
    voor het testen van flags 
 + ALL flag     = Sla toe bij alle opgegeven flags (ook anderen).
 * ANY flag     = Sla toe bij alle opgegeven flags.
 ! NOT flag     = Sla toe als de opgegeven flags niet zijn gezet.
    
    Meestal wordt het sleutelwoord 'flags' op deze manier gebruikt:
    
        flags: <Flag waarde>;
    
    De gereserveerde bits kunnen gebruikt worden om ongebruikelijk
    gedrag te detecteren, bijvoorbeeld pogingen om de vingerafdrukken
    van de IP stack te achterhalen. 
    content: 
    Een van de meest gebruikte sleutelwoorden (behalve 'msg') is
    'content'. Het kan gebruikt worden om de lading van pakketten voor
    te doorzoeken op bepaalde inhoud. Als de opgegeven inhoud wordt
    aangetroffen, worden voorgedefinieerde stappen ondernomen tegen
    de gebruiker. Na de detectie van de inhoud in de lading van een
    pakket, zal de de rest van de Snort regels worden uitgevoerd.
    Zonder 'nocase' toe te passen, zal er onderscheid worden gemaakt
    tussen hoofd- en kleine letters. De inhoud van de lading zal
    doorzocht worden op binaries en tekst. Binaire data komt tussen
    | | en wordt weergegeven als byte code. De byte code geeft binaire
    informatie weer in de vorm van hexadecimale nummers. De negatieve
    operator (!) kan in deze context worden gebruikt, zo kunnen we
    bijvoorbeerbeeld een alarm starten als een pakket een bepaalde
    tekst bevat. 
        content: [!] "<content>";
    
    Het gebruik van ! is niet verplicht 
 alert tcp any any -> 192.168.1.0/24 143 \
(content: "|90C8 C0FF FFFF|/bin/sh";\
msg: "IMAP buffer overflow";)
    
    Zoals gedemonstreerd in deze regel, is de binaire data opgenomen
    tussen ||, hiermee kan ook normale tekst worden gebruikt. Zie
    ook de beschrijvingen van 'offset' en 'depth' in de Snort User
    Manual, deze worden vaak gebruikt in context met 'context'.
    
    
    content-list: 
    
    Dit sleutelwoord werkt vergelijkbaar met 'content', met het verschil
    dat er een aantal strings, om de pakketten op te doorzoeken, kunnen
    worden opgegeven in een bestand. Dit bestand, met de woorden waarnaar
    gezocht wordt, wordt gespecificeerd met 'content list'. Hiermee moet
    je in gedachten houden dat de strings verticaal worden uitgelijnd
    (iedere string op een eigen regel), bijvoorbeeld 
    
        "kinderporno"
        "warez"
        .....
    
    In aansluiting, kunnen we - met behulp van ' content-list:
    [!] "<bestand>" ' dit bestand doorzoeken. Natuurlijk
    is de ! optioneel, het heeft hetzelfde effect als in 'content'...
    
    nocase: 
    Deze regel speelt een belangrijke rol in context met 'content'
    sleutelwoorden. Normaal gesproken worden hoofdletters gerespecteerd,
    met behulp van 'nocase' wordt het onderscheid genegeerd:
    
 alert tcp any any -> 192.168.1.0/24 21 (content: "USER root";\
  nocase; msg: "FTP root user access attempt";)
    
    
    Zonder het gebruik van 'nocase' zou alleen gezocht worden naar
    'USER root', maar daar 'nocase' was aangegeven, wordt er geen
    onderscheid gemaakt tussen hoofd- en kleine letters. 
    Als het doorzoeken van een pakket op specifieke content (met
    'content' of 'content_list') resulteerd in een hit, kan 'react'
    gebruikt worden voor de reactie. Zo kunnen bijvoorbeeld bepaalde
    pagina's, opgevraagd door de gebruiker, geblokkeerd worden (porno
    pagina's...). Door Flex Resp toe te passen kunnen verbindingen
    afgebroken worden of waarschuwingen verstuurd naar de browser. De
    volgende opties zijn mogelijk/legaal:
    
    block - verbreekt de verbinding en stuurt een waarschuwing. 
    warn - stuurt een zichtbare waarschuwing (binnenkort beschikbaar) 
    Deze 'basis argumenten' kunnen compleet gemaakt worden met additionele
    argumenten (zogenoemde 'additionele modifiers'): 
    
    msg - de text die verstuurt moet worden naar de gebruiker, als 'msg'
    wordt gebruikt. 
    proxy : <portnummer> - de proxy wordt gebruikt om de notificatie
    te sturen (binnekort beschikbaar)
        react : <basic argument [, additional modifier ]>;
    
    Het 'react' sleutelwoord wordt toegevoegd aan het eind van de regel
    opties, en kan als volgt gebruikt worden: 
 alert tcp any any <> 192.168.1.0/24 80 (content-list: "adults"; \
   msg: "This page is not for children !"; react: block, msg;)
    sid: 
    'sid' of Snort rules IDentification wordt gebruikt om 'speciale' Snort
    regels te identificeren. Dit maakt het mogelijk/legaal voor "uitvoer
    plugins" om iedere regel te identificeren. Er zijn een aantal sid groepen:
 < 100 = gereserveerd voor toekomstig gebruik
 100-1 000 000 = regels die met Snort komen
 > 1 000 000 = gebruikt voor lokale regels
 sid-msg.map bevat een mapping van msg tags voor sid's.
Het wordt gebruikt voor post processing om een waarschuwing toe te
wijzen aan een id.
 sid:  <snort rules id>;
 alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS 80  \
  (msg: "WEB-IIS file permission canonicalization"; uricontent:\
  "/scripts"..%c1%9c../"; flags: A+;nocase;sid: 983;rev:1;)
    classtype: 
    Met 'classtype' kunnen we aanvallen in verschillende groepen
    onderbrengen. In de regels kunen we de prioriteit van een potentiële
    aanval vaststellen, alsook in welke groep hij thuishoort. Regels die een
    categorie hebben toegewezen gekregen in het configuratie bestand zullen
    automatisch een standaard prioriteit krijgen toegewezen. 
    
 classtype: <class name>;
    
    Categoriëen van regels worden gedefinieerd in classifcation.config.
    De volgende syntax wordt gebruikt: 
 config classificatie: <class naam>,<class beschrijving>,\
       <standaard prioriteit>
    
    In de volgende paragraaf - de beschijving van 'priority' zullen we
    bekijken welke aanvals groepen er zijn. 
    In the following paragraph - the description of 'priority' - we
    will learn what kind of groups of attacks there are. 
    priority: 
    Dit sleutelwoord wordt gebruikt om "beveiligings prioriteiten" aan
    onze regels toe te wijzen, om aan te geven hoeveel schade een
    potentiëe aanval zou kunnen aanrichten. Hoe hoger de prioriteit
    hoe hoger het beveilings risisco. In vergelijking met de eerder
    uitgelegde 'class types', zijn de prioriteiten makkelijker te
    begrijpen: 
Class type                    Omschrijving                Prioriteit
---------------------------------------------------------------------
 not-suspicious               Alle "niet-verdachte" verkeer        0
 unknown                      onbekend verkeer                     1
 bad-unknown                  Potentiëel "slecht" verkeer     2
 attempted-recon              Poging tot Informatie Lek            3
 successful-recon-limited     Informatie Lek                       4
 successful-recon-largescale  Grootschalig Informatie Lek          5
 attempted-dos                Poging tot DoS-aanval                6
 successful-dos               Succesvolle DoS-aanval               7
 attempted-user               Poging om user privileges te krijgen 8
 unsuccessful-user            Onsuccesvolle poging om user 	   9
                              privileges te krijgen
 successful-user              Successvolle poging om user
                                     privileges te krijgen
 attempted-admin              Poging om admin privileges te krijgen 10
 successful-admin            Succesvolle poging tot admin privileges
    
    Zoals eerder genoemd, representeren hogere prioriteiten hogere
    risico's. Een gebruiker die admin privileges krijgt zou de meest
    serieuze aanval zijn. 
 alert tcp any any -> any 80 (msg: "WEB-MISC phf Versuch";\
        flags: A+;content: "/cgi-bin/bash";priority:10;)
    
    Het onderwerp van 'regels' is -toegegeven- complex maar niet zo
    heel erg moeilijk. Bestuur een paar regels, lees de manual waar
    ze voor zijn en naar een tijdje zal het 'regel monster' duidelijk
    worden ;)
    Bronnen voor Snort en documentatie zijn te vinden op
    http://www.snort.org. Hier zijn een aantal waardevolle .pdf's te
    vinden, zoals de Snort USer Manual, welke de belangrijkste bron
    is voor deze beschrijving.
     
LIDS
    
    Sinds Stealth's paper (en bronnen) en de LIDS-Hacking-HOWTO weten
    we dat LIDS de beveiliging de beveiliging van een computer niet
    echt bevorderd, maar in sommige gevallen eerder een root kit is ;)
    
 
    Laten we eens kijken naar het concept en dan naar de (denkbeeldige)
    kracht en zwakheid van LIDS. Het was ontwikkeld om - bijvoorbeeld -
    belangrijke systeem bestanden te beschermen en bepaalde processen
    te verbergen voor de gebruiker. In aanvulling, het zou niet moeten
    toestaan om modules toe te voegen, de nodige modules worden geladen
    tijdens het starten van het systeem. Eerder noemde ik al de
    LIDS-Hacking-HOWTO en Stealth's paper, welke beide de werking en
    zwakheden van LIDS bespreken, ik zal mezelf beperken tot de
    belangrijkste features. Aan het einde van deze sectie zul je links
    aantreffen aar beide teksten. 
    
    De belangrijkste taak van LIDS is het beschermen van het bestandssysteem.
    Om in staat te zijn belangrijke bestanden/directories te beschermen
    worden deze gesorteerd in groepen: 
    
    
      - Read Only = Dit bestand/directory heeft alleen lees toegang,
      veranderingen zijn niet toegestaan 
- Append Only = Het is alleen toegestaan om inhoud "toe te voegen"
      aan het bestand 
- Exception = Deze bestanden worden niet beschermd
- Protect (un)mounting = Staat iemand toe (of niet) om een
      bestandssysteem te (un)mounten
    Voor "echte" bescherming worden sommige system calls gemanipuleerd
    om zeker te weten dat de beschermingen worden volgehouden (bijvoorbeeld
    sys_open(), sys_mknod(), ...)
    Verder, voorkomt LIDS dat specifieke processen gestopt (of zichtbaar)
    kunnen worden. Doel van de procedure is om te voorkomen dat de
    aanvaller specfieke processen ziet die hem zouden kunnen monitoren.
    Een 'ps -ax' call zou ook niet onze processen moeten weergeven. Om
    een proces waarlijk te verbergen, wordt het gemarkeerd als 'PF_HIDDEN'.
    In het geval dat ps werkt om informatie te geven over de processen
    zal dit verhinderd worden doordat de processen zijn gemarkeert als
    'PF_HIDDEN'. Dit op zich is niet voldoende om een proces veilig te
    verbergen omdat het nog steeds een entry heeft in het /proc
    bestandssysteem. LIDS is in staat om die functie te manipuleren om
    te voorkomen dat het proces opduikt in de /proc directory. Behalve
    dit is het mogelijk om de privileges van een proces te beperken.
    Als, bijvoorbeeld CAP_CROOT is gezet op 0, zal het proces geweigerd
    worden gebruikt te maken van chroot (zie
    /usr/src/linux/include/linux/capatibilites.h). 
    In aansluiting heeft LIDS de mogelijkheid om te draaien in een of
    twee beveiligings opties: 'security' of 'none_securtity'. De globale
    variabele 'lids_load' wordt hiervoor gebruikt. De standaard waarde
    is '1', dit betekend dat LIDS draait in 'security' mode - De restricties
    zijn dus ingeschakeld. Als 'security=0' is gezet tijdens de start
    (LILO prompt) wordt 'none_security' geactiveerd. Als een resultaat
    worden alle beveiligings controles, restricties ... gedeactiveerd.
    Met 'lids_load=0' functioneerd de computer alsof LIDS niet was
    geïnstalleerd. Een andere mogelijkheid is om de beveiligings
    optie te veranderen is het programma 'lidsadm -S' online, hiervoor
    dient een wachtwoord opgegeven te worden. 
    
    LIDS biedt ok de mogelijkheid om firewall regels te beschermen, dit
    kan door CONFIG_LIDS_ALLOW_CHANGE_ROUTES te activeren en CAP_NET_ADMIN
    uit te schakelen. Als iemand de firewall regels wil veranderen,
    dient CAP_NET_ADMIN geactiveerd te worden om te voorkomen dat iedereen
    de regels kan veranderen. Ook kan deze Sniffer worden uitgeschakeld
    en een poort scanner kan geïntegreerd worden in de kernel ... 
    kernel. . 
    
    
    LIDS biedt ook verschillende "respons opties" (zie sectie over
    respons), bijvoorbeeld om waarschuwingen te sturen via pager of
    SMS naar de beheerder. 
    
    Er zijn vele opties, Stealth legt dit uit in zijn paper over het
    misbruiken van LIDS:
    http://www.securitybugware.org/Linux/4997.html. De LIDS Howto
    kan gevonden worden op:
    http://www.lids.org/lids-howto/lids-hacking-howto.html. 
    
     
COLOID
    
    COLOID is het acronym voor Collection of LKMs for Intrusion
    Detection, en is een tijdje geleden door mij opgestart. 
    Toen het duidelijk werd dat delen van het project niet goed
    werkten en niet up-to-date waren, is het project tijdelijk
    gestopt. Echter, ik zou graag nog even uitweiden over de
    oorspronkelijke plannen: Met de eerste module (prev_exec) wilden
    we - onder meer - tijdelijk de uitvoering van bepaalde binaries
    blokkeren (in mijn sourcecode gebruikte ik de GNU compiler GCC),
    op specifieke tijden. Het is gedefinieerd in de source wanneer
    een uitvoeren verboden zou moeten zijn. - de tijd kan tot op de
    minuut worden aangegeven. Als een gebruiker probeert in die tijd
    GCC te starten, zal dit worden geblokkeerd, GCC wordt niet gestart.
    Zou een gebruiker GCC op een "toegestane" tijd starten, zullen de
    argumenten worden gecontroleerd en een zoektocht naar .c bestanden
    vindt plaats. Het doel van deze procedure is het doorzoeken van de
    source (iemand wil compileren) op "gevaarlijke functies". Defaults
    waren 'scanf' en 'strcpy' ... enz. Het is mogelijk om meer
    functies toe te voegen. Zoals ik eerder aangaf, doorzoekt LKM de
    source en als het een of meer van de functies aantreft, wordt de
    uitvoering van GCC geblokkeerd. Aansluitend wordt er een entry
    in een log bestand weggeschreven en een 'biep' gegenereerd.
    
 
 
    Tot zo ver werkte de module, maar het concept was niet algemeen
    genoeg en kon eenvoudig omzeilt worden. 
    
    De tweede module was 'anom_detection' welke de Anomaly Detection
    gebruikt die eerder genoemd is. Eigenlijk behoren deze twee LKMs
    tot deze sectie: 
    1) Anomaly_Detection.c welke de database genereerd van normale
    gebruikers activiteiten 
    en 
    2) Misuse_Detect.c welke het gedrag van de gebruiker controleerd
    (door de database als benchmark te gebruiken) op afwijkingen ten
    op zichte van het normale gedrag (gelogged in de database). 
    
    Het plan was om LKM de volgende criteria te laten controleren: 
    
    Hoe vaak voerde de gebruiker de volgende commando's uit:
    
      - su
- login
- chmod
- chown
- insmod
- ps
- lsmod
- rm
- last
- lastlog
- ftp
    
    Wanneer voerde de gebruiker de volgende commando's uit: 
    
    
    Of wanneer heeft de gebruiker de PC normaal gestart en wanneer
    begon hij een shutdown 
    Overig: 
    Hoe vaak (probeerde) hij de volgende bestanden te openen: 
    
      - /etc/passwd
- /etc/group
- /etc/shadow
- /etc/ftpusers
- /etc/ftpgroups
- /etc/ftpaccess
- /etc/hosts.allow
- /etc/hosts.deny
- /etc/inetd.conf
- .....
    
     Hoe vaak voerde hij programma's uit met de SUID bit set? 
    We moeten goed opletten welke bestanden we monitoren (hoe vaak
    opende hij ze). Als we teveel bestanden kiezen, kost dit te veel
    performance, normaal werk is dan nauwelijks nog mogelijk. 
    
    Er bestonden andere, kleinere LKMs zonder complete source, de
    source of de twee bovengenoemde modules is beschikbaar op mijn
    web pagina, mogelijk wil iemand hier iets mee doen .... 
    
    
     
Ter afsluiting
    Zou iemand nog meer ideeën hebben over de inhoud van deze
    paper, ik ben bereikbaar op: Socma(Q)gmx.net . Voor verdere
    stimulatie, lofbetuigingen, kritiek... stuur me een email 
    Referenties (behalve degene genoemd in de tekst):
    
      - http://online.securityfocus.com/infocus/1524
- http://online.securityfocus.com/infocus/1534
- http://online.securityfocus.com/infocus/1544
- http://online.securityfocus.com/infocus/1232
- 
      http://www.entercept.com/products/entercept/whitepapers/downloads/systemcall.pdf
- 
      http://www.computec.ch/dokumente/intrusion_detection/
      angriffsmoeglichkeiten_auf_okenas_stormwatch/
      angriffsmoeglichkeiten_auf_okenas_stormwatch.doc
Talkback voor dit artikel
Elk artikel heeft zijn eigen talkback pagina. Daar kan je commentaar geven of commentaar van anderen lezen:
<--, Terug naar de titelpagina van dit nummer 
2004-03-03, generated by lfparser version 2.43