
MD5-Monomorphic Shellcode Packer - alle Payloads haben denselben MD5-Hash
════════════════════════════════════╦═══
╔═╦═╗ ╔═╗ ╔═╗ ╔═╗ ╔═╦═╗ ╔═╗ ╔══╔═╗ ╠═╗
═╩ ╩ ╩═╚═╝═╩ ╩═╚═╝═╩ ╩ ╩═╚═╝═╩ ╠═╝═╩ ╩═
════════════════════════════════╩═══════
By Retr0id
═══ MD5-Monomorphic Shellcode Packer ═══
VERWENDUNG: python3 monomorph.py input_file output_file [payload_file]
Es packt bis zu 4KB komprimierten Shellcode in eine ausführbare Binärdatei, fast augenblicklich. Die Ausgabedatei wird immer denselben MD5-Hash haben: 3cebbe60d91ce760409bbe513593e401
Derzeit wird nur Linux x86-64 unterstützt. Es wäre trivial, diese Technik auf andere Plattformen zu portieren, obwohl jede Version einen anderen MD5-Hash hätte. Es wäre auch möglich, eine plattformübergreifende Polyglot-Datei wie APE zu verwenden.
Beispielverwendung:
$ python3 monomorph.py bin/monomorph.linux.x86-64.benign bin/monomorph.linux.x86-64.meterpreter sample_payloads/bin/linux.x64.meterpreter.bind_tcp.bin
Leute haben zuvor einzelne Kollisionen verwendet, um eine Binärdatei zwischen "guten" und "bösen" Modi umzuschalten. Monomorph bringt dieses Konzept auf die nächste Stufe.
Einige Leute bestehen immer noch darauf, MD5 zu verwenden, um Dateibeispiele zu referenzieren, aus verschiedenen Gründen, die für mich keinen Sinn ergeben. Wenn einer dieser Leute irgendwann Code untersucht, der mit Monomorph gepackt wurde, werden sie sehr verwirrt sein.
Für jedes Bit, das wir kodieren wollen, wurde ein kollidierender MD5-Block mit FastColl vorberechnet. Wie hier zusammengefasst, gibt uns jede Kollision ein Paar von Blöcken, die wir austauschen können, ohne den gesamten MD5-Hash zu ändern. Der Lader prüft zur Laufzeit, welcher Block ausgewählt wurde, um das Bit zu dekodieren.
Um 4KB Daten zu kodieren, müssen wir 4*1024*8 Kollisionen generieren (was einige Stunden dauert) und dabei 4MB Platz in der endgültigen Datei einnehmen.
Um dies zu beschleunigen, habe ich einige kleine Anpassungen an FastColl vorgenommen, um es in der Praxis noch schneller zu machen und die parallele Ausführung zu ermöglichen. Ich bin sicher, dass es intelligentere Möglichkeiten gibt, es zu parallelisieren, aber mein naiver Ansatz ist es, N Instanzen gleichzeitig zu starten und auf die erste zu warten, die fertig ist, und dann alle anderen zu beenden.
Da ich die Vorberechnung bereits durchgeführt habe, kann die Neukonfiguration des Payloads fast augenblicklich erfolgen. Das Austauschen des Zustands der vorberechneten Blöcke erfolgt mit einer Technik, die von Ange Albertini implementiert wurde.
Ja. Es ist überhaupt nicht sehr heimlich, und es versucht auch nicht, es zu sein. Sie können die Kollisionsblöcke mit detectcoll erkennen.