Detektering av typ av operativsystem med hjälp av TCP/IP stackens fingeravtryck
       av Fyodor <fyodor@insecure.org> (insecure.org)
                      Skapad:  8 juni, 2001
                      Senast ändrad: 8 juni, 2001


Detta dokument får distribueras fritt. Senaste kopian är alltid
tillgänglig på http://nmap.org/nmap-fingerprinting-article.html


SAMMANFATTNING

Detta dokument beskriver hur man får tag i värdefull information om ett 
system genom att undersöka dess TCP/IP stack. Först kommer jag att presentera 
några av de "klassiska" metoderna för att avgöra systemets OS. Dessa metoder 
använder sig inte av stackens fingeravtryck. Sen beskriver jag de nuvarande 
"state of the art" verktygen för stack fingeravtryck. Sedan kommer en beskrivn-
ing av många av de olika tekniker som får fjärrsystemet att läcka information 
om sig själv. Slutligen ger jag en detaljerad beskrivning av hur jag har imple-
menterat det i nmap. Detta följs av olika ögonblicksbilder som visar vilka ope-
rativsystem som körs på flera populära Internet siter.


ORSAKER

Jag tror att det är ganska uppenbart varför det är intressant att avgöra vilket OS
som ett system kör, så därför kommer jag hålla detta avsnitt kort. En av de starkaste
anledningarna är att många säkerhetshål är beroende av OS version. Låt oss säga att
du gör ett penetreringstest och finner att port 53 är öppen. Om det är en sårbar
version av Bind, så kommer du bara att få en chans att exploatera den för att ett
felaktigt försök kommer att krascha demonen. Med en bra fingeravtrycksprogramvara för
TCP/IP kan du snabbt ta reda på om maskinen kör 'Solaris 2.51' eller 'Linux 2.0.35'
och anpassa din kod därefter.

En annan värre möjlighet är att någon scannar 500,000 system i förväg för att se vilka
OS som körs och vilka portar som är öppna. När sedan någon gör ett inlägg (säger) att
det finns ett root-hål i Suns comsat demon, så kan den lille crackers söka igenom sin
lista efter 'UDP/512' och 'Solaris 2.6' och genast får han sida efter sida fylld med 
maskiner som han kan bli root på. Värt att notera är att detta beteende hör till
SCRIPT KIDDIES. Du har inte demonstrerat någon färdighet och ingen kommer att vara
det minsta imponerad av att du har lyckats hitta någon sårbar .edu som inte lyckades
patcha hålet i tid. Människor kommer bli än mindre imponerade om du använder din
nyfunna kunskap till att sänka avdelningens webb-server samtidigt som du med ditt 
självcentrerade skryt berättar om hur duktig du är och hur dumma systemadministratörerna
måste vara.

Ett annan möjligt användningsområde är social engineering. Låt oss säga att du scannar
företaget som är ditt mål och nmap rapporterar om en 'Datavoice TxPORT PRISM 3000 T1 
CSU/DSU 6.22/2.06'. Hackern kan nu ringa upp och utge sig för att vara från 'Datavoice support'
och berätta om vissa problem med deras PRISM 3000. "Vi kommer att berätta om ett
säkerhetshål snart, men först vill vi att alla våra nuvarande kunder installerar patchen --
Jag skickade precis den till dig..." Vissa naiva administratörer kommer kanske att tro
att endast en behörig tekniker från Datavoice kan känna till så mycket om deras CSU/DSU.

Ett annat användningsområde är att göra en utvärdering av de företag som du ska göra affärer
med. Innan du väljer en ny ISP, scanna dem och se vilken typ av utrustning de använder.
De där "1000 kr/år" affärerna kanske inte låter lika bra när du ser att de använder sig
av skräp-routrar och kör PPP-tjänster på ett gäng Windows burkar.

KLASSISKA TEKNIKER

Stack fingeravtryck löser problemet med OS identifiering på ett unikt sätt. Jag tycker att
denna teknik är mest lovande, men det finns för närvarande många andra lösningar. Trist nog
är detta fortfarande en av de mest effektiva metoderna:

playground~> telnet hpux.u-aizu.ac.jp
Trying 163.143.103.12 ...
Connected to hpux.u-aizu.ac.jp.
Escape character is '^]'.

HP-UX hpux B.10.01 A 9000/715 (ttyp2)

login:

