Capture the Flag

Orientierung

Motivation

Moderne Systeme der Robotik basieren so gut wie immer auf einem Linux-System. Dadurch ist es unerlässlich, sich zumindest grundlegend mit der Befehlszeile in Linux auszukennen. Häufige Aufgaben sind hier das Ausführen von Befehlen, das Suchen und Finden von Dateien und das Ausgeben von Dateien. Die hier durchführbare Übung ermöglicht es, die drei häufigsten Tätigkeiten kennen zu lernen und zu üben.

Lernvoraussetzung

  • Sie benötigen keine besonderen Voraussetzungen
  • Sie benötigen ein Programm, um auf einen entfernten Computer zugreifen zu können. Folgende Programme eignen sich dafür:
    • Unter Windows empfiehlt sich PuTTY.
      Alternativ kann auch openSSH unter Windows installiert werden. Die Installation wird HIER erläutert.
    • Unter Linux/MacOS empfiehlt sich openssh-client; von dieser Software gibt es ebenso eine portable Variante openssh portable

Lernergebnisse


Nach der Durchführung der Übung sind Sie in der Lage…
  • … verfügbare Programme auf der Kommandozeile auszuführen.
  • … Dateien basierend auf bestimmten Merkmalen zu finden.
  • … den Inhalt von Dateien zu analysieren und anzuzeigen.

Im Internet findet man eine Vielzahl von verschiedenen Anleitungen. Eine der kürzeren und dennoch verständlichen Anleitungen kann HIER gefunden werden. Tiefergreifende Informationen können HIER abgerufen werden. Im nächsten Abschnitt werden jedoch die benötigten Grundlagen nochmals dargelegt. Eine Seite, auf der komplette Befehle erklärt werden ist unter ExplainShell zu finden.

Wegweiser durch die Übung

Für die Übung benötigt man zwischen 60 und 90 Minuten. Die konkrete Dauer ist hier vom individuellen Lernfortschritt abhängig.

Folgende Aktivitäten/Tätigkeiten werden von Ihnen erwartet:
  • Im Baustein Grundlagen
    • erarbeiten der notwendigen Theorie.
  • Im Baustein Übung
    • lesen Sie sich die Rahmenbedingungen der Übung durch.
    • bekommen Sie noch einen Hinweis, wie Sie mit der Übung starten können.
  • Im Baustein Anwendung
    • bekommen Sie für jede Übungsaufgabe den notwendigen Hinweis um die Übung zu absolvieren.
  • Im Baustein Reflexion
    • erhalten Sie eine kurze Zusammenfassung der Ergebnisse

Grundlagen

Im Folgenden werden die Verbindungsmöglichkeiten mit einem externen Rechner erklärt und die Grundlagen der Unix-Shell gezeigt.

Verbindung mit einem externen Rechner

PuTTY in Windows

Nach dem Starten der Software PuTTY erscheint die nachfolgend abgebildete Benutzeroberfläche. Um eine Verbindung mit einem externen Rechner herzustellen, müssen Host Name und Port angegeben werden. Der Host Name beschreibt den Computernamen und der Port ein Protokoll, das die Verbindung auf dem externen Rechner zuordnet. Über den Port werden nach erfolgreicher Verbindung Daten ausgetauscht. Für diese Online-Übung muss man sich mit dem Rechner engine.ie.technikum-wien.at unter dem Port 4841 verbinden. Dazu müssen die Informationen in den entsprechenden Feldern eingetragen werden. Da eine SSH-Verbindung hergestellt werden soll, muss unter "Connection type" die Option SSH getroffen werden. Im Normalfall ist dies die Standardauswahl und nach dem Start von PuTTY bereits voreingestellt. Für diese Online-Übung müssen keine weitere Einstellungen vorgenommen werden. Somit kann durch Klicken auf den Button Open die Verbindung zum externen Rechner hergestellt werden. Bei erstmaliger Verbindung mit einem Rechner öffnet sich eine Warnmeldung, die mit Ja bestätigt wird.
PuTTY Benutzeroberfläche

Nach erfolgreicher Verbindung öffnet sich eine Konsole, die zum Interagieren mit dem externen Rechner dient. Zuerst wird nach dem Benutzernamen durch "login as:" gefragt. Um die korrekte Anmeldung zu demonstieren, wird der Benutzername level0 in die Befehlszeile der Shell geschrieben und mit Enter bestätigt. Danach erfolgt die Passwortabfrage. Das Passwort des Benutzers level0 lautet ebenfalls level0. Während des Eintippens des Passwortes werden keine Zeichen in der Shell angezeigt! Dabei handelt es sich um keinen Fehler - es soll lediglich der Sicherheit dienen. Nach Eingabe des Passworts, muss wieder mit Enter bestätigt werden. Anschließend erscheint die Information "Starting the Game". Erscheint diese Nachricht, war die Anmeldung am externen Rechner der FH Technikum Wien erfolgreich. Die weiteren Zeilen, die in der Abbildung dargestellt sind, erscheinen nachdem alle Einstellungen am Rechner geladen sind. Dies kann einige Momente in Anspruch nehmen. Weitere Erklärungen sind im nächsten Abschnitt "Befehlszeile und Befehle" beschrieben.
PuTTY Konsole

