
Анализатор протокола сериализации Java на Go, который анализирует, выгружает и создает полезные нагрузки десериализации с поддержкой гаджетов ysoserial и библиотекой для манипуляции данными.
ZKar — это инструмент анализа протокола сериализации Java, реализованный на Go. Этот инструмент всё ещё в разработке, поэтому полной документации по API и руководства по внесению вклада пока нет.
ZKar предоставляет:
Использовать ZKar просто. Используйте go get для установки ZKar вместе с библиотекой и её зависимостями:
go get -u github.com/phith0n/zkar
Далее используйте github.com/phith0n/zkar/* в вашем приложении:
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())
}
Здесь приведён пример того, как прочитать существующую полезную нагрузку и изменить её на полезную нагрузку с избыточным кодированием UTF-8.
ZKar также предоставляет утилиту командной строки, которую можно использовать напрямую:
$ 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)
Например, вы можете дампнуть полезную нагрузку CommonsBeanutils3 из ysoserial следующим образом:
$ go run main.go dump -f "$(pwd)/testcases/ysoserial/CommonsBeanutils3.ser"
ZKar — это хорошо протестированный инструмент, прошедший все тесты разбора и перестройки гаджетов, сгенерированных ysoserial. Это означает, что гаджет, сгенерированный ysoserial, может быть разобран ZKar, а разобранные структуры могут быть преобразованы обратно в байтовую строку, равную исходной.
Примечание: Для разбора полезной нагрузки JDK8u20 необходимо добавить флаг --jdk8u20 к команде dump. Поскольку полезная нагрузка не является допустимым потоком сериализованных данных, необходимо сообщить ZKar о патче данных через этот флаг.
ZKar распространяется под лицензией MIT. См. LICENSE
| Гаджет | Пакет | Разбор | Перестройка | Время разбора |
|---|
| 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 | ✅ | ✅ | 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 |