Det finns ingen mening med att gå igenom allt besvär som det innebär med fingervatryck om
maskinen ändå annonserar ut till världen exakt vad den kör! Tråkigt nog är det fortfarande
många tillverkare som skeppar sina nya system med dessa typer av meddelanden och många admini-
stratörer stänger heller aldrig av dem. Bara för att det finns andra metoder för att avgöra
vilket OS som körs (såsom fingeravtryck) behöver det inte betyda att vi ska basunera ut vårt
OS och vår arkitektur till varje tönt som försöker koppla upp sig.

Problemet med att förlita sig på den här tekniken är att många väljer att stänga av sina
inloggningsmeddelanden, många system ger inte ut så mycket information och det är ganska lätt
för folk att "ljuga" i sina inloggningsmeddelanden. Hur som helst, läsning av inloggnings-
meddelanden för att ta reda på OS och OS version är allt du får om du spenderar tusentals 
dollar på den kommersiella scannern ISS. Ladda ner nmap och queso istället och spara dina 
pengar :).

Även om du slår inloggningsmeddelandet, så kommer fortfarande många applikationer att
gladeligen lämna ifrån sig den typen av information när den efterfrågas. Vi kan till exempel
ta oss en titt på en FTP server:

payfonez> telnet ftp.netscape.com 21
Trying 207.200.74.26 ...
Connected to ftp.netscape.com.
Escape character is '^]'.
220 ftp29 FTP server (UNIX(r) System V Release 4.0) ready.
SYST
215 UNIX Type: L8 Version: SUNOS

Först ger den oss detaljerad systeminformation i sitt inloggningsmeddelande. Sedan använder 
vi kommandot 'SYST' och den ger oss gladeligen ännu mer information.

Om anonym FTP tillåts, så kan vi ofta ladda ner /bin/ls eller andra binärer och avgöra vilken
arkitektur de skapades för.

Många andra applikationer är också givmilda med information. Ta webb-servrar till exempel:

playground> echo 'GET / HTTP/1.0\n' | nc hotbot.com 80 | egrep '^Server:' 
Server: Microsoft-IIS/4.0
playground>

Hmmm ... Undrar vilket OS de där töntarna kör.

Andra klassiska metoder inkluderar DNS system info poster (sällan effektivt) och social
engineering. Om maskinen lyssnar på 161/udp (snmp), så är du nästan garanterad en mängd
detaljerad information om du använder 'snmpwalk' från CMU SNMP tools distributionen och 
'public' som community name.

NUVARANDE FINGERAVTRYCKSPROGRAM

Nmap är inte det första OS igenkänningsprogrammet som använder TCP/IP fingeravtryck.
Den vanliga IRC spoofern sirc av Johan har inkluderat en väldigt rudimentär fingeravtrycks-
teknik sen version 3 (eller tidigare). Den försöker placera ett system i någon av klasserna
"Linux", "4.4BSD", "Win95", eller "Unknown" genom att använda sig några simpla TCP flaggtest.

Ett annat sådant program är checkos, som släpptes i januari detta år av Shok i Confidence 
Remains High Issue #7. Teknikerna för fingeravtryck är exakt de samma som för SIRC och koden
är till och med identisk på många ställen. Checkos användes länge enbart privat innan den 
släpptes fri, så jag har inte en aning om vem som stal kod från vem. Men ingen verkar berömma
den andre. En sak som checkos lägger till är kontroll av telnets inloggningsmeddelande, som
är fullt användbart men har de problem som beskrevs tidigare. [ Uppdatering: Shok skrev att
checkos aldrig var tänkt att släppas fritt och det var anledningen till att han inte tackade
SIRC för delar av koden. ]

Su1d skrev också ett OS kontroll program. Hans heter SS och kan i version 3.11 identifiera
12 olika typer av OS. Jag är lite partisk till detta på grund av att han tackar mitt nmap
program för delar av nätverkskoden :).

Slutligen har vi queso. Detta program är det nyaste och det är ett stort kliv framåt jämfört
med de andra programmen. De introducerar inte bara några nya tester, men de var också först
(vad jag har sett) med att flytta OS fingeravtrycken utanför koden. De andra scannrarna
innehöll kod som kunde se ut så här:

/* from ss */
if ((flagsfour & TH_RST) && (flagsfour & TH_ACK) && (winfour == 0) && 
        (flagsthree & TH_ACK))
                  reportos(argv[2],argv[3],"Livingston Portmaster ComOS");

Istället flyttar queso detta till en konfigurationsfil som givetvis medför bättre skalning
och gör det lika lätt att addera ett OS som det är att skriva in några rader i filen för
fingeravtryck.