Shell-Fenster unter Linux/MacOS

Im Gegensatz zu Windowssystemen, muss bei Verwendung von Linux/MacOS kein Programm installiert werden. Bei diesen Betriebssystemen wird eine SSH-Verbindung direkt über die Konsole mit dem vorinstallierten Programm ssh hergestellt. Dazu muss zuerst die Shell unter Linux bzw. ein Terminal unter MacOS gestartet werden. Die Konsole ist in der unteren Abbildung abgebildet, wobei die Darstellung vom verwendeten Betriebssystem abhängig ist. Eine erfolgreiche Verbindung mit dem externen Rechner erfolgt wiederum durch Angabe von Host (engine.ie.technikum-wien.at) und Port (4841). Der Übergabe des Ports erfolgt mithilfe des Attributes -p an den die Portnummer angehängt wird. Zusätzlich muss vor dem Herstellen der Verbindung der Benutzername (level0) übergebehn werden. Der Benutzername wird dazu vor dem Host-Namen gestellt, wobei Benutzername und Host durch ein @ voneinander getrennt werden. Um mit dem Programm "ssh" eine SSH-Verbindung herzustellen, müssen die beschriebenen Parameter folgendermaßen in der Befehlszeile eingegeben werden:
user@SERVICE-SA92C87:~$ ssh USER@HOST -pPORT
Dadurch wird dem Programm mitgeteilt, dass sich der Benutzer USER auf dem Server HOST über den Port PORT anmeldet. Für diese Online-Übung müssen nun die Parameter ersetzt werden:
user@SERVICE-SA92C87:~$ ssh level0@engine.ie.technikum-wien.at -p4841
Wird der Befehl mit Enter bestätigt, wird versucht eine Verbindung aufzubauen. Nach erfolgreicher Verbindung wird nach dem Passwort des Benutzers level0 gefragt. Wie bereits beschrieben, lautet das Passwort level0. Während des Eintippens des Passwortes werden keine Zeichen in der Shell angezeigt! Dabei handelt es sich um keinen Fehler - es soll lediglich der Sicherheit dienen. Nach Eingabe des Passworts, muss wieder mit Enter bestätigt werden. Anschließend erscheint die Information "Starting the Game". Erscheint diese Nachricht, war die Anmeldung am externen Rechner der FH Technikum Wien erfolgreich. Die weiteren Zeilen, die in der Abbildung dargestellt sind, erscheinen nachdem alle Einstellungen am Rechner geladen sind. Dies kann einige Momente in Anspruch nehmen. Weitere Erklärungen sind im nächsten Abschnitt "Befehlszeile und Befehle" beschrieben.
Konsole

Befehlszeile und Befehle

Alle Übungen werden auf der Befehlszeile auf einem Linux-Rechner ausgeführt. Im Folgenden ist die Befehlszeile der Übung abgebildet.
level0@ctf:~$
Hier gibt es verschiedene Elemente, die einem Informationen über das System geben. So bezeichnet level0 den Benutzernamen, mit dem man gerade auf dem Rechner arbeitet. ctf ist der Name des Computers und wird durch das @-Zeichen getrennt. Die Form ist auch von E-Mail Adressen bekannt. Hier wird ebenso ein Benutzername durch ein @ vom Zielsystem getrennt. Als nächstes, getrennt durch :, steht der Pfad des aktuellen Ordners in dem gearbeitet wird. Dabei steht ~ dafür, dass wir uns im Heimat-Verzeichnis des Benutzers befinden. Als letztes Element kommt entweder $ oder # zum Einsatz und dient als Kennzeichnung welche Rechte der aktuelle Benutzer besitzt. Wenn das letzte Element ein $ ist, so handelt es sich um einen regulären Benutzer. Wenn es sich bei dem letzten Element jedoch um ein # handelt, dann handelt es sich bei dem aktuellen Benutzer um einen Administrator des Systems.

