
होस्ट, सेवाओं और सामग्री के लिए पैटर्न पहचान
# Recog: एक पहचान ढांचा
[](https://github.com/rapid7/recog/actions/workflows/ci.yml)
[](https://github.com/rapid7/recog/actions/workflows/verify.yml)
Recog एक ऐसा ढांचा है जो विभिन्न नेटवर्क प्रोब से प्राप्त डेटा के विरुद्ध फिंगरप्रिंट्स का मिलान करके उत्पादों, सेवाओं, ऑपरेटिंग सिस्टम और हार्डवेयर की पहचान करता है। Recog वेब सर्वर बैनर, SNMP सिस्टम विवरण फ़ील्ड और बहुत कुछ से उपयोगी जानकारी निकालना आसान बनाता है।
Recog ओपन सोर्स है, कृपया अधिक जानकारी के लिए [LICENSE](https://github.com/rapid7/recog/blob/main/LICENSE) फ़ाइल देखें।
## विषय सूची
1. [रिपॉजिटरी विभाजन](#रिपॉजिटरी-विभाजन)
1. [डिफ़ॉल्ट शाखा का नाम बदलना](#डिफ़ॉल्ट-शाखा-का-नाम-बदलना)
1. [Recog लाइब्रेरी भाषा कार्यान्वयन](#recog-लाइब्रेरी-भाषा-कार्यान्वयन)
1. [सुविधा समानता](#सुविधा-समानता)
1. [स्थापना](#स्थापना)
1. [परिपक्वता](#परिपक्वता)
1. [फिंगरप्रिंट्स](#फिंगरप्रिंट्स)
1. [मिलान का परीक्षण](#मिलान-का-परीक्षण)
1. [ftp_banners](#ftp_banners)
1. [http_cookies](#http_cookies)
1. [http_servers](#http_servers)
1. [favicons](#favicons)
1. [http_wwwauth](#http_wwwauth)
1. [tls_jarm](#tls_jarm)
1. [योगदान](#योगदान)
## रिपॉजिटरी विभाजन
31 मार्च, 2022 को, Recog सामग्री - XML फिंगरप्रिंट फ़ाइलें और उपयोगिताएँ - को Recog ढांचा लाइब्रेरी कार्यान्वयन से अलग कर दिया गया। मूल [Recog](https://github.com/rapid7/recog) रिपॉजिटरी में अब Recog सामग्री है और [Recog-Ruby](https://github.com/rapid7/recog-ruby) रिपॉजिटरी में Ruby भाषा कार्यान्वयन है। Recog सामग्री Recog-Ruby में एक git सबमॉड्यूल के रूप में शामिल है और `recog` निर्देशिका के अंतर्गत स्थित है। विभाजन के बाद के सभी Recog gem संस्करण 3.0.0 या उससे अधिक: 1. XML फिंगरप्रिंट निर्देशिका को `recog` निर्देशिका के अंतर्गत रखेंगे, और 2. केवल `recog_match` टूल शामिल करेंगे क्योंकि अन्य टूल फिंगरप्रिंट प्रबंधन पर केंद्रित हैं।
[^शीर्ष पर वापस जाएँ](#recog-एक-पहचान-ढांचा)
### डिफ़ॉल्ट शाखा का नाम बदलना
रिपॉजिटरी विभाजन के साथ-साथ डिफ़ॉल्ट शाखा का नाम `master` से `main` कर दिया गया। इन परिवर्तनों से पहले बनाए गए किसी भी क्लोन को आपके स्थानीय वातावरण में मैन्युअल रूप से अपडेट करना होगा। यदि आपके पास एक फोर्क है, तो अपने फोर्क की सेटिंग्स पर जाएँ और डिफ़ॉल्ट शाखा को `main` में बदलने के लिए [किसी शाखा का नाम बदलने](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-branches-in-your-repository/renaming-a-branch) के निर्देशों का पालन करें।
```
git branch -m master main
git fetch origin
git branch -u origin/main main
git remote set-head origin -a
```
वैकल्पिक रूप से, पुरानी शाखा नाम के ट्रैकिंग संदर्भों को हटाने के लिए निम्न कमांड चलाएँ।
```
# आगे बढ़ने से पहले स्थिर संदर्भों की पुष्टि करने के लिए ड्राई-रन जिन्हें हटाया जाएगा
git remote prune origin --dry-run
git remote prune origin
```
यदि आपने पहले अपस्ट्रीम ट्रैकिंग शाखा `upstream-master` का उपयोग किया था, तो पुरानी शाखा को हटाने और एक नई अपस्ट्रीम ट्रैकिंग शाखा बनाने के लिए निम्न कमांड चलाएँ।
```
git branch -d upstream-master
git checkout -b upstream-main --track upstream/main
```
वैकल्पिक रूप से, पुरानी अपस्ट्रीम शाखा नाम के ट्रैकिंग संदर्भों को हटाने के लिए निम्न कमांड चलाएँ।
```
# आगे बढ़ने से पहले स्थिर संदर्भों की पुष्टि करने के लिए ड्राई-रन जिन्हें हटाया जाएगा
git remote prune upstream --dry-run
git remote prune upstream
```
[^शीर्ष पर वापस जाएँ](#recog-एक-पहचान-ढांचा)
## Recog लाइब्रेरी भाषा कार्यान्वयन
* Ruby: [rapid7/recog-ruby](https://github.com/rapid7/recog-ruby)
* Java: [rapid7/recog-java](https://github.com/rapid7/recog-java)
* Go: [runZeroInc/recog-go](https://github.com/runZeroInc/recog-go)
[^शीर्ष पर वापस जाएँ](#recog-एक-पहचान-ढांचा)
### सुविधा समानता
| सुविधा :sparkles: | rapid7/recog-ruby | rapid7/recog-java | runZeroInc/recog-go |
|---------------------------------------------|:------------------:|:------------------:|:-------------------:|
| फिंगरप्रिंट सत्यापन CLI टूल | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| फिंगरप्रिंट मिलान CLI टूल | :white_check_mark: | | :white_check_mark: |
| base64 एन्कोडेड उदाहरणों का समर्थन | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| फ़ाइलसिस्टम-आधारित बाहरी उदाहरणों का समर्थन | :white_check_mark: | :white_check_mark: | :white_check_mark: |
| फिंगरप्रिंट मिलान CPE पैराम इंटरपोलेशन | :white_check_mark: | :white_check_mark: | :white_check_mark: |
[^शीर्ष पर वापस जाएँ](#recog-एक-पहचान-ढांचा)
## स्थापना
Recog में XML फिंगरप्रिंट फ़ाइलें और कोड का एक संग्रह दोनों शामिल हैं, जो अधिकांशतः Ruby में है, जो निहित फिंगरप्रिंट को विकसित करना, परीक्षण करना और उपयोग करना आसान बनाता है। शामिल Ruby कोड का उपयोग करने के लिए, Ruby का एक हालिया संस्करण (2.31+) आवश्यक है, साथ ही Rubygems और `bundler` gem। एक बार ये निर्भरताएँ स्थापित हो जाने के बाद, नवीनतम स्रोत कोड प्राप्त करने और किसी भी अतिरिक्त निर्भरता को स्थापित करने के लिए निम्न कमांड का उपयोग करें।
```shell
$ git clone [email protected]:rapid7/recog.git
$ cd recog
$ bundle install
```
[^शीर्ष पर वापस जाएँ](#recog-एक-पहचान-ढांचा)
## परिपक्वता
कृपया ध्यान दें कि जबकि XML फिंगरप्रिंट स्वयं काफी स्थिर और अच्छी तरह से परीक्षित हैं, Ruby कोडबेस अभी भी काफी नया है और तेज़ी से बदल सकता है। कृपया किसी भी उत्पादन परियोजना में Recog कोड का उपयोग करने से पहले हमसे संपर्क करें (research[at]rapid7.com)।
[^शीर्ष पर वापस जाएँ](#recog-एक-पहचान-ढांचा)
## फिंगरप्रिंट्स
Recog के भीतर फिंगरप्रिंट्स XML फ़ाइलों में संग्रहीत होते हैं, जिनमें से प्रत्येक को किसी विशिष्ट प्रोटोकॉल प्रतिक्रिया स्ट्रिंग या फ़ील्ड से मिलान करने के लिए डिज़ाइन किया गया है। उदाहरण के लिए, फ़ाइल [ssh_banners.xml](https://github.com/rapid7/recog/blob/main/xml/ssh_banners.xml) प्रारंभिक SSH डेमॉन बैनर स्ट्रिंग का मिलान करके os, विक्रेता और कभी-कभी हार्डवेयर उत्पाद निर्धारित कर सकती है।
एक फिंगरप्रिंट फ़ाइल में निम्नलिखित जैसा XML दस्तावेज़ होता है:
```xml
<fingerprints matches="ssh.banner">
<fingerprint pattern="^RomSShell_([\d\.]+)$">
<description>Allegro RomSShell SSH</description>
<example service.version="4.62">RomSShell_4.62</example>
<param pos="0" name="service.vendor" value="Allegro"/>
<param pos="0" name="service.product" value="RomSShell"/>
<param pos="1" name="service.version"/>
</fingerprint>
</fingerprints>
```
पहली पंक्ति में हमेशा XML संस्करण घोषणा होनी चाहिए। पहला तत्व हमेशा एक `fingerprints` ब्लॉक होना चाहिए जिसमें `matches` विशेषता हो, जो इंगित करती है कि यह फिंगरप्रिंट फ़ाइल किस डेटा से मिलान करने वाली है। `matches` विशेषता सामान्यतः `protocol.field` के रूप में होती है।
`fingerprints` तत्व के अंदर एक या अधिक `fingerprint` तत्व होने चाहिए। प्रत्येक `fingerprint` में एक `pattern` विशेषता होनी चाहिए, जिसमें डेटा के विरुद्ध मिलान करने के लिए उपयोग किया जाने वाला नियमित अभिव्यक्ति हो। यह नियंत्रित करने के लिए एक वैकल्पिक `flags` विशेषता निर्दिष्ट की जा सकती है कि नियमित अभिव्यक्ति की व्याख्या कैसे की जाए। अधिक जानकारी के लिए [FLAG_MAP के लिए Recog दस्तावेज़](http://www.rubydoc.info/gems/recog/Recog/Fingerprint/RegexpFactory#FLAG_MAP-constant) देखें।
फिंगरप्रिंट के अंदर, एक `description` तत्व में इस फिंगरप्रिंट का वर्णन करने वाली मानव-पठनीय स्ट्रिंग होनी चाहिए।
कम से कम एक `example` तत्व मौजूद होना चाहिए, हालांकि कई `example` तत्वों को प्राथमिकता दी जाती है। इन तत्वों का उपयोग `rspec` में मौजूद परीक्षण कवरेज के भाग के रूप में किया जाता है, जो सत्यापित करता है कि प्रदान किया गया डेटा निर्दिष्ट नियमित अभिव्यक्ति से मेल खाता है। इसके अतिरिक्त, यदि फिंगरप्रिंट डेटा से फ़ील्ड मान निकालने के लिए `param` तत्वों (आगे वर्णित) का उपयोग कर रहा है, तो आप इन अपेक्षित निष्कर्षणों को `example` तत्वों के लिए विशेषताओं के रूप में जोड़ सकते हैं। उपरोक्त उदाहरण में, यह:
```xml
<example service.version="4.62">RomSShell_4.62</example>
```
परीक्षण करता है कि `RomSShell_4.62` प्रदान की गई नियमित अभिव्यक्ति से मेल खाता है और `service.version` का मान 4.62 है।
`example` स्ट्रिंग को base64 एन्कोड किया जा सकता है ताकि अप्रिंट करने योग्य वर्णों के उपयोग की अनुमति हो। Recog को यह संकेत देने के लिए, `_encoding` विशेषता को `base64` मान के साथ `example` तत्व में जोड़ा जाता है। 80 वर्णों से अधिक लंबा base64 एन्कोडेड टेक्स्ट पठनीयता में सहायता के लिए नीचे दिखाए अनुसार न्यूलाइन के साथ लपेटा जा सकता है।
```xml
<example _encoding="base64">
dGllczGEAAAAlQQWMS4yLjg0MC4xMTM1NTYuMS40LjgwMAQuZGF0YS5yZW1vdmVkLjCEAAAAK
AQdZG9tYWluQ29udHJvbGxlckZ1bmN0aW9uYWxpdHkxhAAAAAMEATc=
</example>
```
इसके अतिरिक्त, उदाहरणों को XML फ़ाइल के समान आधार नाम वाली निर्देशिका में, XML फ़ाइल के समान निर्देशिका में रखा जा सकता है:
```
xml/services.xml
xml/services/file1
xml/services/file2
...
```
फिर उन्हें `_filename` विशेषता का उपयोग करके लोड किया जा सकता है:
```xml
<example _filename="file1"/>
```
यह लंबे उदाहरणों के लिए उपयोगी है।
`param` तत्वों में एक `pos` विशेषता होती है, जो इंगित करती है कि `pattern` से कौन सा कैप्चर फ़ील्ड निकाला जाना चाहिए, या एक स्थिर स्ट्रिंग के लिए `0`। `name` विशेषता वह कुंजी है जो सफल मिलान की स्थिति में रिपोर्ट की जाएगी और `value` या तो `pos` मान `0` के लिए एक स्थिर स्ट्रिंग होगी या अनुपस्थित होगी और कैप्चर किए गए फ़ील्ड से ली जाएगी।
`value` विशेषता अन्य फ़ील्ड से डेटा के इंटरपोलेशन का समर्थन करती है। यह अक्सर उपयोगी होता है जब regex के माध्यम से `hw.product` के लिए मान कैप्चर करते हैं और इस मान को `os.product` में पुनः उपयोग करते हैं।
यहाँ `http_servers.xml` से एक उदाहरण है जहाँ `hw.product` कैप्चर किया जाता है और पुनः उपयोग किया जाता है।
```xml
<fingerprint pattern="^Eltex (TAU-\d+[A-Z]*(?:\.IP)?)$">
<description>Eltex TAU मॉडल VoIP गेटवे</description>
<example hw.product="TAU-72">Eltex TAU-72</example>
<example hw.product="TAU-1.IP">Eltex TAU-1.IP</example>
<param pos="0" name="os.vendor" value="Eltex"/>
<param pos="0" name="os.product" value="{hw.product} Firmware"/>
<param pos="0" name="os.device" value="VoIP Gateway"/>
<param pos="0" name="hw.vendor" value="Eltex"/>
<param pos="1" name="hw.product"/>
<param pos="0" name="hw.device" value="VoIP Gateway"/>
</fingerprint>
```
अस्थायी विशेषताओं के लिए विशेष हैंडलिंग है जिनके नाम `_tmp.` से शुरू होते हैं। इन विशेषताओं का उपयोग इंटरपोलेशन के लिए किया जा सकता है लेकिन आउटपुट में उत्सर्जित नहीं किया जाता है। यह तब उपयोगी होता है जब कोई विशेष उत्पाद नाम विभिन्न बैनरों, विक्रेता विपणन, या CPE उत्पन्न करने का प्रयास करते समय NIST मानों में असंगत होता है। ऐसे मामलों में, बैनर के उपयोगी भागों को निकाला जा सकता है और मिलान द्वारा उत्सर्जित डेटा को अव्यवस्थित किए बिना एक नया मान तैयार किया जा सकता है।
```xml
<fingerprint pattern="^foo baz switchThing-(\d{4})$">
<description>NetCorp NX सीरीज स्विच</description>
<example hw.product="NX8200">foo baz switchThing-8200</example>
<param pos="0" name="hw.vendor" value="NetCorp"/>
<param pos="0" name="hw.product" value="NX{_tmp.001}"/>
<param pos="2" name="_tmp.001"/>
</fingerprint>
```
ये अस्थायी विशेषताएँ `identifiers/fields.txt` में ट्रैक नहीं की जाती हैं।
[^शीर्ष पर वापस जाएँ](#recog-एक-पहचान-ढांचा)
### मिलान का परीक्षण
निम्नलिखित उदाहरण `bin/recog_match` का उपयोग करते हैं, जो Recog के फिंगरप्रिंट डेटा का उपयोग करने वाला एक सरल Ruby कमांड लाइन टूल है। Recog चलाने से पहले आमतौर पर प्री-प्रोसेसिंग की आवश्यकता होती है, जैसे HTTP हेडर मान निकालना, आदि। सभी फिंगरप्रिंट डेटा `xml/*.xml` में पाया जा सकता है।
#### ftp_banners
कनेक्ट करने के बाद सर्वर के बैनर प्रतिक्रिया के आधार पर FTP सर्वरों की पहचान करें:
```
# सादे टेक्स्ट इनपुट का उदाहरण
echo -n '220 Microsoft FTP Service' | bin/recog_match xml/ftp_banners.xml -
# nmap का उपयोग करके उदाहरण कमांड
nmap -sV -script=banner -p 21 192.168.123.13 | grep --color=never '_banner' | cut -d: -f2- | bin/recog_match xml/ftp_banners.xml -
# उदाहरण आउटपुट
MATCH: {"matched"=>"Microsoft FTP Server on Windows XP, 2003 or later without version", "service.vendor"=>"Microsoft", "service.product"=>"IIS", "service.family"=>"IIS", "service.cpe23"=>"cpe:/a:microsoft:iis:-", "os.vendor"=>"Microsoft", "os.family"=>"Windows", "os.product"=>"Windows", "os.cpe23"=>"cpe:/o:microsoft:windows:-", "host.name"=>"220", "service.protocol"=>"ftp", "fingerprint_db"=>"ftp.banner", "data"=>"220 Microsoft FTP Service"}
```
#### http_cookies
HTTP `Set-Cookie` हेडर मान का उपयोग करके HTTP सर्वर की पहचान करें:
```
# सादे टेक्स्ट इनपुट का उदाहरण
echo 'laravel_session=eyJ...etc..etc...%3D; expires=Mon, 13-Mar-2023 16:48:58 GMT; Max-Age=7200; path=/; httponly; samesite=lax' | bin/recog_match xml/http_cookies.xml -
# उदाहरण cURL कमांड
curl --silent -I http://localhost:9001 | grep --color=never -i '^Set-Cookie:' | cut -d: -f2- | bin/recog_match xml/http_cookies.xml -
# उदाहरण आउटपुट
MATCH: {"matched"=>"Laravel PHP web application framework", "service.vendor"=>"Laravel", "service.product"=>"Laravel", "service.cpe23"=>"cpe:/a:laravel:laravel:-", "service.protocol"=>"http", "fingerprint_db"=>"http_header.cookie", "data"=>"laravel_session=eyJ...etc..etc...%3D; expires=Mon, 13-Mar-2023 16:48:58 GMT; Max-Age=7200; path=/; httponly; samesite=lax"}
```
#### http_servers
HTTP `Server` हेडर मान का उपयोग करके HTTP सर्वर की पहचान करें:
```
# सादे टेक्स्ट इनपुट का उदाहरण
echo -n 'Apache/2.4.38 (Debian)' | bin/recog_match xml/http_servers.xml -
# उदाहरण cURL कमांड
curl --silent -I http://localhost:9001 | grep --color=never -i '^Server:' | cut -d: -f2- | bin/recog_match xml/http_servers.xml -
# उदाहरण आउटपुट
MATCH: {"matched"=>"Apache", "service.vendor"=>"Apache", "service.product"=>"HTTPD", "service.family"=>"Apache", "service.version"=>"2.4.38", "service.cpe23"=>"cpe:/a:apache:http_server:2.4.38", "apache.info"=>"(Debian)", "service.protocol"=>"http", "fingerprint_db"=>"http_header.server", "data"=>"Apache/2.4.38 (Debian)"}
```
#### favicons
चल रही सेवा की पहचान करने के लिए फ़ेविकॉन के md5sum का उपयोग करें:
```
# सादे टेक्स्ट इनपुट का उदाहरण
echo -n fe22dd2bb09daccf58256611ac491469 | bin/recog_match xml/favicons.xml -
# उदाहरण cURL कमांड
curl --silent http://localhost:8000/favicon.ico | md5sum | awk '{ print $1 }' | bin/recog_match xml/favicons.xml -
# उदाहरण आउटपुट
MATCH: {"matched"=>"Drupal CMS", "service.vendor"=>"Drupal", "service.product"=>"CMS", "service.certainty"=>"0.5", "service.cpe23"=>"cpe:/a:drupal:drupal:-", "service.protocol"=>"", "fingerprint_db"=>"favicon.md5", "data"=>"fe22dd2bb09daccf58256611ac491469"}
```
#### http_wwwauth
HTTP `WWW-Authenticate` हेडर मान का उपयोग करके HTTP सर्वर की पहचान करें:
```
# सादे टेक्स्ट इनपुट का उदाहरण
echo -n 'Basic realm="monit"' | bin/recog_match xml/http_wwwauth.xml -
# उदाहरण cURL कमांड
curl --silent -I http://localhost:9001 | grep --color=never -i '^WWW-Authenticate:' | cut -d: -f2- | bin/recog_match xml/http_wwwauth.xml -
# उदाहरण आउटपुट
MATCH: {"matched"=>"Minot", "service.vendor"=>"Tildeslash", "service.product"=>"Monit", "service.cpe23"=>"cpe:/a:tildeslash:monit:-", "service.protocol"=>"http", "fingerprint_db"=>"http_header.wwwauth", "data"=>"Basic realm=\"monit\""}
```
#### tls_jarm
TLS सर्वर से 10 TLS क्लाइंट हैलो पैकेट पर प्रतिक्रिया के आधार पर TLS सर्वरों की पहचान करें। फिंगरप्रिंट https://github.com/salesforce/jarm पर आधारित है
```
# सादे टेक्स्ट इनपुट का उदाहरण
echo -n 07d14d16d21d21d07c42d43d000000f50d155305214cf247147c43c0f1a823 | bin/recog_match xml/jarm.xml -
# चल रहे Metasploit लिसनर के विरुद्ध Salesforce के JARM का उपयोग करके उदाहरण कमांड
python3 $code/jarm/jarm.py -p 8443 192.168.123.1 | grep --color=never 'JARM: ' | awk -F: '{ print $2 }' | bin/recog_match xml/tls_jarm.xml -
# उदाहरण आउटपुट
MATCH: {"matched"=>"Metasploit listener", "service.vendor"=>"Rapid7", "service.product"=>"Metasploit", "service.cpe23"=>"cpe:/a:rapid7:metasploit:-", "service.protocol"=>"tls", "fingerprint_db"=>"tls.jarm", "data"=>"07d14d16d21d21d07c42d43d000000f50d155305214cf247147c43c0f1a823"}
```
## योगदान
Recog के उपयोगकर्ता और अनुरक्षक परियोजना में आपके किसी भी योगदान की अत्यधिक सराहना करेंगे। दिशानिर्देशों और निर्देशों के लिए कृपया [CONTRIBUTING.MD](https://github.com/rapid7/recog/blob/main/CONTRIBUTING.md) देखें।
[^शीर्ष पर वापस जाएँ](#recog-एक-पहचान-ढांचा)