Shellcode

In der Computersicherheit ist ein shellcode ein kleines Stück des Codes, der als die Nutzlast in der Ausnutzung einer Softwareverwundbarkeit verwendet ist. Es wird "shellcode" genannt, weil es normalerweise eine Befehl-Schale anfängt, von der der Angreifer die in Verlegenheit gebrachte Maschine kontrollieren kann. Shellcode wird im Maschinencode allgemein geschrieben, aber jedes Stück des Codes, der eine ähnliche Aufgabe durchführt, kann shellcode genannt werden. Weil die Funktion einer Nutzlast auf das bloße Laichen einer Schale nicht beschränkt wird, haben einige vorgeschlagen, dass der Name shellcode ungenügend ist. Jedoch haben Versuche des Ersetzens des Begriffes breite Annahme nicht gewonnen.

Typen von shellcode

Shellcode kann entweder lokal oder je nachdem entfernt sein, ob er eine Angreifer-Kontrolle über die Maschine gibt, die er auf (dem Vorortszug) oder über eine andere Maschine durch ein (entferntes) Netz führt.

Lokal

Lokaler shellcode wird von einem Angreifer verwendet, der Zugang zu einer Maschine beschränkt hat, aber eine Verwundbarkeit, zum Beispiel eine Pufferüberschwemmung in einem höher privilegierten Prozess auf dieser Maschine ausnutzen kann. Wenn erfolgreich durchgeführt, wird der shellcode den Angreifer-Zugang zur Maschine mit denselben höheren Vorzügen wie der ins Visier genommene Prozess zur Verfügung stellen.

Entfernt

Entfernter shellcode wird verwendet, wenn ein Angreifer einen verwundbaren Prozess ins Visier nehmen will, der auf einer anderen Maschine in einem lokalen Netz oder Intranet läuft. Wenn erfolgreich durchgeführt, kann der shellcode den Angreifer-Zugang zur Zielmaschine über das Netz zur Verfügung stellen. Entfernte shellcodes verwenden normalerweise TCP/IP Standardsteckdose-Verbindungen, um den Angreifer-Zugang zur Schale auf der Zielmaschine zu erlauben. Solcher shellcode kann gestützt darauf kategorisiert werden, wie diese Verbindung aufgestellt wird: Wenn der shellcode diese Verbindung herstellen kann, wird es eine "Rückschale" oder das in Verbindung Stehen zurück shellcode genannt, weil der shellcode zurück zur Maschine des Angreifers in Verbindung steht. Andererseits, wenn der Angreifer die Verbindung schaffen muss, wird der shellcode einen bindshell genannt, weil der shellcode zu einem bestimmten Hafen bindet, auf dem der Angreifer in Verbindung stehen kann, um es zu kontrollieren. Ein dritter Typ, viel weniger üblich, ist Steckdose-Wiedergebrauch shellcode. Dieser Typ von shellcode wird manchmal verwendet, wenn eine Großtat eine Verbindung mit dem verwundbaren Prozess herstellt, der nicht geschlossen wird, bevor der shellcode geführt wird. Der shellcode kann dann diese Verbindung wiederverwenden, um mit dem Angreifer zu kommunizieren. Steckdose, die shellcode wiederverwendet, ist härter zu schaffen, weil der shellcode herausfinden muss, welche Verbindung zum Wiedergebrauch und der Maschine viele offene Verbindungen haben kann.

Eine Brandmauer kann verwendet werden, um die aus dem Amt scheiden Verbindungen zu entdecken, die durch das in Verbindung Stehen zurück shellcodes und den Versuch gemacht sind, eingehende durch bindshells gemachte Verbindungen zu akzeptieren. Sie können deshalb etwas Schutz gegen einen Angreifer anbieten, selbst wenn das System verwundbar ist, indem es den Angreifer davon abgehalten wird, Zugang zur durch den shellcode geschaffenen Schale zu gewinnen. Das ist ein Grund, warum Steckdose, die shellcode wiederverwendet, manchmal verwendet wird: Weil es neue Verbindungen nicht schafft und deshalb härter ist, zu entdecken und zu blockieren.

Laden Sie herunter und führen Sie durch