Wenden wir uns kurz dem Dateisystem eines Linux-Systems zu. In einem Linux-System besteht das Dateisystem aus Ordnern, Dateien und Links. Ordner werden verwendet, um Dateien zu organisieren. Links werden verwendet, um Dateien und Ordner unter einem anderen Namen ansprechen zu können. Alles andere sind Dateien! Alle Geräte verbundenen Geräte sind als Datei zugänglich. Schauen wir uns einmal den Inhalt des Root-Verzeichnisses (/) an. Dabei handelt es sich um den Basisordner, in dem alle anderen Ordner und Dateien abgelegt sind. Dafür verwenden wir den Befehl ls, auf den wir später nochmal eingehen, und bekommen folgenden Output:
level0@ctf:~$ ls -lah /
total 76K
drwxr-xr-x   1 root root 4.0K Sep 10 08:48 .
drwxr-xr-x   1 root root 4.0K Sep 10 08:48 ..
-rwxr-xr-x   1 root root    0 Sep 10 08:48 .dockerenv
drwxr-xr-x   1 root root 4.0K Apr  4 08:29 bin
drwxr-xr-x   2 root root 4.0K Apr 12  2016 boot
drwxr-xr-x   5 root root  360 Sep 10 08:48 dev
-rwxrwxr-x   1 root root  129 Jun  4 11:10 entrypoint.sh
drwxr-xr-x   1 root root 4.0K Sep 10 08:48 etc
drwxr-xr-x   1 root root 4.0K Jun  4 11:11 home
drwxr-xr-x   1 root root 4.0K Sep 13  2015 lib
drwxr-xr-x   2 root root 4.0K Jan 22  2019 lib64
drwxr-xr-x   2 root root 4.0K Jan 22  2019 media
drwxr-xr-x   2 root root 4.0K Jan 22  2019 mnt
drwxr-xr-x   2 root root 4.0K Jan 22  2019 opt
dr-xr-xr-x 271 root root    0 Sep 10 08:48 proc
drwx------   1 root root 4.0K Jun  4 13:24 root
drwxr-xr-x   1 root root 4.0K Sep 10 08:48 run
drwxr-xr-x   1 root root 4.0K Jan 22  2019 sbin
drwxr-xr-x   2 root root 4.0K Jan 22  2019 srv
dr-xr-xr-x  13 root root    0 Sep 10 07:57 sys
drwxrwx-wx   1 root root 4.0K Apr  4 08:29 tmp
drwxr-xr-x   1 root root 4.0K Jan 22  2019 usr
drwxr-xr-x   1 root root 4.0K Jan 22  2019 var
Folgende Elemente werden uns hier von links nach rechts präsentiert:
  • Information zu den Zugriffsrechten über das folgende Element drwxr-xr-x
    Das führende d kennzeichnet einen Ordner. Wenn es sich um eine Datei handelt, so steht dort -; im Falle einer Verknüpfung findet man dort ein l. Es gibt noch einige andere Buchstaben, die spezielle Dateien bezeichnen, diese können HIER unter dem Punkt --format=verbose nachgelesen werden. Als nächstes werden die Zugriffsrechte abgebildet. Es gibt drei Berechtigungen: Lesen (r), Schreiben (w) und Ausführen (x). Und es gibt drei verschiedene Gruppen, für die es Berechtigungen gibt: den Besitzer, die zugeordnete Gruppe und alle anderen. Sollte eine Berechtigung nicht erteilt sein, so wird sie mit einem - gekennzeichnet.
  • Anzahl der Verlinkungen auf das Element.
  • Besitzer
  • Gruppe
  • Größe
  • Zeitpunkt der letzten Modifikation
  • Name des Elements
Die beiden Elemente . und .. sind besonders. Bei dem Element . handelt es sich um den aktuellen Ordner. Das Element .. bezeichnet den übergeordneten Ordner. Diese beiden Elemente sind in jedem Ordner vorhanden, werden jedoch normalerweise nicht angezeigt, da es sich um versteckte Dateien handelt. Eine Datei ist in Linux dann versteckt, wenn das erste Zeichen des Namens ein Punkt ist.

Um das Dateisystem zu navigieren, verwendet man absolute und relative Pfade. Der Unterschied zwischen einem absoluten und einem relativen Pfad ist, dass ein absoluter Pfad den gesamten Pfad einer Datei bezeichnet, während ein relativer Pfad eine Datei vom aktuellen Ordner aus bezeichnet. Jeder Pfad, der mit einem / beginnt, ist ein absoluter Pfad, alle anderen Angaben sind relative Pfade. Hier kommen die speziellen Elemente von vorher ins Spiel. Nur durch sie ist es möglich, einen relativen Pfad anzugeben. Bei einer Pfadangabe werden die einzelnen Pfadelemente durch einen / getrennt. Ein Beispiel für eine absolute und eine relative Pfadangabe können wir hier sehen:
level0@ctf:/home$ ls -l /entrypoint.sh
-rwxrwxr-x 1 root root 129 Jun  4 11:10 /entrypoint.sh
level0@ctf:/home$ ls -l ../entrypoint.sh
-rwxrwxr-x 1 root root 129 Jun  4 11:10 ../entrypoint.sh
In beiden Fällen sind wir im /home Verzeichnis, welches wir schon im letzten Beispiel sehen konnten. Im ersten Fall verwenden wir die absolute Pfadangabe, um uns die Datei anzeigen zu lassen. Im zweiten Fall ist es die relative Angabe. Wir erinnern uns, dass sich die relative Pfadangabe immer auf den aktuellen Ordner bezieht, und dass das Element .. einen Ordner nach oben geht. Damit sieht der Pfad folgendermaßen aus: /home/../entrypoint.sh.

