Ändern Sie die Berechtigungen einer Datei mit der Hilfe meiner Katze

55
root@system:~# less myfile
-bash: /bin/less: Input/output error

Das Root-Dateisystem ist tot. Aber meine Katze lebt noch (in meiner Erinnerung):

root@system:~# cat > /tmp/somefile
C^d
root@system:~#

Er ist zwar irgendwie einsam, alle seine Freunde sind weg:

root@system:~# mount
-bash: /bin/mount: Input/output error
root@system:~# dmesg
-bash: /bin/dmesg: Input/output error
root@system:~# less
-bash: /bin/less: Input/output error
root@system:~# chmod
-bash: /bin/chmod: Input/output error

Das System läuft noch und erfüllt seinen Zweck. Ich weiß, ich weiß, die einzig vernünftige Antwort darauf ist, das System herunterzufahren und das Root-Laufwerk zu ersetzen. Leider ist dies keine Option, da dies viel Zeit und Geld kosten würde. Außerdem würde es meine Katze töten, und das würde mich traurig machen.

Ich habe daran gedacht, ihm seine üblichen Freunde von einem Spender zu bringen. Ich wage es nicht, sie zu scpen, falls ssh versucht, sie zu laden und die Zeile abschneidet (die Binärdatei ist sowieso weg). Das klingt nach einem Job für den Cousin meiner Katze:

root@system:~# netcat -l 1234 > /tmp/less
-bash: netcat: command not found

Leider ist er schon lange weg.

Jetzt kann ich versuchen, meine Katze dazu zu bringen, ein Ritual durchzuführen, um sie wiederzubeleben:

cat > netcat < /dev/tcp/localhost/9999

Und das hat funktioniert. Er ist fast am Leben:

root@system:/tmp# /tmp/netcat
-bash: /tmp/netcat: Permission denied

Er braucht nur einen winzigen Lebensfunken. Diese kleine +xmagische Beschwörung, die ich im Moment nicht rezitieren kann.

Können Sie mir helfen, die Freunde meiner Katze zurückzubringen?

Goncalopp
quelle
3
Können Sie ausführen /lib/ld-linux.so.2 ./netcat(oder das Äquivalent Ihres Systems) und etwas in Gang bringen?
Michael Homer
4
Auch: welches Betriebssystem ist das? Haben Sie vfat oder NTFS-Dateisysteme gemountet? Netzwerk-Dateisysteme? Partitionen, deren Inhalt Sie löschen können? Gibt es irgendwelche zugänglichen Dateien mit Genehmigung ausführen?
Michael Homer
3
"Außerdem würde es meine Katze töten, und das würde mich traurig machen." - Ich dachte immer, das Sprichwort "Keine Kinder wurden bei der Herstellung verletzt" sei nur ein Sprichwort, aber gut ...
Rugk
7
Ich musste das für all diese
Katzenanalogien unbedingt befürworten
2
arme Katze, ich hoffe, es geht ihm gut :(
Katze

Antworten:

37

Es gibt verschiedene Möglichkeiten, die alle von den genauen Parametern Ihrer aktuellen Situation abhängen. In den folgenden Beispielen gehe ich von Linux aus, sofern zutreffend, aber in den meisten Fällen ist eine ähnliche Funktionalität auf anderen Plattformen vorhanden.

  • Möglicherweise können Sie den Dynamic Loader veranlassen, eine ausführbare Datei für Sie auszuführen. Vorausgesetzt, es catbesteht eine dynamische Verknüpfung, und das Äquivalent Ihrer Plattform befindet /lib/ld-linux.so.2sich wahrscheinlich auch im Arbeitsspeicher und kann daher zur Ausführung einer Binärdatei verwendet werden:

    $ /lib64/ld-linux-x86-64.so.2 ./chmod
    chmod: missing operand

    Möglicherweise verfügen Sie über mehrere davon (32- und 64-Bit-Versionen sind wahrscheinlich) und möglicherweise sind mehrere Kopien oder Symlinks verfügbar, die aufgelöst werden müssen. Eine davon könnte funktionieren.

  • Wenn Sie ein gemountetes vfat- oder NTFS-Dateisystem haben oder ein anderes, das alle Dateien als 777 behandelt, können Sie dort Ihre ausführbare Datei erstellen.

    $ cat > /mnt/windows/chmod < /dev/tcp/localhost/9999
  • Wenn Sie ein bereitgestelltes Netzwerk-Dateisystem haben, können Sie, auch wenn es nicht lokal beschreibbar ist, Dateien auf dem Remote-System erstellen und diese normal verwenden.
  • Wenn es eine hängten Partition ist nicht wahr über den Inhalt, auf einem Laufwerk kümmern , die noch meist funktionieren, können Sie den Inhalt mit einem neuen Bild des gleichen Dateisystem - Typs ersetzen ausführbare Dateien enthält , die Sie wollen - catsollte dies in der Ordnung sein Diese Rolle wird normalerweise von Personen verwendet dd, und Sie können das Image über das Netzwerk bereitstellen.

    $ cat > /dev/sdb1 < ...

    Dieser ist plausibel, hat aber viele Stellen, an denen man nicht arbeiten kann, je nachdem, was genau sich noch auf dieser Partition im Speicher befindet.

  • Wenn es eine zugreifbare Datei gibt, die Ausführungsberechtigungen für ein beschreibbares Dateisystem besitzt, können cat >Sie die Inhalte durch eine Binärdatei Ihrer Wahl ersetzen.

    $ cat > ~/test.py < ...
  • Da Bash noch ausgeführt wird, können Sie ein Bash-Plugin dynamisch in den Prozess laden, der chmod verfügbar macht. Insbesondere könnten Sie installieren und ladenctypes.sh , was eine fremde Funktionsschnittstelle für Bash bietet, und dann dlcall chmod ./netcat 511.
  • Sie könnten eine dynamische Bibliotheksdatei foo.soIhrer Konstruktion einspielen und diese dann catin Ihrem Namen laden LD_PRELOAD, um beliebigen Code ausführen zu können.

    $ LD_PRELOAD=./hack.so cat /dev/null

    Wenn Sie zum Beispiel abfangen open:

    int open(const char *path, int flags, ...) {
        chmod(path, 0755);
        return -1;
    }

    dann kannst du tun, was immer du tun musst.

Mein Vorschlag wäre, eine statisch verknüpfte busyboxausführbare Datei als erstes Element (oder wirklich als einziges Element) einzubinden, damit Sie die gesamte Palette der verfügbaren Befehle nutzen können, ohne den Hack erneut zu verwenden, der Sie zu diesem Zeitpunkt bis zur Erschöpfung gebracht hat.

Michael Homer
quelle
3
Neu "statisch verknüpft busybox": Beachten Sie, dass dies sashspeziell für diese Art von Anwendungsfall entwickelt wurde und zur Not leichter verfügbar ist (z. B. können Sie es im Voraus installieren und eine Kopie irgendwo laufen lassen, damit sie sich im Speicher des Systems befindet Pausen ... oder du kannst deine Haustiere wegwerfen und stattdessen ein paar Rinder kaufen, nehme ich an).
Kevin