
सरल POC लाइब्रेरी जो NdrServerCall2 या इसी तरह के माध्यम से प्रॉक्सी करके मनमाने कॉल निष्पादित करती है
स्थानीय और दूरस्थ कोड निष्पादित करने का एक सामान्य तरीका बनाने के लिए, हमने कोड निष्पादन की एक अपेक्षाकृत अस्पष्ट विधि डिज़ाइन की है, जिसे हम आंतरिक रूप से RpcCraft (Self) और RpcExec (Remote Process) कहते हैं। यह तकनीक एक्सप्लॉइट डेवलपर्स के बीच प्रसिद्ध एक पद्धति का लाभ उठाती है, जो मनमाना कोड निष्पादित करने के लिए NdrServerCall2 या NdrServerCallAll जैसी RPC (Remote Procedure Call) सर्वर कॉलों का दुरुपयोग करती है।
RPCRT4.dll के भीतर, NdrServerCall2, NdrServerCallAll, और NdrServerCallNdr64 (NdrServerCallAll का एक उपनाम) जैसे फ़ंक्शन सर्वर कार्यक्षमताओं से संबंधित फ़ंक्शनों को गतिशील रूप से आमंत्रित करने के लिए रैपर के रूप में लागू किए गए हैं। ये फ़ंक्शन एक एकल तर्क लेते हैं, जो RPC_MESSAGE संरचना के लिए एक पॉइंटर है।
RPC_MESSAGE संरचना:
typedef struct _RPC_MESSAGE {
RPC_BINDING_HANDLE Handle;
unsigned long DataRepresentation;
void *Buffer;
unsigned int BufferLength;
unsigned int ProcNum;
PRPC_SYNTAX_IDENTIFIER TransferSyntax;
void *RpcInterfaceInformation;
void *ReservedForRuntime;
RPC_MGR_EPV *ManagerEpv;
void *ImportContext;
unsigned long RpcFlags;
} RPC_MESSAGE, *PRPC_MESSAGE;
किसी सेवा से बाइंडिंग किए बिना रनटाइम को आरंभ करने के लिए, PerformRpcInitialization फ़ंक्शन का उपयोग किया जाता है। यह फ़ंक्शन आंतरिक रूप से आवश्यक संरचनाओं को प्रारंभ करता है, बिना मैन्युअल बाइंडिंग की आवश्यकता के।
तकनीक का यह सार्वजनिक संस्करण व्यवहार्यता प्रदर्शित करने के लिए POC के रूप में विकसित किया गया है, और यह वर्तमान में गायब बाइंडिंग हैंडल के कारण NdrGetBuffer पर एक अपवाद (exception) उत्पन्न करता है। इससे कई तरीकों से निपटा जा सकता है, लेकिन वर्तमान कार्यान्वयन निम्नलिखित करता है:
int FetchReturnValue(const PEXCEPTION_POINTERS ExceptionInfo) {
ExceptionInfo->ContextRecord->EFlags |= (1 << 16);
g_ReturnValue = (PVOID)ExceptionInfo->ContextRecord->Rax;
return EXCEPTION_CONTINUE_EXECUTION;
}
RPC इनवोकेशन CFG द्वारा संरक्षित है, जिसका अर्थ है कि पूर्ण, अप्रतिबंधित कोड निष्पादन प्राप्त करने के लिए, या तो SetProcessValidCallTargets के साथ लक्ष्य को मान्य के रूप में चिह्नित करना आवश्यक है या RpcInvokeCheckICall को पैच करना आवश्यक है।
RpcProxyInvoke प्रोजेक्ट एक वैकल्पिक तकनीक प्रदर्शित करता है जिसका दुरुपयोग RailGun शैली की लाइब्रेरी को लागू करने के लिए किया जा सकता है। यद्यपि सार्वजनिक कार्यान्वयन सही नहीं है, यह आगे के विकास के लिए एक आधार के रूप में काम कर सकता है।
यह प्रोजेक्ट MIT लाइसेंस के अंतर्गत लाइसेंस प्राप्त है - विवरण के लिए LICENSE फ़ाइल देखें।