\documentclass[a4paper, 17pt, landscape]{foils} \usepackage[latin1]{inputenc} \usepackage[T1]{fontenc} \usepackage[german]{babel} \usepackage{graphicx} \newcommand{\function}[1]{\texttt{#1}} \newcommand{\command}[1]{\texttt{#1}} \newcommand{\sniffed}[2]{ \noindent \small{Folgendes wurde während eines \command{#1} mit \command{tethereal -lo0} gesnifft: \\ \texttt{#2} } \normalsize{} } \newcommand{\url}[1]{\texttt{#1}} \newcommand{\scanner}[1]{\textbf{#1}} \newcommand{\detector}[1]{\scanner{#1}} \newcommand{\problem}[1]{\scanner{#1}} \title{Portscanning und Portscan-Detection} \author{Thomas Walpuski\\ \texttt{Thomas.Walpuski@gmx.net}} \date{2000-12-20} \leftheader{Thomas Walpuski} \rightheader{2000-12-20} \MyLogo {Portscanning und Portscan-Detection} \begin{document} \maketitle \foilhead{Portscanning - Was ist das?} Als Portscanning bezeichnet man die Erkennung offener TCP- und UDP-Ports mittels verschiedener Techniken, die sp"ater n"aher erkl"art werden. Alle diese Techniken basieren auf einem Testen der Reaktion des zu scannenden Rechners auf bestimmte TCP-Pakete bzw. UDP-Datagramme, die an die zu scannenden Ports adressiert sind. \foilhead{Wozu n"utzt das?} Die Erkennung offener Ports bedeutet auch die Erkennung laufender Services, die ggf. deaktiviert werden m"ussen um: \begin{itemize} \item Sicherheitsproblemen vorzubeugen oder \item Resourcen zu sparen. \end{itemize} Weiterhin kann man mit Portscannern Firewall-Konfigurationen testen, Betriebssysteme erkennen ... \foilhead{Arten des Portscannings} \begin{itemize} \item TCP-connect()-Scan \item TCP-SYN-Scan \item FIN-Scan \item Xmas-Scan \item Null-Scan \item UDP-ICMP-Scan \item UDP-write()/recvfrom()-Scan \end{itemize} \foilhead{TCP-connect()-Scan} Per \command{connect()} wird versucht, eine Verbindung aufzubauen. Liefert \command{connect()} 0 zur"uck, ist der Port offen, andernfalls (\command{connect()} liefert -1) ist der Port geschlossen. Der TCP-connect()-Scan ist der einzige TCP-Scan, der \emph{keine} root-Rechte ben"otigt. Zudem ist er sehr schnell. Er kann jedoch auch mit einfachen Methoden erkannt werden, da ein kompletter Verbindungsaufbau per 3-way-handshake durchgef"uhrt wird. \sniffed {nmap -P0 -sT -p 79, 80 localhost} {localhost -> localhost TCP 3721 > finger [SYN] Seq=1713108672 Ack=0 Win=16384 Len=0 \\ localhost -> localhost TCP finger > 3721 [RST, ACK] Seq=0 Ack=1713108673 Win=0 Len=0 \\ localhost -> localhost TCP 3722 > http [SYN] Seq=1713231337 Ack=0 Win=16384 Len=0 \\ localhost -> localhost TCP http > 3722 [SYN, ACK] Seq=1713350423 Ack=1713231338 Win=57344 Len=0 \\ localhost -> localhost TCP 3722 > http [ACK] Seq=1713231338 Ack=1713350424 Win=57344 Len=0 \\ localhost -> localhost TCP 3722 > http [RST, ACK] Seq=1713231338 Ack=1713350424 Win=57344 Len=0 } \foilhead{TCP-SYN-Scan} Der TCP-SYN-Scan sendet ein Paket, bei dem nur das SYN-Flag gesetzt ist. Anwortet der zu scannende Rechner mit einem SYN\textbar{}ACK, so ist der Port offen, andernfalls (der Rechner anwortet mit RST\textbar{}ACK) ist der Port geschlossen. Sofort nach der Antwort des Ziel-Rechners wird ein RST gesendet, um den Verbindungsaufbau abzubrechen. Daher spricht man auch von halboffenem Scanning. \sniffed{nmap -P0 -sS -p 79, 80 localhost} {localhost -> localhost TCP 50529 > finger [SYN] Seq=971906275 Ack=0 Win=2048 Len=0 \\ localhost -> localhost TCP finger > 50529 [RST, ACK] Seq=0 Ack=971906276 Win=0 Len=0 \\ localhost -> localhost TCP 50529 > http [SYN] Seq=971906275 Ack=0 Win=2048 Len=0 \\ localhost -> localhost TCP http > 50529 [SYN, ACK] Seq=1797564532 Ack=971906276 Win=49152 Len=0 \\ localhost -> localhost TCP 50529 > http [RST] Seq=971906276 Ack=0 Win=0 Len=0 } \foilhead{FIN-Scan} \label{fin} Der FIN-Scan basiert darauf, dass "`schwachsinnige"' TCP-Pakete mit einem RST\textbar{}ACK beantwortet werden. Es wird ein Paket gesendet, bei dem nur das FIN-Flag gesetzt ist. Antwortet der zuscannende Host mit einem RST, ist der Port geschlossen. \sniffed{nmap -P0 -sF -p 79, 80 localhost} {localhost -> localhost TCP 49452 > finger [FIN] Seq=0 Ack=0 Win=3072 Len=0 \\ localhost -> localhost TCP finger > 49452 [RST, ACK] Seq=0 Ack=0 Win=0 Len=0 \\ localhost -> localhost TCP 49452 > http [FIN] Seq=0 Ack=0 Win=3072 Len=0 \\ localhost -> localhost TCP 49453 > http [FIN] Seq=0 Ack=0 Win=3072 Len=0 } \foilhead{Xmas-Scan} \label{xmas} Der Xmas-Scan ist eine Abwandlung des FIN-Scan. Zus"atzlich zum FIN sind die Flags PSH und URG gesetzt. \sniffed{nmap -P0 -sX -p 79, 80 localhost} {localhost -> localhost TCP 53023 > finger [FIN, PSH, URG] Seq=0 Ack=0 Win=1024 Urg=0 Len=0 \\ localhost -> localhost TCP finger > 53023 [RST, ACK] Seq=0 Ack=0 Win=0 Len=0 \\ localhost -> localhost TCP 50978 > http [FIN, PSH, URG] Seq=0 Ack=0 Win=1024 Urg=0 Len=0 \\ localhost -> localhost TCP 50979 > http [FIN, PSH, URG] Seq=0 Ack=0 Win=1024 Urg=0 Len=0 } \foilhead{Null-Scan} \label{null} Auch der Null-Scan ist eine Variante des FIN-Scan. Diesmal sind keine Flags gesetzt. \sniffed{nmap -P0 -sN -p 79, 80 localhost} {localhost -> localhost TCP 36614 > finger [] Seq=0 Ack=0 Win=2048 Len=0 \\ localhost -> localhost TCP finger > 36614 [RST, ACK] Seq=0 Ack=0 Win=0 Len=0 \\ localhost -> localhost TCP 36614 > http [] Seq=0 Ack=0 Win=2048 Len=0 \\ localhost -> localhost TCP 36615 > http [] Seq=0 Ack=0 Win=2048 Len=0 } \foilhead{UDP-ICMP-Scan} Der UDP-ICMP-Scan basiert darauf, dass auf ein UDP-Datagram an einen geschlossenen Port der Ziel-Rechner ein ICMP port unreachable sendet. \sniffed{nmap -P0 -sU -p 513, 514 localhost} {localhost -> localhost WHO Source port: 33108 Destination port: who \\ localhost -> localhost ICMP Destination unreachable \\ localhost -> localhost UDP Source port: 33600 Destination port: syslog \\ localhost -> localhost UDP Source port: 33601 Destination port: syslog } \foilhead{UDP-write()/recvfrom()-Scan} Der UDP-write()/recvfrom()-Scan ist ein UDP-ICMP-Scan, der vollkommen ohne root-Rechte (also ohne Zugriff auf RAW-Sockets, libpcap ..) durchgef"uhrt werden kann. Die Schwierigkeit besteht darin zu erkennen, dass ICMP port unreachable gesendet wurde. Der UDP-write()-Scan basiert darauf, dass der Empfang des ICMP port unreachable durch das Fehlschlagen eines zweiten \function{write()}s (\function{write()} liefert -1 als R"uckgabewert) angezeigt wird. Die Grundlage des UDP-recvfrom()-Scan ist, dass das Erhalten des ICMP port unreachable bei einem \function{recvfrom()} auf einen NONBLOCKING-Socket durch das Setzen von ERRNO auf 111 (ECONNREFUSED) angezeigt wird. \foilhead{Welche Portscanner gibt es? Und was k"onnen sie?} \begin {itemize} \item \scanner{Nmap} - (fast) alles (\url{http://www.insecure.org/nmap/}) \item \scanner{Strobe} - sehr schneller TCP-connect()-Scanner, nutzt NONBLOCKING-Sockets \item \scanner{UDP SCAN} - UDP-ICMP-Scanner (\url{http://shadowpenguin.backsection.net/toolbox/}) \item etc. pp. (\url{http://packetstorm.securify.com/UNIX/scanner/}) \end {itemize} \foilhead{Woran erkenne ich Portscanns?} Es gibt viele Umst"ande, bei denen von einem Portscan ausgangen werden kann: \begin{itemize} \item In einer bestimmten Zeit (z.\,B. 30s) wird eine bestimme Anzahl (z.\,B. 5) von Ports mit Paketen "`beliefert"'. \item Das zuerst an einen Port gesendete Paket ist charakteristisch f"ur Stealth-Scans (siehe S.~\pageref{fin} ff.). \item Ungew"ohnlich hoher Anteil von ICMP port unreachable am ICMP-Traffic. \item etc. pp. \end{itemize} \foilhead{Portscan-Detection in der Praxis} Grunds"atzlich gibt es zwei verschiedene Arten, wie Portscan-Detection realisiert wird: \begin{enumerate} \item Der Portscan-Detector nistet sich auf bestimmten Ports mit \function{listen()} ein und registriert versuchte Verbindungsaufbauten.\\ \textbf{Vorteile:} \begin{itemize} \item man ben"otigt keine root-Rechte \item es ist Ressourcen schonend \end{itemize} \textbf{Nachteile:} \begin{itemize} \item mit Stealth-Scans einfach zu umgehen \item man st"o"st schnell an die Grenze der maximal offenen Dateien \end{itemize} Diese Technik der Portscan-Erkennung verwendet z.\,B. Portsentry. \item Der Portscan-Detector snifft den gesamten Netzwerkverkehr auf einem Device mit und registriert verd"achtige Pakete.\\ \textbf{Vorteile:} \begin{itemize} \item schwer zu umgehen \end{itemize} \textbf{Nachteile:} \begin{itemize} \item Ressourcen fressend \end{itemize} Diese Technik der Portscan-Erkennung verwendet z.\,B. Scanlogd. \end{enumerate} \foilhead{Welche Probleme gibt es bei der Portscan-Detection?} \begin {itemize} \item Umgehung des Erkennungsmechanismus durch stark \problem{fragmentierte Pakete} (selbst die Header sind fragmentiert) \item Umgehung des Loggingmechanismus durch \problem{Log-Floodging} - der Loggingmechanismus wird so lange mit gespooften Scans "`gef"uttert"', bis er keine weiteren Scans loggen kann, danach erfolgt der eigentliche Scan \item \problem{DoS-Attacken} - durch Rekonfiguration der Firewall in Folge gespoofter Scans \end {itemize} \foilhead{Welche Programme zur Portscan-Detection gibt es?} \begin {itemize} \item \detector{Scanlogd} (\url{http://www.openwall.com/scanlogd/}) \item \detector{Snort-Portscan-Preprocessor} (\url{http://www.snort.org/}) \item \detector{Portsentry} (\url{http://www.psionic.com/abacus/portsentry/}) \item etc. pp. (\url{http://packetstorm.securify.com/UNIX/scan\_detect/}) \end {itemize} \foilhead{Literatur} \begin{thebibliography}{99} \bibitem{} {TCP port Stealth Scanning (\url{http://phrack.infonexus.com/search.phtml?view\&article=p49\-15})} \bibitem{} {The Art of Scanning (\url{http://phrack.infonexus.com/search.phtml?view\&article=p51\-11})} \bibitem{} {Port Scan Detection Tools (\url{http://phrack.infonexus.com/search.phtml?view\&article=p53\-13})} \end{thebibliography} \end{document}