
🖖 तेज़, आधुनिक, उपयोग में आसान नेटवर्क स्कैनर
sx कमांड-लाइन नेटवर्क स्कैनर है जो UNIX दर्शन का पालन करने के लिए डिज़ाइन किया गया है।
इस परियोजना का लक्ष्य स्वच्छ और सरल कोड के साथ सबसे तेज़ नेटवर्क स्कैनर बनाना है।
सबसे सरल तरीका है GitHub Releases से डाउनलोड करना और निष्पादन योग्य फ़ाइल को अपने PATH में रखना।
आवश्यकताएँ:
macOS पर, पहले Xcode कमांड लाइन टूल्स इंस्टॉल करें ताकि CGO सिस्टम libpcap से लिंक कर सके:
xcode-select --install
स्रोत ट्री के रूट से, चलाएँ:
go build
यहाँ कुछ त्वरित उदाहरण दिए गए हैं जो दिखाते हैं कि आप sx के साथ नेटवर्क को कैसे स्कैन कर सकते हैं।
अपने स्थानीय नेटवर्क को स्कैन करें और कनेक्टेड उपकरणों का IP पता, MAC पता और संबंधित हार्डवेयर विक्रेता प्रदर्शित करें:
sx arp 192.168.0.1/24
नमूना आउटपुट:
192.168.0.1 b0:be:76:40:05:8d TP-LINK TECHNOLOGIES CO.,LTD.
192.168.0.111 80:c5:f2:0b:02:e3 AzureWave Technology Inc.
192.168.0.171 88:53:95:2d:3c:af Apple, Inc.
JSON आउटपुट के साथ:
sx arp --json 192.168.0.1/24
नमूना आउटपुट:
{"ip":"192.168.0.1","mac":"b0:be:76:40:05:8d","vendor":"TP-LINK TECHNOLOGIES CO.,LTD."}
{"ip":"192.168.0.111","mac":"80:c5:f2:0b:02:e3","vendor":"AzureWave Technology Inc."}
{"ip":"192.168.0.171","mac":"88:53:95:2d:3c:af","vendor":"Apple, Inc."}
बाहर निकलने से पहले विलंबित रिप्लाई पैकेट प्राप्त करने के लिए 5 सेकंड प्रतीक्षा करें, डिफ़ॉल्ट रूप से sx 300 मिलीसेकंड प्रतीक्षा करता है:
sx arp --exit-delay 5s 192.168.0.1/24
लाइव स्कैन मोड जो हर 10 सेकंड में नेटवर्क को फिर से स्कैन करता है:
sx arp 192.168.0.1/24 --live 10s
nmap और अन्य स्कैनरों के विपरीत जो वास्तविक स्कैन से पहले IP पतों को MAC पतों में हल करने के लिए ARP अनुरोधों को अंतर्निहित रूप से करते हैं, sx स्पष्ट रूप से ARP cache अवधारणा का उपयोग करता है। ARP cache फ़ाइल एक सरल टेक्स्ट फ़ाइल है जिसमें प्रत्येक पंक्ति में JSON स्ट्रिंग होती है (JSONL फ़ाइल), जिसमें वही JSON फ़ील्ड हैं जो ऊपर ARP स्कैन JSON आउटपुट में वर्णित हैं। TCP और UDP जैसे उच्च-स्तरीय प्रोटोकॉल के स्कैन stdin से ARP cache फ़ाइल पढ़ते हैं और फिर वास्तविक स्कैन शुरू करते हैं।
यह न केवल प्रोग्राम के डिज़ाइन को सरल बनाता है, बल्कि स्कैनिंग प्रक्रिया को भी गति देता है, क्योंकि हर बार ARP स्कैन करना आवश्यक नहीं है।
मान लें कि वास्तविक ARP cache arp.cache फ़ाइल में है। हम इसे मैन्युअल रूप से बना सकते हैं या नीचे दिखाए अनुसार ARP स्कैन का उपयोग कर सकते हैं:
sx arp 192.168.0.1/24 --json | tee arp.cache
एक बार ARP cache फ़ाइल हो जाने पर, हम उच्च-स्तरीय प्रोटोकॉल जैसे TCP SYN स्कैन चला सकते हैं:
cat arp.cache | sx tcp -p 1-65535 192.168.0.171
नमूना आउटपुट:
192.168.0.171 22
192.168.0.171 443
इस स्थिति में हम पाते हैं कि पोर्ट 22 और 443 खुले हैं।
यदि बड़े स्कैन के दौरान send: No buffer space available दिखाई देता है, तो इसका मतलब आमतौर पर भेजने वाला कर्नेल/रॉ-सॉकेट बफ़र्स से आगे निकल रहा है। पहला समाधान है --rate जोड़ना और भेजने के बर्स्ट को कम करना, उदाहरण के लिए -r 100000/s या आवश्यकतानुसार कम। कुछ सिस्टम पर, OS सॉकेट/बफ़र सीमाओं को ट्यून करने से भी मदद मिल सकती है, लेकिन रेट लिमिटिंग प्राथमिक समाधान है।
JSON आउटपुट के साथ स्कैन:
cat arp.cache | sx tcp --json -p 1-65535 192.168.0.171
नमूना आउटपुट:
{"scan":"tcpsyn","ip":"192.168.0.171","port":22}
{"scan":"tcpsyn","ip":"192.168.0.171","port":443}
एकाधिक पोर्ट रेंज स्कैन करें:
cat arp.cache | sx tcp -p 1-23,25-443 192.168.0.171
या व्यक्तिगत पोर्ट:
cat arp.cache | sx tcp -p 22,443 192.168.0.171
या स्कैन करने के लिए पोर्ट या पोर्ट रेंज निर्दिष्ट करने के लिए --ports-file विकल्प का उपयोग करें, प्रति पंक्ति एक।
फ़ाइल से ip/port जोड़ियों को JSON आउटपुट के साथ स्कैन करें:
cat arp.cache | sx tcp --json -f ip_ports_file.jsonl
इनपुट फ़ाइल की प्रत्येक पंक्ति एक json स्ट्रिंग है, जिसमें ip और port फ़ील्ड होने चाहिए।
नमूना इनपुट फ़ाइल:
{"ip":"10.0.1.1","port":1080}
{"ip":"10.0.2.2","port":1081}
-a या --arp-cache विकल्पों का उपयोग करके ARP cache फ़ाइल निर्दिष्ट करना संभव है:
sx tcp -a arp.cache -p 22,443 192.168.0.171
या stdin रीडायरेक्ट:
sx tcp -p 22,443 192.168.0.171 < arp.cache
आप tcp के बजाय tcp syn उप-कमांड का भी उपयोग कर सकते हैं:
cat arp.cache | sx tcp syn -p 22 192.168.0.171
tcp उप-कमांड केवल tcp syn उप-कमांड का संक्षिप्त रूप है जब तक कि --flags विकल्प पारित नहीं किया जाता है, नीचे देखें।
sx वर्चुअल नेटवर्क इंटरफेस (wireguard, openvpn, आदि) के साथ स्कैनिंग का समर्थन करता है और इस मामले में ARP cache का उपयोग करना आवश्यक नहीं है, क्योंकि इन इंटरफेस को इनपुट के रूप में Ethernet फ्रेम के बजाय कच्चे IP पैकेट की आवश्यकता होती है। उदाहरण के लिए, vpn नेटवर्क पर एक IP पते को स्कैन करना:
sx tcp 10.1.27.1 -p 80 --json
अधिकांश नेटवर्क स्कैनर स्कैन के परिणामों की व्याख्या करने का प्रयास करते हैं। उदाहरण के लिए वे कहते हैं "यह पोर्ट बंद है" इसके बजाय "मुझे एक RST प्राप्त हुआ"। कभी-कभी वे सही होते हैं। कभी-कभी नहीं। यह शुरुआती लोगों के लिए आसान है, लेकिन जब आप जानते हैं कि आप क्या कर रहे हैं, तो आप विशेष रूप से उन्नत स्कैन तकनीकों के लिए कार्यक्रम की व्याख्या से वास्तव में क्या हुआ, यह निकालने की कोशिश करते रहते हैं।
sx उन समस्याओं को दूर करने का प्रयास करता है। यह TCP FIN, NULL, Xmas और कस्टम TCP स्कैन के लिए सभी रिप्लाई पैकेटों के बारे में जानकारी लौटाता है। जानकारी में IP पता, TCP पोर्ट और रिप्लाई पैकेट में सेट सभी TCP फ़्लैग शामिल हैं।
TCP FIN स्कैन और इसके अन्य रूपांतर (NULL और Xmas) RFC793 धारा 3.9 का शोषण करते हैं:
SEGMENT ARRIVES
If the state is CLOSED (i.e., TCB does not exist) then
all data in the incoming segment is discarded. An incoming segment containing a RST is discarded. An incoming segment not containing a RST causes a RST to be sent in response. The acknowledgment and sequence field values are selected to make the reset sequence acceptable to the TCP that sent the offending segment.
इसलिए बंद पोर्ट को RST फ़्लैग के साथ पैकेट लौटाना चाहिए।
यह धारा यह भी बताती है कि:
If the state is LISTEN then
...
Any other control or text-bearing segment (not containing SYN) must have an ACK and thus would be discarded by the ACK processing. An incoming RST segment could not be valid, since it could not have been sent in response to anything sent by this incarnation of the connection. So you are unlikely to get here, but if you do, drop the segment, and return.
मुख्य वाक्यांश यहाँ है: drop the segment, and return. तो अधिकांश ऑपरेटिंग सिस्टम पर एक खुला पोर्ट SYN, ACK और RST को छोड़कर किसी भी फ़्लैग वाले TCP पैकेट को हटा देगा।
आइए TCP FIN स्कैन के साथ किसी बंद पोर्ट को स्कैन करें:
cat arp.cache | sx tcp fin --json -p 23 192.168.0.171
नमूना आउटपुट:
{"scan":"tcpfin","ip":"192.168.0.171","port":23,"flags":"ar"}
flags फ़ील्ड में रिप्लाई पैकेट के सभी TCP फ़्लैग होते हैं, जहाँ प्रत्येक अक्षर एक TCP फ़्लैग का प्रतिनिधित्व करता है:
s - SYN फ़्लैगa - ACK फ़्लैगf - FIN फ़्लैगr - RST फ़्लैगp - PSH फ़्लैगu - URG फ़्लैगe - ECE फ़्लैगc - CWR फ़्लैगn - NS फ़्लैगइस मामले में हम पाते हैं कि पोर्ट 23 ने ACK और RST फ़्लैग सेट के साथ रिप्लाई पैकेट भेजा (rfc793 के अनुसार बंद पोर्ट के लिए विशिष्ट प्रतिक्रिया)।
यदि हम एक खुले पोर्ट को स्कैन करते हैं, तो हमें कोई प्रतिक्रिया नहीं मिलती (जब तक कि फ़ायरवॉल प्रतिक्रियाओं की नकल नहीं कर रहा हो)।
अन्य प्रकार के TCP स्कैन सादृश्य द्वारा किए जा सकते हैं।
TCP NULL स्कैन:
cat arp.cache | sx tcp null --json -p 23 192.168.0.171
TCP Xmas स्कैन:
cat arp.cache | sx tcp xmas --json -p 23 192.168.0.171
--flags विकल्प का उपयोग करके कस्टम TCP फ़्लैग के साथ TCP पैकेट भेजना संभव है।
आइए रिमोट OS को फ़िंगरप्रिंट करने के लिए SYN, FIN और ACK फ़्लैग सेट के साथ TCP पैकेट भेजें:
cat arp.cache | sx tcp --flags syn,fin,ack --json -p 23 192.168.0.171
Windows और MacOS इस पैकेट का जवाब नहीं देंगे, लेकिन Linux RST फ़्लैग के साथ रिप्लाई पैकेट भेजेगा।
--flags विकल्प के संभावित तर्क:
syn - SYN फ़्लैगack - ACK फ़्लैगfin - FIN फ़्लैगrst - RST फ़्लैगpsh - PSH फ़्लैगurg - URG फ़्लैगece - ECE फ़्लैगcwr - CWR फ़्लैगns - NS फ़्लैगsx खुले UDP पोर्ट की जांच में मदद कर सकता है। UDP स्कैन RFC1122 धारा 4.1.3.1 का शोषण करता है:
If a datagram arrives addressed to a UDP port for which there is no pending LISTEN call, UDP SHOULD send an ICMP Port Unreachable message.
TCP स्कैन के समान, sx UDP स्कैन के लिए सभी रिप्लाई ICMP पैकेटों के बारे में जानकारी लौटाता है। जानकारी में IP पता, ICMP पैकेट प्रकार और रिप्लाई पैकेट में सेट कोड शामिल है।
उदाहरण के लिए, होस्ट पर DNS सर्वर का पता लगाने के लिए, चलाएँ:
cat arp.cache | sx udp --json -p 53 192.168.0.171
नमूना आउटपुट:
{"scan":"udp","ip":"192.168.0.171","icmp":{"type":3,"code":3}}
इस मामले में हम पाते हैं कि होस्ट ने Destination Unreachable प्रकार और Port Unreachable कोड के साथ ICMP रिप्लाई पैकेट भेजा (rfc1122 के अनुसार बंद पोर्ट के लिए विशिष्ट प्रतिक्रिया)।
फ़ायरवॉल आमतौर पर Port Unreachable से भिन्न ICMP कोड सेट करते हैं और इसलिए आसानी से पता लगाया जा सकता है।
कभी-कभी आपको उस गति को सीमित करने की आवश्यकता होती है जिस पर उत्पन्न पैकेट भेजे जाते हैं। यह --rate विकल्प के साथ किया जा सकता है।
उदाहरण के लिए, गति को 5 सेकंड में 1 पैकेट तक सीमित करने के लिए:
cat arp.cache | sx tcp --rate 1/5s --json -p 22,80,443 192.168.0.171
कभी-कभी आपको स्कैनिंग से कुछ IP पतों और सबनेट को बाहर करने की आवश्यकता होती है। यह --exclude विकल्प के साथ किया जा सकता है। यह CIDR नोटेशन में बाहर करने के लिए IP या सबनेट वाली फ़ाइल निर्दिष्ट करता है, प्रति पंक्ति एक।
उदाहरण के लिए, RFC 1918 पतों को बाहर करने के लिए, निम्नलिखित सामग्री के साथ ips.txt फ़ाइल बनाएँ:
10.0.0.0/8
172.16.0.0/16
192.168.0.0/16
आप टिप्पणियाँ और खाली पंक्तियाँ भी सम्मिलित कर सकते हैं:
# RFC 1918 पतों को बाहर करें
10.0.0.0/8 # टिप्पणी 1
172.16.0.0/12 # टिप्पणी 2
192.168.0.0/16 # टिप्पणी 3
0.0.0.0/8 # आरंभिक प्रक्रियाओं में उपयोग किया जाता है (RFC 6890)
# RFC 5735 पतों को बाहर करें
127.0.0.0/8 # लूपबैक पता
192.0.0.0/24 # IETF प्रोटोकॉल असाइनमेंट के लिए आरक्षित ब्लॉक
224.0.0.0/4 # IPv4 मल्टीकास्ट पता असाइनमेंट में उपयोग के लिए आवंटित
240.0.0.0/4 # भविष्य के उपयोग के लिए आरक्षित
# Amazon नेटवर्क को बाहर करें
3.0.0.0/8
# IP पते भी मान्य हैं
1.1.1.1
और --exclude ips.txt विकल्प के साथ स्कैन चलाएँ।
स्कैन रचना के एक उदाहरण के रूप में, आप पूरे LAN नेटवर्क को समय-समय पर स्कैन करने वाला लाइव TCP पोर्ट स्कैनर बनाने के लिए ARP और TCP SYN स्कैन को जोड़ सकते हैं।
लाइव ARP स्कैन शुरू करें और परिणामों को arp.cache फ़ाइल में सहेजें:
sx arp 192.168.0.1/24 --live 10s --json | tee arp.cache
दूसरे टर्मिनल में TCP SYN स्कैन शुरू करें:
while true; do sx tcp -p 1-65535 -a arp.cache -f arp.cache; sleep 30; done
sx सक्रिय SOCKS5 प्रॉक्सी का पता लगा सकता है। स्कैन करने के लिए, आपको एक IP रेंज या ip/port जोड़ियों वाली JSONL फ़ाइल निर्दिष्ट करनी होगी।
उदाहरण के लिए, एक IP रेंज स्कैन:
sx socks -p 1080 10.0.0.1/16
JSON आउटपुट के साथ फ़ाइल से ip/port जोड़ियों को स्कैन करें:
sx socks --json -f ip_ports_file.jsonl
इनपुट फ़ाइल की प्रत्येक पंक्ति एक json स्ट्रिंग है, जिसमें ip और port फ़ील्ड होने चाहिए।
नमूना इनपुट फ़ाइल:
{"ip":"10.0.1.1","port":1080}
{"ip":"10.0.2.2","port":1081}
आप स्कैन करने के लिए पोर्ट की एक श्रेणी भी निर्दिष्ट कर सकते हैं:
sx socks -p 1080-4567 -f ips_file.jsonl
इस स्थिति में फ़ाइल से केवल IP पते लिए जाएंगे और port फ़ील्ड की अब आवश्यकता नहीं है।
sx help
योगदान, समस्याएँ और सुविधा अनुरोधों का स्वागत है।
लोगो mikhailtsoy.com द्वारा डिज़ाइन किया गया है
यह परियोजना MIT लाइसेंस के तहत लाइसेंस प्राप्त है। पूर्ण लाइसेंस पाठ के लिए LICENSE फ़ाइल देखें।