Nachdem wir uns kurz den Pfaden gewidmet haben, sehen wir uns einmal an, wie man einen Befehl ausführen, oder eine ausführbare Datei, auch Programm genannt, starten kann. Um einen Befehl oder ein Programm auszuführen, muss im Regelfall nur der Name eingegeben werden und mit Enter bestätigt werden. Das System sucht selbstständig in verschiedenen Suchordnern nach dem Programm, welche durch die Systemvariable PATH definiert sind. Wenn eine ausführbare Datei in den Ordnern /bin, /usr/bin, /usr/local/bin, ~/bin oder ~/.local/bin ist, handelt es sich um den Regelfall und die Datei wird automatisch gefunden. Wenn das Programm nicht in einem der vorher angeführten Ordnern ist, kann man durch die Angabe eines relativen oder absoluten Pfades des Programmes dieses ausführen. Sollte man jetzt zum Beispiel ein Programm names testProgramm haben und sich im selben Ordner wie das Programm aufhalten, so kann es einfach über ./testProgramm ausgeführt werden. In dieser Übung kommen keine eigenen Programme zum Einsatz, alle Programme sind im Suchpfad des Systems.

Ordner wechseln und Inhalt anzeigen

Um den aktuellen Ordner zu wechseln, gibt es den Befehl cd. Dabei gibt man als Argument den Zielordner als absoluten oder relativen Pfad an. Hier sehen wir ein paar Beispiele:
level0@ctf:~$ cd /var
level0@ctf:/var$ cd ../etc
level0@ctf:/etc$ cd ~
level0@ctf:~$ cd /home
level0@ctf:/home$ cd level0
level0@ctf:~$ cd .
level0@ctf:~$ cd ../..
level0@ctf:/$ cd
level0@ctf:~$
Wenn kein Argument angegeben wird, dann wird in das Heimat-Verzeichnis gewechselt.

Um den Inhalt eines Verzeichnisses anzuzeigen, gibt es zwei verschiedene Möglichkeiten. Einerseits gibt es den schon verwendeten Befehl ls. Andererseits gibt es den Befehl tree. Während der erste Befehl auf jedem Linux-System existiert, muss der zweite Befehl nachinstalliert werden. Aus diesem Grund widmen wir uns dem Befehl ls. Der Befehl kann ohne ein Argument aufgerufen werden, dann arbeitet er am aktuellen Verzeichnis. Man kann jedoch auch eine Vielzahl an absoluten und relativen Pfadangaben angeben, und er wird für jedes Verzeichnis den Inhalt des Verzeichnisses darstellen. Ohne weitere Optionen werden nur die Namen der sichtbaren Elemente im angegebenen Ordner angezeigt. Im Folgenden eine kurze Übersicht über mögliche nützliche Optionen:
-a
Es sollen alle Dateien, also auch die versteckten Dateien, angezeigt werden.
-l
Es werden nicht nur die Namen, sondern auch interessante Attribute angezeigt. Diese Attribute sind schon weiter oben genannt worden.
-h
Größenangaben sollen nicht in Blockgrößen, sondern in verständlichen Einheiten angegeben werden.
-F
Es wird ein Indikator an die Namen angehängt, wenn es sich nicht um eine reguläre Datei handelt. Es gibt folgende Indikatoren:
*
Es handelt sich um eine Ausführbare Datei.
/
Es handelt sich um einen Ordner.
=
Es handelt sich um einen Socket.
>
Es handelt sich um eine Door.
@
Es handelt sich um eine Verlinkung.
|
Es handelt sich um eine Pipe mit einem Namen.

Dateien analysieren

Es gibt verschiedene Möglichkeiten eine Datei zu analysieren. Folgende Befehle sind hilfreich:
  • file
  • wc
  • grep
  • diff
  • cmp
  • cksum
Beginnen wir mit dem file Befehl. Dieser analysiert eine Datei und gibt verschiedene Informationen aus. Ein wichiger Punkt ist, dass er Auskunft darüber gibt, ob eine Datei für Menschen lesbar ist, oder nicht.
level0@ctf:~$ file /bin/bash
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6.32, BuildID[sha1]=04eca96c5bf3e9a300952a29ef3218f00487d37b, stripped
level0@ctf:~$ file /entrypoint.sh
/entrypoint.sh: Bourne-Again shell script, ASCII text executable
Im ersten Beispiel wird ein Programm analysiert, im zweiten Beispiel eine Textdatei. Dass es sich bei dem zweiten Beispiel um eine Textdatei handelt, kann man an dem Zusatz ASCII text erkennen. Durch die Option -i wird klarer, jedoch kürzer dargestellt, um was für Dateien es sich handelt. Dabei wird der MIME Type der Datei ausgegeben.
level0@ctf:~$ file -i /bin/bash
/bin/bash: application/x-executable; charset=binary
level0@ctf:~$ file -i /entrypoint.sh
/entrypoint.sh: text/x-shellscript; charset=us-ascii
Der Befehl wc liefert verschiedene Metriken einer Datei. Das Programm kennt folgende Optionen:
-c
Diese Option liefert die Anzahl an Bytes der angegebenen Datei.
-w
Diese Option liefert die Anzahl an Wörtern in der angegebenen Datei.
-l
Diese Option liefert die Anzahl an Zeilen der angegebenen Datei.
Das folgende Beispiel zeigt die Verwendung des Programms.
level0@ctf:~$ wc /entrypoint.sh
 10  23 129 /entrypoint.sh
