it-swarm.com.de

Wie chmod ohne / usr / bin / chmod?

Heute wurde mir von einem Unix-Trainer eine Geschichte erzählt, in der das Root-Passwort an die Schüler weitergegeben wurde und einer der Jungs die Ausführungsberechtigung von /usr/bin/chmod selbst. Wie können Sie in diesem Fall chmod wiederherstellen und wieder ausführbar machen? Nehmen wir an, es ist nicht vorzuziehen, es von einer externen Quelle zu beziehen oder neu zu kompilieren. Gibt es einen intelligenten Hack, der dieses chmod selbst wiederherstellen kann?

Beachten Sie, dass dies vor langer Zeit passiert ist und ich nicht nach einer Lösung für ein aktuelles Problem suche. Ich bin nur neugierig, wie Unix uns bei einem solchen Problem unterstützt.

Sie können den Loader direkt ausführen und ihm den Befehl übergeben, den Sie ausführen möchten:

/lib/ld-linux.so /bin/chmod +x /bin/chmod

Ihr Pfad zum Lader kann variieren. Auf einem 64-Bit-System müssen Sie das richtige auswählen, basierend darauf, wie chmod kompiliert wurde. Die 64-Bit-Version heißt so etwas wie /lib64/ld-linux-x86-64.so.2

196
Michael Mrozek

Das Dienstprogramm chmod basiert auf dem Systemaufruf chmod() (siehe man 2 chmod). Sie können dies also mit ein paar Zeilen C oder mit fast jeder anderen Sprache tun, die von einem Wrapper umgeben ist (was die meisten von ihnen wären). Sehr wenigen * nix-Systemen werden ein C-Compiler und ein Perl-Interpreter fehlen. Die meisten Linux-Distributionen benötigen das spätere, um zu funktionieren.

Perl -e 'chmod 0755, "foobar.file"'
104
goldilocks

Auf einigen Systemen ist auch busybox installiert. In diesem Fall können Sie Folgendes ausführen:

busybox chmod +x /bin/chmod

Da Sie nach Hacks gefragt haben, habe ich nur an einen anderen gedacht:

mv /bin/chmod /bin/chmod.orig
cp -a /bin/chown /bin/chmod

Jetzt hast du ein /bin/chmod das ist ausführbar, aber es ist tatsächlich chown (d. h. eine andere Binärdatei). Jetzt müssen wir es nur noch mit der ursprünglichen Binärdatei überschreiben.

dd if=/bin/chmod.orig of=/bin/chmod

Das + x-Flag bleibt erhalten, sodass Sie nur das + x einer anderen Datei für diese gestohlen haben.

Wenn alle diese alternativen Binärdateien (einschließlich Loader, Perl, Python, GCC usw.) chmod -x wären, könnte die Reparatur über ein Rettungssystem die einzige Option sein.

70
frostschutz

Einfach. Was Sie tun können, ist eine andere ausführbare Datei vorzubereiten und dann cp chmod darüber.

 $ cp /bin/ls chmod
 $ cp /bin/chmod .

Das erste cp erstellt eine Datei mit dem Namen chmod mit ausführbaren Berechtigungen, die jedoch wirklich die ausführbare Datei ls ist. Das zweite cp füllt diese Datei mit dem Binärcode chmod, wobei die Ausführungsberechtigungen der Zieldatei beibehalten werden (da wir keine Optionen zum Übertragen von Berechtigungen der Quelldatei angegeben haben).


Ein anderer Ansatz besteht darin, das Dienstprogramm install zu verwenden, ein verherrlichtes Kopierprogramm, mit dem Berechtigungen in einem Schritt festgelegt werden können. (Siehe -m Streit.)

$ install -m a+x /bin/chmod .
$ ./chmod # executes

Das Programm install ist nicht Teil der Unix-Spezifikation, befindet sich jedoch in BSD und in GNU Coreutils. Beide unterstützen das -m Option mit chmod-ähnlicher Syntax, sowohl symbolisch als auch oktal.

45
Kaz

