Sie sind auf Seite 1von 40

Exploitin PS4 Video Appp

by
m0rph3u 1987
Apneida
• Intro
• Analyse

1.76 Webkit exploit details

Memory Dumping
• Wie geht es weiter?
• Der Masterplan
• Spraying
• Objekte identfzieren
• ROP executon triggern / ROP Chain
• Fazit
Iitro
• @m0rph3us1987
• Sofwareentwickler (Bereich ERP)
• Fetsch für reverse engineering und für low level
Programmiersprachen
• PS4 war als Geschenk für mich gedacht (Anfang 2015)
• Suche nach einer Konsole mit FW 1.76 (Bundle)
• Amazon Händler
• FW 3.15 :(
IGN
Apialy e
Youtube

Vevo
PS4

Netflix
tcpdump

Prime Video
Apialy e
• Einige Video Apps (IGN, Vevo, etc.) verwenden AppleWebkit/531.3
und kein SSL

• Theoretsch sollte der 1.76 Webkit Exploit in diesen Video Apps noch
funktonieren
Apialy e

IGN
PS4

DNS

1.76 Webkit exploit


Apialy e
Exploit atempt...
u32 size: 0x1cdda9a0
u32base = 0x21cdda980
verify base = 0x81480f8
WebKit2 base address = 0x80adfe60

u32base immer an der selben Adresse. Kein ASLR???


1.76 Webkit exploit detail (credit NApS uid proxima)

• Nutz einen Bug in der array.sort() Funkton aus


• Schreibt die Zeigeradresse und Länge eines Arrays um
• Gibt den Angreifer die Möglichkeit über ein u32 Array beliebige
Speicheradressen zu lesen/schreiben

• u32base -> Adresse des Arrays


• setBase(0x8000000);
• var value = u32[0];
• u32[0] = 0xdeadbeef;
Memory dumpiin

IGN
PS4

DNS

ajax
Dumper 1.76 Webkit exploit
Memory dumpiin
Memory dumpiin
• Zugrif auf Speicher der App
• Falsche Ofsets bedeuten Crash der App oder der Konsole
• Kleine Chunks auszulesen (4096 Bytes bestes Ergebnis)
• Code fängt wie bei FreeBSD bei 0x400000 an. (Ausnahmen)
• Heap war ab von 0x200000000
• Modules liegen immer 16KB von einander getrennt. (OrbisOS
PAGE_SIZE)
• Sehr sehr lange Zeit….
Memory dumpiin
Wie neht e weiter?
• Wie kann ich mit einem arbitrary read/write den Programmfuss
übernehmen?
Wie neht e weiter?

vtable
vtable

RW RX

• Gilt für jede Methode in einer Klasse


• geter/seter für Objekteigenschafen
• vtable liegt im RX Bereich, die Objektnstanz im RW Bereich
vtable v fake vtable
• vtable Pointer befnden sich auf dem Heap
• Heap wird von uns kontrolliert
• vtable Pointer mit einem fake vtable Pointer ersetzen
Der Ma terplai
• Objekte sprayen (in meinem Fall textareas)
• Ein Objektnstanz auf dem Heap suchen/fnden
 Speicheradresse + Objektndex im Array
• vtable des Objektes fnden
• vtable mit fake vtable austauschen
• ROP Executon triggern
Object prayiin…

• Textareas vor garbage collecton schützen


• Anzahl Objekte = 0x1000
• textarea.rows dient der Identfzierung. (el.rows = 0xDEADC0DE)
Der Ma terplai
• Objekte sprayen (in meinem Fall textareas)
• Ein Objektnstanz auf dem Heap suchen/fnden
 Speicheradresse + Objektndex im Array
• vtable des Objektes fnden
• vtable mit fake vtable austauschen
• ROP Executon triggern
Objekti taiz ideitizierei
Objekti taiz ideitizierei

• Falls der Wert 0xDEADC0DE gefunden wurde, wird er mit


0xDEADBEEF ersetzt
• Adresse der Objektnstanz: el_adr = HeapBase + (i * 4) - 0xC8
• Prüfen welches
Element im Array
sich geändert hat

• Wert in
0xC0EDBABE
ändern um 100%
sicher zu sein (und
vielleicht weil es
Spaß macht!)
Der Ma terplai
• Objekte sprayen (in meinem Fall textareas)
• Ein Objektnstanz auf dem Heap suchen/fnden
 Speicheradresse + Objektndex im Array
• vtable des Objektes fnden
• vtable mit fake vtable austauschen
• ROP Executon triggern
vtable iidei
• Speicherbereich rund um die Instanz analysieren

• Suche nach einem Pointer in einen Codebereich, der eine vtable sein
könnte

• vtable ermiteln ist einfach!


vtable iidei
Der Ma terplai
• Objekte sprayen (in meinem Fall textareas)
• Ein Objektnstanz auf dem Heap suchen/fnden
 Speicheradresse + Objektndex im Array
• vtable des Objektes fnden
• vtable mit fake vtable austauschen
• ROP Executon triggern
Trinneriin ROP executoi
• Fake vtable erlaubt uns ein Gadget auszuführen
• Es muss also ein Gadget sein das RSP unter unsere Kontrolle bringt
(stack pivot gadget)
• Einziges brauchbares Gadget push rax ; pop rsp ; ret
Das bedeutet das die Ropchain an die Stelle plaziert werden
muss auf die RAX zeigt!
• Wie ermitle ich den Wert von RAX?
Trinneriin ROP executoi
GDB uid PCBSD
• PCBSD9 VM, mit alten Midori Browser

• Porterung war einfach, einzige Unterschiede sind Ofsets


GDB uid PCBSD
• RAX = Speicher Adresse vtable/fake vtable
GDB uid PCBSD
• RAX = Speicher Adresse vtable/fake vtable

• vtable entry 30 =
textarea.setselectonstart
• Stack pivot gadget muss an diese
Stelle
• ROP chain muss an Anfang der
fake vtable, weil RSP dort hin
zeigen wird wenn das stack pivot
gadget ausgeführt wird
Trinneriin ROP executoi
Der Ma terplai
• Objekte sprayen (in meinem Fall textareas)
• Ein Objektnstanz auf dem Heap suchen/fnden
 Speicheradresse + Objektndex im Array
• vtable des Objektes fnden
• vtable mit fake vtable austauschen
• ROP Executon triggern
Die ROP chaii
• Kleine Anzahl an möglichen gadgets wegen vtable größe

• Also benutzen wir nur die ersten 2/3 Einträge um RSP


irgendwo hinzuschieben wo wir Platz für eine größere chain haben

• Die echte chain liegt irgendwo auf dem Heap


Die ROP chaii
ROP chaii trinneri
Der Ma terplai
• Objekte sprayen (in meinem Fall textareas)
• Ein Objektnstanz auf dem Heap suchen/fnden
 Speicheradresse + Objektndex im Array
• vtable des Objektes fnden
• vtable mit fake vtable austauschen
• ROP Executon triggern
ROP chaii
Fazit
• Video Apps brauchen PSN Zugrif
• Kein JIT Zugrif (ab FW 3.15 egal)
• Video Apps unterstützen kein Threading
• Sandbox
• Können einfach gefxt werden

• Total OK um einen Kernel Exploit zu triggern :D


Vielen Dank für die Aufmerksamkeit