Из какой страны тот, кто пытается несанкционированно получить доступ к моему серверу по SSH!

8 min

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

Здравствуйте, я бездарь. Я публикую сервер FreeBSD на Vultr, и мне стало интересно, кто пытается получить доступ по SSH, поэтому я решил посмотреть. Кстати, в случае с FreeBSD, он отправляет мне на мой домен «security run output» и сообщает, какие попытки были предприняты. image Вот так. Итак, давайте посмотрим, из каких стран глобальные IP-адреса людей, пытающихся это сделать, используя geoip. Кстати, команду 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  
  

В приведенном выше случае, из описания «security run output» под названием vultr, мы извлекаем описание, содержащее строку «from» до «port», используя совпадение grep -o и регулярное выражение Perl с -P.
Это будет выглядеть примерно так:

from IP-адрес port  
  

Причина, по которой я не использовал awk на этом этапе, заключается в том, что вывод ошибок меняется, если пароль неверен или если целевого пользователя вообще не существует на моем сервере, когда пробел используется в качестве разделителя, поэтому я извлек строку от «from» до «port», чтобы собрать все. Затем я извлекаю только IP-адрес из первого поля в конце с помощью awk, удаляю дублирующиеся IP-адреса с помощью sort и uniq, а затем записываю их в файл под названием grepip. Затем, после выполнения geoiplookup для этого IP-адреса в bash, давайте попросим его сделать небольшой подсчет по странам.

$ cat country.sh  
#!/bin/bash  
  
# Файл IP-адресов  
INPUT="grepip"  
  
# Выходной файл  
OUTPUT="countries.log"  
  
# Инициализация  
> $OUTPUT  
  
# Выполнить geoiplookup для каждого IP-адреса и получить информацию о стране  
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. Поэтому мы будем отображать диаграмму с помощью 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