level0@ctf:~$ wc -l /entrypoint.sh
10 /entrypoint.sh
level0@ctf:~$ wc -w /entrypoint.sh
23 /entrypoint.sh
level0@ctf:~$ wc -c /entrypoint.sh
129 /entrypoint.sh
Der Befehl grep ist in der Lage, Dateien nach Begriffen zu durchsuchen. Ist der gesuchte Begriff in der Datei vorhanden, wird die gesamte Zeile, in der der Begriff vorkommt, in der Konsole ausgegeben. Der Befehl setzt sich aus dem Programm grep, dem Suchbegriff sowie der zu durchsuchenden Datei zusammen. Wenn der gesuchte Begriff mehrmals in der Datei vorkommt, werden alle Zeilen mit dem Begriff in der Konsole ausgegeben. Im Gegensatz dazu erscheint keine Ausgabe in der Konsole und damit auch keine Information, wenn der gesuchte Begriff nicht gefunden wurde. Durch die Option -c zeigt das Programm nicht jede Zeile an, in der der gesuchte Begriff vorkommt, sondern wie oft der Begriff in der Datei vorkommt. Die nachfolgenden Beispiele veranschaulichen das Verhalten des grep-Befehls.

Der Befehl diff vergleicht zwei Dateien miteinander und zeigt an, wo sich die Dateien unterscheiden. Eine umfassende Anleitung für den Befehl gibt es HIER. Während diff auf Textdateien zugeschnitten ist, da es zeilenweise vergleicht, ist das Programm cmp universell. Dieses Programm vergleicht Dateien byteweise. Im nachstehenden Beipiel wird der Unterschied verdeutlicht.
level0@ctf:/tmp/test$ ls -lh
total 8.0K
-rw-rw-r-- 1 level0 level0 63 Sep 12 13:34 datei1
-rw-rw-r-- 1 level0 level0 63 Sep 12 13:34 datei2
level0@ctf:/tmp/test$ diff datei1 datei2
3c3
< Nummer 123
---
> Nummer 321
level0@ctf:/tmp/test$ cmp datei1 datei2
datei1 datei2 differ: char 60, line 3
Der Befehl cksum berechnet eine einfache Prüfsumme für die angegebenen Dateien. Die generierte Prüfsumme ist ein Indikator, ob etwas an einer Datei verändert worden ist. Sie gibt aber keinen Aufschluss darüber, was verändert worden ist. Darüber geben jedoch die beiden vorhergehenden Programme Aufschluss. Prüfsummen eignen sich, um sicherzustellen, dass eine Datei korrekt übertragen worden ist (z.B. beim Kopieren).
level0@ctf:/tmp/test$ ls -lh
total 8.0K
-rw-rw-r-- 1 level0 level0 63 Sep 12 13:59 datei1
-rw-rw-r-- 1 level0 level0 63 Sep 12 13:59 datei2
level0@ctf:/tmp/test$ cksum datei1 datei2
1438393268 63 datei1
3289888160 63 datei2

Dateien ausgeben

Es gibt verschiedene Möglichkeiten eine Datei auszugeben. Folgende Befehle sind hilfreich:
  • cat
  • sort
  • uniq
  • less
  • head
  • tail
Der Befehl cat gibt den Inhalt aller angegebenen Dateien aus. Sollte der Inhalt so groß sein, dass er nicht auf das aktuelle Konsolenfenster passt, so muss man hoffen, dass man scrollen kann. Ist dies nicht möglich, so sieht man nur den untersten Teil der Datei.

Mithilfe des Befehls sort kann der Inhalt einer Datei sortiert werden, wobei die Datei selbst nicht geändert wird, sondern lediglich der sortierte Inhalt der Datei in der Konsole ausgegeben wird. Ohne Angabe weiterer Optionen erfolgt die Sortierung alphabetisch. Das Attribut -n beispielsweise ermöglicht eine numerische Sortierung. Weitere Optionen, die in dieser Übung jedoch nicht angewendet werden müssen, werden HIER erklärt.

Ein weiteres wichtiges Programm zum Ausgeben von Dateiinhalten ist uniq. Dadurch wird eine Datei zeilenweise analysiert, indem jede Zeile mit der jeweils darüberliegenden Zeile verglichen wird. Sind hintereinander folgende Zeilen ident, wird die Zeile nur einmal ausgegeben. Die Option -c gibt die Anzahl jeder Zeile an. Eine weitere wichtige Option ist -u, wodurch mehrmals vorkommende Zeilen nicht ausgegeben werden. An dieser Stelle sei nochmals erwähnt, dass der Zeilenvergleich nur mit der jeweils darüberliegenden Zeile erfolgt.

