Sie sollten einfach von einem Live-USB (oder CD / DVD) booten und wieder umbenennen libc.so.6
.
LD_PRELOAD
funktioniert nicht mit ausführbaren Dateien von setuid. Wenn Sie möchten, können Sie jedoch /bin/busybox
vor dem Neustart Last-Minute-Sicherungen durchführen (für die keine Befehle als Root ausgeführt werden müssen). Es ist möglich, dies ohne Live-USB / CD / DVD zu beheben, aber Sie müssen immer noch neu starten, und ich schlage vor, eine zu verwenden.
LD_PRELOAD
funktioniert nicht mit setuid-Befehlen.
Derzeit versuchen Sie, sudo
die umbenannte gemeinsam genutzte Bibliothek durch Festlegen zu verwenden LD_PRELOAD
. Dies wird nicht funktionieren. Sie können nicht ändern, mit was gemeinsam genutzte Bibliotheken sudo
verknüpft sind LD_PRELOAD
, und es funktioniert auch nicht mit einer der Alternativen zu sudo
. Wenn Sie dies tun könnten , wäre dies ein äußerst schwerwiegender Sicherheitsfehler.
Die Art und Weise sudo
und pkexec
(und su
) Arbeit zu ermöglichen es Ihnen, elevate Privilegien ist , dass die ausführbaren Dateien haben den setuid Bit Satz 0 , die bewirkt , dass sie als Benutzer ausgeführt werden , den sie besitzt, die für die ausführbaren Dateien ist der Root - Benutzer, anstatt die Benutzer , dass läuft sie tatsächlich. Wenn sie ausgeführt werden, überprüfen sie sehr sorgfältig, was Sie von ihnen verlangen. Auf diese Weise können Benutzer, sofern ihre Entwickler vorsichtig genug waren, nur Aktionen ausführen, zu deren Ausführung sie berechtigt sind.
LD_PRELOAD
hat keine Auswirkung auf ausführbare Setuid-Dateien, die von anderen Benutzern als ihren Besitzern ausgeführt werden . Dies ist für die Sicherheit unbedingt erforderlich. Andernfallskönnte jeder seine eigene Bibliothek erstellen und ein Programm erzwingen, das es gernesudo
verwendet, und dann könnte jeder Root-Rechte erlangen. Sie könnenLD_PRELOAD
damit nicht-setuid-Programme ausführen, und root kann damit fast alles ausführen. Aber als Nicht-RootBenutzer, können Sie es nicht laufen verwenden Programme wiesudo
,pkexec
undsu
das sind setuid root.
Wenn bereits eine Root-Shell ausgeführt wurde, müssen Sie nicht neu starten. Aber selbst wenn Sie das Root-Konto aktiviert haben - das heißt, selbst wenn Sie ein Kennwort dafür festgelegt haben, mit dem Sie sich mit einem Befehl wie su
root als root anmelden können -, können Sie das Problem ohne Neustart nicht beheben . Zum Beispiel su
in Ubuntu erfordert libc.so.6
und ist auch setuid root, so LD_PRELOAD
wird auch nicht damit funktionieren. 1 (Siehe auch Peter Cordes ‚s Kommentare .)
Das Problem hierbei ist, dass die verfügbaren Mechanismen zum Ausführen von Aktionen als Root erfordern, dass Sie ausführbare setuid-Dateien ausführen, die root gehören, aber LD_PRELOAD
in dieser Situation keine Auswirkungen haben. Wenn Sie keine Aktionen als root ausführen müssten oder wenn Sie bereits eine Root-Shell geöffnet hätten, könnten Sie diese problemlos ohne Neustart und auch ohne Verwendung umbenennen LD_PRELOAD
. Dies liegt daran, dass Ubuntu-Systeme /bin/busybox
statisch verknüpft sind. Damit können Sie viele der gängigen * nix-Tools ausführen , einschließlich der Befehle mv
und cp
. Sie können ausführen oder nur ausführen , um eine Shell zu erhalten, in der Sie die Befehle ausführen können. Lauf/bin/busybox mv source destination
/bin/busybox sh
/bin/busybox
ohne Argumente, um eine Liste der unterstützten Befehle zu erhalten. Es hat sogar eine Version von dpkg
!
Sie können Dateien sichern (wenn Sie möchten) und in einer Live-Umgebung neu starten.
Ich erwähne dies busybox
hauptsächlich, weil Sie es zwar nicht verwenden können, um Root-Rechte zu erlangen und wiederherzustellen libc.so.6
, aber Sie können damit alle Dateien sichern , die Sie verlieren möchten, bevor Sie in einer Live-Umgebung neu starten. Ich bezweifle sehr , Sie würden nichts verlieren , aber da Sie besorgt sind, können Sie verwenden möchten busybox
alle wichtigen Dateien zu kopieren - wie Dokumente , die Sie haben , seit der letzten Sicherung erstellt oder geändert - an einen anderen Ort.
Ein Neustart auf die übliche Weise kann nicht sehr weit kommen, da beim normalen Herunterfahren tatsächlich dynamisch verknüpfte Programme ausgeführt werden, die davon abhängen libc.so.6
. Möglicherweise möchten Sie verwenden Alt+ SysRq+REISUB zu sicher Neustart . Dies ist kein idealer Weg zum Herunterfahren, aber wahrscheinlich besser als ein meist ineffektiver Neustartversuch, gefolgt von einem Hard-Reset. Eine andere Möglichkeit wäre, einen Neustart zu versuchen und dann zu versuchen, die REISUB-Methode zu verwenden, um den Rest des Weges fortzusetzen. (Wenn Sie den Computer ausschalten möchten, anstatt ihn neu zu starten, verwenden Sie REISU O anstelle von REISU B. )
Wenn Sie von einer Live-Umgebung aus starten, ist das Umbenennen der Datei einfach. Sie müssen chroot
oder tun nichts Besonderes. Mounten Sie einfach Ihr Root-Dateisystem (was Sie normalerweise mit einem Klick im Dateibrowser tun können, obwohl Sie den mount
Befehl verwenden können, wenn Sie möchten). Verwenden Sie dann in einem Terminal den Befehl mv
oder cp
zum Wiederherstellen libc.so.6
. Sie brauchen sudo
, aber das funktioniert gut in einer Live-Umgebung.
Ich weiß, dass Sie erwähnt haben, dass Sie keine Rettungsdiskette haben. Es wäre schwierig, vielleicht unmöglich, einen bootfähigen Live-USB auf diesem System zu erstellen, auf dem Sie die meisten Programme nicht ausführen können. (Sie können busybox
Dateien kopieren und verschieben, und es gibt sogar einen dd
Befehl, aber ich würde nicht empfehlen, ihn dafür zu verwenden. Normalerweise müssten Sie dd
als Root ausgeführt werden können, um Live-Medien zu erstellen.) Vielleicht wird es jemand tun einen Weg vorschlagen. Wenn Sie einen anderen Computer zum Einlegen der Festplatte haben, können Sie ihn hoffentlich mit diesem Computer erstellen. Wenn nicht, können Sie am besten einen Bekannten bitten, einen zu machen.
Es gibt einen Weg ohne Live-CD / DVD / USB, aber Sie müssen immer noch neu starten.
Es gibt jedoch eine Alternative zum Booten von externen Medien. 2 Sie müssen noch neu starten, benötigen jedoch kein Live-System. Ich empfehle dies nicht besonders, da es umständlich ist; Die Verwendung einer Live-Umgebung ist einfacher. Sie können es aber auch ohne machen, wenn Sie es wirklich wollen.
Wie Zanna zuvor in Kommentaren betont hatte, würde der Rettungsmodus nicht funktionieren, da die meisten Programme dies benötigen libc.6.so
(z. B. das /bin/bash
, was die Shell bereitstellt, benötigt). Sie können das System jedoch mit /bin/busybox sh
as initinit=/bin/busybox sh
booten, indem Sie es als Boot-Option an den Kernel in GRUB übergeben. 3 Dies ist im Wesentlichen die gleiche Technik wie die üblichere init=/bin/sh
(oder init=/bin/bash
), um eine Root-Shell zu erhalten, jedoch mit /bin/busybox sh
anstelle der regulären /bin/sh
, da sie /bin/sh
dynamisch verknüpft ist und erfordert libc.so.6
.
Wenn Sie dies auf diese Weise tun möchten, halten Sie Shiftbeim (erneuten) Booten die linke Taste gedrückt, damit das GRUB-Startmenü angezeigt wird. (Wenn Shiftdies nicht funktioniert, verwenden Sie Esc.) Wählen Sie mit den Pfeiltasten Erweiterte Optionen für Ubuntu aus und drücken Sie die Eingabetaste. Nach diesem Punkt werden Sie nicht mehr drücken, Enterda dies normalerweise und nicht mit benutzerdefinierten Startoptionen gestartet wird. Wählen Sie einen beliebigen Kernel aus und drücken Sie e, um die Startoptionen vorübergehend zu bearbeiten. Wenn mehrere Zeilen vorhanden sind und sich der Cursor nicht in der Zeile befindet, mit der begonnen wird linux
, bewegen Sie ihn mit den Pfeiltasten dorthin. Fügen Sie init=/bin/busybox sh
am Ende dieser Zeile hinzu und drücken Sie F10, um sie zu starten.
Sie sollten eine BusyBox-Shell-Eingabeaufforderung erhalten. Sie müssen das Root-Dateisystem erneut schreiben und umbenennen, libc.so.6
damit es den richtigen Namen hat, den es früher hatte. Führen Sie dazu die folgenden Befehle in der BusyBox-Shell aus (wo andere Leser libc.so.6
an einem anderen Speicherort den an den cd
Befehl übergebenen Verzeichnisnamen anpassen müssten ):
mount -o remount,rw /
cd /lib64
mv libc.so.6.bak libc.so.6
Dann empfehle ich Ihnen, alle zwischengespeicherten Schreibvorgänge mit dem Dateisystem zu synchronisieren, sie schreibgeschützt erneut bereitzustellen und neu zu starten:
sync
mount -o remount,ro /
reboot -f
(Ohne funktioniert -f
der reboot
Befehl in dieser Situation überhaupt nicht, da kein richtiger Init-Daemon ausgeführt wird.)
0 Für diejenigen, die interessiert sind: Wenn diese Programme (wie sudo
) Ihren Befehl tatsächlich ausführen oder eine Shell als Root oder ein anderer alternativer Benutzer erstellen, werden sowohl Ihre realen als auch Ihre effektiven Benutzer-IDs auf die des Zielbenutzers festgelegt. Wenn Sie sie jedoch ausführen, bevor sie dies getan haben, während sie festlegen, ob Sie die von Ihnen angeforderte Aktion ausführen sollen, ist ihre effektive Benutzer-ID die von root, während ihre tatsächliche Benutzer-ID noch Ihre ist. Ich erwähne dies, um ein weit verbreitetes Missverständnis über die Funktionsweise realer und effektiver Benutzer-IDs in Programmen wie z sudo
. Wenn Sie noch nie von echten und effektiven Benutzer-IDs gehört haben, können Sie diese Fußnote ignorieren.
1 Wie bereits erwähnt, ist busybox
Ubuntu statisch verknüpft und nicht abhängig libc.so.6
. Sie könnten denken, Sie könnten dies verwenden, um einen Neustart zu vermeiden, da busybox
ein su
Befehl angeboten wird. Dies hilft jedoch keinem, da es bei der Installation busybox
kein Setuid-Root ist. Um tatsächlich zu arbeiten, damit ein Nicht-Root-Benutzer root werden kann, su
muss root festgelegt werden. Die nützliche Funktion von busybox su
besteht darin, root zu erlauben , sich als andere Benutzer auszugeben, anstatt anderen Benutzern zu erlauben, sich als root auszugeben.
2 Zanna hat viel zu diesem Verfahren beigetragen und auch alle Tests dafür durchgeführt!
3 Dies ist erfolgreich sh
, busybox
obwohl Sie möglicherweise erwarten, dass es als nachfolgende Kernel-Startoption interpretiert wird. Das Einfügen von Anführungszeichen verhindert, dass es funktioniert. Beachten Sie auch , dass in Ubuntu, die statisch gelinkte busybox
ausführbare Datei ist nur genannt busybox
, nicht busybox-static
(obwohl das Paket , das es ermöglicht wird genannt busybox-static
). Wenn Sie die statisch verknüpfte BusyBox deinstalliert und die dynamisch verknüpfte BusyBox installiert haben, funktioniert diese Methode nicht, aber es ist sehr unwahrscheinlich, dass Sie dies getan haben.
sudo bash -c "LD_PRELOAD=./libc-2.14.so ln -s ./libc-2.14.so ./libc.so.6"
, wenn auf der gleichen Partition