
लाइव मॉनिटरिंग टूल जो ETW का उपयोग करके रिमोट PowerShell सत्रों के लिए WinRM/PSRP प्रोटोकॉल को कैप्चर और डिकोड करता है, सुरक्षा विश्लेषण के लिए कमांड निष्पादन ट्रेस और लॉगिंग प्रदान करता है।
RemotePSpy रिमोट PowerShell सत्रों की लाइव निगरानी प्रदान करता है, जो विशेष रूप से PowerShell के पुराने (5.0 से पहले के) संस्करणों के लिए उपयोगी है, जिनमें व्यापक लॉगिंग सुविधाएँ अंतर्निहित नहीं होती हैं।
यह रिमोट PowerShell के लिए परिवहन के रूप में उपयोग किए जाने वाले WinRM प्रोटोकॉल से संदेश डेटा प्राप्त करने के लिए Windows के लिए इवेंट ट्रेसिंग (ETW) का उपयोग करता है, और विभिन्न प्रोटोकॉल परतों को डिकोड करके निष्पादित स्क्रिप्ट कमांड और उनके इनपुट/आउटपुट का ट्रेस प्रदान करता है।
यह वर्तमान में एक प्रारंभिक शोध प्रोटोटाइप है और इसलिए PowerShell रिमोट प्रोटोकॉल (PSRP) के हर पहलू का समर्थन नहीं करता है। फिर भी, यह रिमोट PowerShell सत्र में क्या हो रहा है, इसके बारे में उपयोगी जानकारी प्रदान कर सकता है।
स्थापित करने का सबसे आसान तरीका pip का उपयोग करना है:
pip install remotepspy
pip के माध्यम से स्थापित करते समय निर्भरताएँ स्वचालित रूप से स्थापित हो जानी चाहिए, लेकिन यदि आप स्रोत से स्थापित करना चाहते हैं तो वे यहाँ सूचीबद्ध हैं:
libwim-15.dll केवल तभी आवश्यक है जब आप (अनुशंसित, और डिफ़ॉल्ट) Microsoft-Windows-WinRM ETW प्रदाता को डेटा स्रोत के रूप में उपयोग कर रहे हों। इसका उपयोग WinRM/WSMan प्रोटोकॉल में कुछ स्ट्रीम ऑब्जेक्ट्स को डीकंप्रेस करने के लिए किया जाता है जिनमें PSRP संदेश खंड होते हैं। इसे मुख्य Python स्क्रिप्ट के समान निर्देशिका में रखें।
निगरानी और लॉगिंग शुरू करने के लिए बस RemotePSpy निष्पादित करें, और समाप्त होने पर Return दबाएँ। लॉग वर्तमान कार्यशील निर्देशिका में लिखा जाएगा, जिसका नाम RemotePSpy.log होगा।
यह उपकरण लॉग फ़ाइल में अधिक विस्तृत जानकारी के साथ-साथ stdout पर रिमोट PowerShell के उपयोगकर्ता को अपनी स्क्रीन पर जो दिखाई देगा उसका एक अनुमानित प्रतिकृति भी प्रिंट करेगा। अधिक जटिल लॉगिंग उपलब्ध है, नीचे "लॉगिंग" देखें।
यदि आपने Python को अपने PATH में स्थापित किया है, तो RemotePSpy निष्पादन योग्य स्क्रिप्ट भी आपके PATH में होंगी। अन्यथा आपको उन्हें अपनी Python site-packages निर्देशिका में देखने की आवश्यकता हो सकती है।
डिफ़ॉल्ट RemotePSpy (अनुशंसित) WinRM ETW प्रदाता को डेटा स्रोत के रूप में उपयोग करता है। यदि आप इसके बजाय PowerShell ETW प्रदाता का उपयोग करना चाहते हैं, तो आप RemotePSpy_powershell_prov निष्पादित कर सकते हैं।
इस विशेष ETW प्रदाता में डेटा कैसे प्रदान किया जाता है, इसके आधार पर कुछ स्थिति को ट्रैक करने की अतिरिक्त जटिलता के कारण यह संस्करण कुछ अनावश्यक चेतावनियाँ उत्पन्न कर सकता है।
कोड में कई काफी मॉड्यूलर क्लासेस शामिल हैं जो प्रोटोकॉल स्टैक में विभिन्न परतों पर इनपुट स्वीकार कर सकते हैं। यह उन्हें डेटा कहाँ से और किस रूप में प्राप्त किया जाता है, इसके आधार पर थोड़े अलग तरीकों से एक साथ जोड़े जाने की अनुमति देता है। अधिकांश क्लासेस एक कॉलबैक फ़ंक्शन स्वीकार करते हैं जिसका उपयोग वे अपने द्वारा उत्पादित परिणाम को स्टैक में अगली परत तक पहुँचाने के लिए करते हैं।
मुख्य क्लासेस का विवरण नीचे दिया गया है, इसके बाद कुछ प्रोसेसिंग फ्लो दिए गए हैं जो दिखाते हैं कि विभिन्न परिदृश्यों में कौन सी क्लास किसको फीड करती है।
ETWWinRM – WinRM प्रदाता से ETW इवेंट प्राप्त करता है।
ETWPowerShell – PowerShell प्रदाता से ETW इवेंट प्राप्त करता है।
PowerShellETWParser – PowerShell ETW इवेंट के लिए Shell संदर्भ की पहचान करता है, खंड डेटा को PSRPDefragmenter को आगे भेजता है। थ्रेड सिंक्रनाइज़ेशन भी प्रदान करता है।
SoapDefragmenter – WinRM ETW इवेंट से पूर्ण WSMan SOAP संदेशों को फिर से जोड़ता है, पूर्ण SOAP को WSManPS को आगे भेजता है।
WSManPS – PowerShell से संबंधित नहीं होने वाले WinRM को फ़िल्टर करता है, Shell संदर्भ को ट्रैक करता है, WSMan SOAP से PSRP खंड डेटा को पार्स करता है, और खंड डेटा को PSRPDefragmenter को आगे भेजता है।
PSRPDefragmenter – PSRP खंडों को पूर्ण PRSP संदेशों में फिर से जोड़ता है। खंडों को ObjectID द्वारा जोड़ा जाता है, और ObjectID की विशिष्टता Shell संदर्भ को ध्यान में रखकर सुनिश्चित की जाती है। अंतिम PSRP संदेशों को PSRPParser को आगे भेजता है।
PSRPParser – कच्चे बाइनरी PSRP संदेश को डिकोड करता है, RPID, Pipeline ID, और MessageType जैसे हेडर विवरण निकालता है। डिकोड किए गए संदेशों को SimpleCommandTracer को आगे भेजता है।
SimpleCommandTracer – MessageType का उपयोग करके PSRP संदेशों की व्याख्या करता है, और कमांड, तर्क और उनके आउटपुट को निकालता और प्रिंट/लॉग करता है। क्रमबद्ध PowerShell ऑब्जेक्ट्स का आंशिक डिकोडिंग शामिल है। हर संभव सुविधा का पूर्ण कार्यान्वयन नहीं है, लेकिन निष्पादन ट्रेस की अनुमति देने के लिए अधिकांश सामान्य मामलों को कवर करने का प्रयास करता है।
Microsoft-Windows-WinRM ETW प्रदाता का उपयोग करते समय प्रोसेसिंग फ्लो:
ETWWinRM -> SoapDefragmenter -> WSManPS -> PSRPDefragmenter -> PSRPParser -> SimpleCommandTracer
Microsoft-Windows-PowerShell ETW प्रदाता का उपयोग करते समय प्रोसेसिंग फ्लो:
ETWPowerShell -> PowerShellETWParser -> PSRPDefragmenter -> PSRPParser -> SimpleCommandTracer
प्रोटोकॉल स्टैक में प्रत्येक परत पर व्यापक लॉगिंग है। यह विभिन्न स्तरों पर डिबगिंग की अनुमति देता है, और विकास के दौरान विशेष रूप से सहायक था। उम्मीद है कि यह रिमोट PowerShell की कार्यप्रणाली की जाँच करने वाले किसी भी व्यक्ति के लिए भी उपयोगी हो सकता है, क्योंकि सभी प्रमुख परतों पर प्रोटोकॉल का पूर्ण ट्रेस प्राप्त करना संभव है।
वर्तमान में, स्क्रिप्ट के अंत में स्रोत कोड जहाँ लॉगर कॉन्फ़िगर किए गए हैं, उसे लॉगिंग बदलने के लिए संपादित किया जाना चाहिए। भविष्य के रिलीज़ में उम्मीद है कि ऐसे कॉन्फ़िगरेशन के लिए एक बेहतर विधि प्रदान की जाएगी।
प्रत्येक लॉगर नाम एक स्थिरांक, LOGGER_NAME, द्वारा परिभाषित किया गया है, जो उस क्लास में होता है जो इसका उपयोग करता है। प्रत्येक लॉगर "RemotePSpy" के चाइल्ड के रूप में परिभाषित किया गया है (जैसे RemotePSpy.etw)। प्रोग्रामेटिक रूप से, लॉगर को उपयुक्त लॉग नाम के साथ logging.getLogger() का उपयोग करके कॉन्फ़िगर किया जा सकता है।
त्वरित संदर्भ के लिए, निम्नलिखित लॉगर और स्तर आपको प्रोटोकॉल में विभिन्न परतों पर प्रोटोकॉल ट्रेस प्रदान करेंगे:
ध्यान दें कि SimpleCommandTracer stdout पर भी एक ट्रेस आउटपुट करता है, और यह कुछ हद तक उस डिस्प्ले को दोहराने का प्रयास करता है जैसा रिमोट PowerShell उपयोगकर्ता देखेगा। यह कमांड ट्रेस लॉग से अलग है जो प्रत्येक कमांड, पाइपलाइन विधि कॉल और पाइपलाइन आउटपुट को अधिक सटीक तरीके से लॉग करता है, जिसमें RPID और Pipeline ID जैसे अतिरिक्त संदर्भ शामिल हैं।
प्रत्येक लॉग में किस स्तर पर क्या दिखाई देता है, इसका अधिक विस्तृत सारांश नीचे दिया गया है:
ERROR:
WARNING:
INFO:
DEBUG:
DEBUG:
ERROR:
WARNING:
INFO:
DEBUG:
ERROR:
WARNING:
INFO:
DEBUG:
INFO:
DEBUG:
DEBUG:
ERROR:
DEBUG:
INFO:
| मुख्य लॉग डेटा | लॉगर नाम स्थिरांक | स्तर |
|---|
| कमांड ट्रेस | SimpleCommandTracer.LOGGER_NAME | INFO |
| पूर्ण ETW इवेंट ट्रेस | ETWWinRM.LOGGER_NAME | DEBUG |
| पूर्ण WSMan SOAP संदेश ट्रेस | SoapDefragmenter.LOGGER_NAME | INFO |
| प्रत्येक PSRP खंड का पूर्ण ट्रेस | PSRPDefragmenter.LOGGER_NAME | DEBUG |
| पूर्ण PSRP संदेश ट्रेस | PSRPParser.LOGGER_NAME | DEBUG |