Queso skrevs av Savage, en av bra människorna vid Apostols.org .

Ett problem med samtliga tidigare nämnda program är de är väldigt begränsade i antalet 
kontroller av fingeravtryck. Detta medför att finkornigheten i svaren begränsas. Jag vill
veta mer än bara att 'den här maskinen är OpenBSD, FreeBSD, eller NetBSD', jag vill veta
exakt vilken av dessa det är och dessutom få tips om vilken version det kan vara. På samma 
sätt vill jag hellre se 'Solaris 2.6' än bara 'Solaris'. För att erhålla denna finkornighet
i svaren använder jag mig av ett antal tekniker för fingeravtryck, som beskrivs i nästa
avsnitt.

METODOLOGI FÖR FINGERAVTRYCK

Det finns många olika tekniker som kan användas för hitta fingeravtryck för nätverksstackar.
Det börjar alltid med att du tittar på vilka skillnader som finns mellan olika operativsystem
och skriver en programsnutt som letar efter denna skillnad. Om du kombinerar tillräckligt
många sådana, så kan du begränsa svaret innehållande OS väldigt hårt. Nmap kan till exempel
med säkerhet skilja på Solaris 2.4 och Solaris 2.5-2.51 och Solaris 2.6. Det kan också skilja
på Linux kärna 2.0.30 från 2.0.31-34 eller 2.0.35. Här är några tekniker:


FIN probe -- Här skickar vi ett FIN paket (eller vilket paket som helst utan att sätta ACK 
             eller SYN flaggan) till en öppen port och väntar på ett svar. Korrekta sättet
             enligt RFC793 är att INTE svara, men många trasiga implementationer som till
             exempel MS Windows, BSDI, CISCO, HP/UX, MVS, och IRIX skickar tillbaka en RESET.
             De flesta nuvarande verktyg använder sig av den här tekniken.

BOGUS flag probe -- Queso är den första scanner jag har sett använda detta smarta test. 
                    Idén är att sätta en odefinierad TCP "flagga" (64 eller 128) i huvudet
                    för TCP på ett SYN paket. Linux maskiner före 2.0.35 behåller flaggan
                    satt i sina svar. Jag har inte lyckats hitta något annat OS som har detta
                    fel. Vissa operativsystem verkar dock vilja skicka reset för uppkopplingen
                    när de får ett SYN+BOGUS paket. Detta beteende kan vara användbart när
                    man ska identifiera dem.

TCP ISN Prover -- Idén bakom den här är att försöka hitta mönster i det initiala sekvensnumret
                  som väljs av TCP implementationen när de svarar på ett uppkopplingsförsök.
                  Dessa kan kategoriseras i många grupper som till exempel den traditionella
                  64K (många gamla UNIX-burkar), Slumpmässiga ökningar (Nyare versioner av
                  Solaris, IRIX, FreeBSD, Digital UNIX, Cray, och många andra), äkta
                  "slumpmässighet" (Linux 2.0.*, OpenVMS, nyare AIX, etc). Windows burkar
                  använder sig av en "tidsberoende" modell där ISN ökas med ett litet fast
                  tal varje tidsperiod. Det är väl överflödigt att påpeka att detta är lika
                  lätt att lista ut som det gamla 64K beteendet. Sen har vi givetvis min 
                  favorit "konstant". Maskinen använder alltid samma ISN :). Jag har sett 
                  detta på vissa 3Com hubbar (de använder 0x803) och Apple Laserwriter
                  skrivare (de använder 0xC7001).

                  Du kan också göra subklasser av grupper såsom slumpmässiga ökningar genom 
                  att räkna ut variationer, största gemensamma nämnare, och andra funktioner
                  på de olika sekvensnumren och skillnaderna mellan dessa nummer.

                  Det bör noteras att ISN genereringen har viktiga säkerhetsaspekter. För mer
                  information om detta, kontakta "säkerhetsexperten" Tsutomu "Shimmy" Shimomura 
                  vid SDSC och fråga honom hur han utnyttjades. Nmap är det första programmet
                  jag har sett som använder detta för OS identifiering.

Don't Fragment bit -- Många operativsystem har börjat sätta IP biten "Ingen fragmentering" på
                      vissa paket som sänds. Detta ger diverse förbättringar i prestanda (även
                      om det också kan vara enerverande -- det är därför nmaps fragmenterings-
                      scanningar inte fungerar från Solaris burkar). Hur som helst, det är inte 
                      alla OS som gör det och vissa gör det i olika fall, så genom att studera
                      detta kan vi komma åt ytterligare information om målets OS. Jag har inte 
                      sett detta anändas tidigare heller.
 