Größere Dateien können mit dem Programm less angezeigt werden. In diesem Programm ist es möglich mit den Pfeiltasten zu scrollen, und Text zu suchen. Zusätzlich ist es möglich zwischen den einzelnen gefundenen Textpassagen herumzuspringen.

Die Namen der beiden Programme head und tail lassen vermutlich schon erahnen, was mit den Programmen möglich ist. Das erste Programm kann eine beliebige Anzahl (standardmäßig sind es 10) an Zeilen vom Anfang der Datei ausgeben. Das zweite Programm gibt eine beliebige Anzahl an Zeilen vom Ende der Datei an.
level0@ctf:~$ cat /entrypoint.sh
#!/bin/bash
set -e

service ssh start

if [ "$1" = '/bin/bash' ]; then
    /bin/su - level0
else
    /bin/su - level0 -c "$@"
fi
level0@ctf:~$ head -n 2 /entrypoint.sh
#!/bin/bash
set -e
level0@ctf:~$ tail -n 2 /entrypoint.sh
    /bin/su - level0 -c "$@"
fi

Dateien suchen

Um unter Unix ein Element zu finden, sei es eine Datei, ein Ordner, oder sonstiges, wird der Befehl find verwendet. Das Programm benötigt einen Suchpfad und kann durch verschiedene Parameter angepasst werden. Das Programm sucht nur ausgehend vom angegebenen Suchpfad. Um das gesamte System zu durchsuchen, muss / als Suchpfad angegeben werden. Es kann nur Elemente finden, für die man entsprechende Berechtigungen hat. Eine kurze Auswahl möglicher Parameter:
-name und -iname
Diese Parameter suchen nach einem bestimmten Namen, welcher direkt nach dem Parameter angegeben werden muss. Die erste Form berücksichtigt die Groß- und Kleinschreibung des angegebenen Namens, die zweite Form tut dies nicht.
-type
Dieser Parameter schränkt die Art des zu suchenden Elements ein. Die Art des zu suchenden Elements muss angegeben werden. Dabei steht f für eine Datei, d für ein Verzeichnis und l für einen Verweis.
-user
Es werden nur Dateien angezeigt, die dem spezifizierten Benutzer gehören.
-group
Es werden nur Dateien angezeigt, die einer spezifizierten Gruppe gehören.
-size
Es werden nur Dateien angezeigt, die eine gewisse Größe haben. Sollte die angegebene Zahl den Suffix c haben, so bezeichnet die Zahl die Anzahl an Bytes. Ansonsten wird die Blockanzahl spezifiziert.
-maxdepth
Dieser Parameter gibt an, wie tief im Dateisystem gesucht werden soll. So bedeutet -maxdepth 1 nur die Suche im aktuellen Ordner.
-readable -writeable -executable
Diese Tests prüfen, ob die Dateien vom aktuellen Benutzer gelesen, beschrieben oder ausgeführt werden dürfen.
-not
Damit kann ein nachfolgender Test invertiert werden.
Neben den Optionen zum spezifizieren was gefunden werden soll, können noch ausgewählte Funktionen ausgeführt werden. Im Folgenden eine kurze Auswahl möglicher Aktionen:
-print
Die gefundenen Dateien werden auf der Konsole angezeigt. Jede Datei steht in einer neuen Zeile.
-print0
Die Dateien werden auf der Konsole angezeigt. Anders als bei der vorhergehenden Option werden die Dateinamen durch ein Zeichen mit dem Zahlenwert 0 getrennt.
-ls
Es wird auf die gefundenen Dateien das Programm ls -dils angewandt.
-exec ... \;
Damit ist es möglich, beliebige Befehle auf die gefundenen Dateien anzuwenden. Der Befehl wird auf jede Datei einzeln angewandt. Dabei wird {} an jener Stelle geschrieben, wo der Name der aktuellen Datei stehen soll und vom Befehl automatisch ersetzt.
-exec ... \+
Damit ist es möglich, beliebige Befehle auf die gefundenen Dateien anzuwenden. Der Befehl wird auf alle gefundenen Dateien angewandt. Dabei wird {} an jener Stelle geschrieben, wo der Name der aktuellen Datei stehen soll und vom Befehl automatisch ersetzt.
Die nachfolgenden Beispiele zeigen den Unterschied zwischen den beiden Exec Funktionen und wie man alle Dateien mit einem gewissen Namen finden kann. In diesem Fall werden alle Dateien gefunden, die auf .sh enden. Die letzten beiden Beispiele zeigen, wie man Fehlermeldungen unterdrücken kann. Diese Beispiele limitieren die maximale Tiefe, damit die Ausgabe der Befehle nicht zu lange wird.
level0@ctf:~$ find / -maxdepth 1 -executable -type f -ls -exec file '{}' \;
  1706606      0 -rwxr-xr-x   1 root     root            0 Sep 13 09:15 /.dockerenv
