
Go-basierter Analysator für Java-Serialisierungsprotokolle, der Deserialisierungs-Payloads analysiert, ausgibt und generiert, mit Unterstützung für ysoserial-Gadgets und einer Bibliothek zur Datenmanipulation.
ZKar ist ein Analysewerkzeug für das Java-Serialisierungsprotokoll, implementiert in Go. Dieses Tool befindet sich noch in Arbeit, daher gibt es noch keine vollständige API-Dokumentation oder einen Beitragsleitfaden.
ZKar bietet:
Die Verwendung von ZKar ist einfach. Verwende go get, um ZKar zusammen mit der Bibliothek und ihren Abhängigkeiten zu installieren:
go get -u github.com/phith0n/zkar
Als Nächstes verwende github.com/phith0n/zkar/* in deiner Anwendung:
package main
import (
"fmt"
"github.com/phith0n/zkar/serz"
"log"
"os"
)
func main() {
fs, _ := os.Open("./testcases/ysoserial/CommonsCollections6.ser")
defer fs.Close()
serialization, err := serz.FromReader(fs)
if err != nil {
log.Fatal("parse error")
}
fmt.Println(serialization.ToString())
}
Hier ist ein Beispiel, das zeigt, wie man einen vorhandenen Payload liest und in einen UTF-8-Überlängen-Payload umwandelt.
ZKar bietet auch ein Kommandozeilen-Dienstprogramm, das du direkt verwenden kannst:
$ go run main.go
NAME:
zkar - A Java serz tool
USAGE:
main [global options] command [command options] [arguments...]
COMMANDS:
generate generate Java serz attack payloads
dump parse the Java serz streams and dump the struct
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--help, -h show help (default: false)
Zum Beispiel kannst du den Payload CommonsBeanutils3 von ysoserial wie folgt dumpen:
$ go run main.go dump -f "$(pwd)/testcases/ysoserial/CommonsBeanutils3.ser"
ZKar ist ein gut getestetes Werkzeug, das alle Parsing- und Wiederherstellungstests für von ysoserial generierte Gadgets bestanden hat. Das bedeutet, dass von ysoserial generierte Gadgets von ZKar geparst werden können und die geparsten Strukturen wieder in eine Bytefolge umgewandelt werden können, die der ursprünglichen entspricht.
| Gadget | Package | Parse | Rebuild | Parse Time |
|---|---|---|---|---|
| AspectJWeaver | ysoserial | ✅ | ✅ | 80.334µs |
| BeanShell1 | ysoserial | ✅ | ✅ | 782.613µs |
| C3P0 | ysoserial | ✅ | ✅ | 98.321µs |
| Click1 | ysoserial | ✅ | ✅ | 573.298µs |
| Clojure | ysoserial | ✅ | ✅ | 72.415µs |
| CommonsBeanutils1 | ysoserial | ✅ | ✅ | 461.15µs |
| CommonsCollections1 | ysoserial | ✅ | ✅ | 64.484µs |
| CommonsCollections2 | ysoserial | ✅ | ✅ | 508.918µs |
| CommonsCollections3 | ysoserial | ✅ | ✅ | 564.071µs |
| CommonsCollections4 | ysoserial | ✅ | ✅ | 535.449µs |
| CommonsCollections5 | ysoserial | ✅ | ✅ | 137.609µs |
| CommonsCollections6 | ysoserial | ✅ | ✅ | 68.753µs |
| CommonsCollections7 | ysoserial | ✅ | ✅ | 178.549µs |
| FileUpload1 | ysoserial | ✅ | ✅ | 35.39µs |
| Groovy1 | ysoserial | ✅ | ✅ | 150.991µs |
| Hibernate1 | ysoserial | ✅ | ✅ | 789.674µs |
| Hibernate2 | ysoserial | ✅ | ✅ | 168.624µs |
| JBossInterceptors1 | ysoserial | ✅ | ✅ | 632.581µs |
| JRMPClient | ysoserial | ✅ | ✅ | 32.967µs |
| JRMPListener | ysoserial | ✅ | ✅ | 38.263µs |
| JSON1 | ysoserial | ✅ | ✅ | 2.157225ms |
| JavassistWeld1 | ysoserial |
Hinweis: Zum Parsen des JDK8u20-Payloads solltest du das Flag --jdk8u20 zum Befehl dump hinzufügen. Da der Payload kein gültiger serialisierter Datenstrom ist, ist es notwendig, ZKar über dieses Flag mitzuteilen, dass die Daten gepatcht werden müssen.
ZKar wird unter der MIT-Lizenz veröffentlicht. Siehe LICENSE
| ✅ |
| ✅ |
| 468.596µs |
| Jdk7u21 | ysoserial | ✅ | ✅ | 355.01µs |
| Jython1 | ysoserial | ✅ | ✅ | 216.862µs |
| MozillaRhino1 | ysoserial | ✅ | ✅ | 1.775193ms |
| MozillaRhino2 | ysoserial | ✅ | ✅ | 409.124µs |
| Myfaces1 | ysoserial | ✅ | ✅ | 22.997µs |
| Myfaces2 | ysoserial | ✅ | ✅ | 38.131µs |
| ROME | ysoserial | ✅ | ✅ | 485.804µs |
| Spring1 | ysoserial | ✅ | ✅ | 797.469µs |
| Spring2 | ysoserial | ✅ | ✅ | 358.041µs |
| URLDNS | ysoserial | ✅ | ✅ | 21.502µs |
| Vaadin1 | ysoserial | ✅ | ✅ | 438.729µs |
| Wicket1 | ysoserial | ✅ | ✅ | 23.509µs |
| JDK8u20* | pwntester | ✅ | ✅ | 529.3µs |