Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

रूबी में पोर्ट स्कैनर कैसे लिखें?

आप पोर्ट स्कैनर क्यों लिखना चाहेंगे?

पोर्ट स्कैनर लिखना टीसीपी प्रोटोकॉल की मूल बातें सीखने का एक शानदार तरीका है, जो कि ट्रांसपोर्ट लेयर है। अधिकांश इंटरनेट प्रोटोकॉल (HTTP और SSH सहित) द्वारा उपयोग किया जाता है।

रूबी नेटवर्क प्रोग्रामिंग कैसे काम करती है, इसके बारे में अधिक जानने के लिए यह एक अच्छा अभ्यास है।

आइए बंदरगाहों के बारे में बात करके शुरुआत करें!

पोर्ट क्या है?

जब हम बंदरगाहों के बारे में बात करते हैं तो हम वास्तव में किस बारे में बात कर रहे हैं? एक बंदरगाह ओ.एस. (ऑपरेटिंग सिस्टम) स्तर एक प्रक्रिया से जुड़ा सिर्फ एक "फाइल डिस्क्रिप्टर" है।

एक फ़ाइल विवरणक केवल एक संख्या है जिसका उपयोग खुले I/O चैनल को संदर्भित करने के लिए किया जाता है, जैसे stdout (मानक आउटपुट), एक नेटवर्क सॉकेट या एक फ़ाइल।

जब OS को TCP/IP पैकेट प्राप्त होता है तो वह गंतव्य पोर्ट को देखता है और इस पोर्ट पर सुनने वाली प्रक्रिया को खोजने का प्रयास करता है।

फिर अगर कोई सुनने की प्रक्रिया होती है तो पैकेट उस तक पहुंचा दिया जाता है।

पोर्ट रेंज

कुल मिलाकर 65.535 बंदरगाह उपलब्ध हैं, लेकिन व्यवहार में उन सभी का नियमित रूप से उपयोग नहीं किया जाता है।

बंदरगाहों को 3 समूहों में विभाजित किया जा सकता है:

<वें संरेखण ="बाएं">नाम
रेंज उदाहरण
1-1023 प्रसिद्ध बंदरगाह 22 (SSH), 80 (HTTP), 443 (HTTPS)
1024-49151 पंजीकृत पोर्ट 3306 (MySQL), 5432 (PostgreSQL)
49152-65535 क्षणिक बंदरगाह Chrome, Firefox

दूसरी श्रेणी में पोर्ट IANA (इंटरनेट असाइन किए गए नंबर प्राधिकरण) द्वारा असाइन किए जाते हैं।

और तीसरी श्रेणी का उपयोग "गतिशील" या "क्षणिक" बंदरगाहों के लिए किया जाता है, ये सर्वर से डेटा प्राप्त करने के लिए कनेक्शन के क्लाइंट पक्ष द्वारा उपयोग किए जाने वाले बंदरगाह हैं।

टीसीपी संचार की मूल बातें

अब आपको बंदरगाहों से अधिक परिचित होना चाहिए, लेकिन हम अभी भी अपना पोर्ट स्कैनर लिखने के लिए तैयार नहीं हैं।

सबसे पहले, हमें यह चर्चा करने की आवश्यकता है कि बंदरगाह के खुले होने का क्या अर्थ है। फिर हम नेटवर्क स्तर पर एक खुले बंदरगाह और एक बंद बंदरगाह दोनों के व्यवहार की जांच करेंगे ताकि हम उन्हें अलग कर सकें।

आप कैसे जान सकते हैं कि कोई पोर्ट खुला है?

एक खुले बंदरगाह का सीधा सा मतलब है कि दूसरे छोर पर एक एप्लिकेशन सुन रहा है और हमारे पास उस तक पहुंच है (फ़ायरवॉल द्वारा अवरुद्ध नहीं)।

आइए देखें कि एक नया टीसीपी कनेक्शन कैसे शुरू किया जाता है।

रूबी में पोर्ट स्कैनर कैसे लिखें?