/.dockerenv: empty
   918842      4 -rwxrwxr-x   1 root     root          129 Jun  4 11:10 /entrypoint.sh
/entrypoint.sh: Bourne-Again shell script, ASCII text executable
level0@ctf:~$ find / -maxdepth 1 -executable -type f -ls -exec file '{}' \+
  1706606      0 -rwxr-xr-x   1 root     root            0 Sep 13 09:15 /.dockerenv
   918842      4 -rwxrwxr-x   1 root     root          129 Jun  4 11:10 /entrypoint.sh
/.dockerenv:    empty
/entrypoint.sh: Bourne-Again shell script, ASCII text executable
level0@ctf:~$ find / -maxdepth 1 -name '*.sh' -ls -exec file '{}' \;
   918842      4 -rwxrwxr-x   1 root     root          129 Jun  4 11:10 /entrypoint.sh
/entrypoint.sh: Bourne-Again shell script, ASCII text executable
level0@ctf:~$ find / -maxdepth 2 -type f -size 0c -executable -ls
find: '/root': Permission denied
find: '/tmp': Permission denied
  1706606      0 -rwxr-xr-x   1 root     root            0 Sep 13 09:15 /.dockerenv
level0@ctf:~$ find / -maxdepth 2 -type f -size 0c -executable -ls 2>/dev/null
  1706606      0 -rwxr-xr-x   1 root     root            0 Sep 13 09:15 /.dockerenv

Dateien bearbeiten

Es gibt eine Vielzahl an Möglichkeiten Dateien auf einem Linux-System zu bearbeiten. Zwei der gängigeren Programme sind Vim, welches so gut wie überall zumindest in der Version vim.tiny installiert ist, und nano. Eine Online-Anleitung zu Vim finden Sie HIER und HIER. Alternativ können Sie den Befehl vimtutor verwenden. Das Bearbeiten von Dateien ist nicht Teil der Übung.

Übung

Bei der Übung müssen Sie sich auf einem entfernten Computer einloggen und zehn Level absolvieren. Ziel jedes Levels ist es, das Passwort für das nächste Level zu finden. Sie bekommen dabei in der Übungsanleitung und auf dieser Seite Hinweise, wie das nächste Passwort gefunden werden kann. Sobald Sie im Home-Directory eine Datei namens data.txt mit dem Inhalt Congratulations, you are done finden, haben Sie alle Level absolviert.

Ziel dieser Übung ist es, den Umgang mit einer Linux-Umgebung zu erlernen. Dabei lernen Sie:
  • Ausgabe von Dateien
  • Gezieltes Suchen

Anwendung

Der Zugang zu dieser Onlineübung erfolgt über SSH. Dabei kann jeder beliebige SSH-Client verwendet werden. Für Windows-Benutzer empfiehlt sich PuTTY. Für Linux-Benutzer empfiehlt sich der openssh-client. Dieser kann über die Paketverwaltung installiert werden. Es können maximal 20 Personen gleichzeitig auf diese Übung zugreifen. Nach 10 Minuten Inaktivität wird das Spiel automatisch beendet.

In Level 0

Folgende Informationen benötigen Sie um auf die Übung zugreifen zu können:
  • Host: engine.ie.technikum-wien.at
  • Port: 4841
  • Benutzername Level 0: level0
  • Passwort Level 0: level0

In Level 1

Das Passwort ist in einer Datei namens readme im Heimat-Verzeichnis des Benutzers. Mit dem in der Datei abgespeicherten Passwort ist es möglich, das nächste Level zu erreichen. Jedes mal, wenn ein Passwort für ein Level gefunden wird, muss das Programm ssh verwendet werden, um das nächste Level zu erreichen. Die anderen Level sind nicht von außerhalb zugänglich, sondern können nur über die Adresse localhost erreicht werden. Damit können Sie den folgenden Befehl verwenden, um sich auf Level 1 einzuloggen: ssh level1@localhost.

Hilfreiche Befehle: ls, cd, cat, file, du, find

In Level 2

Das Passwort ist in einer Datei namens - zu finden. Diese Datei befindet sich im Heimat-Verzeichnis des Benutzers. Hinweis: Das Argument - bedeutet bei vielen Programmen, dass die Optionen Enden, und nur noch Argumente kommen. Überlegen Sie, ob Ihnen das Dateisystem helfen kann, damit Sie nicht nur den einzelnen Bindestrich angeben müssen.

Hilfreiche Befehle: ls, cd, cat, file, du, find

In Level 3

Das Passwort des nächsten Levels ist in einer Datei mit dem Namen spaces in this filename.

Hilfreiche Befehle: ls, cd, cat, file, du, find

In Level 4

Das Passwort ist in einer versteckten Datei im Verzeichnis inhere.

Hilfreiche Befehle: ls, cd, cat, file, du, find

