Telegram бот, Bad IP List, Хани поты(Honeypot)…

Вдохновившись идеей 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

Вроде все, вы можете добавить сюда любые вам удобные функции.

Посмотреть в живую можно тут : https://t.me/bed_ip_list

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.