TCP initial window -- Detta innebär helt enkelt att vi tittar på fönsterstorlek på returnerade
                      paket. äldre scanners använde helt enkelt icke-noll fönster på ett RST
                      paket till att betyda "BSD 4.4 derivering". Nyare scanners som till
                      exempel queso och nmap spårar den exakta fönsterstorleken på grund av att
                      den är ganska konstant för respektive OS typ. Det här testet ger oss 
                      mycket information eftersom vissa operativsystem unikt kan identifieras
                      av enbart fönstret (till exempel, AIX är det enda OS jag har sett som 
                      använder 0x3F25). I deras "helt omskrivna" TCP stack för NT5, anänder 
                      Microsoft 0x402E. Intressant är att det råkar vara exakt samma tal som
                      används av OpenBSD och FreeBSD.

ACK Value -- Även om du tror att detta är en standard, så varierar värdet som används i ACK
             fältet mellan olika implementationer. Låt oss säga att du skickar ett paket med
             FIN|PSH|URG till en stängd TCP port. De flesta implementationer kommer att sätta
             ACK till att vara samma som ditt initiala sekvensnummer, men Windows och några 
             dumma skrivare kommer att sända ditt sqe + 1. Om du skickar ett paket innehållande
             SYN|FIN|URG|PSH till en öppen port, så beter sig Windows väldigt konstigt. Ibland
             skickar den tillbaka din seq, men ibland skickar den tillbaka S++ och vid vissa
             tillfällen skickar den tillbaka ett till synes slumpmässigt tal. Det här får en 
             att undra över vilken kod MS egentligen skriver som ändrar sig på detta sätt.


ICMP Error Message Quenching -- Vissa (smarta) operativsystem följer förslaget i RFC 1812 om 
                                att begränsa antalet felmeddelanden som sänds. Linux kärnan
                                (i net/ipv4/icmp.h) begränsar meddelandet destination unreachable
                                 till max 80 per sekund, med en 1/4 sekunds straff om detta 
                                överksrids. Ett sätt att testa detta är att skicka ett gäng paket
                                till en slumpmässig hög UDP port och räkna hur många felmeddelanden
                                det blir. Jag har inte sett detta användas tidigare och faktum 
                                är att jag inte använder det i nmap (förutom i UDP port scanningen).
                                Detta test skulle göra att OS detekteringen skulle ta längre tid
                                eftersom du skulle bli tvungen att sända ett gäng paket och sedan
                                vänta tills de kommer tillbaka. Att ta hand om problemet med att
                                vissa paket kanske förloras i nätverket skulle också bli jobbigt.

ICMP Message Quoting -- I RFC beskrivs att ICMP felmeddelanden ska citera en liten del av ett ICMP
                        meddelande som orsakar felet. För felmeddelandet port unreachable, skickar 
                        de allra flesta implementationer enbart tillbaka det erforderliga IP-huvudet
                        + 8 bytes. Men Solaris skickar tillbaka lite mer och Linux skickar tillbaka
                        ännu mer. Det fina i kråksången är att detta tillåter nmap att känna igen 
                        både Linux och Solaris även om de inte lyssnar på några portar.

