Willkommen, Gast
Benutzername: Passwort: Angemeldet bleiben:
  • Seite:
  • 1

THEMA:

Rätsel, was macht dieser Befehl? 4 Jahre 5 Monate her #1

  • Rainer
  • Rainers Avatar Autor
  • Offline
  • Fresh Boarder
  • Fresh Boarder
  • Beiträge: 7
  • Dank erhalten: 0
openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2> /dev/null | base64)" -nosalt < /dev/zero > /dev/sdX
Habe ich übrigens gar nicht ausprobiert! Mache ich aber bald mal!

Bitte Anmelden um der Konversation beizutreten.

Rätsel, was macht dieser Befehl? 4 Jahre 5 Monate her #2

  • klaren
  • klarens Avatar
  • Offline
  • Administrator
  • Administrator
  • JID:klaren@im.kaalug.de
  • Beiträge: 645
  • Dank erhalten: 161
Hallo Rainer,

das ist eine echt gute Frage!! Vielen Dank dafür. Wo hast du das Kommando her?

Und das ist nicht nur ein Befehl, sondern eine Verschachtelung von Befehlen.

Zunächst mal das hier:
$(dd if=/dev/urandom bs=128 count=1 2> /dev/null | base64)

Wenn du das einzeln in der Shell ausführst - z.B. so:
echo $(dd if=/dev/urandom bs=128 count=1 2> /dev/null | base64)

kommt zum Biespiel das bei raus:
7WUHcpOWWdAkGkYSVf2pEjyy1IFBKlkn/uxArtjHt7BUGb+iBDBcuCNlggMeby1c6jOChfBKmi7s uH+SAkkuq/PfX0xNZrjblL+dBiwSZHyVkA9asCxLd1THujnDj9VvZU1jaCmOXxol07aGbI04L2do s/XRrcFpePUK5V2lPsA=

Das Kommando " dd " wird hier benutzt um von /dev/urandom (if=/dev/urandom) zu lesen. Das sind Zufallszahlen. "dd" liest genau 128 Bytes an Zufallswerten (bs=128 count=1).

dd if=/dev/urandom bs=128 count=1 2> /dev/null

Was macht "2> /dev/null" ?

Dieser Ausdruck leitet die Standardfehlerausgabe um nach "nirgendwo". /dev/null ist die Müllhalde, das Datennirvana. Ein Witz unter Unixleuten ist es doch das Backup nach >/dev/null zu machen, da das sehr schnell ist.
Warum braucht man das hier?
Das dd Kommand gibt auch Daten auf dem Fehlerkanal aus, die sich ansonsten in die Ausgabe der Pipe und damit in das Format des Passworts mischen könnten, wenn man das nicht umleitet. Lässt man das weg, funktioniert das Kommando nicht mehr.

Beispiel (gleiches Kommando wie oben, nur ohne 2>/dev/null):
echo $(dd if=/dev/urandom bs=128 count=1 | base64)
1+0 Datensätze ein
1+0 Datensätze aus
128 Bytes kopiert, 0,0002601 s, 492 kB/s
2pzF48N/n8GabErMdEuigF+C3c2IqiA6dHah+wBf0sKabSf70r/VT2rL90vMMu3jJZn/ku8jSLnm NgWK2NWohofT2tGknhbJzuzXUQXfMHuLkWMBCORQiUjjWzD8OYMer7QOaGfyHj70huNE0EJL/0Mi MYxGL0o+FRdBN1TKpgs=

Der Teil in blau ist was von dd aus über den Standard Fehlerkanal geht und was das erwartete Eingabeformat für die openssl Option -pass stört.

Kommen wir zum Ausdruck "| base64". Die 128 Bytes an "reinem" Zufall, die das dd Kommando liefert wird mittels Pipe ( | ) an das Kommando "base64" übergeben und damit mit base64 kodiert.

So, was macht dann der Ausdruck "$( )" ?
Er nimmt die Ausgabe der Kommandokette und setzt diese als Zeichenkette an der Stelle ein. Will heißen, die base64 kodierte Zufallszahl wird der Option -pass des Kommandos openssl übergeben.