एक नया TCP कनेक्शन SYN . के साथ प्रारंभ किया गया है पैकेट। यह पैकेट एक नए कनेक्शन की शुरुआत का प्रतीक है।

तीन संभावित परिणाम हैं :

  • सर्वर एक SYN/ACK के साथ जवाब देता है - इसका मतलब है कि यह एक कनेक्शन स्थापित करने के लिए तैयार है
  • सर्वर RST के साथ उत्तर देता है पैकेट - इसका मतलब है कि कनेक्शन अस्वीकार कर दिया गया है
  • सर्वर बिल्कुल भी जवाब नहीं देता (कुछ फायरवॉल इसे DROP नीति के रूप में लागू करते हैं)

अगर क्लाइंट को SYN/ACK मिलता है पैकेट तो यह एक ACK . भेजकर कनेक्शन स्थापित करना समाप्त कर सकता है पैकेट।

इसे “तीन-तरफा हाथ मिलाना . कहा जाता है ".

<ब्लॉककोट>

नोट :ऐसा होते हुए देखने का एक शानदार तरीका है tcpdump या Wireshark जैसे नेटवर्किंग टूल का उपयोग करना। ये उपकरण आपको आपके सिस्टम के अंदर और बाहर आने वाले प्रत्येक पैकेट को देखने की अनुमति देते हैं।

यहां tshark . से कनेक्शन का एक उदाहरण दिया गया है (वायरशार्क का कमांड-लाइन इंटरफ़ेस):

रूबी में पोर्ट स्कैनर कैसे लिखें?

अब जबकि आपको एक बुनियादी समझ है कि टीसीपी कनेक्शन कैसे स्थापित किया जाता है, हम एक साधारण पोर्ट स्कैनर लिख सकते हैं।

आइए एक पोर्ट स्कैनर लिखें!

हमारे स्कैनर को लिखने का सबसे आसान तरीका TCPSocket . का उपयोग करके एक नया TCP कनेक्शन खोलना है और फिर इस तथ्य पर भरोसा करें कि एक अस्वीकृत कनेक्शन Errno::ECONNREFUSED बढ़ा देगा अपवाद।

यहां कोड है :

'सॉकेट' की आवश्यकता हैपोर्ट =ARGV[0] || 22होस्ट =एआरजीवी[1] || 'लोकलहोस्ट' सॉकेट शुरू करें =TCPSocket.new (होस्ट, पोर्ट) स्थिति ="खुला" बचाव Errno ::ECONNREFUSED, Errno ::ETIMEDOUT स्थिति ="बंद" एंडपुट ​​"पोर्ट # {पोर्ट} # {स्थिति} है।" । पूर्व> 

इस कोड की कुछ सीमाएँ हैं:

हम एक बार में केवल एक ही पोर्ट को स्कैन कर सकते हैं। किसी विशिष्ट होस्ट पर कौन सी सेवाएं प्रदर्शित की जाती हैं, इसका बेहतर विचार प्राप्त करने के लिए अक्सर आप पोर्ट की एक श्रृंखला को स्कैन करना चाहते हैं।

इस कोड के साथ एक और सीमा यह है कि एक गैर-प्रतिक्रिया पोर्ट (परिणामों का तीसरा मैंने पहले उल्लेख किया है) आपको कनेक्शन के समय समाप्त होने तक लगभग 20 सेकंड तक प्रतीक्षा करेगा।

इसे connect_nonblock . के संयोजन से हल किया जा सकता है , IO.select &Socket (TCPSocket के बजाय , जो आपके द्वारा ऑब्जेक्ट बनाते ही एक कनेक्शन शुरू कर देता है)।

उदाहरण :

