आप पोर्ट स्कैनर क्यों लिखना चाहेंगे?
पोर्ट स्कैनर लिखना टीसीपी प्रोटोकॉल की मूल बातें सीखने का एक शानदार तरीका है, जो कि ट्रांसपोर्ट लेयर है। अधिकांश इंटरनेट प्रोटोकॉल (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 नई चीजों के साथ एक टिप्पणी लिखें 🙂
सारांश
इस पोस्ट में आपने सीखा कि पोर्ट क्या है, विभिन्न पोर्ट रेंज उपलब्ध हैं, टीसीपी कनेक्शन कैसे शुरू किया जाता है (थ्री-वे हैंडशेक) और रूबी का उपयोग करके एक बेसिक पोर्ट स्कैनर कैसे लिखा जाता है।
अगर आपको यह पोस्ट अच्छी लगी हो तो इसे शेयर करना न भूलें ताकि अधिक से अधिक लोग इसका आनंद उठा सकें 🙂