Das Wichtigste auf meinem Kopf,

  • Booten Sie von einer anderen Quelle (Netzwerkbuch, CD usw.) und verwenden Sie den chmod für diese Quelle, um die Berechtigungen festzulegen.
  • Schreiben Sie ein kleines C-Programm, um die Berechtigungen zu ändern.
  • Schreiben Sie ein Perl-Skript (Ruby, PHP, Python usw.), um die Berechtigungen zu ändern

/usr/bin/chmod führt nur einen Systemaufruf durch, um die Berechtigungen zu ändern. Sie können dieses System auf verschiedene Arten selbst aufrufen.

16
EightBitTony

Dies ist hackiger als jede andere Antwort (mit der möglichen Ausnahme der Antwort ld-linux.so, Bei der es sich um einen wirklich cleveren Hack handelt), kann jedoch an andere Probleme angepasst werden (insbesondere wenn Sie fallen in einen Zeitwirbel und reisen zurück in ein Land vor Perl ™).

  1. Kopieren Sie aus Sicherheitsgründen /bin/chmod An einen sicheren Ort:

    cd
    cp /bin/chmod .
    
  2. Mach echo chmod | cpio -oc > chmod.cpio
    Dadurch wird ein cpio Archiv erstellt (ähnlich einem tar Archiv), das chmod enthält. Die Option -c Gibt an, dass die Dateimetadaten in hexadezimaler Schreibweise (d. H. In ASCII) geschrieben sind.

  3. vi chmod.cpio
    Sie werden so etwas sehen

    0707010005DBFD000081A4000303E9000302010000000155C64D6E0000C01D000068E70000C361…chmod^@…
                       ↑↑↑
    

    gefolgt von einer Mischung aus Steuerzeichen, Standardzeichen ASCII Zeichen und erweitert ASCII Zeichen). Beachten Sie, dass 0644 = 0x1A4 und 0755 = 0x1ED. Suchen Sie das 1A4 (Ab der 20. Zeichenposition) und ändern Sie es in 1ED. Speichern und beenden.

    • Wenn Sie einen Hex-Editor oder ähnliches haben, ist es möglicherweise besser, diesen zu verwenden, um das Risiko zu vermeiden, dass vi den ausführbaren Binärcode in der Datei kontaminiert. Aber ich habe es mit vi versucht und es schien in Ordnung zu funktionieren.
  4. cpio -i < chmod.cpio
    Sie haben jetzt eine Kopie von chmod in Ihrem Verzeichnis, geschützt 755.

Andere Archivierungsprogramme verfügen möglicherweise über ähnliche Funktionen. Insbesondere ist cpio alt und möglicherweise veraltet; Wenn Sie es nicht haben, suchen Sie nach pax.

12
Scott

Oder noch einfacher - verwenden Sie setfacl, das auf modernen Systemen häufig vorhanden ist:

  1. Festlegen der ausführbaren Berechtigung für den Benutzer:

    # setfacl -m u::rx /bin/chmod
    
  2. Verwenden Sie jetzt die jetzt ausführbare Binärdatei, um die eigenen Berechtigungen auf die ursprünglichen zurückzusetzen (d. H. Für alle Benutzer).

    # chmod +x /bin/chmod
    
  3. Erweiterte ACL-Einträge löschen - optional, da es möglicherweise einen guten Grund dafür gab, warum sie überhaupt vorhanden waren.

    # setfacl -b /bin/chmod
    

Beachten Sie, dass setfacl in einem Dateisystem verwendet werden kann, das auch keine ACLs unterstützt.

8
Pedro Guimaraes

rsync kann auch verwendet werden, um die Berechtigungen der Datei zu ändern

# rsync /bin/chmod /tmp/chmod --chmod=ugo+x
# ls -al /tmp/chmod
  -rwxr-x--- 1 root root 52000 Sep  6 15:13 /tmp/chmod
#
5
Ofer

Pipe den Inhalt von chmod in eine bereits ausführbare Datei

cp /usr/bin/executable_file ~/executable_file
cat /usr/bin/chmod > ~/executable_file
~/executable_file +x file_to_be_executed.sh
3
p.j