मेरे सर्वर पर SSH के माध्यम से अवैध रूप से पहुँचने की कोशिश करने वाले किस देश से हैं!

8 min

language: ja bn en es hi pt ru zh-cn zh-tw

नमस्ते, मैं अक्षम हूँ। मैंने Vultr के FreeBSD सर्वर को सार्वजनिक किया है, और मैं यह जानने के लिए उत्सुक था कि SSH के माध्यम से पहुँचने की कोशिश करने वाले लोग कौन हैं। वैसे, FreeBSD के मामले में, यह आपके डोमेन पर "security run output" के रूप में जानकारी भेजता है, जिससे आपको पता चलता है कि क्या प्रयास किए गए हैं। image
कुछ ऐसा। तो, आइए geoip का उपयोग करके देखें कि ये लोग, जो कोशिश कर रहे हैं, किस देश के ग्लोबल IP पते से हैं। वैसे, geoiplookup कमांड को इस प्रकार इंस्टॉल किया जा सकता है:

sudo pacman -S geoip  
  

कमांड यह है:

$ geoiplookup IPアドレス  
GeoIP Country Edition: RU, Russian Federation  
  

बैश में टेक्स्ट को फॉर्मेट करना

तो, सबसे पहले, हम मूल डेटा "security run output" स्ट्रिंग को अपने ThinkPad पर लाएंगे और फिर उसे फॉर्मेट करेंगे।

cat vultr | grep -oP "from.*port" | awk '{print $(NF-1)}' | sort | uniq > grepip  
  

उपरोक्त मामले में, हम 'vultr' नामक "security run output" विवरण से, grep के 'o' विकल्प का उपयोग करके मेल खाने वाले मानों को और 'P' विकल्प का उपयोग करके पर्ल रेगुलर एक्सप्रेशन का उपयोग करके 'from' स्ट्रिंग से 'port' तक के विवरणों को निकालेंगे।
यह कुछ इस तरह की स्ट्रिंग बन जाएगी।

from IPアドレス port  
  

इस बिंदु पर awk का उपयोग न करने का कारण यह था कि यदि हम स्पेस को विभाजक के रूप में उपयोग करते हैं, तो गलत पासवर्ड या यदि लक्ष्य उपयोगकर्ता मेरे सर्वर पर मौजूद नहीं है, तो त्रुटि आउटपुट बदल जाता है, इसलिए मैंने 'from' से 'port' तक की पूरी स्ट्रिंग निकाली ताकि सभी को पकड़ा जा सके। फिर, awk का उपयोग करके, मैंने अंतिम रिकॉर्ड में केवल IP पते को निकाला, sort और uniq का उपयोग करके डुप्लिकेट IP हटाए, और इसे 'grepip' नामक फ़ाइल में लिखा। और फिर, आइए बैश में इस IP के लिए geoiplookup चलाने के बाद देश और एक हल्का सारांश प्राप्त करें।

$ cat country.sh  
#!/bin/bash  
  
# IPアドレスのファイル  
INPUT="grepip"  
  
# 出力ファイル  
OUTPUT="countries.log"  
  
# 初期化  
> $OUTPUT  
  
# 各IPアドレスに対してgeoiplookupを実行し、国情報を取得  
while IFS= read -r ip; do  
    geoiplookup "$ip" | awk -F: '{print $2}' >> $OUTPUT  
done < "$INPUT"  
  
# 国情報を集計して表示  
sort $OUTPUT | uniq -c | sort -tr  
  

अब इसे निष्पादन अनुमति दें।

chmod +x ./country.sh  
  

बस इसे चलाएँ।

$ ./country.sh  
      1  BE, Belgium  
      1  BG, Bulgaria  
      1  BR, Brazil  
      1  CH, Switzerland  
      1  HK, Hong Kong  
      1  HU, Hungary  
      1  IR, Iran, Islamic Republic of  
      1  IT, Italy  
      1  LT, Lithuania  
      1  MT, Malta  
      1  MX, Mexico  
      1  MY, Malaysia  
      1  NO, Norway  
      1  PA, Panama  
      1  PE, Peru  
      1  SE, Sweden  
      1  SK, Slovakia  
      1  TH, Thailand  
      1  TM, Turkmenistan  
      1  TZ, Tanzania, United Republic of  
      1  UZ, Uzbekistan  
      1  ZA, South Africa  
      2  RO, Romania  
      2  UA, Ukraine  
      3  PL, Poland  
      6  GB, United Kingdom  
      7  VN, Vietnam  
      8  CA, Canada  
      8  ID, Indonesia  
      9  RU, Russian Federation  
      9  SG, Singapore  
     10  FR, France  
     10  KR, Korea, Republic of  
     11  DE, Germany  
     11  NL, Netherlands  
     16  CN, China  
     18  IN, India  
     43  US, United States  
  