ICMP Error message echoing integrity -- Den här idén fick jag från något som Theo De Raadt
                                        (ledande OpenBSD utvecklare) postade i gruppen
                                        comp.security.unix. Som jag nämnde tidigare så måste system
                                        skicka tillbaka delar av ditt ursprungliga meddelande
                                        tillsammans med ett felmeddelande om att porten inte gick att nå.
                                        Men det finns en del system som verkar använda dina huvuden
                                        som "arbetsyta" under den initiala behandlingen och därför är
                                        de lite förändrade när du får tillbaka dem. Till exempel
                                        AIX och BSDI skickar tillbaka fältet IP 'total storlek' som
                                        är 20 bytes för högt. Vissa BSDI, FreeBSD, OpenBSD, ULTRIX
                                        och VAXen förstör IP ID som du skickade dem. även om 
                                        checksumman kommer att ändras på grund av ändrad TTL ändå,
                                        så finns det trots det vissa system (AIX, FreeBSD, etc.) som
                                        skickar tillbaka ett inkonsekvent nummer eller 0 som checksumma.
                                        Samma sak gäller för UDPs checksumma. Allt som allt gör nmap
                                        nio olika kontroller på ICMP felen för att luska rätt på
                                        subtila skillnader som dessa.

        Type of Service -- För felet från ICMP att porten inte gick att nå tittar jag tillbaka på
                           typ av service (TOS) värdet för paketet som skickades tillbaka. Nästan 
                           alla implementationer använder 0 för detta ICMP fel även om Linux använder
                           0XC0. Detta är inte en indikation på ett TOS värde, utan istället är det
                           en del av det oanvända (AFAIK) ordningsföljd fältet. Jag vet inte varför
                           detta sätts, men om de ändrar det till 0 så kan vi fortsätta att identifiera
                           gamla versioner och vi kan skilja på gamla och nya.

       Hantering av fragmentering -- Detta är favorittekniken för H. Ptacek från Secure Networks, Inc
                                     (Numera ägt av en grupp Windows användare vid NAI). Det här tar
                                     hänsyn till att olika implementationer ofta hanterar överlappande
                                     IP fragment på olika sätt. Vissa skriver över de gamla med nya,
                                     och i andra fall har det gamla sättet företräde. Det finns många
                                     olika sätt att avgöra hur paketet blev ihopplockat. Jag adderade
                                     inte denna funktion på grund av att jag inte känner till något sätt
                                     att få porterbar kod som sänder IP fragment (i Solaris är det riktigt
                                     svårt). För mer information om överlappande fragment kan du läsa deras
                                     IDS dokument (www.secnet.com).


TCP optioner --            Det här är en riktig guldgruva, när det gäller att läcka information. Skönheten 
                           med dessa är att:
                           1) De behöver för det mesta inte vara med (öhh!) :) så alla system implementerar
                              inte dem.
                           2) Du vet om ett system har implementerat dem genom att skicka en fråga med en
                              option satt. Målmaskinen visar vanligtvis att det finns support genom att
                              sätta flaggan i svaret.
                           3) Du kan sätta massor med optioner i ett och samma paket för att testa alla på
                              samma gång.

                           Nmap skickar med dessa optioner med nästan alla testpaket:

                           Window Scale=10; NOP; Max Segment Size = 265; Timestamp; End of Ops;

                           När du får tillbaka ditt svar tar du dig en titt på vilka optioner som 
                           returnerades och därför också supportades. Vissa operativsystem som till
                           exempel nyare FreeBSD system har support för alla optioner, emedan andra
                           som till exempel Linux 2.0.X har support för endast ett fåtal. De senaste
                           Linux 2.1.x kärnorna har support för alla optioner. Men å andra sidan är
                           de mycket mer sårbara för att gissa sekvensnummer i TCP. Tänk själv.
       
                           Även om många system har support för samma optioner så kan du ibland
                           skilja dem åt genom att titta på värdet på optionerna. Till exempel, om
                           du skickar ett litet MSS värde till ett Linux system så kommer det
                           vanligtvis att skicka tillbaka samma MSS till dig. Andra system ger
                           andra värden.

                           Och även om de har support för samma optioner OCH returnerar samma värden,
                           så kan du fortfarande skilja dem åt genom att titta på i vilken ordning
                           optionerna kommer och var någonstans utfyllnad används. Till exempel
                           Solaris returnerar 'NNTNWME' som betyder:
                           <no op><no op><timestamp><no op><window scale><echoed MSS>

                           Men Linux 2.1.122 returnerar MENNTNW. Samma optioner, samma värden,
                           men en annan ordning!

                           Jag har inte sett något annat verktyg för OS detektering som använder TCP
                           optioner, men det är väldigt användbart.

                           Det finns en del andra användbara optioner som jag kanske kommer att testa
                           på vid tillfälle, som till exempel de som har support för T/TCP och
                           selektiva bekräftelser.


Kronologi för utnyttjande -- Trots alla tester beskrivna ovan kan inte nmap skilja på TCP stacken i
                             i Win95, WinNT eller Win98. Detta är ganska förvånande, speciellt med
                             tanke på att Win98 kom ut ungefär 4 år efter Win95. Man skulle kunna 
                             tro att de hade förbättrat sin stack på något sätt (som att erbjuda
                             support för fler TCP optioner) så att vi också skulle kunna upptäcka
                             skillnaderna och därigenom också skilja på operativsystemen. Så är
                             olyckligt nog inte fallet. NT stacken är precis samma skit stack som
                             de hade i '95. Och de brydde sig inte om att uppgradera den till '98.

                             Men ge inte upp hoppet, för det finns en lösning. Du kan använda dig
                             av de tidiga Windows DOS attackerna (Ping of Death, Winnuke, etc) och
                             stega dig uppåt en bit till Teardrop och Land. Efter varje attack, kan
                             du pinga dem och se efter om de har kraschat. När du slutligen har
                             kraschat dem, så kommer du sannerligen kunna gissa vad de kör ner
                             till vilket service pack och vilken hotfix.

                             Jag har inte lagt till denna funktionalitet även om jag medger att det
                             är väldigt frestande :).


