Вдохновившись идеей Honeypot (ловушка для хакеров) захотелось что ни будь сделать в таком же духе, но совсем простое. И тут пришла совсем не сложная идея автоматического создания списка IP адресов с которых ботнеты атакуют просторы интернета. Что бы не скучать прикрутим к этому делу Telegram-бота для спама.
Не запариваясь покупаем VDS сервер на Debian. Это нам дает белый IP, онлайн 24\7 и вообще удобно. На данный момент цена на самый простой сервер где то 150 рублей в месяц. В качестве рекламы могу посоветовать VDS-OVZ-Разминка (90 рублей месяц) от FirstVDS.ru
VDS (Virtual Dedicated Server) или VPS (Virtual Private Server) — это хостинг-услуга, где пользователю предоставляется виртуальный сервер с максимальными привилегиями. VDS или VPS эмулирует работу реального физического сервера — есть root -доступ, возможна установка своих операционных систем и программного обеспечения.
Ну и конечно на сервере открыт доступ по SSH. Куда наши боты ломануться как на Г. Отслеживать и банить наглый Брут мы будем с помощью утилиты fail2ban. Вот так выглядит лог файл :

Ну и нам нужно создать Телеграмм бота, который будет присылать очередной IP , страну и общее число IP в нашем списке.
Пишем код.
Писать мы это все безобразие будет на Python, ну а на чем еще ) Идея ся проста: мы будем просто просматривать лог файл fail2ban в поисках забаненых адресов. Потом добавлять их в свой список с указанием даты обнаружения. А для телеграм бота будем использовать библиотеку pytelegrambotapi . Для начала импортируем все нужные библиотеки :
import os
import time
from datetime import date
import subprocess
import telebot
#pip install pytelegrambotapi
bot = telebot.TeleBot('Ваш токен')
Теперь напишем функцию которая проверяет есть ли у нас сохраненные IP, если нету сделаем файл для хранения:
def Ferst():
if os.path.isfile('bed_ip_list.log'):
# Проверяем если файл.
save_ip_list = read_save_list()
# Читаем данные из файл bed_ip_list.log
log_list = read_log_list()
# Читаем лог файл fail2ban
else:
file = open('bed_ip_list.log', 'w')
# Если нету , создаем.
file.close()
log_list = read_log_list()
save_ip_list = []
return log_list, save_ip_list
Дальше две функции которые читают данные из файлов :
def read_save_list():
save_bed_list = []
file = open('bed_ip_list.log', 'r')
tmp = file.readlines()
file.close()
if len(tmp) > 0:
for i in tmp:
save_bed_list.append(i.split(',')) # Если файл не пустой , создаем список с данными
return save_bed_list
else:
return save_bed_list
def read_log_list():
log_list = []
file = open('/var/log/fail2ban.log', 'r') # Открываем и читаем лог файл.
data = file.readlines()
file.close()
for i in data:
tmp = i.split()
if 'Ban' in tmp: # Ищем записи о бане IP
log_list.append([tmp[7], tmp[0]]) # Добавляем дату и Ip в список.
return log_list
Теперь напишем функцию для поиска новых IP. Из будет две версии, первая запускается при старте скрипта и не отправляет в телеграм сообщения о найденных IP.
def scerch_ip_ferst(log_list, save_bed_list):
if len(save_bed_list) > 0: # Проверяем что список не пустой
for i in log_list:
flag = 0 # Флаг что не нашли ip в сохранённых данных
for ii in save_bed_list:
if i[0] == ii[0]:
flag = 1
break
if flag == 0: # Если не нашли ,то добавляем айпишник к баз.
file = open('bed_ip_list.log', 'a')
file.write(i[0] + ',' + i[1] + '\n')
#print('Save: ', i[0])
file.close()
else:
# Если список пустой, то сохраняем все найденные IP.
#print('Save all')
file = open('bed_ip_list.log', 'a')
for ii in log_list:
file.write(ii[0] + ',' + ii[1] + '\n')
file.close()
def scerch_ip(log_list, save_bed_list):
if len(save_bed_list) > 0: # Проверяем что список не пустой
for i in log_list:
flag = 0 # Флаг что не нашли ip в сохранённых данных
for ii in save_bed_list:
# print(i[0], ii[0])
if i[0] == ii[0]:
flag = 1
break
if flag == 0: # Если не нашли то добавляем айпишник к базе.
file = open('bed_ip_list.log', 'a')
file.write(i[0] + ',' + i[1] + '\n')
#print('Save: ', i[0])
file.close()
mess = 'New IP: ' + str(i[0] + ' Country: ' + str(country_serch(str(i[0]))))
send_teleg_bot(mess) # Отправляем сообщение в телегу
else:
# Если список пустой, то сохраняем все найденные IP.
#print('Save all')
file = open('bed_ip_list.log', 'a')
for ii in log_list:
file.write(ii[0] + ',' + ii[1] + '\n')
file.close()
Функции отправки сообщения и определение страны с помощью whois :
def send_teleg_bot(message):
bot.send_message(chat_id='@имя_канала', text=message)
def country_serch(ip):
tmp = subprocess.getoutput('whois ' + str(ip)).split()
return tmp[tmp.index('country:') + 1]
Теперь пишем основное тело скрипта :
log_list, save_ip_list = Ferst()
scerch_ip_ferst(log_list, save_ip_list)
send_teleg_bot('Total score list: ' + str(len(read_save_list())) + ' IP')
# Пишем в телеграм количество IP в списке.
doc = open('bed_ip_list.log', 'rb')
bot.send_document('@ваш_канал', doc)
# Отправляем файл с Айпишниками в телегу
doc.close()
data = date.today()
while True:
time.sleep(300)
# Пауза между проверками
try:
log_list = read_log_list()
save_ip_list = read_save_list()
scerch_ip(log_list, save_ip_list)
if data != date.today():
# Если наступил новый день отправляем файл и статистику
data = date.today()
send_teleg_bot('Now total score list: ' + str(len(read_save_list()) + ' IP')
doc = open('bed_ip_list.log', 'rb')
bot.send_document('@ваш_канал', doc)
doc.close()
except:
send_teleg_bot('Something went wrong!')
# Если что то пошло не так, отправляем сообщение.
Ну и запускаем все это дело в фоне с помощью утилиты screen .
screen -dmS Имя_сессии python3 scan.py
Вроде все, вы можете добавить сюда любые вам удобные функции.
