Translated ['src/generic-methodologies-and-resources/phishing-methodolog

This commit is contained in:
Translator 2025-04-27 16:33:43 +00:00
parent 08589bdf92
commit 1e8cb6991c
5 changed files with 263 additions and 102 deletions

View File

@ -31,6 +31,7 @@ additional-js = [
"theme/tabs.js", "theme/tabs.js",
"theme/ht_searcher.js", "theme/ht_searcher.js",
"theme/sponsor.js", "theme/sponsor.js",
"theme/ai.js"
] ]
no-section-label = true no-section-label = true
preferred-dark-theme = "hacktricks-dark" preferred-dark-theme = "hacktricks-dark"

View File

@ -561,6 +561,7 @@
- [CSRF (Cross Site Request Forgery)](pentesting-web/csrf-cross-site-request-forgery.md) - [CSRF (Cross Site Request Forgery)](pentesting-web/csrf-cross-site-request-forgery.md)
- [Dangling Markup - HTML scriptless injection](pentesting-web/dangling-markup-html-scriptless-injection/README.md) - [Dangling Markup - HTML scriptless injection](pentesting-web/dangling-markup-html-scriptless-injection/README.md)
- [SS-Leaks](pentesting-web/dangling-markup-html-scriptless-injection/ss-leaks.md) - [SS-Leaks](pentesting-web/dangling-markup-html-scriptless-injection/ss-leaks.md)
- [DApps - Decentralized Applications](pentesting-web/dapps-DecentralizedApplications.md)
- [Dependency Confusion](pentesting-web/dependency-confusion.md) - [Dependency Confusion](pentesting-web/dependency-confusion.md)
- [Deserialization](pentesting-web/deserialization/README.md) - [Deserialization](pentesting-web/deserialization/README.md)
- [NodeJS - \_\_proto\_\_ & prototype Pollution](pentesting-web/deserialization/nodejs-proto-prototype-pollution/README.md) - [NodeJS - \_\_proto\_\_ & prototype Pollution](pentesting-web/deserialization/nodejs-proto-prototype-pollution/README.md)
@ -625,6 +626,7 @@
- [Regular expression Denial of Service - ReDoS](pentesting-web/regular-expression-denial-of-service-redos.md) - [Regular expression Denial of Service - ReDoS](pentesting-web/regular-expression-denial-of-service-redos.md)
- [Reset/Forgotten Password Bypass](pentesting-web/reset-password.md) - [Reset/Forgotten Password Bypass](pentesting-web/reset-password.md)
- [Reverse Tab Nabbing](pentesting-web/reverse-tab-nabbing.md) - [Reverse Tab Nabbing](pentesting-web/reverse-tab-nabbing.md)
- [RSQL Injection](pentesting-web/rsql-injection.md)
- [SAML Attacks](pentesting-web/saml-attacks/README.md) - [SAML Attacks](pentesting-web/saml-attacks/README.md)
- [SAML Basics](pentesting-web/saml-attacks/saml-basics.md) - [SAML Basics](pentesting-web/saml-attacks/saml-basics.md)
- [Server Side Inclusion/Edge Side Inclusion Injection](pentesting-web/server-side-inclusion-edge-side-inclusion-injection.md) - [Server Side Inclusion/Edge Side Inclusion Injection](pentesting-web/server-side-inclusion-edge-side-inclusion-injection.md)

View File