SYN Flood Motstånd -- Vissa operativsystem slutar att acceptera nya uppkopplingar om du skickar för
                      många falska SYN paket till dem (falska paket gör att du undviker problem med
                      att din kernel stänger ner uppkopplingarna). Många operativsystem kan bara 
                      hantera 8 paket. Nyare Linux kärnor (bland andra operativsystem) tillåter
                      olika metoder som till exempel SYN cookies för att undvika detta problem.
                      Detta innebär att du kan lära dig en del om målets OS genom att skicka 8 paket
                      från en falsk källa till en öppen port och sedan se om du kan koppla upp dig
                      mot den porten. Detta är inte implementerat i nmap eftersom vissa personer
                      kan bli uppretade om du gör en SYN flood mot dem. även om du försöker förklara
                      att du bara ville ta reda på vilket OS de kör så kommer det troligtvis inte
                      att lugna ner dem.

NMAP IMPLEMENTATION OCH RESULTAT

Jag har skapat en referens implementation av de OS detekteringstekniker som nämnts ovan
(förutom de som inte är inkluderade). Jag har lagt till detta till min Nmap scanner, vilket
får den fördelen att den redan vet vilka portar som är öppna och stängda för att ta
fingeravtryck, så du behöver aldrig ange det. Det är också porterbart mellan Linux, *BSD,
och Solaris 2.51 och 2.6 och även en del andra operativsystem.

Den nya versionen av nmap läser en fil som är full med fingeravtrycks mallar som följer en
simpel uppställning. Här är ett exempel:

FingerPrint  IRIX 6.2 - 6.4 # Thanks to Lamont Granquist
TSeq(Class=i800)
T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT)
T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=)
T3(Resp=Y%DF=N%W=C000|EF2A%ACK=O%Flags=A%Ops=NNT)
T4(DF=N%W=0%ACK=O%Flags=R%Ops=)
T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=)
T6(DF=N%W=0%ACK=O%Flags=R%Ops=)
T7(DF=N%W=0%ACK=S%Flags=AR%Ops=)
PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E)

Låt oss ta en titt på första raden (Jag lägger till '>' citat tecken):

> FingerPrint  IRIX 6.2 - 6.3 # Thanks to Lamont Granquist

Den här raden talar helt enkelt om att fingeravtrycket täcker IRIX version 6.2 till och med
6.3 och kommentaren talar bara om att Lamont Granquist snällt nog skickade mig IP-adressen
eller fingeravtrycket till de IRIX system som testades.

> TSeq(Class=i800)

Det här betyder att ISN prover placeras i klassen "i800". Det betyder att varje ny ISN är en
ökning på 800 jämfört med den tidigare.

> T1(DF=N%W=C000|EF2A%ACK=S++%Flags=AS%Ops=MNWNNT)

Det här testet heter T1 (för test1, klokt eller hur?). I detta test skickar vi ett SYN paket
med en massa TCP optioner satta till en öppen port. DF=N betyder att "Fragmentera inte" biten
i svaret inte ska sättas. W=C000|EF2A betyder att fönsterstorleken som aviseras måste vara
antingen 0XC000 eller 0XEF2A. ACK=S++ betyder att bekräftelsen som vi får tillbaka måste vara
vårt initiala sekvensnummer plus 1. Flags = AS betyder att ACK och SYN flaggorna skickades i
svaret. Ops = MNWNNT betyder att optioner i svaret måste vara (i denna ordning):

<MSS (not echoed)><NOP><Window scale><NOP><NOP><Timestamp>

> T2(Resp=Y%DF=N%W=0%ACK=S%Flags=AR%Ops=)

Test 2 involverar ett NULL med samma optioner till en öppen port. Resp=Y betyder att vi måste 
få ett svar. Ops= betyder att inga optioner får vara inkluderade i svaret. Om vi hade tagit 
bort '%Ops=' helt och hållet så skulle optioner som vi skickade matcha.

> T3(Resp=Y%DF=N%W=400%ACK=S++%Flags=AS%Ops=M)

