আমার সার্ভারে SSH এর মাধ্যমে অবৈধভাবে অ্যাক্সেস করার চেষ্টা করছে কারা!

8 min

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

নমস্কার, আমি মুনো। আমি একটি Vultr FreeBSD সার্ভার প্রকাশ্যে রেখেছি, এবং আমি কৌতূহলী যে কারা SSH সংযোগের চেষ্টা করছে। প্রসঙ্গত, FreeBSD এর ক্ষেত্রে, এটি আপনার ডোমেইনে একটি "security run output" পাঠায়, যা আপনাকে যেকোনো প্রচেষ্টা সম্পর্কে অবহিত করে। image
এইরকম। তাহলে, চলুন geoip ব্যবহার করে দেখি এই সংযোগের চেষ্টা করা ব্যক্তিরা কোন দেশের গ্লোবাল আইপি ঠিকানা থেকে আসছে। প্রসঙ্গত, geoiplookup কমান্ডটি নিম্নোক্তভাবে ইনস্টল করা যেতে পারে:

sudo pacman -S geoip  
  

কমান্ডটি এটি

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

bash দিয়ে টেক্সট ফরম্যাটিং

তাহলে প্রথমে, মূল ডেটা "security run output" এর স্ট্রিংটি আমার থিঙ্কপ্যাডে (বা যেকোনো মেশিনে) নিয়ে আসি এবং তারপর এটি ফরম্যাট করি।

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 ব্যবহার করে শেষ রেকর্ডের শুধুমাত্র আইপি ঠিকানাটি বের করি, sort এবং uniq দিয়ে ডুপ্লিকেট আইপিগুলি সরিয়ে ফেলি, এবং তারপর এটি grepip নামক একটি ফাইলে লিখি। এরপর, bash ব্যবহার করে এই আইপিগুলির উপর 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 ব্যবহার করে চার্ট প্রদর্শন করি। ইনস্টলেশন এবং কোড:

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