Kommen wir zum Kern des Kommandos:
openssl enc -aes-256-ctr -pass pass:"ZUFALLSZAHL" -nosalt < /dev/zero > /dev/sdX

openssl ist ein Tausendsasser was Verschlüsselung, Zertifikatserstellung und -prüfung angeht. Hier wird das openssl Werkzeug " enc" verwendet.

Es verschlüsselt Daten mit einem Algorithmus. Der Algorithmus, der hier ausgewählt ist ist "aes-256-ctr".
AES ist ein symmetrisches Verschlüsselungsverfahren. Man hat also genau einen Schlüssel zum ver- und entschlüsseln. Dieser Schlüssel ist das was mit der Option -pass übergeben wird - die Zufallszahl.

-nosalt Option sorgt dafür das das Passwort nicht mit einer weiteres Zufallszahl "gesalzen" wird. Das "salzen" verwendet man, damit z.B. die gleiche Passphrase nicht zu exakt dem gleichen verschlüsselten Zeichenkette führt. Denn sonst könnte man ja einfach die verschlüsselten Werte mit bekannten Passwörtern vergleichen und so Rückschlüsse auf das original Passwort treffen. Aber ich schweife ab.

Kommen wir zu:
< /dev/zero

Das bedeutet wir lesen (endlos) NULLEN von einem speziellen Unix "Gerät" das sich zero nennt.

>/dev/sdX

Das ist eine Ausgabeumleitung an ein Speicherlaufwerk.

Vermutlich hat man dir gesagt das man X gegen einen anderen Buchstaben z.B. a, b, c austauschen muss.
/dev/sdX sind Speicherlaufwerke. Das kann deine Festplatte sein, aber auch eine SD Karte oder eine USB Festplatte oder -stick.

Wenn du dieses Kommando auf ein Speicherlaufwerk los lässt sorgt es dafür, dass der Speicher komplett mit (Pseudo-) Zufallszahlen überschrieben wird. Mach das besser nicht mit deiner Systemfestplatte, wenn dir deine Installation lieb ist. :evil:
Auf einen USB Stick angewendet entfernt es rückstandsfrei alles was darauf gespeichert war. :cheer:

Wie komme ich darauf, das es so ist? Nun, zum einen liest die Verschlüsselung von /dev/zero. Es werden also nur Nullen verschlüsselt. Zum anderen wird an keiner Stelle das zufällig generierte Passwort irgendwo sonst gespeichert. Somit sind die Eingaben, egal was es ist, verloren, da man nicht auf das zufällig generierte Passwort zurück schließen kann.

Warum, könntest du nun fragen, macht man so einen komplizierten Lindwurm, wenn man einfach Zufall von /dev/urandom lesen könnte, um damit den Speicher zu überschreiben?

Der Grund erscheint vielleicht zuerst orthodox: Geschwindigkeit

Das AES verschlüsselt die gelesenen Nullen mit dem zufälligen Schlüssel. Das sind keine Zufallszahlen sondern die Ausgabe ist eine Funktion der Eingabe Null und der Eingabe Passwort.
/dev/urandom liefert aber nach besten Möglichkeiten zufällige Werte. Der Unix Kernel treibt da einigen Aufwand damit die generierten Zahlen möglichst nah an Zufallswerten herankommen. Das ist wichtig, da alle kryptographischen Verfahren auf möglichst echte, nicht reproduzierbare Zufallszahlen aufbauen.
Das ist tatsächlich wesentlich aufwändiger und wesentlich langsamer als die AES Verschlüsselung. AES Verschlüsselung besitzt sogar eine Hardwarebeschleunigung in so ziemlich allen CPUs.
Und nun stelle man sich vor, das wir nicht nur 128 Bytes echten Zufall brauchen, sondern gleich ein Giga oder Tera Byte... das kann dauern.

Ich hoffe das hilft dir.

Liebe Grüße,
Klaren
Folgende Benutzer bedankten sich: Hanjo, GRAUWERT

Bitte Anmelden um der Konversation beizutreten.

Letzte Änderung: von klaren.

