Detektering av typ av operativsystem med hjälp av TCP/IP stackens fingeravtryck av Fyodor <[email protected]> (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 dinaanvä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 [email protected]. Nmap kan hämtas från http://insecure.org/nmap.