Test 3 är en SYN|FIN|URG|PSH med optioner till en öppen port.

> T4(DF=N%W=0%ACK=O%Flags=R%Ops=)

Det här ett ACK till en öppen port. Notera att vi inte har satt Resp= här. Det betyder
att om svar inte ges (till exempel ett paket som slängs på nätverket eller av en elak
brandvägg) inte glöms bort så länge de andra testerna matchar. Vi gör så här för att
nästan alla OS kommer att skicka ett svar, så ett borttappat svar beror troligtvis på
nätverksgrejer och inte på operativsystemet. Vi sätter Resp flaggan i test 2 och 3 för
att vissa operativsystem slänger dessa utan att svara.

> T5(DF=N%W=0%ACK=S++%Flags=AR%Ops=)
> T6(DF=N%W=0%ACK=O%Flags=R%Ops=)
> T7(DF=N%W=0%ACK=S%Flags=AR%Ops=)

De här testerna är SYN, ACK och FIN|PSH|URG var för sig till en stängd port. Samma
optioner sätts alltid. Detta är givetvis ganska uppenbart med tanke på de deskriptiva
namnen 'T5', 'T6' och 'T7' :).

> PU(DF=N%TOS=0%IPLEN=38%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E)

Den här stora busen är ett test av meddelandet 'port unreachable'. Du borde känna igen
DF=N nu. TOS=0 betyder att IP typen av service fältet var 0. Nästa två fält ger (hex)
värdet av den totala IP längden av IP meddelandets huvud och den totala längden i IP
huvudet som ekas tillbaka till oss. RID=E betyder att RID värdet vi fick tillbaka i 
kopian av vårt ursprungliga UDP paket var väntat (med andra ord samma som vi skickade).
RIPCK=E betyder att de inte sabbade checksumman (om de hade gjort det skulle det ha stått
RIPCK=F). UCK=E betyder att UDP checksumman också är korrekt. Sen kommer UDP längden som
var 0X134 och DAT=E betyder att de ekade våra UDP data riktigt. Eftersom de flesta
implementationer (inklusive den här) inte skickar tillbaka någon UDP data, så får de också 
alltid DAT=E.

Versionen av nmap med denna funktionalitet är för tillfället i sjätte privata beta cykeln.
Den kanske är ute när du läser om detta i Phrack. Men å andra sidan kanske inte. Kolla på
http://nmap.org/ för den senaste versionen.


POPULÄRA ÖGONBLICKSBILDER FRÅN PLATSER

Här kommer det roliga resultatet från våra ansträngingar. Vi kan numera ta en slumpvist
utvald Internet plats och bestämma vilket OS de kör. Många av dessa personer har tagit
bort telnets inloggningsmeddelanden etc. för att hålla denna information privat. Men 
det hjälper inte mot våran nya fingeravtryckläsare! Detta är också ett bra sätt att
exponera dina  användare vilka förlorare de är :)!

Kommandot som användes i dessa exempel var: nmap -sS -p 80 -O -v 

Notera också att de flest av dessa scanningar gjordes 1998-10-18. Vissa av dessa personer
kan ha uppgraderat/ändrat system sedan dess.

Det är inte så att jag inte tycker om de platser som listas här.

# "Hacker" platser eller (i vissa fall) de som tror att de är det
www.l0pht.com        => OpenBSD 2.2 - 2.4
insecure.org     => Linux 2.0.31-34
www.rhino9.ml.org    => Windows 95/NT     # Ingen kommentar :)
www.technotronic.com => Linux 2.0.31-34
www.nmrc.org         => FreeBSD 2.2.6 - 3.0
www.cultdeadcow.com  => OpenBSD 2.2 - 2.4
www.kevinmitnick.com => Linux 2.0.31-34  # Befria Kevin!
www.2600.com         => FreeBSD 2.2.6 - 3.0 Beta
www.antionline.com   => FreeBSD 2.2.6 - 3.0 Beta
www.rootshell.com    => Linux 2.0.35  # ändrade till OpenBSD efter
                                      # att de köptes upp.

# Säkerhetsföretag, konsulter etc.
www.repsec.com       => Linux 2.0.35
www.iss.net          => Linux 2.0.31-34
www.checkpoint.com   => Solaris 2.5 - 2.51
www.infowar.com      => Win95/NT