In Level 5

Das Passwort ist die einzig lesbare (reiner ASCII-Text) Datei im inhere Verzeichnis. Sollten Sie das Terminal durch die Ausgabe der nicht lesbaren Dateien soweit verändert haben, dass Sie nicht damit arbeiten können, verwenden Sie den reset-Befehl um es wieder funktionstüchtig zu bekommen.

Hilfreiche Befehle: ls, cd, cat, file, du, find

In Level 6

Das Passwort ist irgendwo im inhere Verzeichnis und besitzt folgende Eigenschaften:
  • ASCII-Text
  • 41 bytes groß
  • nicht ausführbar
Hilfreiche Befehle: ls, cd, cat, file, du, find

In Level 7

Das Passwort ist in einer Datei irgendwo auf dem Server und hat die folgenden Eigenschaften:
  • Besitzer: level7
  • Gruppe: level6
Hilfreiche Befehle: ls, cd, cat, file, du, find, grep
Achtung! Beim Lösen dieses Levels kann es zu Unix-Fehlermeldungen kommen. Überlegen Sie deshalb, wie Sie die Fehlermeldungen umgehen können. Um die Suchzeit zu verringern, empfiehlt es sich außerdem, nicht die gesamte Ordnerstruktur des Servers zu durchsuchen, sondern eine maximale Tiefe von 6 zu verwenden.

In Level 8

Das Passwort ist in der Datei data.txt neben dem Wort million.

Hilfreiche Befehle: grep, sort, uniq, strings, base64

In Level 9

Das Passwort ist in der Datei data.txt die einzige einmalig vorkommende Zeile.

Hilfreiche Befehle: grep, sort, uniq, strings, base64

In Level 10

Das Passwort ist in der Datei data.txt als base64 kodierter Text abgelegt.

Hilfreiche Befehle: grep, sort, uniq, strings, base64

Reflexion

Nach der Durchführung der Onlineübung sind Sie in der Lage, die Linux-Befehlszeile zu verwenden. Sie haben gesehen, wie man Dateien finden und anzeigen kann. Ebenso haben Sie gelernt, wie man verschiedene Programme ausführen kann. Damit haben Sie die Grundlagen zum Interagieren mit der Befehlszeile kennen gelernt.

Selbstevaluierung

Nachfolgend werden Fragen angezeigt, die Sie nach erfolgreicher Absolvierung der Onlineübung beantworten können. Die Lösung kann durch Klicken auf die Frage angezeigt werden.

Wie lautet der Code, um sich mit einem externen Server zu verbinden?

ssh USER@SERVER -p PORT

Wie lautet der Befehl um auch versteckte Inhalte eines beestimmten Verzeichnisses anzuzgein?

ls PATH -a

Wozu wird das Attribut -exec beim Programm find verwendet?

Dieses Attribut ermöglicht es, auf gefundene Dateien weitere Befehle anzuwenden.

Welchen Befehl verwenden Sie um die Anzahl der Zeilen einer Datei zu ermitteln?

file PATH/FILENAME -l

Wozu wird das Programm grep verwendet?

Das Programm dient zum Suchen von Begriffen in Dateien.

Welche Informationen beinhaltet die Befehlszeile PARAM1@PARAM2:~$?

Die ersten beiden Elemente zeigen an, dass sich der Benutzer PARAM1 am Rechner PARAM2 befindet. Die beiden Informationen sind durch das @ Symbol getrennt. Zusätzlich wird der aktuelle Pfad des aktuellen Verzeichnisses nach dem : Symbol angezeigt, wobei ~$ für das Heimatverzeichnis steht.

Take-Home-Messages

  • ssh Programm zum Verbinden mit einem externen Rechner
  • ls zum Anzeigen des Ordnerinhaltes
  • cd um den Ordner zu wechseln
  • cat um Dateien auszugeben
  • find um nach Dateien und Ordnern zu suchen
  • file zum Analysieren einer Datei
  • sort um den Inhalt einer Datei zu sortieren
Hier finden Sie eine Zusammenfassung der verlinkten Literatur.

Weiterführende Themengebiete

  • Redirects


    Dabei wird die Ein- und/oder Ausgabe in Dateien umgeleitet.
  • Pipes


    Dabei wird der Output eines Programms zum Input eines anderen Programmes.
  • Scripting


    Ein Shell-Script ist eine Abfolge von Befehlen, die ausgeführt werden sollen. Um komplexere Shell-Scripts zu erstellen, fehlen jedoch noch verschiedene Komponenten. Diese sind unter anderem:
    • Verzweigungen
    • Schleifen
    • Variablen
    • Das Programm sed
  • systemd


    Damit können Services erstellt werden. Services sind Programme, die bei Systemstart gestartet werden und bestimmte Aufgaben übernehmen.

This site uses cookies

Cookies help us to improve your browsing experience and analyze site traffic. Find out more on how we use cookies.
I accept cookies
I refuse cookies