@ -4,17 +4,17 @@
## Methodology ## Methodology
1. पीड़ित की पहचान करें 1. शिकार का पता लगाना
1. **पीड़ित डोमेन** का चयन करें। 1. **शिकार डोमेन** का चयन करें।
2. पीड़ित द्वारा उपयोग किए जाने वाले **लॉगिन पोर्टल्स** की कुछ बुनियादी वेब एन्यूमरेशन करें और **निर्णय लें** कि आप किसका **नकली रूप** धारण करेंगे। 2. शिकार द्वारा उपयोग किए जाने वाले **लॉगिन पोर्टल्स** की बुनियादी वेब एन्यूमरेशन करें और **निर्णय** लें कि आप किसका **नकली रूप** धारण करेंगे।
3. कुछ **OSINT** का उपयोग करके **ईमेल खोजें** 3. कुछ **OSINT** का उपयोग करके **ईमेल खोजें**
2. वातावरण तैयार करें 2. वातावरण तैयार करें
1. **डोमेन खरीदें** जिसका आप फ़िशिंग आकलन के लिए उपयोग करने जा रहे हैं 1. **डोमेन खरीदें** जिसका आप फ़िशिंग आकलन के लिए उपयोग करने जा रहे हैं
2. **ईमेल सेवा** से संबंधित रिकॉर्ड (SPF, DMARC, DKIM, rDNS) कॉन्फ़िगर करें 2. **ईमेल सेवा** से संबंधित रिकॉर्ड (SPF, DMARC, DKIM, rDNS) को **कॉन्फ़िगर करें**
3. **gophish** के साथ VPS कॉन्फ़िगर करें 3. **gophish** के साथ VPS को कॉन्फ़िगर करें
3. अभियान तैयार करें 3. अभियान तैयार करें
1. **ईमेल टेम्पलेट** तैयार करें 1. **ईमेल टेम्पलेट** तैयार करें
2. क्रेडेंशियल चुराने के लिए **वेब पेज** तैयार करें 2. क्रेडेंशियल्स चुराने के लिए **वेब पेज** तैयार करें
4. अभियान शुरू करें! 4. अभियान शुरू करें!
## समान डोमेन नाम उत्पन्न करें या एक विश्वसनीय डोमेन खरीदें ## समान डोमेन नाम उत्पन्न करें या एक विश्वसनीय डोमेन खरीदें
@ -22,15 +22,15 @@
### डोमेन नाम विविधता तकनीकें ### डोमेन नाम विविधता तकनीकें
- **कीवर्ड**: डोमेन नाम में मूल डोमेन का एक महत्वपूर्ण **कीवर्ड** **शामिल** है (जैसे, zelster.com-management.com)। - **कीवर्ड**: डोमेन नाम में मूल डोमेन का एक महत्वपूर्ण **कीवर्ड** **शामिल** है (जैसे, zelster.com-management.com)।
- **हाइफनेट सबडोमेन**: एक सबडोमेन के **डॉट को हाइफन** में बदलें (जैसे, www-zelster.com)। - **हाइफन वाला उपडोमेन**: उपडोमेन के **डॉट को हाइफन** में बदलें (जैसे, www-zelster.com)।
- **नया TLD**: एक **नए TLD** का उपयोग करते हुए वही डोमेन (जैसे, zelster.org) - **नया TLD**: एक **नए TLD** का उपयोग करते हुए वही डोमेन (जैसे, zelster.org)
- **हॉमोग्लिफ**: यह डोमेन नाम में एक अक्षर को **ऐसे अक्षरों से बदलता है जो समान दिखते हैं** (जैसे, zelfser.com)। - **हॉमोग्लिफ**: यह डोमेन नाम में एक अक्षर को **समान दिखने वाले अक्षरों** से **बदलता** है (जैसे, zelfser.com)।
- **स्थानांतरण:** यह डोमेन नाम में **दो अक्षरों को स्वैप** करता है (जैसे, zelsetr.com)। - **स्थानांतरण:** यह डोमेन नाम में **दो अक्षरों को स्वैप** करता है (जैसे, zelsetr.com)।
- **एकवचन/बहुवचन**: डोमेन नाम के अंत में “s” जोड़ता या हटाता है (जैसे, zeltsers.com)। - **एकवचन/बहुवचन**: डोमेन नाम के अंत में “s” जोड़ता या हटाता है (जैसे, zeltsers.com)।
- **अवशेष**: यह डोमेन नाम से **एक** अक्षर को **हटाता है** (जैसे, zelser.com)। - **अवशेष**: यह डोमेन नाम से **एक** अक्षर को **हटाता** है (जैसे, zelser.com)।
- **दोहराव:** यह डोमेन नाम में **एक** अक्षर को **दोहराता है** (जैसे, zeltsser.com)। - **दोहराव:** यह डोमेन नाम में **एक** अक्षर को **दोहराता** है (जैसे, zeltsser.com)।
- **प्रतिस्थापन**: हॉमोग्लिफ की तरह लेकिन कम छिपा हुआ। यह डोमेन नाम में एक अक्षर को बदलता है, शायद कीबोर्ड पर मूल अक्षर के निकटता में एक अक्षर के साथ (जैसे, zektser.com)। - **प्रतिस्थापन**: हॉमोग्लिफ की तरह लेकिन कम छिपा हुआ। यह डोमेन नाम में एक अक्षर को बदलता है, शायद कीबोर्ड पर मूल अक्षर के निकटता में एक अक्षर के साथ (जैसे, zektser.com)।
- **सबडोमेन**: डोमेन नाम के अंदर एक **डॉट** पेश करें (जैसे, ze.lster.com)। - **उपडोमेन**: डोमेन नाम के अंदर एक **डॉट** पेश करें (जैसे, ze.lster.com)।
- **सम्मिलन**: यह डोमेन नाम में **एक अक्षर सम्मिलित** करता है (जैसे, zerltser.com)। - **सम्मिलन**: यह डोमेन नाम में **एक अक्षर सम्मिलित** करता है (जैसे, zerltser.com)।
- **गायब डॉट**: डोमेन नाम के साथ TLD जोड़ें। (जैसे, zelstercom.com) - **गायब डॉट**: डोमेन नाम के साथ TLD जोड़ें। (जैसे, zelstercom.com)
@ -47,13 +47,13 @@
### बिटफ्लिपिंग ### बिटफ्लिपिंग
यहां **संभावना है कि कुछ बिट्स जो संग्रहीत हैं या संचार में हैं, स्वचालित रूप से पलट सकते हैं** विभिन्न कारकों के कारण जैसे सौर ज्वालाएं, ब्रह्मांडीय किरणें, या हार्डवेयर त्रुटिया एक **संभावना है कि कुछ बिट्स जो संग्रहीत हैं या संचार में हैं, विभिन्न कारकों के कारण स्वचालित रूप से पलट सकते हैं** जैसे सौर ज्वालाएं, ब्रह्मांडीय किरणें, या हार्डवेयर त्रुटिया
जब इस अवधारणा को **DNS अनुरोधों पर लागू किया जाता है**, तो यह संभव है कि **DNS सर्वर द्वारा प्राप्त डोमेन** वही न हो जो प्रारंभ में अनुरोधित था। जब इस अवधारणा को **DNS अनुरोधों पर लागू किया जाता है**, तो यह संभव है कि **DNS सर्वर द्वारा प्राप्त डोमेन** वही न हो जो प्रारंभ में अनुरोधित किया गया था।
उदाहरण के लिए, "windows.com" डोमेन में एकल बिट संशोधन इसे "windnws.com" में बदल सकता है। उदाहरण के लिए, "windows.com" डोमेन में एकल बिट संशोधन इसे "windnws.com" में बदल सकता है।
हमलावर **इसका लाभ उठाकर कई बिट-फ्लिपिंग डोमेन पंजीकृत कर सकते हैं** जो पीड़ित के डोमेन के समान हैं। उनका इरादा वैध उपयोगकर्ताओं को अपनी खुद की अवसंरचना की ओर पुनर्निर्देशित करना है। हमलावर **इसका लाभ उठाकर कई बिट-फ्लिपिंग डोमेन पंजीकृत कर सकते हैं** जो शिकार के डोमेन के समान होते हैं। उनका इरादा वैध उपयोगकर्ताओं को अपनी खुद की अवसंरचना की ओर मोड़ना है।
अधिक जानकारी के लिए पढ़ें [https://www.bleepingcomputer.com/news/security/hijacking-traffic-to-microsoft-s-windowscom-with-bitflipping/](https://www.bleepingcomputer.com/news/security/hijacking-traffic-to-microsoft-s-windowscom-with-bitflipping/) अधिक जानकारी के लिए पढ़ें [https://www.bleepingcomputer.com/news/security/hijacking-traffic-to-microsoft-s-windowscom-with-bitflipping/](https://www.bleepingcomputer.com/news/security/hijacking-traffic-to-microsoft-s-windowscom-with-bitflipping/)
@ -65,7 +65,7 @@
- [http://www.fortiguard.com/webfilter](http://www.fortiguard.com/webfilter) - [http://www.fortiguard.com/webfilter](http://www.fortiguard.com/webfilter)
- [https://urlfiltering.paloaltonetworks.com/query/](https://urlfiltering.paloaltonetworks.com/query/) - [https://urlfiltering.paloaltonetworks.com/query/](https://urlfiltering.paloaltonetworks.com/query/)
## ईमेल खोजने ## ईमेल खोजने के लिए
- [https://github.com/laramies/theHarvester](https://github.com/laramies/theHarvester) (100% मुफ्त) - [https://github.com/laramies/theHarvester](https://github.com/laramies/theHarvester) (100% मुफ्त)
- [https://phonebook.cz/](https://phonebook.cz) (100% मुफ्त) - [https://phonebook.cz/](https://phonebook.cz) (100% मुफ्त)
@ -73,8 +73,8 @@
- [https://hunter.io/](https://hunter.io) - [https://hunter.io/](https://hunter.io)
- [https://anymailfinder.com/](https://anymailfinder.com) - [https://anymailfinder.com/](https://anymailfinder.com)
**अधिक** मान्य ईमेल पते खोजने या **पहले से खोजे गए पते** की पुष्टि करने के लिए आप देख सकते हैं कि क्या आप पीड़ित के smtp सर्वरों को ब्रूट-फोर्स कर सकते हैं। [यहां ईमेल पते की पुष्टि/खोजने के तरीके के बारे में जानें](../../network-services-pentesting/pentesting-smtp/index.html#username-bruteforce-enumeration).\ **अधिक** मान्य ईमेल पते खोजने या **पहले से खोजे गए** पते की पुष्टि करने के लिए आप देख सकते हैं कि क्या आप शिकार के smtp सर्वरों को ब्रूट-फोर्स कर सकते हैं। [यहां ईमेल पते की पुष्टि/खोजने के तरीके के बारे में जानें](../../network-services-pentesting/pentesting-smtp/index.html#username-bruteforce-enumeration).\
इसके अलावा, यह न भूलें कि यदि उपयोगकर्ता **अपने मेल तक पहुचने के लिए कोई वेब पोर्टल का उपयोग करते हैं**, तो आप देख सकते हैं कि क्या यह **यूजरनेम ब्रूट फोर्स** के लिए कमजोर है, और यदि संभव हो तो इस कमजोरी का लाभ उठाएं। इसके अलावा, यह न भूलें कि यदि उपयोगकर्ता **अपने मेल तक पहुचने के लिए कोई वेब पोर्टल का उपयोग करते हैं**, तो आप देख सकते हैं कि क्या यह **यूजरनेम ब्रूट फोर्स** के लिए संवेदनशील है, और यदि संभव हो तो इस कमजोरी का लाभ उठाएं।
## GoPhish कॉन्फ़िगर करना ## GoPhish कॉन्फ़िगर करना
@ -82,8 +82,8 @@
आप इसे [https://github.com/gophish/gophish/releases/tag/v0.11.0](https://github.com/gophish/gophish/releases/tag/v0.11.0) से डाउनलोड कर सकते हैं आप इसे [https://github.com/gophish/gophish/releases/tag/v0.11.0](https://github.com/gophish/gophish/releases/tag/v0.11.0) से डाउनलोड कर सकते हैं
इसे `/opt/gophish` के अंदर डाउनलोड और डिकंप्रेस करें और `/opt/gophish/gophish` चलाए।\ इसे `/opt/gophish` के अंदर डाउनलोड और डिकंप्रेस करें और `/opt/gophish/gophish` चलाए।\
आपको आउटपुट में पोर्ट 3333 पर व्यवस्थापक उपयोगकर्ता के लिए एक पासवर्ड दिया जाएगा। इसलिए, उस पोर्ट तक पहुंचें और व्यवस्थापक पासवर्ड बदलने के लिए उन क्रेडेंशियल्स का उपयोग करें। आपको उस पोर्ट को स्थानीय पर टनल करने की आवश्यकता हो सकती है: आपको आउटपुट में पोर्ट 3333 पर व्यवस्थापक उपयोगकर्ता के लिए एक पासवर्ड दिया जाएगा। इसलिए, उस पोर्ट तक पहुँचें और उन क्रेडेंशियल्स का उपयोग करके व्यवस्थापक पासवर्ड बदलें। आपको उस पोर्ट को स्थानीय पर टनल करने की आवश्यकता हो सकती है:
```bash ```bash
ssh -L 3333:127.0.0.1:3333 <user>@<ip> ssh -L 3333:127.0.0.1:3333 <user>@<ip>
``` ```
@ -109,9 +109,9 @@ cp "/etc/letsencrypt/live/$DOMAIN/fullchain.pem" /opt/gophish/ssl_keys/key.crt
``` ```
**मेल कॉन्फ़िगरेशन** **मेल कॉन्फ़िगरेशन**
शुरू करें इंस्टॉलेशन: `apt-get install postfix` शुरू करें इंस्टॉल करने के लिए: `apt-get install postfix`
फिर निम्नलिखित फ़ाइलों में डोमेन जोड़ें: फिर डोमेन को निम्नलिखित फ़ाइलों में जोड़ें:
- **/etc/postfix/virtual_domains** - **/etc/postfix/virtual_domains**
- **/etc/postfix/transport** - **/etc/postfix/transport**
@ -124,7 +124,7 @@ cp "/etc/letsencrypt/live/$DOMAIN/fullchain.pem" /opt/gophish/ssl_keys/key.crt
अंत में फ़ाइलों **`/etc/hostname`** और **`/etc/mailname`** को अपने डोमेन नाम में संशोधित करें और **अपने VPS को पुनः प्रारंभ करें।** अंत में फ़ाइलों **`/etc/hostname`** और **`/etc/mailname`** को अपने डोमेन नाम में संशोधित करें और **अपने VPS को पुनः प्रारंभ करें।**
अब, एक **DNS A रिकॉर्ड** बनाएं `mail.<domain>` का जो **VPS के ip address** की ओर इशारा करता है और एक **DNS MX** रिकॉर्ड जो `mail.<domain>` की ओर इशारा करता है। अब, एक **DNS A रिकॉर्ड** बनाएं `mail.<domain>` का जो VPS के **ip address** की ओर इशारा करता है और एक **DNS MX** रिकॉर्ड जो `mail.<domain>` की ओर इशारा करता है।
अब चलिए एक ईमेल भेजने का परीक्षण करते हैं: अब चलिए एक ईमेल भेजने का परीक्षण करते हैं:
```bash ```bash
@ -219,9 +219,9 @@ service gophish status
ss -l | grep "3333\|443" ss -l | grep "3333\|443"
service gophish stop service gophish stop
``` ```
## मेल सर्वर और डोमेन कॉन्फ़िगर करना ## मेल सर्वर और डोमेन को कॉन्फ़िगर करना
### प्रतीक्षा करें और वैध बनें ### प्रतीक्षा करें और वैध रहें
जितना पुराना एक डोमेन होगा, उतना ही कम संभावना है कि इसे स्पैम के रूप में पकड़ा जाएगा। इसलिए आपको फ़िशिंग मूल्यांकन से पहले जितना संभव हो सके (कम से कम 1 सप्ताह) प्रतीक्षा करनी चाहिए। इसके अलावा, यदि आप किसी प्रतिष्ठित क्षेत्र के बारे में एक पृष्ठ डालते हैं, तो प्राप्त प्रतिष्ठा बेहतर होगी। जितना पुराना एक डोमेन होगा, उतना ही कम संभावना है कि इसे स्पैम के रूप में पकड़ा जाएगा। इसलिए आपको फ़िशिंग मूल्यांकन से पहले जितना संभव हो सके (कम से कम 1 सप्ताह) प्रतीक्षा करनी चाहिए। इसके अलावा, यदि आप किसी प्रतिष्ठित क्षेत्र के बारे में एक पृष्ठ डालते हैं, तो प्राप्त प्रतिष्ठा बेहतर होगी।
@ -235,7 +235,7 @@ service gophish stop
आपको **नए डोमेन के लिए एक SPF रिकॉर्ड कॉन्फ़िगर करना चाहिए**। यदि आप नहीं जानते कि SPF रिकॉर्ड क्या है [**इस पृष्ठ को पढ़ें**](../../network-services-pentesting/pentesting-smtp/index.html#spf)। आपको **नए डोमेन के लिए एक SPF रिकॉर्ड कॉन्फ़िगर करना चाहिए**। यदि आप नहीं जानते कि SPF रिकॉर्ड क्या है [**इस पृष्ठ को पढ़ें**](../../network-services-pentesting/pentesting-smtp/index.html#spf)।
आप अपने SPF नीति को उत्पन्न करने के लिए [https://www.spfwizard.net/](https://www.spfwizard.net) का उपयोग कर सकते हैं (VPS मशीन का IP उपयोग करें) आप [https://www.spfwizard.net/](https://www.spfwizard.net) का उपयोग करके अपनी SPF नीति उत्पन्न कर सकते हैं (VPS मशीन का IP उपयोग करें)
![](<../../images/image (1037).png>) ![](<../../images/image (1037).png>)
@ -247,18 +247,18 @@ v=spf1 mx a ip4:ip.ip.ip.ip ?all
आपको **नए डोमेन के लिए DMARC रिकॉर्ड कॉन्फ़िगर करना होगा**। यदि आप नहीं जानते कि DMARC रिकॉर्ड क्या है [**इस पृष्ठ को पढ़ें**](../../network-services-pentesting/pentesting-smtp/index.html#dmarc)। आपको **नए डोमेन के लिए DMARC रिकॉर्ड कॉन्फ़िगर करना होगा**। यदि आप नहीं जानते कि DMARC रिकॉर्ड क्या है [**इस पृष्ठ को पढ़ें**](../../network-services-pentesting/pentesting-smtp/index.html#dmarc)।
आपको एक नया DNS TXT रिकॉर्ड बनाना होगा जो होस्टनाम `_dmarc.<domain>` की ओर इंगित करता है जिसमें निम्नलिखित सामग्री है: आपको `_dmarc.<domain>` होस्टनाम की ओर इंगित करते हुए एक नया DNS TXT रिकॉर्ड बनाना होगा जिसमें निम्नलिखित सामग्री हो:
```bash ```bash
v=DMARC1; p=none v=DMARC1; p=none
``` ```
### DomainKeys Identified Mail (DKIM) ### DomainKeys Identified Mail (DKIM)
आपको **नए डोमेन के लिए DKIM कॉन्फ़िगर करना होगा**। यदि आप नहीं जानते कि DMARC रिकॉर्ड क्या है [**इस पृष्ठ को पढ़ें**](../../network-services-pentesting/pentesting-smtp/index.html#dkim) आपको **नए डोमेन के लिए DKIM कॉन्फ़िगर करना होगा**। यदि आप नहीं जानते कि DMARC रिकॉर्ड क्या है [**इस पृष्ठ को पढ़ें**](../../network-services-pentesting/pentesting-smtp/index.html#dkim)
यह ट्यूटोरियल आधारित है: [https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy](https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy) यह ट्यूटोरियल आधारित है: [https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy](https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy)
> [!NOTE] > [!NOTE]
> आपको DKIM कुंजी द्वारा उत्पन्न दोनों B64 मानों को संयोजित करने की आवश्यकता है: > आपको दोनों B64 मानों को जोड़ना होगा जो DKIM कुंजी उत्पन्न करती है:
> >
> ``` > ```
> v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0wPibdqPtzYk81njjQCrChIcHzxOp8a1wjbsoNtka2X9QXCZs+iXkvw++QsWDtdYu3q0Ofnr0Yd/TmG/Y2bBGoEgeE+YTUG2aEgw8Xx42NLJq2D1pB2lRQPW4IxefROnXu5HfKSm7dyzML1gZ1U0pR5X4IZCH0wOPhIq326QjxJZm79E1nTh3xj" "Y9N/Dt3+fVnIbMupzXE216TdFuifKM6Tl6O/axNsbswMS1TH812euno8xRpsdXJzFlB9q3VbMkVWig4P538mHolGzudEBg563vv66U8D7uuzGYxYT4WS8NVm3QBMg0QKPWZaKp+bADLkOSB9J2nUpk4Aj9KB5swIDAQAB > v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0wPibdqPtzYk81njjQCrChIcHzxOp8a1wjbsoNtka2X9QXCZs+iXkvw++QsWDtdYu3q0Ofnr0Yd/TmG/Y2bBGoEgeE+YTUG2aEgw8Xx42NLJq2D1pB2lRQPW4IxefROnXu5HfKSm7dyzML1gZ1U0pR5X4IZCH0wOPhIq326QjxJZm79E1nTh3xj" "Y9N/Dt3+fVnIbMupzXE216TdFuifKM6Tl6O/axNsbswMS1TH812euno8xRpsdXJzFlB9q3VbMkVWig4P538mHolGzudEBg563vv66U8D7uuzGYxYT4WS8NVm3QBMg0QKPWZaKp+bADLkOSB9J2nUpk4Aj9KB5swIDAQAB
@ -271,7 +271,7 @@ v=DMARC1; p=none
```bash ```bash
echo "This is the body of the email" | mail -s "This is the subject line" test-iimosa79z@srv1.mail-tester.com echo "This is the body of the email" | mail -s "This is the subject line" test-iimosa79z@srv1.mail-tester.com
``` ```
आप अपने **ईमेल कॉन्फ़िगरेशन** की भी जांच कर सकते हैं `check-auth@verifier.port25.com` पर एक ईमेल भेजकर और **प्रतिक्रिया पढ़कर** (इसके लिए आपको **पोर्ट** **25** खोलने की आवश्यकता होगी और यदि आप ईमेल को रूट के रूप में भेजते हैं तो फ़ाइल _/var/mail/root_ में प्रतिक्रिया देखें)।\ आप अपने **ईमेल कॉन्फ़िगरेशन** की जांच भी कर सकते हैं `check-auth@verifier.port25.com` पर एक ईमेल भेजकर और **प्रतिक्रिया पढ़कर** (इसके लिए आपको **पोर्ट** **25** खोलने की आवश्यकता होगी और यदि आप ईमेल को रूट के रूप में भेजते हैं तो फ़ाइल _/var/mail/root_ में प्रतिक्रिया देखें)।\
सुनिश्चित करें कि आप सभी परीक्षणों में पास करते हैं: सुनिश्चित करें कि आप सभी परीक्षणों में पास करते हैं:
```bash ```bash
========================================================== ==========================================================
@ -291,30 +291,30 @@ dkim=pass header.i=@example.com;
``` ```
### Spamhouse ब्लैकलिस्ट से हटाना ### Spamhouse ब्लैकलिस्ट से हटाना
पृष्ठ [www.mail-tester.com](https://www.mail-tester.com) आपको यह बता सकता है कि क्या आपका डोमेन spamhouse द्वारा ब्लॉक किया गया है। आप अपने डोमेन/IP को हटाने के लिए अनुरोध कर सकते हैं: [https://www.spamhaus.org/lookup/](https://www.spamhaus.org/lookup/) पृष्ठ [www.mail-tester.com](https://www.mail-tester.com) आपको बता सकता है कि क्या आपका डोमेन spamhouse द्वारा ब्लॉक किया गया है। आप अपने डोमेन/IP को हटाने के लिए अनुरोध कर सकते हैं: [https://www.spamhaus.org/lookup/](https://www.spamhaus.org/lookup/)
### Microsoft ब्लैकलिस्ट से हटाना ### Microsoft ब्लैकलिस्ट से हटाना
​​आप अपने डोमेन/IP को हटाने के लिए अनुरोध कर सकते हैं [https://sender.office.com/](https://sender.office.com) पर। ​​आप अपने डोमेन/IP को हटाने के लिए अनुरोध कर सकते हैं [https://sender.office.com/](https://sender.office.com).
## GoPhish अभियान बनाएं और लॉन्च करें ## GoPhish अभियान बनाएं और लॉन्च करें
### भेजने की प्रोफ़ाइल ### भेजने की प्रोफ़ाइल
- प्रेषक प्रोफ़ाइल को पहचानने के लिए कुछ **नाम सेट करें** - प्रेषक प्रोफ़ाइल को पहचानने के लिए कुछ **नाम सेट करें**
- तय करें कि आप फ़िशिंग ईमेल किस खाते से भेजने जा रहे हैं। सुझाव: _noreply, support, servicedesk, salesforce..._ - तय करें कि आप किस खाते से फ़िशिंग ईमेल भेजने जा रहे हैं। सुझाव: _noreply, support, servicedesk, salesforce..._
- आप उपयोगकर्ता नाम और पासवर्ड को खाली छोड़ सकते हैं, लेकिन सुनिश्चित करें कि Ignore Certificate Errors को चेक करें - आप उपयोगकर्ता नाम और पासवर्ड को खाली छोड़ सकते हैं, लेकिन सुनिश्चित करें कि Ignore Certificate Errors को चेक करें
![](<../../images/image (253) (1) (2) (1) (1) (2) (2) (3) (3) (5) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (15) (2).png>) ![](<../../images/image (253) (1) (2) (1) (1) (2) (2) (3) (3) (5) (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (10) (15) (2).png>)
> [!NOTE] > [!NOTE]
> यह अनुशंसा की जाती है कि आप यह सुनिश्चित करने के लिए "**Send Test Email**" कार्यक्षमता का उपयोग करें कि सब कुछ काम कर रहा है।\ > यह अनुशंसा की जाती है कि आप यह सुनिश्चित करने के लिए "**Send Test Email**" कार्यक्षमता का उपयोग करें कि सब कुछ काम कर रहा है।\
> मैं अनुशंसा करूंगा कि **परीक्षण ईमेल 10 मिनट के मेल पते पर भेजें** ताकि परीक्षण करते समय ब्लैकलिस्ट में न जाएं। > मैं अनुशंसा करूंगा कि **परीक्षण ईमेल 10 मिनट मेल पते पर भेजें** ताकि परीक्षण करते समय ब्लैकलिस्ट में न जाएं।
### ईमेल टेम्पलेट ### ईमेल टेम्पलेट
- टेम्पलेट को पहचानने के लिए कुछ **नाम सेट करें** - टेम्पलेट को पहचानने के लिए कुछ **नाम सेट करें**
- फिर एक **विषय** लिखें (कुछ अजीब नहीं, बस कुछ ऐसा जो आप नियमित ईमेल में पढ़ने की उम्मीद कर सकते हैं) - फिर एक **विषय** लिखें (कुछ अजीब नहीं, बस कुछ ऐसा जो आप एक सामान्य ईमेल में पढ़ने की उम्मीद कर सकते हैं)
- सुनिश्चित करें कि आपने "**Add Tracking Image**" को चेक किया है - सुनिश्चित करें कि आपने "**Add Tracking Image**" को चेक किया है
- **ईमेल टेम्पलेट** लिखें (आप निम्नलिखित उदाहरण की तरह वेरिएबल का उपयोग कर सकते हैं): - **ईमेल टेम्पलेट** लिखें (आप निम्नलिखित उदाहरण की तरह वेरिएबल का उपयोग कर सकते हैं):
```html ```html
@ -344,7 +344,7 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY
![](<../../images/image (80).png>) ![](<../../images/image (80).png>)
> [!NOTE] > [!NOTE]
> ईमेल टेम्पलेट भी **भेजने के लिए फ़ाइलें संलग्न** करने की अनुमति देता है। यदि आप कुछ विशेष रूप से तैयार की गई फ़ाइलों/दस्तावेज़ों का उपयोग करके NTLM चुनौतियों को चुराना चाहते हैं [इस पृष्ठ को पढ़ें](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md)। > ईमेल टेम्पलेट भी **भेजने के लिए फ़ाइलें संलग्न** करने की अनुमति देता है। यदि आप कुछ विशेष रूप से तैयार की गई फ़ाइलों/दस्तावेज़ों का उपयोग करके NTLM चुनौतियों को चुराना चाहते हैं तो [इस पृष्ठ को पढ़ें](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md)।
### लैंडिंग पृष्ठ ### लैंडिंग पृष्ठ
@ -360,7 +360,7 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY
> ध्यान दें कि यदि आपको HTML के लिए **कुछ स्थिर संसाधनों** का उपयोग करने की आवश्यकता है (शायद कुछ CSS और JS पृष्ठ) तो आप उन्हें _**/opt/gophish/static/endpoint**_ में सहेज सकते हैं और फिर _**/static/\<filename>**_ से उन तक पहुंच सकते हैं। > ध्यान दें कि यदि आपको HTML के लिए **कुछ स्थिर संसाधनों** का उपयोग करने की आवश्यकता है (शायद कुछ CSS और JS पृष्ठ) तो आप उन्हें _**/opt/gophish/static/endpoint**_ में सहेज सकते हैं और फिर _**/static/\<filename>**_ से उन तक पहुंच सकते हैं।
> [!NOTE] > [!NOTE]
> रीडायरेक्शन के लिए आप **उपयोगकर्ताओं को पीड़ित के वैध मुख्य वेब पृष्ठ पर रीडायरेक्ट** कर सकते हैं, या उन्हें उदाहरण के लिए _/static/migration.html_ पर रीडायरेक्ट कर सकते हैं, कुछ **स्पिनिंग व्हील** ([**https://loading.io/**](https://loading.io)**) 5 सेकंड के लिए और फिर संकेत दें कि प्रक्रिया सफल रही।** > रीडायरेक्शन के लिए आप **उपयोगकर्ताओं को पीड़ित के वैध मुख्य वेब पृष्ठ पर रीडायरेक्ट** कर सकते हैं, या उदाहरण के लिए, उन्हें _/static/migration.html_ पर रीडायरेक्ट कर सकते हैं, कुछ **स्पिनिंग व्हील** ([**https://loading.io/**](https://loading.io)**) 5 सेकंड के लिए और फिर संकेत दें कि प्रक्रिया सफल रही।**
### उपयोगकर्ता और समूह ### उपयोगकर्ता और समूह
@ -378,13 +378,13 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY
![](<../../images/image (192).png>) ![](<../../images/image (192).png>)
> [!NOTE] > [!NOTE]
> मैं **10 मिनट के मेल पते पर परीक्षण ईमेल भेजने की सिफारिश करूंगा** ताकि परीक्षण करते समय ब्लैकलिस्ट में न फंसें। > मैं **10 मिनट के मेल पते पर परीक्षण ईमेल भेजने की सिफारिश करूंगा** ताकि परीक्षण करते समय ब्लैकलिस्ट में न पड़ें।
जब सब कुछ तैयार हो जाए, तो बस अभियान शुरू करें! जब सब कुछ तैयार हो जाए, तो बस अभियान शुरू करें!
## वेबसाइट क्लोनिंग ## वेबसाइट क्लोनिंग
यदि किसी कारणवश आप वेबसाइट को क्लोन करना चाहते हैं तो निम्नलिखित पृष्ठ की जांच करें: यदि किसी कारण से आप वेबसाइट को क्लोन करना चाहते हैं तो निम्नलिखित पृष्ठ देखें:
{{#ref}} {{#ref}}
clone-a-website.md clone-a-website.md
@ -392,8 +392,8 @@ clone-a-website.md
## बैकडोर वाले दस्तावेज़ और फ़ाइलें ## बैकडोर वाले दस्तावेज़ और फ़ाइलें
कुछ फ़िशिंग आकलनों (मुख्य रूप से रेड टीमों के लिए) में आप **कुछ प्रकार के बैकडोर वाली फ़ाइलें भेजना** चाहेंगे (शायद एक C2 या शायद कुछ ऐसा जो प्रमाणीकरण को ट्रिगर करेगा)।\ कुछ फ़िशिंग आकलनों (मुख्य रूप से रेड टीमों के लिए) में आप **कुछ प्रकार के बैकडोर वाली फ़ाइलें भेजना** भी चाहेंगे (शायद एक C2 या शायद बस कुछ जो प्रमाणीकरण को ट्रिगर करेगा)।\
कुछ उदाहरणों के लिए निम्नलिखित पृष्ठ की जांच करें: कुछ उदाहरणों के लिए निम्नलिखित पृष्ठ देखें:
{{#ref}} {{#ref}}
phishing-documents.md phishing-documents.md
@ -403,9 +403,9 @@ phishing-documents.md
### प्रॉक्सी MitM के माध्यम से ### प्रॉक्सी MitM के माध्यम से
पिछला हमला काफी चालाक है क्योंकि आप एक असली वेबसाइट का अनुकरण कर रहे हैं और उपयोगकर्ता द्वारा सेट की गई जानकारी एकत्र कर रहे हैं। दुर्भाग्यवश, यदि उपयोगकर्ता ने सही पासवर्ड नहीं डाला या यदि आप जिस एप्लिकेशन का अनुकरण कर रहे हैं वह 2FA के साथ कॉन्फ़िगर किया गया है, **तो यह जानकारी आपको धोखे में पड़े उपयोगकर्ता का अनुकरण करने की अनुमति नहीं देगी**। पिछला हमला काफी चालाक है क्योंकि आप एक असली वेबसाइट का अनुकरण कर रहे हैं और उपयोगकर्ता द्वारा सेट की गई जानकारी एकत्र कर रहे हैं। दुर्भाग्यवश, यदि उपयोगकर्ता ने सही पासवर्ड नहीं डाला या यदि आप जिस एप्लिकेशन का अनुकरण कर रहे हैं वह 2FA के साथ कॉन्फ़िगर किया गया है, तो **यह जानकारी आपको धोखे में पड़े उपयोगकर्ता का अनुकरण करने की अनुमति नहीं देगी**।
यहां ऐसे उपकरण हैं जैसे [**evilginx2**](https://github.com/kgretzky/evilginx2)**,** [**CredSniper**](https://github.com/ustayready/CredSniper) और [**muraena**](https://github.com/muraenateam/muraena) उपयोगी हैं। यह उपकरण आपको एक MitM जैसे हमले को उत्पन्न करने की अनुमति देगा। मूल रूप से, हमले का काम करने का तरीका इस प्रकार है: यहां ऐसे उपकरण हैं जैसे [**evilginx2**](https://github.com/kgretzky/evilginx2)**,** [**CredSniper**](https://github.com/ustayready/CredSniper) और [**muraena**](https://github.com/muraenateam/muraena) उपयोगी हैं। यह उपकरण आपको एक MitM जैसे हमले को उत्पन्न करने की अनुमति देगा। मूल रूप से, हमले इस प्रकार काम करते हैं:
1. आप **वास्तविक वेबपृष्ठ** के लॉगिन फ़ॉर्म का अनुकरण करते हैं। 1. आप **वास्तविक वेबपृष्ठ** के लॉगिन फ़ॉर्म का अनुकरण करते हैं।
2. उपयोगकर्ता **अपनी** **क्रेडेंशियल्स** को आपके फ़र्ज़ी पृष्ठ पर भेजता है और उपकरण उन्हें वास्तविक वेबपृष्ठ पर भेजता है, **जांचता है कि क्या क्रेडेंशियल्स काम करते हैं** 2. उपयोगकर्ता **अपनी** **क्रेडेंशियल्स** को आपके फ़र्ज़ी पृष्ठ पर भेजता है और उपकरण उन्हें वास्तविक वेबपृष्ठ पर भेजता है, **जांचता है कि क्या क्रेडेंशियल्स काम करते हैं**
@ -414,21 +414,21 @@ phishing-documents.md
### VNC के माध्यम से ### VNC के माध्यम से
क्या होगा यदि आप **पीड़ित को एक दुर्भावनापूर्ण पृष्ठ पर भेजने के बजाय** उसे एक **VNC सत्र में भेजते हैं जिसमें वास्तविक वेब पृष्ठ से जुड़े ब्राउज़र** होते हैं? आप देख सकेंगे कि वह क्या करता है, पासवर्ड, उपयोग किए गए MFA, कुकीज़ चुराते हैं...\ क्या होगा यदि आप **पीड़ित को एक दुर्भावनापूर्ण पृष्ठ पर भेजने के बजाय** एक **VNC सत्र में भेजते हैं जिसमें वास्तविक वेब पृष्ठ से जुड़े ब्राउज़र** होते हैं? आप देख सकेंगे कि वह क्या करता है, पासवर्ड, उपयोग किए गए MFA, कुकीज़ चुराने में सक्षम होंगे...\
आप इसे [**EvilnVNC**](https://github.com/JoelGMSec/EvilnoVNC) के साथ कर सकते हैं। आप इसे [**EvilnVNC**](https://github.com/JoelGMSec/EvilnoVNC) के साथ कर सकते हैं।
## पहचानने की पहचान ## पहचानने की पहचान
स्पष्ट रूप से, यह जानने के सबसे अच्छे तरीकों में से एक है कि क्या आपको पकड़ा गया है, **अपने डोमेन को ब्लैकलिस्ट में खोजना**। यदि यह सूचीबद्ध है, तो किसी न किसी तरह आपका डोमेन संदिग्ध के रूप में पहचाना गया।\ स्पष्ट रूप से, यह जानने के सबसे अच्छे तरीकों में से एक है कि क्या आपको पकड़ा गया है, **ब्लैकलिस्ट में अपने डोमेन की खोज करना**। यदि यह सूचीबद्ध है, तो किसी न किसी तरह आपका डोमेन संदिग्ध के रूप में पहचाना गया।\
यह जांचने का एक आसान तरीका है कि क्या आपका डोमेन किसी भी ब्लैकलिस्ट में दिखाई देता है [https://malwareworld.com/](https://malwareworld.com) का उपयोग करना। यह जांचने का एक आसान तरीका है कि क्या आपका डोमेन किसी भी ब्लैकलिस्ट में दिखाई देता है, [https://malwareworld.com/](https://malwareworld.com) का उपयोग करना है
हालांकि, यह जानने के अन्य तरीके हैं कि क्या पीड़ित **संदिग्ध फ़िशिंग गतिविधियों की सक्रिय रूप से खोज कर रहा है** जैसा कि समझाया गया है: हालांकि, यह जानने के अन्य तरीके हैं कि क्या पीड़ित **संदिग्ध फ़िशिंग गतिविधियों की सक्रिय रूप से खोज कर रहा है** जैसा कि निम्नलिखित में समझाया गया है:
{{#ref}} {{#ref}}
detecting-phising.md detecting-phising.md
{{#endref}} {{#endref}}
आप **पीड़ित के डोमेन के बहुत समान नाम** के साथ एक डोमेन खरीद सकते हैं **और/या एक प्रमाणपत्र उत्पन्न कर सकते हैं** एक **उपडोमेन** के लिए जो आपके द्वारा नियंत्रित डोमेन का **कीवर्ड** शामिल करता है। यदि **पीड़ित** उनके साथ किसी प्रकार की **DNS या HTTP इंटरैक्शन** करता है, तो आप जानेंगे कि **वह सक्रिय रूप से खोज रहा है** संदिग्ध डोमेन और आपको बहुत सतर्क रहने की आवश्यकता होगी आप **पीड़ित के डोमेन के बहुत समान नाम** के साथ एक डोमेन खरीद सकते हैं **और/या एक प्रमाणपत्र उत्पन्न कर सकते हैं** एक **उपडोमेन** के लिए जो आपके द्वारा नियंत्रित डोमेन का **कीवर्ड** शामिल करता है। यदि **पीड़ित** उनके साथ किसी प्रकार की **DNS या HTTP इंटरैक्शन** करता है, तो आप जानेंगे कि **वह सक्रिय रूप से संदिग्ध डोमेन की खोज कर रहा है** और आपको बहुत सतर्क रहना होगा
### फ़िशिंग का मूल्यांकन करें ### फ़िशिंग का मूल्यांकन करें

141
theme/ai.js Normal file
View File

@ -0,0 +1,141 @@
/**
* HackTricks AI Chat Widget v1.14 animated typing indicator
* ------------------------------------------------------------------------
* Replaces the static placeholder with a threedot **bouncing** loader
* while waiting for the assistants response.
* ------------------------------------------------------------------------
*/
(function () {
const LOG = "[HackTricks-AI]";
/* ---------------- Usertunable constants ---------------- */
const MAX_CONTEXT = 3000; // highlightedtext char limit
const MAX_QUESTION = 500; // question char limit
const TOOLTIP_TEXT =
"💡 Highlight any text on the page,\nthen click to ask HackTricks AI about it";
const API_BASE = "https://www.hacktricks.ai/api/assistants/threads";
const BRAND_RED = "#b31328"; // HackTricks brand
/* ------------------------------ State ------------------------------ */
let threadId = null;
let isRunning = false;
const $ = (sel, ctx = document) => ctx.querySelector(sel);
if (document.getElementById("ht-ai-btn")) { console.warn(`${LOG} Widget already injected.`); return; }
(document.readyState === "loading" ? document.addEventListener("DOMContentLoaded", init) : init());
/* ==================================================================== */
async function init() {
console.log(`${LOG} Injecting widget… v1.14`);
await ensureThreadId();
injectStyles();
const btn = createFloatingButton();
createTooltip(btn);
const panel = createSidebar();
const chatLog = $("#ht-ai-chat");
const sendBtn = $("#ht-ai-send");
const inputBox = $("#ht-ai-question");
const resetBtn = $("#ht-ai-reset");
const closeBtn = $("#ht-ai-close");
/* ------------------- Selection snapshot ------------------- */
let savedSelection = "";
btn.addEventListener("pointerdown", () => { savedSelection = window.getSelection().toString().trim(); });
/* ------------------- Helpers ------------------------------ */
function addMsg(text, cls) {
const b = document.createElement("div");
b.className = `ht-msg ${cls}`;
b.textContent = text;
chatLog.appendChild(b);
chatLog.scrollTop = chatLog.scrollHeight;
return b;
}
const LOADER_HTML = '<span class="ht-loading"><span></span><span></span><span></span></span>';
function setInputDisabled(d) { inputBox.disabled = d; sendBtn.disabled = d; }
function clearThreadCookie() { document.cookie = "threadId=; Path=/; Max-Age=0"; threadId = null; }
function resetConversation() { chatLog.innerHTML=""; clearThreadCookie(); panel.classList.remove("open"); }
/* ------------------- Panel open / close ------------------- */
btn.addEventListener("click", () => {
if (!savedSelection) { alert("Please highlight some text first to then ask Hacktricks AI about it."); return; }
if (savedSelection.length > MAX_CONTEXT) { alert(`Highlighted text is too long (${savedSelection.length} chars). Max allowed: ${MAX_CONTEXT}.`); return; }
chatLog.innerHTML=""; addMsg(savedSelection, "ht-context"); panel.classList.add("open"); inputBox.focus();
});
closeBtn.addEventListener("click", resetConversation);
resetBtn.addEventListener("click", resetConversation);
/* --------------------------- Messaging --------------------------- */
async function sendMessage(question, context=null) {
if (!threadId) await ensureThreadId();
if (isRunning) { addMsg("Please wait until the current operation completes.", "ht-ai"); return; }
isRunning = true; setInputDisabled(true);
const loadingBubble = addMsg("", "ht-ai");
loadingBubble.innerHTML = LOADER_HTML;
const content = context ? `### Context:\n${context}\n\n### Question to answer:\n${question}` : question;
try {
const res = await fetch(`${API_BASE}/${threadId}/messages`, { method:"POST", credentials:"include", headers:{"Content-Type":"application/json"}, body:JSON.stringify({content}) });
if (!res.ok) {
let err=`Unknown error: ${res.status}`;
try { const e=await res.json(); if(e.error) err=`Error: ${e.error}`; else if(res.status===429) err="Rate limit exceeded. Please try again later."; } catch(_){}
loadingBubble.textContent = err; return; }
const data = await res.json();
loadingBubble.remove();
if (Array.isArray(data.response)) data.response.forEach(p=>{ addMsg( p.type==="text"&&p.text&&p.text.value ? p.text.value : JSON.stringify(p), "ht-ai"); });
else if (typeof data.response === "string") addMsg(data.response, "ht-ai");
else addMsg(JSON.stringify(data,null,2), "ht-ai");
} catch (e) { console.error("Error sending message:",e); loadingBubble.textContent="An unexpected error occurred."; }
finally { isRunning=false; setInputDisabled(false); chatLog.scrollTop=chatLog.scrollHeight; }
}
async function handleSend(){ const q=inputBox.value.trim(); if(!q)return; if(q.length>MAX_QUESTION){alert(`Your question is too long (${q.length} chars). Max allowed: ${MAX_QUESTION}.`); return;} inputBox.value=""; addMsg(q,"ht-user"); await sendMessage(q,savedSelection||null);}
sendBtn.addEventListener("click", handleSend);
inputBox.addEventListener("keydown", e=>{ if(e.key==="Enter"&&!e.shiftKey){ e.preventDefault(); handleSend(); } });
}
/* ==================================================================== */
async function ensureThreadId(){ const m=document.cookie.match(/threadId=([^;]+)/); if(m&&m[1]){threadId=m[1];return;} try{ const r=await fetch(API_BASE,{method:"POST",credentials:"include"}); const d=await r.json(); if(!r.ok||!d.threadId) throw new Error(`${r.status} ${r.statusText}`); threadId=d.threadId; document.cookie=`threadId=${threadId}; Path=/; Secure; SameSite=Strict; Max-Age=7200`; }catch(e){ console.error("Error creating threadId:",e); alert("Failed to initialise the conversation. Please refresh and try again."); throw e; }}
/* ==================================================================== */
function injectStyles(){ const css=`
#ht-ai-btn{position:fixed;bottom:20px;left:50%;transform:translateX(-50%);width:60px;height:60px;border-radius:50%;background:#1e1e1e;color:#fff;font-size:28px;display:flex;align-items:center;justify-content:center;cursor:pointer;z-index:99999;box-shadow:0 2px 8px rgba(0,0,0,.4);transition:opacity .2s}
#ht-ai-btn:hover{opacity:.85}
@media(max-width:768px){#ht-ai-btn{display:none}}
#ht-ai-tooltip{position:fixed;padding:6px 8px;background:#111;color:#fff;border-radius:4px;font-size:13px;white-space:pre-wrap;pointer-events:none;opacity:0;transform:translate(-50%,-8px);transition:opacity .15s ease,transform .15s ease;z-index:100000}
#ht-ai-tooltip.show{opacity:1;transform:translate(-50%,-12px)}
#ht-ai-panel{position:fixed;top:0;right:0;height:100%;width:350px;max-width:90vw;background:#000;color:#fff;display:flex;flex-direction:column;transform:translateX(100%);transition:transform .3s ease;z-index:100000;font-family:system-ui,-apple-system,Segoe UI,Roboto,"Helvetica Neue",Arial,sans-serif}
#ht-ai-panel.open{transform:translateX(0)}
@media(max-width:768px){#ht-ai-panel{display:none}}
#ht-ai-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #333}
#ht-ai-header .ht-actions{display:flex;gap:8px;align-items:center}
#ht-ai-close,#ht-ai-reset{cursor:pointer;font-size:18px;background:none;border:none;color:#fff;padding:0}
#ht-ai-close:hover,#ht-ai-reset:hover{opacity:.7}
#ht-ai-chat{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:12px;font-size:14px}
.ht-msg{max-width:90%;line-height:1.4;padding:10px 12px;border-radius:8px;white-space:pre-wrap;word-wrap:break-word}
.ht-user{align-self:flex-end;background:${BRAND_RED}}
.ht-ai{align-self:flex-start;background:#222}
.ht-context{align-self:flex-start;background:#444;font-style:italic;font-size:13px}
#ht-ai-input{display:flex;gap:8px;padding:12px 16px;border-top:1px solid #333}
#ht-ai-question{flex:1;min-height:40px;max-height:120px;resize:vertical;padding:8px;border-radius:6px;border:none;font-size:14px}
#ht-ai-send{padding:0 18px;border:none;border-radius:6px;background:${BRAND_RED};color:#fff;font-size:14px;cursor:pointer}
#ht-ai-send:disabled{opacity:.5;cursor:not-allowed}
/* Loader animation */
.ht-loading{display:inline-flex;align-items:center;gap:4px}
.ht-loading span{width:6px;height:6px;border-radius:50%;background:#888;animation:ht-bounce 1.2s infinite ease-in-out}
.ht-loading span:nth-child(2){animation-delay:0.2s}
.ht-loading span:nth-child(3){animation-delay:0.4s}
@keyframes ht-bounce{0%,80%,100%{transform:scale(0);}40%{transform:scale(1);} }
::selection{background:#ffeb3b;color:#000}
::-moz-selection{background:#ffeb3b;color:#000}`;
const s=document.createElement("style"); s.id="ht-ai-style"; s.textContent=css; document.head.appendChild(s);}
function createFloatingButton(){ const d=document.createElement("div"); d.id="ht-ai-btn"; d.textContent="🤖"; document.body.appendChild(d); return d; }
function createTooltip(btn){ const t=document.createElement("div"); t.id="ht-ai-tooltip"; t.textContent=TOOLTIP_TEXT; document.body.appendChild(t); btn.addEventListener("mouseenter",()=>{const r=btn.getBoundingClientRect(); t.style.left=`${r.left+r.width/2}px`; t.style.top=`${r.top}px`; t.classList.add("show");}); btn.addEventListener("mouseleave",()=>t.classList.remove("show")); }
function createSidebar(){ const p=document.createElement("div"); p.id="ht-ai-panel"; p.innerHTML=`<div id="ht-ai-header"><strong>HackTricksAI Chat</strong><div class="ht-actions"><button id="ht-ai-reset" title="Reset">↺</button><span id="ht-ai-close" title="Close">✖</span></div></div><div id="ht-ai-chat"></div><div id="ht-ai-input"><textarea id="ht-ai-question" placeholder="Type your question…"></textarea><button id="ht-ai-send">Send</button></div>`; document.body.appendChild(p); return p; }
})();

View File

@ -1,3 +1,26 @@
/*
Polyfill so requestIdleCallback works everywhere (IE 11/Safari)
*/
if (typeof window.requestIdleCallback !== "function") {
window.requestIdleCallback = function (cb) {
const start = Date.now();
return setTimeout(function () {
cb({
didTimeout: false,
timeRemaining: function () {
return Math.max(0, 50 - (Date.now() - start));
}
});
}, 1);
};
window.cancelIdleCallback = window.clearTimeout;
}
/*
search.js
*/
"use strict"; "use strict";
window.search = window.search || {}; window.search = window.search || {};
(function search(search) { (function search(search) {
@ -471,64 +494,58 @@ window.search = window.search || {};
showResults(true); showResults(true);
} }
(async function loadSearchIndex(lang = window.lang || 'en') { (async function loadSearchIndex(lang = window.lang || "en") {
/* ───────── paths ───────── */ const branch = lang === "en" ? "master" : lang;
const branch = lang === 'en' ? 'master' : lang; const rawUrl =
const baseRemote = `https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/${branch}`; `https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/refs/heads/${branch}/searchindex.js`;
const remoteJson = `${baseRemote}/searchindex.json`; const localJs = "/searchindex.js";
const remoteJs = `${baseRemote}/searchindex.js`; const TIMEOUT_MS = 10_000;
const localJson = './searchindex.json';
const localJs = './searchindex.js';
const TIMEOUT_MS = 5_000;
/* ───────── helpers ───────── */ const injectScript = (src) =>
const fetchWithTimeout = (url, opt = {}) => new Promise((resolve, reject) => {
Promise.race([ const s = document.createElement("script");
fetch(url, opt), s.src = src;
new Promise((_, r) => setTimeout(() => r(new Error('timeout')), TIMEOUT_MS)) s.onload = () => resolve(src);
]); s.onerror = (e) => reject(e);
const loadScript = src =>
new Promise((resolve, reject) => {
const s = document.createElement('script');
s.src = src;
s.onload = resolve;
s.onerror = reject;
document.head.appendChild(s); document.head.appendChild(s);
}); });
/* ───────── 1. remote JSON ───────── */
try { try {
const r = await fetchWithTimeout(remoteJson); /* 1 — download raw JS from GitHub */
if (!r.ok) throw new Error(r.status); const controller = new AbortController();
return init(await r.json()); const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
} catch (e) {
console.warn('Remote JSON failed →', e); const res = await fetch(rawUrl, { signal: controller.signal });
clearTimeout(timer);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
/* 2 — wrap in a Blob so the browser sees application/javascript */
const code = await res.text();
const blobUrl = URL.createObjectURL(
new Blob([code], { type: "application/javascript" })
);
/* 3 — execute it */
await injectScript(blobUrl);
/* PATCH
heavy parsing now deferred to idle time
*/
requestIdleCallback(() => init(window.search));
return; // ✔ UI remains responsive
} catch (eRemote) {
console.warn("Remote JS failed →", eRemote);
} }
/* ───────── 2. remote JS ───────── */ /* ───────── fallback: local copy ───────── */
try { try {
await loadScript(remoteJs); await injectScript(localJs);
return init(window.search);
} catch (e) {
console.warn('Remote JS failed →', e);
}
/* ───────── 3. local JSON ───────── */ /* ───────────── PATCH ───────────── */
try { requestIdleCallback(() => init(window.search));
const r = await fetch(localJson); return;
if (!r.ok) throw new Error(r.status); } catch (eLocal) {
return init(await r.json()); console.error("Local JS failed →", eLocal);
} catch (e) {
console.warn('Local JSON failed →', e);
}
/* ───────── 4. local JS ───────── */
try {
await loadScript(localJs);
return init(window.search);
} catch (e) {
console.error('Local JS failed →', e);
} }
})(); })();