अपडेट पर वापस जाएँ
New releaseAug 10, 2026

recog v3.1.30

होस्ट, सेवाओं और सामग्री के लिए पैटर्न पहचान

साझा करें

Recog: एक पहचान ढांचा

CI Workflow Verify Workflow

Recog एक ऐसा ढांचा है जो विभिन्न नेटवर्क प्रोब से प्राप्त डेटा के विरुद्ध फिंगरप्रिंट्स का मिलान करके उत्पादों, सेवाओं, ऑपरेटिंग सिस्टम और हार्डवेयर की पहचान करता है। Recog वेब सर्वर बैनर, SNMP सिस्टम विवरण फ़ील्ड और बहुत कुछ से उपयोगी जानकारी निकालना आसान बनाता है।

Recog ओपन सोर्स है, कृपया अधिक जानकारी के लिए LICENSE फ़ाइल देखें।

विषय सूची

  1. रिपॉजिटरी विभाजन
    1. डिफ़ॉल्ट शाखा का नाम बदलना
  2. Recog लाइब्रेरी भाषा कार्यान्वयन
    1. सुविधा समानता
  3. स्थापना
  4. परिपक्वता
  5. फिंगरप्रिंट्स
  6. मिलान का परीक्षण
    1. ftp_banners
    2. http_cookies
    3. http_servers
    4. favicons
    5. http_wwwauth
    6. tls_jarm
  7. योगदान

रिपॉजिटरी विभाजन

31 मार्च, 2022 को, Recog सामग्री - XML फिंगरप्रिंट फ़ाइलें और उपयोगिताएँ - को Recog ढांचा लाइब्रेरी कार्यान्वयन से अलग कर दिया गया। मूल Recog रिपॉजिटरी में अब Recog सामग्री है और Recog-Ruby रिपॉजिटरी में Ruby भाषा कार्यान्वयन है। Recog सामग्री Recog-Ruby में एक git सबमॉड्यूल के रूप में शामिल है और recog निर्देशिका के अंतर्गत स्थित है। विभाजन के बाद के सभी Recog gem संस्करण 3.0.0 या उससे अधिक: 1. XML फिंगरप्रिंट निर्देशिका को recog निर्देशिका के अंतर्गत रखेंगे, और 2. केवल recog_match टूल शामिल करेंगे क्योंकि अन्य टूल फिंगरप्रिंट प्रबंधन पर केंद्रित हैं।

^शीर्ष पर वापस जाएँ

डिफ़ॉल्ट शाखा का नाम बदलना

रिपॉजिटरी विभाजन के साथ-साथ डिफ़ॉल्ट शाखा का नाम master से main कर दिया गया। इन परिवर्तनों से पहले बनाए गए किसी भी क्लोन को आपके स्थानीय वातावरण में मैन्युअल रूप से अपडेट करना होगा। यदि आपके पास एक फोर्क है, तो अपने फोर्क की सेटिंग्स पर जाएँ और डिफ़ॉल्ट शाखा को main में बदलने के लिए किसी शाखा का नाम बदलने के निर्देशों का पालन करें।

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 लाइब्रेरी भाषा कार्यान्वयन

^शीर्ष पर वापस जाएँ

सुविधा समानता

सुविधा ✨rapid7/recog-rubyrapid7/recog-javarunZeroInc/recog-go
फिंगरप्रिंट सत्यापन CLI टूल
फिंगरप्रिंट मिलान CLI टूल
base64 एन्कोडेड उदाहरणों का समर्थन
फ़ाइलसिस्टम-आधारित बाहरी उदाहरणों का समर्थन
फिंगरप्रिंट मिलान CPE पैराम इंटरपोलेशन

^शीर्ष पर वापस जाएँ

स्थापना

Recog में XML फिंगरप्रिंट फ़ाइलें और कोड का एक संग्रह दोनों शामिल हैं, जो अधिकांशतः Ruby में है, जो निहित फिंगरप्रिंट को विकसित करना, परीक्षण करना और उपयोग करना आसान बनाता है। शामिल Ruby कोड का उपयोग करने के लिए, Ruby का एक हालिया संस्करण (2.31+) आवश्यक है, साथ ही Rubygems और bundler gem। एक बार ये निर्भरताएँ स्थापित हो जाने के बाद, नवीनतम स्रोत कोड प्राप्त करने और किसी भी अतिरिक्त निर्भरता को स्थापित करने के लिए निम्न कमांड का उपयोग करें।

$ git clone [email protected]:rapid7/recog.git
$ cd recog
$ bundle install

^शीर्ष पर वापस जाएँ

परिपक्वता

कृपया ध्यान दें कि जबकि XML फिंगरप्रिंट स्वयं काफी स्थिर और अच्छी तरह से परीक्षित हैं, Ruby कोडबेस अभी भी काफी नया है और तेज़ी से बदल सकता है। कृपया किसी भी उत्पादन परियोजना में Recog कोड का उपयोग करने से पहले हमसे संपर्क करें (research[at]rapid7.com)।