अच्छा, अच्छा...

Matplotlib के साथ आसानी से चार्ट प्रदर्शित करें

ठीक है, यह स्ट्रिंग में तो समझ में आता है, लेकिन जब संख्याएँ बहुत अधिक हो जाती हैं तो इसे देखना मुश्किल होता है, इसलिए हम इसे चार्ट के रूप में प्रदर्शित करना चाहेंगे, है ना?
इसके अलावा, यदि इसे स्क्रिप्ट किया जाता है, तो इसे क्रॉन जॉब के रूप में भी उत्पन्न किया जा सकता है। इसलिए, हम Matplotlib, एक उपयोगी Python लाइब्रेरी का उपयोग करके चार्ट प्रदर्शित करेंगे। इंस्टॉलेशन और कोड

pip install matplotlib  
  
cat AreYouFrom.py  
#!/usr/bin/python3  
  
import matplotlib.pyplot as plt  
import collections  
  
# ファイルを読み込み、国ごとにアクセス数を集計  
country_counts = collections.Counter()  
  
with open('countries.txt', 'r') as file:  
    for line in file:  
        # 国情報を取得  
        country = line.strip().split(",")[1]  
        country_counts[country] += 1  
  
# データをソート  
countries, counts = zip(*country_counts.most_common())  
  
# グラフを作成  
plt.figure(figsize=(10, 6))  
plt.bar(countries, counts, color='skyblue')  
plt.xlabel('Country')  
plt.ylabel('Accesses')  
plt.title('Accesses by Country')  
plt.xticks(rotation=90)  
plt.tight_layout()  
  
# pngファイルとして画像出力  
plt.savefig('accesses.png')  
  

अब आप चार्ट आउटपुट और छवि आउटपुट प्राप्त कर सकते हैं।

chmod +x AreYouFrom.py  
  

(यह एक मिडिल स्कूल अंग्रेजी फ़ाइल नाम जैसा है!)

image

देदेडॉन! ऐसा लगता है कि संयुक्त राज्य अमेरिका से सबसे अधिक हैं।

SSH करने की कोशिश कर रहे पोर्ट के अनुसार सारांश

तो, आइए उन पोर्ट्स के अनुसार जाँच करें जिन पर पहुँचने का प्रयास किया जा रहा है।
इससे केवल पोर्ट्स को grep किया जा सका।

cat vultr | grep -oP "port [123456789].*ssh2$" | grep -oP "[123456789].* "  
  

इसे ports.txt के रूप में आउटपुट करें।
हालांकि, चूंकि सभी पोर्ट नंबर अलग-अलग हैं, इसलिए प्लॉट आउटपुट करते समय उन्हें ब्लॉक द्वारा अलग करें।

$ cat AreYouPort.py  
#!/usr/bin/python3  
import matplotlib.pyplot as plt  
from collections import Counter  
  
# ポート番号をファイルから読み込む  
with open('ports.txt', 'r') as file:  
    ports = [int(line.strip()) for line in file]  
  
# ポート番号の頻度分布を計算  
counter = Counter(ports)  
  
blocks = {}  
for port, count in counter.items():  
    block = (port // 10000) * 10000  
    if block not in blocks:  
        blocks[block] = 0  
    blocks[block] += count  
  
# グラフを作成  
x = list(blocks.keys())  
y = list(blocks.values())  
  
plt.figure(figsize=(12, 6))  
plt.bar(x, y, width=6000, color='skyblue', edgecolor='black')  
plt.xlabel('Port Number')  
plt.ylabel('Frequency')  
plt.title('Port Numbers by Frequency')  
plt.xticks(x, [f'{i}-{i+9999}' for i in x], rotation=45)  
plt.grid(True, axis='y', linestyle='--', alpha=0.7)  
plt.tight_layout()  
  
# PNGファイルに保存  
plt.savefig('port_numbers.png')  
  

और फिर.... image
आखिर क्यों 30,000 से अधिक के असंभव पोर्ट नंबरों पर इतने सारे प्रयास हो रहे हैं...? तो, आज के लिए बस इतना ही। फिर मिलेंगे।

Related Posts