# Tillverkare lojalitet mot sitt OS
www.li.org           => Linux 2.0.35 # Linux International
www.redhat.com       =>> Linux 2.0.31-34 # Jag undrar vilken distribution :)
www.debian.org       => Linux 2.0.35
www.linux.org        => Linux 2.1.122 - 2.1.126
www.sgi.com          => IRIX 6.2 - 6.4
www.netbsd.org       => NetBSD 1.3X
www.openbsd.org      => Solaris 2.6     # Hmm :) (det är bara för att UAlberta 
                                        # äger uppkopplingen)
www.freebsd.org      => FreeBSD 2.2.6-3.0 Beta

# Plugg ligan
www.harvard.edu      => Solaris 2.6
www.yale.edu         => Solaris 2.5 - 2.51
www.caltech.edu      => SunOS 4.1.2-4.1.4  # Hallå! Det här är nittiotalet :)   
www.stanford.edu     => Solaris 2.6
www.mit.edu          => Solaris 2.5 - 2.51 # Sammanträffande att så många bra
                                           # skolor verkar gilla Sun?
                                           # Kanske beror på den 40%
                                           # .edu rabatten :)
www.berkeley.edu     => UNIX OSF1 V 4.0,4.0B,4.0D  
www.oxford.edu       => Linux 2.0.33-34  # Rocka på!

# Förlorarnas platser
www.aol.com          => IRIX 6.2 - 6.4  # Inte konstigt att de är så osäkra :)
www.happyhacker.org  => OpenBSD 2.2-2.4 # Trött på att vara köpt, Carolyn?
                                        # även det säkraste OS är
                                        # oanvändbart i händerna på en
                                        # inkompetent admin.

# Blandat
www.lwn.net          => Linux 2.0.31-34 # Den här Linux platsen rockar!
www.slashdot.org     => Linux 2.1.122 - 2.1.126
www.whitehouse.gov   => IRIX 5.3
sunsite.unc.edu      => Solaris 2.6

Kommentarer: I sitt säkerhetsdokument så säger Microsoft följande om sin
bristande säkerhet: "detta antagande har förändrats över åren eftersom 
Windows NT blir mer och mer populärt på grund av sina säkerhetsfunktioner.
Hmm, av vad jag kan utläsa verkar det inte som om Windows är särskilt 
populärt bland säkerhetsfolket :). Jag kan bara se 2 Windows system i hela
gruppen och Windows är enkelt för nmap att skilja ut eftersom det är så 
trasigt (med avseende på standarder).

Och givetvis finns det en till plats vi måste kolla. Det är webb-platsen
för det ultra-säkra Transmeta företaget. Intressant nog grundades företaget
av Paul Allen från Microsoft, men de har anställt Linus Torvalds. Så följer 
de Paul och kör NT eller huserar de med rebellerna och ansluter till Linux-
revolutionen? Låt oss se:

Vi använder kommandot:

nmap -sS -F -o transmeta.log -v -O www.transmeta.com//24

Detta säger att vi ska SYN scanna efter kända portar (från /etc/services), logga 
resultatet till 'transmeta.log', ge mycket output, scanna efter OS och scanna
klass 'C' som www.transmeta.com finns på. Här är ett utdrag från resultaten:

neon-best.transmeta.com (206.184.214.10) => Linux 2.0.33-34
www.transmeta.com (206.184.214.11) => Linux 2.0.30
neosilicon.transmeta.com (206.184.214.14) => Linux 2.0.33-34
ssl.transmeta.com (206.184.214.15) => Linux unknown version
linux.kernel.org (206.184.214.34) => Linux 2.0.35
www.linuxbase.org (206.184.214.35) => Linux 2.0.35 ( possibly the same machine as above )

Ja, jag tror att svaret på vår fråga är ganska givet :).

TACK TILL

Den enda anledningen till att Nmap för tillfället kan upptäcka så många olika
operativsystem är för att många människor i det privata beta teamet lade ner
mycket möda på att söka efter nya intressanta system att ta fingeravtryck på!
Särskilt Jan Koum, van Hauser, Dmess0r, David O'Brien, James W. Abendschan, 
Solar Designer, Chris Wilson, Stuart Stock, Mea Culpa, Lamont Granquist, 
Dr. Who, Jordan Ritter, Brett Eldridge, and Pluvius skickade in tonvis med
IP adresser på konstiga system och/eller fingeravtryck på system som inte
gick att nå via Internet.

Tack till Richard Stallman för att du skrev GNU Emacs. Den här artikeln skulle
inte vara så väl radbruten om jag hade använt vi eller cat och ^D.

Frågor och kommentarer kan skickas till fyodor@insecure.org. Nmap kan hämtas
från http://insecure.org/nmap.