Sie sollten einfach von einem Live-USB (oder CD / DVD) booten und wieder umbenennen libc.so.6.
LD_PRELOADfunktioniert nicht mit ausführbaren Dateien von setuid. Wenn Sie möchten, können Sie jedoch /bin/busyboxvor 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, sudodie umbenannte gemeinsam genutzte Bibliothek durch Festlegen zu verwenden LD_PRELOAD. Dies wird nicht funktionieren. Sie können nicht ändern, mit was gemeinsam genutzte Bibliotheken sudoverknü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 sudound 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_PRELOADhat 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 gernesudoverwendet, und dann könnte jeder Root-Rechte erlangen. Sie könnenLD_PRELOADdamit 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,pkexecundsudas 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 suroot als root anmelden können -, können Sie das Problem ohne Neustart nicht beheben . Zum Beispiel suin Ubuntu erfordert libc.so.6und ist auch setuid root, so LD_PRELOADwird 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_PRELOADin 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/busyboxstatisch verknüpft sind. Damit können Sie viele der gängigen * nix-Tools ausführen , einschließlich der Befehle mvund 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/busyboxohne 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 busyboxhauptsä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 busyboxalle 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 chrootoder tun nichts Besonderes. Mounten Sie einfach Ihr Root-Dateisystem (was Sie normalerweise mit einem Klick im Dateibrowser tun können, obwohl Sie den mountBefehl verwenden können, wenn Sie möchten). Verwenden Sie dann in einem Terminal den Befehl mvoder cpzum 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 busyboxDateien kopieren und verschieben, und es gibt sogar einen ddBefehl, aber ich würde nicht empfehlen, ihn dafür zu verwenden. Normalerweise müssten Sie ddals 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 shas 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 shanstelle der regulären /bin/sh, da sie /bin/shdynamisch 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 sham 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.6damit 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.6an einem anderen Speicherort den an den cdBefehl ü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 -fder rebootBefehl 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 busyboxUbuntu 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 busyboxein suBefehl angeboten wird. Dies hilft jedoch keinem, da es bei der Installation busyboxkein 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 subesteht 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, busyboxobwohl 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 busyboxausfü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