\documentclass[12pt]{beamer}
\usepackage{amsmath}
\usepackage{url}
\usepackage{ucs}
\usepackage[utf8x]{inputenc}
\usepackage[ngerman]{babel}

% Manual syntax highlighting
\newcommand{\synfunc}   [1]{\color{blue!50!black}#1\color{black}}
\newcommand{\synstr}    [1]{\color{red!50!black}#1\color{black}}
\newcommand{\synvar}    [1]{\color{purple!50!black}#1\color{black}}
\newcommand{\synclass}  [1]{\color{green!50!black}#1\color{black}}
\newcommand{\syncomment}[1]{\color{blue!20!black}#1\color{black}}
\newcommand{\syncool}   [1]{\color{beamer@blendedblue}#1\color{black}}
\newcommand{\synoder}      {\ \ \color{black}$\vee$\ \ }
\newcommand{\hr}        {\rule[4pt]{\textwidth}{0.1pt}\\}

\title{File Transfer Protocol}
\author{Ingo Blechschmidt \\\texttt{<iblech@web.de>}}
\institute{LUGA}
\date{25. Januar 2006}

\usetheme{Warsaw}
\usecolortheme{seahorse}
%\usepackage{bookman}
\setbeamercovered{transparent}

\begin{document}

\frame{\titlepage}
\frame[t]{
  \frametitle{Inhalt}
  \tableofcontents
}

% * Design
% * Anwendungen
%   * Typischer Ablauf
%   * Server-zu-Server-Kommunikation
%   * Spoofing mit FTP
% * Alternativen

\section{Design}
\subsection{Geschichte}
\frame[t]{\frametitle{Geschichte}
  \begin{itemize}
    \item Erste Definition in RFC 114 (April 1971)
    \item Hervorhebung des Unterschieds zwischen "`direkter"' und
          "`indirekter Nutzung"' durch den RFC:
          \vspace*{-1em}
          \begin{tabbing}
            Indirekte Nutzung: \= \kill
            Direkte Nutzung:   \> Einloggen via Telnet o.\,Ä. \\
            Indirekte Nutzung: \> Abstraktion durch ein Protokoll
          \end{tabbing}
    \pause
    \item Probleme bei direkter Nutzung \\
          ("`wie listet man unter \texttt{\$OS} nochmal Dateien auf?"')
    \item FTP als Möglichkeit indirekter Nutzung; \\
          große Vereinfachung
    \item Kontinuierliche Weiterentwicklung \\
          (u.\,a. RFC 959 (Oktober 1985))
  \end{itemize}
}

\subsection{Aufbau}
\frame[t]{\frametitle{Aufbau}
  \begin{itemize}
    \item ASCII-Basierung (→ einfaches manuelles Testen; ähnlich wie bei POP3 oder NNTP)
    \item Multi-User-Fähigkeit
    \item Strukturierung der Dateien in Verzeichnisse
    \pause
    \item Trennung in Kontroll- und Datenkanäle:
          \vspace*{-1em}
          \begin{tabbing}
            Kontrollkanal: \= \kill
            Kontrollkanal: \> Default-TCP-Port 21; Kommandoaustausch \\
            Datenkanäle:   \> dynamische Portaushandlung; \\
                           \> nur Datenaustausch
          \end{tabbing}
  \end{itemize}
}

\section{Anwendungen}
\subsection{Typischer Ablauf}
\frame[t]{\frametitle{Typischer Ablauf}
  \begin{enumerate}
    \item Einloggen
    \item Holen des Dateilistings, Holen einer bestimmten Datei
    \item Ausloggen
  \end{enumerate}
}

\frame[t]{\frametitle{Einloggen}
  \texttt{%
    \$ \textsl{telnet FTP-Server 21}\\
    Trying \textsl{a.b.c.d}...\\
    Connected to \textsl{FTP-Server}.\\
    Escape character is '\^{}]'.\\
    220 \textsl{Banner}\\
    \pause
    \textsl{USER Benutzername}\\
    331 Password required for \textsl{Benutzername}.\\
    \pause
    \textsl{PASS Passwort}\\
    230-\textsl{Willkommensnachricht}\\
    230-\textsl{Willkommensnachricht}\\
    230-\textsl{Willkommensnachricht}\\
    230-\textsl{Willkommensnachricht}\\
    230 User logged in.%
  }
  \pause\hfill \textsl{Live-Demo}
}

\frame[t]{\frametitle{Dateilisting -- passiv}
  \small
  \texttt{%
    \textsl{PASV}\\
    227 Entering Passive Mode (\textsl{a},\textsl{b},\textsl{c},\textsl{d},\textsl{x},\textsl{y})\\
    \textsl{LIST}\\
    125 Data connection open; Transfer starting.\\
    226 Transfer complete.\\
  }

  \pause
  \begin{block}{Übermittlung der Daten im \textsl{Datenkanal}}
    \texttt{\footnotesize%
      \$ \textsl{telnet \textsl{a}.\textsl{b}.\textsl{c}.\textsl{d} \$((\textsl{x}*256 + \textsl{y}))}\\
      Trying \textsl{a.b.c.d}...\\
      Connected to \textsl{FTP-Server}.\\
      Escape character is '\^{}]'.\\
      \pause
      drwxr-xr-x 1 \textsl{Nutzer} \textsl{Gruppe} 0 Nov 25 2002 bussys\\
      drwxr-xr-x 1 \textsl{Nutzer} \textsl{Gruppe} 0 May 21 2001 deskapps\\
      \textsl{[...]}\\
      Connection closed by foreign host.
    }
    \pause\hfill \textsl{Live-Demo}
  \end{block}
}

\frame<1>[t,label=transfertable]{\frametitle{Übertragungsarten}
  \small\hspace*{-1em}\begin{tabular}{l|l}
    Passive Übertragung & \onslide<2->{Aktive Übertragung} \\\hline
    \hspace*{-1.1em}\begin{minipage}{0.55\textwidth}
      \begin{itemize}
        \item \texttt{PASV}: \\
              Öffnung eines Ports auf dem FTP-Server durch den FTP-Daemon
        \item \texttt{LIST}, \texttt{RETR}, \texttt{STOR}: \\
              Übertragung der Daten in einer TCP-Verbindung \textsl{vom} Client
              \textsl{zum} mitgeteilten Port des Servers
        \item Durchlassen der Verbindung durch die Firewall des Servers~(!)
      \end{itemize}
    \end{minipage} &
    \onslide<2->{\hspace*{-1.1em}\begin{minipage}{0.55\textwidth}
      \begin{itemize}
        \item \texttt{PORT \textsl{i,j,k,l,x,y}}: \\
              Öffnung eines Ports auf dem Client durch den \\ FTP-Client
        \item \texttt{LIST}, \texttt{RETR}, \texttt{STOR}: \\
              Übertragung der Daten in einer TCP-Verbindung \textsl{vom} Server
              \textsl{zum} mitgeteilten Port des Clients
        \item Durchlassen der Verbindung durch die Firewall des Clients~(!)
      \end{itemize}
    \end{minipage}}
  \end{tabular}
}

\frame[t]{\frametitle{Dateilisting -- aktiv}
  \small
  \texttt{%
    \textsl{PORT i,j,k,l,x,y}\\
    200 PORT command successful.\\
    \textsl{LIST}\\
    150 Opening ASCII mode data connection for /bin/ls.\\
    226 Transfer complete.\\
  }

  \pause
  \begin{block}{Übermittlung der Daten im \textsl{Datenkanal}}
    \texttt{%
      \$ \textsl{netcat -vlp \$((\textsl{x}*256 + \textsl{y}))}\\
      Listening on [\textsl{i.j.k.l}] \textsl{[Port]} ...\\
      \pause
      connect to [\textsl{i.j.k.l}] from (UNKNOWN) [\textsl{a.b.c.d}] 20
      drwxr-xr-x 1 \textsl{Nutzer} \textsl{Gruppe} 0 Nov 25 2002 bussys\\
      drwxr-xr-x 1 \textsl{Nutzer} \textsl{Gruppe} 0 May 21 2001 deskapps\\
      \textsl{[...]}\\
      \ sent 0, rcvd 809
    }
    \pause\hfill \textsl{Live-Demo}
  \end{block}
}

\againframe<2>{transfertable}

\frame[t]{\frametitle{Oft genutzte FTP-Befehle}
  \begin{description}
    \item[\texttt{USER}, \texttt{PASS}] Authentifizierung
    \item[\texttt{QUIT}] Ausloggen
    \vspace*{0.1em}\hrule
    \item[\texttt{DELE}] Löschen einer Datei
    \item[\texttt{RNFR}, \texttt{RNTO}] Umbennung (rename \textsl{from}, rename \textsl{to})
    \item[\texttt{MKD}, \texttt{RMD}] Erzeugen, Löschen eines Verzeichnis
    \item[\texttt{CWD}] Verzeichniswechsel
    \vspace*{0.2em}\hrule
    \item[\texttt{PORT}] Auswählen von aktivem FTP
    \item[\texttt{PASV}] Auswählen von passivem FTP
    \vspace*{0.1em}\hrule
    \item[\texttt{LIST}] Verzeichnislisting
    \item[\texttt{RETR}] Herunterladen einer Datei
    \item[\texttt{STOR}] Hochladen einer Datei
  \end{description}
}

\subsection{Direkte Server-zu-Server-Übertragung}
\frame[t]{\frametitle{Direkte Server-zu-Server-Übertragung}
  \begin{itemize}
    \item Wunsch: \\
          Kopie einer Datei von FTP-Server \textsl{A} zum FTP-Server \textsl{B}
    \item Problem:
          \vspace*{-1.5em}
          \begin{tabbing}
            Herunterladen \= \kill
            Herunterladen \> von \textsl{A} auf den lokalen Rechner langsam \\
            Hochladen     \> auf \textsl{B} vom lokalen Rechner aus langsam
          \end{tabbing}
    \item Abhilfe: Kombination von aktivem und passivem FTP
    \item<3> Problem: Weigerung vieler Daemonen, beliebige Rechner zu kontakten
  \end{itemize}

  \pause
  \begin{block}{Vermittlung zwischen \textsl{A} und \textsl{B}}
    \begin{tabular}{l|l}
      Zu \textsl{A} & Zu \textsl{B} \\\hline
      \texttt{\textsl{PASV}} & \texttt{\textsl{PORT A,x,y}} \\
      \texttt{227 Entering Passive} & \texttt{200 PORT command} \\
      \texttt{\ \ \ \ Mode (\textsl{A},\textsl{x},\textsl{y})} & \texttt{\ \ \ \ successful.}
    \end{tabular}
  \end{block}
}

\subsection{FTP als Einweg-Proxy}
\frame[t]{\frametitle{FTP als Einweg-Proxy -- Spoofing mit FTP}
  \begin{itemize}
    \item Wunsch: Anonymes Senden von beliebigen \\
          Daten \textsl{M} an \texttt{\textsl{B}:\textsl{p}} \\
          (wobei $p = 256\,x + y$ mit $x,y \in \left\{ 0,1,2,\ldots,255 \right\}$)
    \pause
    \item Realisierung durch
          \begin{enumerate}
            \item Deponieren von \textsl{M} als Datei \texttt{datei} auf
                  liberalem FTP-Server
                  \textsl{A}
            \item \texttt{PORT \textsl{B},\textsl{x},\textsl{y}}
            \item \texttt{RETR \textsl{datei}}
          \end{enumerate}
    \item Problem nur wieder: Weigerung vieler Daemonen, beliebige Rechner zu
          kontakten
  \end{itemize}
}

\section{Sicherheit}
\subsection{Benutzernamen/Passwörter}
\frame[t]{\frametitle{Benutzernamen/Passwörter}
  \begin{itemize}
    \item Übertragung von Benutzernamen und Passwörtern im Klartext
    \item Übertragung der Nutzdaten im Klartext
    \item Daher erfolgreiches Sniffen problemlos möglich
  \end{itemize}
}

\subsection{Separater Datenkanal}
\frame[t]{\frametitle{Separater Datenkanal}
  \begin{itemize}
    \item Dynamische Portaushandlung; \\
          je nach FTP-Typ Lücken in entweder der Server- (passives FTP)
          oder der Client-Firewall (aktives FTP) nötig
    \item FTP durch NAT-Router "`schwierig"'
  \end{itemize}
}

\frame[t]{\frametitle{Austricksen von Firewalls}
  \begin{enumerate}
    \item Firewall belauscht FTP-Kontrollkanal nach
          \texttt{PASV}-Rückmeldungen
    \item \texttt{aaaaaaaaa\textsl{[...]}aaa227 Entering Passive Mode (\textsl{a},\textsl{b},\textsl{c},\textsl{d},\textsl{x},\textsl{y})}
    \item \texttt{500 Unknown command: aaaaaaaaa\textsl{[...]}aaa227 Entering Passive Mode (\textsl{a},\textsl{b},\textsl{c},\textsl{d},\textsl{x},\textsl{y})}
    \item Wählen der Länge der \texttt{a}s so, dass \texttt{227
          Entering\textsl{[...]}} in ein eigenes TCP-Paket fällt
          (Fragmentierung!)
    \item "`Oh, der FTP-Daemon will gleich Daten ausliefern, schnell den Weg
          freimachen"'
  \end{enumerate}
}

\subsection{Lücken im FTP-Daemon}
\frame[t]{\frametitle{L"ucken im FTP-Daemon}
  \begin{itemize}
    \item FTP-Daemonen müssen/können/sollten können\ldots
          \begin{itemize}
            \item \ldots auf Port 21 lauschen
            \item \ldots den aktuellen Nutzer wechseln ("`\texttt{su}"')
            \item \ldots Logs führen
            \item \ldots FTP-spezifische Quotas beachten
          \end{itemize}
    \item Daher: Notwendigkeit des Laufens einiger Komponenten mit root-Rechten
    \item Bei Sicherheitslücke nicht nur Erhalt von Nutzer-Rechten, sondern
          root-Rechten!
  \end{itemize}
}

\frame[t]{\frametitle{Sicherer: Privilege Separation}
  \begin{itemize}
    \item Start des Daemons als root
    \item Öffnen des Port-21-Sockets als root
    \item Abarbeiten von allgemeinen Kommandos (\texttt{USER}, \texttt{PASS})
          als nobody
    \item Nach korrekter \texttt{USER}/\texttt{PASS}-Kombination weiteres
          Arbeiten als \textsl{nutzer}
  \end{itemize}
}

%\subsection{Alternativen}
\frame[t]{\frametitle{Alternativen}
  \begin{itemize}
    \item FTPS (FTP-SSL und FTP-TLS): \\
          Absicherung von FTP mit SSL (vgl. HTTPS)
    \item SFTP (Subsystem von SSH)
    \item SCP
    \item HTTPS, WebDAV
    \item Subversion
  \end{itemize}
}

\end{document}
