是谁在尝试通过SSH非法访问我的服务器,他们来自哪个国家!

6 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  
  

使用bash进行文本格式化

那么首先,我们将原始数据“security run output”字符串带到我的ThinkPad(或其他任何地方),然后进行格式化。

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

在上述情况下,我们从名为vultr的“security run output”描述中,使用grep的-o选项匹配值,并使用-P选项的Perl正则表达式,提取包含从“from”到“port”字符串的描述。
会变成如下字符串的样子:

from IPアドレス port  
  

此时不使用awk的原因是,如果以空格作为分隔符,当密码错误或服务器上根本不存在目标用户时,错误输出会发生变化,因此我提取了从“from”到“port”的字符串以捕获所有情况。接下来,我使用awk提取了最后一个记录中的IP地址,通过sort和uniq删除了重复的IP,并将其写入名为grepip的文件中。然后,让我们使用bash对这些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清晰地显示图表

嗯,虽然在字符串上可以看懂,但当数量增多时会变得难以阅读,所以我们希望以图表形式显示,对吧?
此外,如果将其脚本化,也可以作为cron作业生成。因此,我们将使用方便的Python库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