Laden Sie herunter und führen Sie durch ist ein Typ von entferntem shellcode, der herunterlädt und eine Form von malware auf dem Zielsystem durchführt. Dieser Typ von shellcode erzeugt keine Schale, aber beauftragt eher die Maschine, eine bestimmte rechtskräftige Datei vom Netz herunterzuladen, es zur Platte zu sparen und es durchzuführen. Heutzutage wird es im Laufwerk - durch Download-Angriffe allgemein verwendet, wo ein Opfer einen böswilligen webpage besucht, der der Reihe nach versucht, solch ein Download zu führen und shellcode durchzuführen, um Software auf der Maschine des Opfers zu installieren. Eine Schwankung dieses Typs von shellcode lädt herunter und lädt eine Bibliothek. Vorteile dieser Technik bestehen darin, dass der Code kleiner sein kann, dass es nicht verlangt, dass der shellcode einen neuen Prozess auf dem Zielsystem erzeugt, und dass der shellcode nicht codieren muss, um den ins Visier genommenen Prozess aufzuräumen, weil das von der in den Prozess geladenen Bibliothek getan werden kann.

Inszeniert

Wenn die Datenmenge, die ein Angreifer in den Zielprozess einspritzen kann, zu beschränkt wird, um nützlichen shellcode direkt durchzuführen, kann es möglich sein, es etappenweise durchzuführen. Erstens wird ein kleines Stück von shellcode (Bühne 1) durchgeführt. Dieser Code lädt dann ein größeres Stück von shellcode (Bühne 2) ins Gedächtnis des Prozesses herunter und führt es durch.

Ei-Jagd

Das ist eine andere Form von inszeniertem shellcode, der verwendet wird, wenn ein Angreifer einen größeren shellcode in den Prozess einspritzen kann, aber nicht bestimmen kann, wo im Prozess es enden wird. Kleine Ei-Jagd shellcode wird in den Prozess an einer voraussagbaren Position eingespritzt und durchgeführt. Dieser Code sucht dann den Adressraum des Prozesses für den größeren shellcode (das Ei) und führt es durch.

Omelett

Dieser Typ von shellcode ist der Ei-Jagd shellcode ähnlich, aber sucht nach vielfachen kleinen Datenblocks (Eier) und verbindet sie in einen größeren Block wieder (das Omelett), der nachher durchgeführt wird. Das wird verwendet, wenn ein Angreifer nur mehrere kleine Datenblocks in den Prozess einspritzen kann.

Ausführungsstrategie von Shellcode

Eine Großtat wird einen shellcode in den Zielprozess vorher oder zur gleichen Zeit allgemein einspritzen, weil es eine Verwundbarkeit ausnutzt, um Kontrolle über den Programm-Schalter zu gewinnen. Der Programm-Schalter wird angepasst, um zum shellcode hinzuweisen, nach dem er durchgeführt wird und seine Aufgabe durchführt. Das Einspritzen des shellcode wird häufig durch die Speicherung des shellcode in Daten getan, die über das Netz an den verwundbaren Prozess, durch die Versorgung davon in einer Datei gesandt sind, die durch den verwundbaren Prozess oder durch die Befehl-Linie oder Umgebung im Fall von lokalen Großtaten gelesen wird.

Verschlüsselung von Shellcode

Weil der grösste Teil des Prozess-Filters oder die Daten einschränkt, die eingespritzt werden können, shellcode muss häufig geschrieben werden, um diese Beschränkungen zu berücksichtigen. Das schließt das Bilden des Codes klein, ohne Null oder alphanumerisch ein. Wie man gefunden hat, haben verschiedene Lösungen um solche Beschränkungen herumgekommen, einschließlich:

  • Design und Durchführungsoptimierungen, um die Größe des shellcode zu vermindern.
  • Durchführungsmodifizierungen, um um Beschränkungen im Rahmen im shellcode verwendeter Bytes herumzukommen.
  • Das Selbständern codiert, der mehrere Bytes seines eigenen Codes vor der Durchführung von ihnen modifiziert, um Bytes zu erfrischen, die normalerweise unmöglich sind, in den Prozess einzuspritzen.

