RSS-Feed anzeigen

jahlives

Einmalpassworte verwenden

Bewerten
Einmalpassworte haben einen entscheidenden Vorteil gegenüber normalen Passworten: Man kann sie auch von einem möglicherweise unsicheren Client aus verwenden.
Für Einmalpassworte gibt es z.B. den opie-server in den meisten Linuxdistributionen. Einmal eingerichtet und an einen Dienst (z.B. ssh via PAM) gebunden, präsentiert der Server dem Client eine sogenannte Challenge, die er lösen muss. Kann er sie lösen gilt er als authentifiziert und erhält Zugang zum Dienst.

Im Folgenden soll es nicht um die Einrichtung von opie-server gehen. Das ist relativ schnell erledigt und es gibt massig Beschreibungen und HowTo's dazu. Ich möchte hier zeigen wie einfach man eine (imho) Schwachstelle von opie mit einem eigenen Script ausbügeln kann.
Die Schwachstelle ist, dass die Challenge nicht verfällt, wenn zu oft probiert wurde sie zu lösen. Man fliegt zwar aus dem Anmeldedialog raus, bekommt aber dieselbe Challange beim nächsten Versuch. Es ist zwar EXTREMST unwahrscheinlich, dass man eine Challenge durch BruteForce lösen kann, aber sicher ist sicher ;-)

Entstanden ist folgendes Script. Damit es laufen kann muss man erstmal eine statische Liste mit Challenges erstellen. Dabei ist es wichtig, dass dieses File sehr gut geschützt wird, denn mit den Hashes der Challenges kann man sie brechen (braucht zwar Aufwand, aber es ist möglich...)
Daher sollte das File nur Leserechte für root haben und sonst niemanden
Code:
opiekey -n 100 -x SEQUENZ-NUMMER SALT > opie.keys && chmod 0600 opie.keys
SEQUENZ-NUMMER bekommt man mittels opieinfo USER (USER ist meist root). Die erste Zahl ist die gesuchte Sequenz-Nummer und der zweite Wert der SALT. Zusätzlich wird bei obigem Kommando das Passwort abgefragt, unter welchem man den opie beim opiepasswd -c, initialisiert hat.
Wenn man dieses File generiert hat, kann man folgendes Script laufen lassen
Code:
#!/bin/bash


setNextOPIE() {
 TEMP=$(opieinfo root)
 SEQ=$(echo $TEMP | awk '{print $1}')
 SALT=$(echo $TEMP | awk '{print $2}')
 HEX=$(grep ^$SEQ":" ./opie.keys | awk -F':' '{print $2}' | awk '{print $1 $2 $3 $4}')
 echo "root 0$SEQ $SALT $HEX $(date +'%b %e,%Y %R:%S')" > /etc/opiekeys
 echo "Added new challenge as: root 0$SEQ $SALT $HEX"
 cp -f ./opie.tmp ./opie.log > /dev/null 2>&1 && echo > opie.tmp
}


while true ; do
 printf "$(grep 'Failed keyboard-interactive/pam' /var/log/auth.log)" > ./opie.tmp 2>/dev/null
 diff -qbwBE ./opie.log ./opie.tmp > /dev/null 2>&1
 [ $? -eq 1 ] && setNextOPIE
 sleep 1
done
das Script prüft das ssh Log (auth.log) alle 2 Sekunden auf den String 'Failed keyboard-interactive/pam' und schreibt diese Zeilen in ein tmp File (opie.tmp). Dann wird das tmp file mit dem "alten" Zustand (opie.log) verglichen und bei Unterschieden wird ein neuer Challenge hinzugefügt.

Das Script ist keinesfalls als fertig zu bezeichnen, sondern soll mehr einen Proof-of-Concept darstellen. Ich habe mir die Finger wundgesucht im Web, aber keinen Weg gefunden diese Funktion direkt in opie-server irgendwie zu aktivieren. Grundsätzlich funzt das Script aber :-)
Kategorien
Linux

Kommentare