^शीर्ष पर वापस जाएँ

फिंगरप्रिंट्स

Recog के भीतर फिंगरप्रिंट्स XML फ़ाइलों में संग्रहीत होते हैं, जिनमें से प्रत्येक को किसी विशिष्ट प्रोटोकॉल प्रतिक्रिया स्ट्रिंग या फ़ील्ड से मिलान करने के लिए डिज़ाइन किया गया है। उदाहरण के लिए, फ़ाइल ssh_banners.xml प्रारंभिक SSH डेमॉन बैनर स्ट्रिंग का मिलान करके os, विक्रेता और कभी-कभी हार्डवेयर उत्पाद निर्धारित कर सकती है।

एक फिंगरप्रिंट फ़ाइल में निम्नलिखित जैसा 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 दस्तावेज़ देखें।

फिंगरप्रिंट के अंदर, एक description तत्व में इस फिंगरप्रिंट का वर्णन करने वाली मानव-पठनीय स्ट्रिंग होनी चाहिए।

कम से कम एक example तत्व मौजूद होना चाहिए, हालांकि कई example तत्वों को प्राथमिकता दी जाती है। इन तत्वों का उपयोग rspec में मौजूद परीक्षण कवरेज के भाग के रूप में किया जाता है, जो सत्यापित करता है कि प्रदान किया गया डेटा निर्दिष्ट नियमित अभिव्यक्ति से मेल खाता है। इसके अतिरिक्त, यदि फिंगरप्रिंट डेटा से फ़ील्ड मान निकालने के लिए param तत्वों (आगे वर्णित) का उपयोग कर रहा है, तो आप इन अपेक्षित निष्कर्षणों को example तत्वों के लिए विशेषताओं के रूप में जोड़ सकते हैं। उपरोक्त उदाहरण में, यह:

<example service.version="4.62">RomSShell_4.62</example>

परीक्षण करता है कि RomSShell_4.62 प्रदान की गई नियमित अभिव्यक्ति से मेल खाता है और service.version का मान 4.62 है।

example स्ट्रिंग को base64 एन्कोड किया जा सकता है ताकि अप्रिंट करने योग्य वर्णों के उपयोग की अनुमति हो। Recog को यह संकेत देने के लिए, _encoding विशेषता को base64 मान के साथ example तत्व में जोड़ा जाता है। 80 वर्णों से अधिक लंबा base64 एन्कोडेड टेक्स्ट पठनीयता में सहायता के लिए नीचे दिखाए अनुसार न्यूलाइन के साथ लपेटा जा सकता है।

<example _encoding="base64">
  dGllczGEAAAAlQQWMS4yLjg0MC4xMTM1NTYuMS40LjgwMAQuZGF0YS5yZW1vdmVkLjCEAAAAK
  AQdZG9tYWluQ29udHJvbGxlckZ1bmN0aW9uYWxpdHkxhAAAAAMEATc=
</example>

इसके अतिरिक्त, उदाहरणों को XML फ़ाइल के समान आधार नाम वाली निर्देशिका में, XML फ़ाइल के समान निर्देशिका में रखा जा सकता है:

xml/services.xml
xml/services/file1
xml/services/file2
...

फिर उन्हें _filename विशेषता का उपयोग करके लोड किया जा सकता है:

<example _filename="file1"/>

यह लंबे उदाहरणों के लिए उपयोगी है।

param तत्वों में एक pos विशेषता होती है, जो इंगित करती है कि pattern से कौन सा कैप्चर फ़ील्ड निकाला जाना चाहिए, या एक स्थिर स्ट्रिंग के लिए 0name विशेषता वह कुंजी है जो सफल मिलान की स्थिति में रिपोर्ट की जाएगी और value या तो pos मान 0 के लिए एक स्थिर स्ट्रिंग होगी या अनुपस्थित होगी और कैप्चर किए गए फ़ील्ड से ली जाएगी।

value विशेषता अन्य फ़ील्ड से डेटा के इंटरपोलेशन का समर्थन करती है। यह अक्सर उपयोगी होता है जब regex के माध्यम से hw.product के लिए मान कैप्चर करते हैं और इस मान को os.product में पुनः उपयोग करते हैं।

यहाँ http_servers.xml से एक उदाहरण है जहाँ hw.product कैप्चर किया जाता है और पुनः उपयोग किया जाता है।

  <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 मानों में असंगत होता है। ऐसे मामलों में, बैनर के उपयोगी भागों को निकाला जा सकता है और मिलान द्वारा उत्सर्जित डेटा को अव्यवस्थित किए बिना एक नया मान तैयार किया जा सकता है।

<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 में ट्रैक नहीं की जाती हैं।

^शीर्ष पर वापस जाएँ

मिलान का परीक्षण

निम्नलिखित उदाहरण 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 देखें।

^शीर्ष पर वापस जाएँ

श्रेणियाँ