'सॉकेट' की आवश्यकता है TIMEOUT =2def scan_port(port) सॉकेट =Socket.new(:INET, :STREAM) remote_addr =Socket.sockaddr_in(port, 'www.example.com') start socket.connect_nonblock(remote_addr) रेस्क्यू Errno::EINPROGRESS अंत _, सॉकेट, _ =IO.select(nil, [socket], nil, TIMEOUT) अगर सॉकेट p "पोर्ट # {पोर्ट} खुला है" और # पोर्ट बंद है endendPORT_LIST =[21,22,23 ,25,53,80,443,3306,8080] धागे =[]PORT_LIST.प्रत्येक { |i| धागे < 

IO.select कॉल तब तक प्रतीक्षा करेगा जब तक सॉकेट डेटा प्राप्त करने के लिए तैयार न हो (जिसका अर्थ है कि यह खुला है) या TIMEOUT तक समय बीत चुका है, जिसके बाद हम मान सकते हैं कि पोर्ट या तो बंद है या कनेक्शन अनुरोधों की अनदेखी कर रहा है।

तो, यह एक सीखने के अभ्यास के रूप में बहुत अच्छा है, लेकिन अगर आपको एक उचित पोर्ट स्कैनर की आवश्यकता है तो आपको nmap जैसी किसी चीज़ का उपयोग करना चाहिए।

Nmap खुला स्रोत है और 15 से अधिक वर्षों से सक्रिय विकास के अधीन है।

नैंप आउटपुट इस तरह दिखता है:

रूबी में पोर्ट स्कैनर कैसे लिखें?

मुझे पता है कि यह बहुत सारी जानकारी है, इसलिए आपको याद रखने में मदद करने के लिए इस पोस्ट से सीखी गई 2 नई चीजों के साथ एक टिप्पणी लिखें 🙂

सारांश

इस पोस्ट में आपने सीखा कि पोर्ट क्या है, विभिन्न पोर्ट रेंज उपलब्ध हैं, टीसीपी कनेक्शन कैसे शुरू किया जाता है (थ्री-वे हैंडशेक) और रूबी का उपयोग करके एक बेसिक पोर्ट स्कैनर कैसे लिखा जाता है।

अगर आपको यह पोस्ट अच्छी लगी हो तो इसे शेयर करना न भूलें ताकि अधिक से अधिक लोग इसका आनंद उठा सकें 🙂


  1. एक मैट्रिक्स क्या है और रूबी में इसका उपयोग कैसे करें?

    मैट्रिक्स एक 2डी (2-आयामी) सरणी है जिसका उपयोग स्प्रेडशीट जैसे डेटा को स्टोर और काम करने के लिए किया जा सकता है। उनका उपयोग इसके लिए किया जा सकता है : टेबल गेम (शतरंज, चेकर्स, आदि) में बोर्ड का प्रतिनिधित्व करना सांख्यिकी और डेटा विश्लेषण प्लॉट और ग्राफ़ बनाना चूंकि यह एक शक्तिशाली डेटा संरचना ह

  1. रूबी में स्ट्रक्चर और ओपनस्ट्रक्चर का उपयोग कैसे करें?

    रूबी में स्ट्रक्चर क्या है? एक संरचना एक अंतर्निहित रूबी वर्ग है, इसका उपयोग नए वर्ग बनाने के लिए किया जाता है जो मूल्य वस्तुओं का उत्पादन करते हैं। संबंधित विशेषताओं को एक साथ संग्रहीत करने के लिए एक मूल्य वस्तु का उपयोग किया जाता है। यहां एक उदाहरण दिया गया है : एक Point दो निर्देशांकों के साथ

  1. रूबी में फाइलें कैसे पढ़ें और लिखें (उदाहरण के साथ)

    आज आप रूबी में फाइलों को पढ़ना और लिखना सीखेंगे ताकि आप सामग्री को निकाल सकें, नई फाइलें बना सकें और अपनी जरूरत की जानकारी पा सकें! यहां बताया गया है कि हम क्या कवर करने जा रहे हैं : सामग्री 1 रूबी में फ़ाइलें कैसे पढ़ें 2 रूबी में फ़ाइल को कैसे लिखें 3 रूबी फ़ाइल विधियाँ 4 निर्देशिका संचालन 5