Da Eindringen-Entdeckung Unterschriften von einfachem shellcodes entdecken kann, der über das Netz wird sendet, wird es häufig verschlüsselt, gemacht selbstentschlüsselnd oder polymorph, um Entdeckung zu vermeiden.

Prozent-Verschlüsselung

Großtaten, die Browser allgemein ins Visier nehmen, verschlüsseln shellcode in einer Schnur von JavaScript mit der Prozent-Verschlüsselung, Flucht-Folge, die "\uXXXX" oder Entitätsverschlüsselung verschlüsselt. Einige Großtaten verfinstern auch die verschlüsselte Shellcode-Schnur weiter, um Entdeckung durch IDS zu verhindern.

Zum Beispiel, auf der IA-32 Architektur, ist hier, wie zwei Instruktionen (ohne Operationen), zuerst unverschlüsselt aussehen würden:

90 NOP

90 NOP

Dann verschlüsselt in eine Schnur mit der Prozent-Verschlüsselung (das Verwenden der Funktion zu decodieren):

Unflucht (" %u9090");

Als nächstes verschlüsselt in eine Schnur mit "\uXXXX" - Verschlüsselung:

"\u9090";

Und schließlich verschlüsselt in eine Schnur mit der Entitätsverschlüsselung:

"邐"

oder

"邐"

Shellcode ohne Null

Die meisten shellcodes werden ohne den Gebrauch von ungültigen Bytes geschrieben, weil sie beabsichtigt sind, um in einen Zielprozess durch ungültig begrenzte Schnuren eingespritzt zu werden. Wenn eine ungültig begrenzte Schnur kopiert wird, wird sie bis dazu kopiert, und einschließlich der ersten ungültigen, aber nachfolgenden Bytes des shellcode wird nicht bearbeitet. Wenn shellcode, der Null enthält, auf diese Weise eingespritzt wird, würde nur ein Teil des shellcode eingespritzt, ihn unfähig des Laufens erfolgreich machend.

Um shellcode ohne Null von shellcode zu erzeugen, der ungültige Bytes enthält, kann man Maschineninstruktionen einsetzen, die zeroes mit Instruktionen enthalten, die dieselbe Wirkung haben, aber frei von der Null sind. Zum Beispiel auf der IA-32 Architektur konnte man diese Instruktion ersetzen:

B8 01000000 MOV EAX, 1//Satz das Register EAX zu 0x000000001

der zeroes als ein Teil des Druckfehlers enthält (breitet sich zu aus) mit diesen Instruktionen:

33C0 XOR EAX, EAX//Satz das Register EAX zu 0x000000000

40 INC EAX//Zunahme EAX zu 0x00000001

die dieselbe Wirkung haben, aber weniger Bytes nehmen, um zu verschlüsseln, und frei von der Null sind.

Alphanumerischer und druckfähiger shellcode

In bestimmten Fällen wird ein Zielprozess jedes Byte vom eingespritzten shellcode filtern, der nicht ein druckfähiger oder alphanumerischer Charakter ist. Unter solchen Verhältnissen wird die Reihe von Instruktionen, die verwendet werden können, um einen shellcode zu schreiben, sehr beschränkt. Eine Lösung dieses Problems wurde von Rix in Phrack 57 veröffentlicht, in dem er gezeigt hat, dass es möglich war, jeden Code in den alphanumerischen Code zu verwandeln. Eine häufig verwendete Technik soll Selbständern-Code schaffen, weil das dem Code erlaubt, seine eigenen Bytes zu modifizieren, um Bytes außerhalb der normalerweise erlaubten Reihe einzuschließen, dadurch die Reihe von Instruktionen ausbreitend, die es verwenden kann. Mit diesem Trick kann ein Selbständern-Decoder geschaffen werden, der am Anfang nur Bytes in der erlaubten Reihe verwendet. Der Hauptcode des shellcode wird auch nur mit Bytes in der erlaubten Reihe verschlüsselt. Wenn die Produktion shellcode geführt wird, kann der Decoder seinen eigenen Code modifizieren, um im Stande zu sein, jede Instruktion zu verwenden, die es verlangt, um richtig zu fungieren, und dann fortsetzt, den ursprünglichen shellcode zu decodieren. Nach der Entzifferung des shellcode überträgt der Decoder Kontrolle ihm, so kann es als normal durchgeführt werden. Es ist gezeigt worden, dass es möglich ist, willkürlich komplizierten shellcode zu schaffen, der wie normaler Text in Englisch aussieht.

