\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}
