Easy Hack: Java application

Час від часу пентестерам доводиться стикатися з Java-додатками. Це можуть бути різні сервери, клієнти або просто десктопні програми. І іноді виникає необхідність «пропатчити» такий додаток. Навіщо це потрібно? Кожен випадок виникнення такої необхідності унікальний. Наприклад:

  • Складний протокол спілкування між сервером і клієнтом. Щоб відправляти довільні запити – патчим;
  • Захардкожены налаштування. Щоб поміняти – патчим;
  • Для демонстрації наслідків проблем типу «race condition» – патчим.
Звичайно, в кожному випадку проблему можна вирішити, не вдаючись до модифікації програми. Але часто це самий простий і швидкий спосіб домогтися необхідного результату. У цій статті ми розповімо, як легко і швидко змінити функціонал у додатку на Java.

Application
Для розповіді нам знадобиться піддослідна додаток. Звичайно, ми напишемо його самі. Його структура на малюнку 1.

image
малюнок 1

Як бачимо, воно досить просте: два класи, які запускають програму і малюють GUI. Ось їх исходники. Main.java:

1 package com.mycompany; 
2 
3 public class Main 
4 { 
5 public static void main(String[] args) 
6 { 
7 javax.swing.SwingUtilities.invokeLater(new Runnable() 
8 { 
9 public void run() { 
10 new Window(); 
11 } 
12 }); 
13 } 
14 } 
15

Window.java
1 package com.mycompany; 
2 
3 import com.mycompany.Targets.*; 
4 import javax.swing.*; 
5 
6 public class Window extends JFrame 
7 { 
8 private JPanel panel1; 
9 private JLabel Level1Value; 
10 private JLabel Level2Value; 
11 private JLabel Level3Value; 
12 
13 public Window() 
14 { 
15 super("Simple example"); 
16 
17 Level1Value.setText(new Level1().getText()); 
18 Level2Value.setText(new Level2().getText()); 
19 Level3Value.setText(new Level3().getText()); 
20 
21 getContentPane().add(panel1); 
22 
23 setSize(300,100); 
24 setLocationRelativeTo(null); 
25 
26 setVisible(true); 
27 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
28 } 
29 } 
30

Класи дуже прості. Main – створює вікно Window. Window – друкує текст в 3 поля. Текст він бере з наших цільових класів, на прикладі яких ми і будемо розглядати способи модифікації. Як виглядає запущений додаток, дивіться на малюнку 2.

image
малюнок 2

З інструментів знадобиться нам тільки JDK та JavaDecompiler. Приступаємо до патчу.

Level 1
Наше додаток – це jar-архів. Для початку просто вставляємо його в JavaDecompiler і отримуємо ісходник нас цікавить класу. Level1.java:

1 package com.mycompany.Targets; 
2 
3 public class Level1 
4 { 
5 public String getText() 
6 { 
7 return "Data"; 
8 } 
9 } 
10

Чудово, тепер ми копіюємо цей код у текстовий файл з розширенням «java». Це найпростіший клас, який тільки можна придумати. Тепер змінюємо цей исходник, як захочемо. Ми замінили значення, що повертається на «My msg». Далі виконуємо команду:

image

В результаті ми отримаємо готовий Level1.class. Потім нам потрібно просто додати його в наш jar-архів. Зробимо це наступною командою:

image

Звернемо увагу, що ми створили шлях, ідентичний назвою пакету, в якому розташований наш клас, і переклали туди бінарники.
Результат – на малюнку 3.

image
малюнок 3

Розглянемо випадок складніше.

Level 2
Проробляємо те ж саме і отримуємо исходник. Level2.java:

1 package com.mycompany.Targets; 
2 
3 public class Level2 
4 { 
5 public String getText() 
6 { 
7 return "Super " + (new Level1().getText()); 
8 } 
9 }

В ньому я поміняю «Super» на «New». І спробую скомпілювати:

image

Не вийшло, тому що в класі є посилання на інший об'єкт цього пакету. Але java дуже дружелюбна і дозволяє вказати при компіляції будь-який шлях, де лежать класи. Тобто можна просто виконати команду:

image

В результаті, у нас знову готовий бінарники. Точно так само оновлюємо jar-архів і дивимося результат на малюнку 4:
image

image
малюнок 4

Ну і розглянемо останній випадок, у якому додасться ще трохи складнощів.

Level 3
Декомпіліруем наш клас. Level3.java:

1 package com.mycompany.Targets; 
2 
3 import jd.core.CoreConstants; 
4 
5 public class Level3 
6 { 
7 public String getText() 
8 { 
9 return CoreConstants.class.getSimpleName() + " " 
10 + (new Level2().getText()); 
11 } 
12 }

Тут додамо рядок "-update-". Як ми можемо відразу помітити, додався сторонній пакет. І, якщо ми спробуємо зібрати, отримаємо помилку:

image

І знову ж, java виручає своєю доброзичливістю. Їй можна просто вказати шлях, де лежать jar-архіви залежностей. Робиться це так:

image

(так, тут вказівка шляху класу зайве, т. к. він запакований в архів і лежить в тій же директорії, але оскільки це не завжди так, я його все ж вказав)

І далі все так само – результат на малюнку 5.

image

image
Малюнок 5

Підсумок
У підсумку ми розглянули приклади, як просто і швидко можна модифікувати Java-додатки. Звичайно, ми розглянули на прикладі jar-архіву, але ви ж розумієте, що якщо класи не запаковані, то все набагато простіше?

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.