Rätsel, was macht dieser Befehl? 4 Jahre 5 Monate her #3

  • Rainer
  • Rainers Avatar Autor
  • Offline
  • Fresh Boarder
  • Fresh Boarder
  • Beiträge: 7
  • Dank erhalten: 0
Hallo Klaren,
natürlich habe ich gewusst, dass man damit auf "einfache" Weise die Daten eines Datenträgers überschreibt, um ihn vielleicht entsorgen zu können. Das sollte man machen, falls der Datenträger das zulässt.
Aber danke für die detailierte Erklärung, die war mir nicht bekannt.
Liebe Grüße Rainer

Bitte Anmelden um der Konversation beizutreten.

Rätsel, was macht dieser Befehl? 4 Jahre 5 Monate her #4

  • klaren
  • klarens Avatar
  • Offline
  • Administrator
  • Administrator
  • JID:klaren@im.kaalug.de
  • Beiträge: 645
  • Dank erhalten: 161
Hallo Rainer,

Das Kommando ist ein prima Beispiel für die Nutzung von Ein- und Ausgabekanälen der Unix Shell. Insofern nochmals vielen Dank für diese Frage.

Die drei standart Kanäle und deren Umleitung:
STDIN Standard Eingabe. Typischerweise die Tastatur, kann aber auch umgeleitet werden, um aus einer Datei zu lesen oder einem Laufwerk/Gerät wie /dev/zero
STDOUT Standard Ausgabe. Typischerweise der Bildschirm, kann aber auch umgeleitet werden, um in eine Datei zu schreiben oder in ein Laufwerk
STDERR Standard Fehlerkanal. Auch typischerweise Ausgabe auf dem Bildschirm, es sei denn man verwendet Tricks wie hier "$( )" dann gerät auch die Ausgabe von STDERR in das Ergebnis.

Umleiten der Kanäle ist sehr einfach mit den größer als > und kleiner als < Zeichen möglich.
Beispiel Verzeichnisliste in eine Datei speichern:
ls >/tmp/meine_datei.txt

Die Eingabe umleiten ist schon spezieller. Dafür ist das andere Zeichen - Beispiel leist die Datei und bietet sie dem Progamm cat als Eingabe:
cat </tmp/meine_datei.txt

(Man könnte hier den Umleitungsoperator auch weglassen. Gibt man cat einen Dateinamen so liest es von dort. Das Beispiel soll nur das Prinzip zeigen)

Dann der Fehlerkanal. Es ist ein weiterer Ausgabekanal, also verwendet dieser auch das > Zeichen. Hier muss man wissen, das die Kanäle nummeriert sind.
1 - Standard Ausgabe
2 - Standard Fehlerkanal

Also bewirkt 2>/tmp/test die Umleitung der Fehlerausgabe in eine Datei.
Beispiel - Wir provozieren einen Fehler, indem wir versuchen eine Datei zu lesen, für die wir keine Rechte haben - Umleitung des Fehlerkanals nach /tmp/meine_datei.txt:
cat /etc/shadow 2>/tmp/meine_datei.txt

liefert keine Ausgabe am Bildschirm. Aber, wenn wir in der Datei nachschauen, steht da:
cat /tmp/meine_datei.txt
cat: /etc/shadow: Keine Berechtigung

Dieser Text ging also über den Kanal 2.

Oft sieht man auch folgendes zuerst Mal kryptisches Konstrukt:

2>&1 >/tmp/test

Das bedeutet, das der Fehlerkanal auf das Ziel umgeleitet wird, auf das die Standard Ausgabe zeigt.

So, nun aber genug für heute.

Liebe Grüße,
Klaren
Folgende Benutzer bedankten sich: GRAUWERT

Bitte Anmelden um der Konversation beizutreten.

Rätsel, was macht dieser Befehl? 4 Jahre 5 Monate her #5

  • Rudi
  • Rudis Avatar
  • Offline
  • Administrator
  • Administrator
  • Beiträge: 94
  • Dank erhalten: 19
Hallo Rainer, ich verwende für so was normalerweise shred als den "Standard-Datenträgerschredderer". Wenn du das ausprobiert hast würden mich mal Angaben zur Geschwindigkeit interessieren.

Bitte Anmelden um der Konversation beizutreten.

  • Seite:
  • 1