. . . written by ProXy - 09.02.2003 +-------------------------------------------------+ | Fingerprinting / Footprinting | | (Remote OS Detection) | +-------------------------------------------------+ <1.0> Wtf !? :) <1.1> Was ist Fingerprinting? <1.2> Was ist Footprinting? <2.0> Fingerprinting - TTL Request <3.0> Fingerprinting - IP Stack <3.1> Fingerprinting - Window Size <3.2> Fingerprinting - ICMP Error Msg <4.0> Footprinting - Ports <5.0> Footprinting - FTPD <6.0> Footprinting - HTTPD <7.0> Footprinting - E-Mail <8.0> Finger- & Footprinting -Tools ============================================================= 1.0 - Wtf !? :) ============================================================= 1.1 - Was ist Fingerprinting? Fingerprinting nennt man das erkennen des Betriebssystems eines entfernten Rechners anhand TCP-Sequenzen. In Absatz 2.0 - 3.2 werde ich etwas näher darauf eingehen. ============================================================= 1.2 - Was ist Footprinting? Footprinting nennt man das auslesen des Betriebssystems aus Welcome- und Infobannern von am Rechner laufenden Daemonen oder anhand offener Ports. Absatz 4.0 - 7.0 erklären das genauer.. ============================================================= 2.0 - TTL Fingerprinting ============================================================= Ihr kennt ja sicher den Network Mapper (besser bekannt unter NMAP), das ist ein Portscanner für Linux welcher auch OS-Fingerprinting und diverse andere Scan-Methoden unterstützt. Mit NMAP kann man anhand des -O Parameters das Betriebssystem des zielrechners mit ziehmlicher genauigkeit ermitteln. einige von euch haben sich sicher schon gefragt wie NMAP das wohl macht? ;) Ganz einfach, jeder host der zB durch einen ping angesprochen wird liefert ICMP Sequenzen zurück. Damit wird für gewöhnlich festgestellt ob die von uns abgesandten Daten auch am Zielrechner ankommen. Bei einem Ping werden auch die TTL-Werte angezeigt (Time-to-Live) welche die Lebensdauer eines Datenpacketes in Stationsdurchläufen bis zum Ziel zeigen. Der Standard-TTL-Wert sollte 64 sein, jedoch hielten sich nicht alle Betriebssystem-Hersteller daran und man kann in vielen Fällen anhand des TTL Wertes das Betriebssystem festellen. Also ein einfacher Ping würde reichen! :) Windows-Rechner haben meistens einen TTL-Wert von 128 (pong) und Linux-Rechner liegen etwas darüber mit ca. 255. Die Coder und Mitarbeiter beim Projekt 'nmap' haben viel aufwand in diese Sache investiert und eine Menge Rechner gescannt um die Genauigkeit von OS-Fingerprinting zu verfeinern und nmap zu dem präzisen Tool zu machen das es heute ist. Übersicht mit den verwendeten TTL-Werten: OS: | TTL: ------------------------+----- Cisco Router ISO 12.2.1 | 255 QNX Neutrino OS | 255 Linux | 255 Solaris 2.x | 255 Windows ME | 128 Windows NT 4.0 | 128 Windows 2000 | 128 Windows XP Professional | 128 VMS/Wollongong | 128 VMS/UCX | 128 NetGear FM114P | 64 OS/2 TCP/IP 3.0 | 64 HP/UX 10.01 | 64 Linux | 64 VMS/Multinet | 64 FreeBSD 2.1R | 64 AIX | 60 Irix 5.3 | 60 Irix 6.x | 60 MacOS/MacTCP 2.0.x | 60 OSF/1 V3.2A | 60 SunOS 4.1.3/4.1.4 | 60 Ultrix V4.1/V4.2A | 60 VMS/TCPware | 60 DEC Pathworks V5 | 30 HP/UX 9.0x | 30 Windows for Workgroups | 32 Windows 95 | 32 Windows 98 | 32 Windows 98 SE | 32 Windows NT 3.51 | 32 ============================================================= 3.0 - IP Stack Fingerprinting ============================================================= Bei dieser Art von Remote OS Detection werden verschiedene Pakete an den Zielrechner gesendet und die replys dann mit den Ergebnissen diverser Betriebssystemen verglichen. TEST | DESCRIPTION ------+-------------------------------------------------------- TSeq: | Eine Reihe SYN-Pakete werden zum Zielrechner geschickt | um zu sehen wie TCP-Sequenz-nummer abgeleitet wird. ------+-------------------------------------------------------- T1: | Ein SYN-Paket wird zu einem geöffneten TCP-Port geschickt. ------+-------------------------------------------------------- T2: | Ein NULL-Paket wird zu einem geöffneten TCP-Port geschickt. ------+-------------------------------------------------------- T3: | Ein SYN,FIN,PSH und URG-Paket wird zu einem geöffneten | TCP-Port geschickt. ------+-------------------------------------------------------- T4: | Ein ACK-Paket wird zu einem geöffneten TCP-Port geschickt. ------+-------------------------------------------------------- T5: | Ein SYN-Paket wird zu einem geschlossenen TCP-Port geschickt. ------+-------------------------------------------------------- T6: | Ein ACK-Paket wird zu einem geschlossenen TCP-Port geschickt. ------+-------------------------------------------------------- T7: | Ein SYN,FIN,PSH und URG-Paket wird zu einem geschlossenen | TCP-Port geschickt. ------+-------------------------------------------------------- PU: | Ein Paket wird zu einem geschlossenen UDP-Port geschickt. Einige Beispiel-Outputs: Fingerprint Windows 98 v2 TSeq(Class=TD%gcd=<6%SI=FFF) T1(DF=Y%W=402E%ACK=S++%Flags=AS%Ops=MNWNNT) T2(DF=N%W=0%ACK=S%Flags=AR%Ops=) T3(DF=Y%W=402E%ACK=S++%Flags=AS%Ops=MNWNNT) 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) Fingerprint Linux 2.0.38 TSeq(Class=TR) T1(DF=N%W=7FE0%ACK=S++%Flags=AS%Ops=ME) T2(Resp=N) T3(DF=N%W=7FE0%ACK=S++%Flags=ASF%Ops=ME) 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=164%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E) Fingerprint Linux 2.2.16 TSeq(Class=RI%gcd=<6%SI=>FFFF) T1(DF=Y%W=7F53%ACK=S++%Flags=AS%Ops=MENNTNW) T2(Resp=N) T3(DF=Y%W=7F53%ACK=S++%Flags=AS%Ops=MENNTNW) 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=164%RIPTL=148%RID=E%RIPCK=E%UCK=E%ULEN=134%DAT=E) Die Auswertung: -----+-----------------------------+--------------------------------------- Resp | Y = There was a response | Whether or not the host responded | N = There was no response | to the test packet by sending a reply -----+-----------------------------+--------------------------------------- DF | Y = DF was set | Whether or not the host responding | N = DF was not set | to the test packet sent the | | "Don’t Fragment" bit in response. -----+-----------------------------+--------------------------------------- W | Can be a two-byte integer | Window advertisement size sent | expressed in hexadecimal. | by the host responding to | | the test packet. -----+-----------------------------+--------------------------------------- ACK | 0 = ack zero | The acknowledgement sequence | S = ack sequence number | number response type. | S++ =ack sequence number +1 | -----+-----------------------------+--------------------------------------- Flags| S = SYN F = FIN | Indicate what flags were | A = ACK U = URG | set in the responding packet. | R = RST P = PSH | -----+-----------------------------+--------------------------------------- Ops | M = MSS | Options sent back by the host | E = Echoed MSS | responding to the test packet. | W = Window Scale | There can be any number of options | T = Timestamp | set (including none) in any order. | N = No Option | -----+-----------------------------+------------(sans.org)----------------- 3.1 - Window Size Hierbei wird auf die TCP Fenster-Grösse von Antwort-Paketen geachtet. Bsp von oben: T1(DF=Y%W=402E%ACK=S++%Flags=AS%Ops=MNWNNT) "W=402E" (= Standard für Windows) ============================================================= 3.2 - ICMP Error Message Eine weitere Methode wäre es ICMP Pakete an einen geschlossenen Port zu senden und auf die Zeit zu achten die das System braucht um diese mit einer "Unreachable Port" Error-Message zu beantworten. Die reply-time ist von OS zu OS unterschiedlich und man kann so das Ziel-OS ausfindig machen. ... Es gibt noch einige andere Fingerprinting Methoden jedoch denke ich jetzt die wichtigsten beschrieben zu haben und wende mich nun dem Footprinting zu :) ============================================================= 4.0 - Port Footprinting ============================================================= Auch anhand offener Ports kann man ein Betriebssystem erkennen, zB für windows typisch: Port 135 - epmap Port 139 - Micosoft Netzwerkumgebung (Netbios) Port 445 - microsoft-ds port 1025 - blackjack ... ============================================================= 5.0 - FTPD Footprinting ============================================================= Ist am Zielrechner Port 21 geöffnet dann bedeutet dies meist das dort ein ftp-daemon läuft, am einfachsten ist es sich via Telnet als "anonymer user" (falls erlaubt) darauf einzuloggen und die Begrüssungszeile abzuwarten. Dort wird meist das OS und der ftpd-typ mitangezeigt. Hier zwei Beispiele: (Bsp-1:) 220 xxx.xxx.xxx.xxx Microsoft FTP Service (Version 5.0). (Bsp-2:) 220 xxx.xxx.xxx.xxx FTP server [SunOS 5.8] ready. Es gibt aber noch eine andere Methode das OS ausfindig zu machen wenn ein FTP-Server aktiv ist. Man loggt sich via DOS als Anonymer User ein und gibt dann den Befehl "literal syst" ein. Anschliessend sollte das OS ausgegeben werden: (Bsp-1:) 215 Windows_NT (Bsp-2:) 215 UNIX Type: L8 Version: BSD-198911 ============================================================= 6.0 - HTTPD Footprinting ============================================================= Falls Port 80 geöffnet ist läuft ein http-Server auf dem Rechner und man kann mittels eines simplen Tricks Typ, Version, OS und evtl. noch mehr feststellen... Dazu öffnet man Telnet um sich mit dem server zu verbinden: telnet xxx.xxx.xxx.xxx 80 und gibt danach folgendes ein: options / http/1.1 host: xxx.xxx.xxx.xxx (die IP/Domain habe ich durch xxx.xxx.xxx.xxx ersetzt) Anschliessend zweimal auf Enter gedrückt und folgende Information sollte zum Vorschein kommen: HTTP/1.1 501 Method Not Implemented Date: Tue, 21 Jan 2003 02:38:13 GTM Server: Apache/1.3.6.3 (Unix) Allow: GET, HEAD, OPTIONS, TRACE Connection: close Content-Type: text/html Jedoch darf die "versions information"-Abfrage am Webserver nicht deaktiviert sein, da sonst nichts angezeigt wird. Bei den meisten Webservern ist das aber sowieso nicht der Fall, da kaum jemand darauf achtet. ============================================================= 7.0 - E-MAIL Footprinting ============================================================= Schreibe an die Person die am entfernten Zielrechner sitzt eine E-Mail, warte auf die Antwort und lass dir von deinem E-Mail clienten den vollständigen Header anzeigen. Suche danach nach der Zeile "X-mailer=" und schon weisst du welcher Client benutzt wird und kannst falls notwendig bei Google nachschlagen für welches OS dieser zur Verfügung steht. X-mailer=Microsoft Outlook = hier handelt es sich mit ziehmlicher Sicherheit um ein MS WINDOWS ausser jemand hat es unter linux emuliert ;p ============================================================= 8.0 - Finger- & Footprinting -Tools ============================================================= Network Mapper - http://www.insecure.org/nmap MingSweeper - http://www.hoobie.net/mingsweeper LANguard - http://www.gfi.com/languard Superscan - http://www.webattack.com/get/superscan.shtml WinFingerprint - http://www.webattack.com/get/winfinger.shtml _more_ - http://www.zone-h.org/en/download/category=14 ============================================================= 9.0 - Credits ============================================================= kopieren erlaubt - verändern verboten! ProXy http://www.es-crew.de