Beweis von Unicode shellcode

Moderne Programme verwenden Schnuren von Unicode, um Internationalisierung des Textes zu erlauben. Häufig werden diese Programme eingehende ASCII-Schnuren zu Unicode vor der Verarbeitung von ihnen umwandeln. In UTF-16 verschlüsselte Schnuren von Unicode verwenden zwei Bytes, um jeden Charakter (oder vier Bytes für einige spezielle Charaktere) zu verschlüsseln. Wenn eine ASCII-Schnur in UTF-16 umgestaltet wird, wird ein Nullbyte nach jedem Byte in der ursprünglichen Schnur eingefügt. Obscou hat sich in Phrack 61 erwiesen, dass es möglich ist, shellcode zu schreiben, der erfolgreich nach dieser Transformation laufen kann. Programme, die jeden shellcode in alphanumerischen UTF-16-proof shellcode automatisch verschlüsseln können, bestehen gestützt auf demselben Grundsatz eines kleinen Selbständern-Decoders, der den ursprünglichen shellcode decodiert.

Plattformen

Der grösste Teil von shellcode wird im Maschinencode wegen der niedrigen Stufe geschrieben, an der die Verwundbarkeit, die wird ausnutzt, einen Angreifer-Zugang zum Prozess gibt. Shellcode wird deshalb häufig geschaffen, um eine spezifische Kombination des Verarbeiters, Betriebssystems und Dienstsatzes, genannt eine Plattform ins Visier zu nehmen. Für einige Großtaten, wegen der Einschränkungen zieht den shellcode durch den Zielprozess an, ein sehr spezifischer shellcode muss geschaffen werden. Jedoch ist es für einen shellcode nicht unmöglich, für vielfache Großtaten, Dienstsätze, Betriebssysteme und sogar Verarbeiter zu arbeiten. Solche Vielseitigkeit wird durch das Schaffen vielfacher Versionen der shellcode allgemein erreicht, die die verschiedenen Plattformen und das Schaffen eines Kopfballs ins Visier nehmen, auf dem Zweige zur richtigen Version für die Plattform der Code laufen. Wenn durchgeführt, benimmt sich der Code verschieden für verschiedene Plattformen und führt den richtigen Teil des shellcode für die Plattform durch, auf der es läuft.

Shellcode Analyse

Da shellcode nur roher binärer Code und Daten ist, kann es nicht direkt durchgeführt werden. Um zu analysieren, was ein shellcode versucht, es zu tun, muss in einen anderen Prozess geladen werden. Eine allgemeine Analyse-Technik soll ein kleines C Programm schreiben, das den shellcode als ein Byte-Puffer hält, und dann verwenden Sie einen Funktionszeigestock oder verwenden Sie Reihenmonteur, um Ausführung ihm zu übertragen. Eine andere Technik soll ein Online-Werkzeug wie shellcode_2_exe verwenden, um den shellcode in ein vorgemachtes rechtskräftiges Hüllblatt einzubetten, das dann in einem Standardtesthilfeprogramm analysiert werden kann. Spezialisierte shellcode Analyse-Werkzeuge bestehen auch, wie der iDefense sclog Projekt, das 2005 als ein Teil des Malcode Analytiker-Satzes ursprünglich veröffentlicht wurde. Sclog wird entworfen, um shellcode Außendateien zu laden und sie innerhalb eines API-Protokollierungsfachwerks durchzuführen. Wetteifer hat shellcode Analyse-Werkzeuge gestützt auch bestehen wie die sctest Anwendung, die ein Teil der bösen Plattform libemu Paket ist. Ein anderer gestützter Wetteifer ist shellcode Analyse-Werkzeug, das um die libemu Bibliothek gebaut ist, scdbg, der eine grundlegende Fehlersuchprogramm-Schale und integrierte Bericht-Eigenschaften einschließt.

Siehe auch

Links


Die königliche Akademie von Turku / Dactylorhiza
Impressum & Datenschutz