Aby uczyć się i rozszerzać wiedzę dotyczącą programowania w pythonie piszę różne dziwne, czasem tylko mi przydatne skrypty którymi będę Was katował w tym dziale :)
Dziś pora na pierwszy z nich.
Cel jest dość prosty napisać podstawowy skrypt który w pierwszej kolejności użyję IMCP a konkretniej PING do sprawdzenia listy hostów i zakomunikuje czy host jest online czy nie. (Wiem że tok myślenia jest błędny ponieważ jeśli host ma zablokowane IMCP przez admina to mimo ze będzie ONLINE to wynik będzie błędny, dlatego napisałem iż w PIERWSZEJ kolejności ma być to PING.
Dalej chciałbym:
- zapisać wyniki do pliku tak aby mieć historię
- wykonać wykres wizualizacji dostępności hosta
- dodać możliwość wyboru funkcjonalności dla usera za pomocą sekcji konfiguracja gdzie user określi true/false i tym sposobem włączy wyłączy jakąś część skryptu
- wprowadzić inne możliwości sprawdzania hostów po za PING
- przepisać aplikację aby była .exe i uruchamiała się bez dodatkowego środowiska Python zainstalowanego na komputerze usera
Oto wersja 0.2:
Pierwsza linia jest informacyjna co trzeba zainstalować jeśli macie środowisko natywne, chyba że używacie Google Colab wtedy linia zostaje dzięki temu Colab zainstaluje potrzebne biblioteki.
!pip install ping3 tabulate matplotlib fabulous
# Pinger - skrypt do konsolowego odpytywania hostów w sieci, za pomocą ping
# posiada możliwość generowania wykresów dostępności oraz zapisywania
# wyników do csv
# Autor - Sławomir 'chinczyk' Meredyk
# Data - 2024/10/19
# Wersja - 0.2
import time
from datetime import datetime, timedelta
from ping3 import ping
from tabulate import tabulate
import matplotlib.pyplot as plt
from IPython.display import clear_output # Umożliwia czyszczenie wyjścia w Google Colab
from fabulous.color import white, green, red # Import kolorów z fabulous
import csv
# Lista hostów do pingowania
hosts = [
{"ip": "8.8.8.8", "name": "DNS Google"},
{"ip": "1.1.1.1", "name": "DNS cloudflare"},
{"ip": "165.153.96.206", "name": "Zakodowani"},
]
# Słownik do przechowywania poprzednich statusów
previous_status = {}
# Lista do przechowywania statusów hostów dla wykresu
status_history = {host['name']: [] for host in hosts}
# Słownik do przechowywania ostatniego czasu, kiedy host był ONLINE
last_online_time = {host['name']: None for host in hosts}
# Flagi do kontrolowania generowania wykresu i logowania
generate_plot = True # Ustaw na False, aby wyłączyć wykres
log_to_csv = True # Ustaw na False, aby wyłączyć logowanie do pliku CSV
# Funkcja do logowania do pliku CSV
def log_to_csv_file(host, status):
if log_to_csv:
with open('ping_log.csv', mode='a', newline='') as csvfile:
log_writer = csv.writer(csvfile)
log_writer.writerow([datetime.now().strftime("%Y-%m-%d %H:%M:%S"), host['ip'], host['name'], status])
# Funkcja pingująca hosty
def ping_hosts():
table_data = []
for host in hosts:
ip = host["ip"]
name = host["name"]
try:
response_time = ping(ip, timeout=2)
if response_time is None:
status = "OFFLINE"
current_status = "OFFLINE"
else:
status = "ONLINE"
current_status = "ONLINE"
# Zaktualizuj czas ostatniego online
last_online_time[name] = datetime.now()
except Exception as e:
status = f"ERROR: {e}"
current_status = "ERROR"
# Powiadomienie o zmianie statusu
if ip in previous_status and previous_status[ip] != current_status:
print(f"Status hosta {name} ({ip}) zmienił się z {previous_status[ip]} na {current_status}")
previous_status[ip] = current_status # Aktualizowanie statusu
# Dodanie danych do tabeli z kolorowaniem
if status == "ONLINE":
colored_status = green(status)
elif status == "OFFLINE":
colored_status = red(status)
else:
colored_status = white(status)
# Uzyskanie ostatniego czasu online
last_online_str = last_online_time[name].strftime("%Y-%m-%d %H:%M:%S") if last_online_time[name] else "N/A"
table_data.append([ip, name, colored_status, last_online_str])
# Dodaj status do historii
status_history[name].append(current_status)
# Logowanie do pliku CSV
log_to_csv_file(host, status)
headers = ["IP Address", "Host Name", "Status", "Last Online"]
# Tworzenie tabeli za pomocą tabulate
table = tabulate(table_data, headers, tablefmt="pretty")
clear_output(wait=True)
print(table)
# Wywołanie funkcji do tworzenia wykresu, jeśli flaga jest ustawiona na True
if generate_plot:
plot_status_history()
# Funkcja do tworzenia wykresu statusów
def plot_status_history():
# Tworzenie wykresu dla każdego hosta
online_counts = {name: 0 for name in status_history.keys()}
offline_counts = {name: 0 for name in status_history.keys()}
# Liczenie statusów w ciągu ostatnich 24 godzin
for name, statuses in status_history.items():
for status in statuses[-24:]: # Ostatnie 24 wpisy (można dostosować)
if status == "ONLINE":
online_counts[name] += 1
elif status == "OFFLINE":
offline_counts[name] += 1
# Tworzenie wykresu
fig, ax = plt.subplots()
labels = list(online_counts.keys())
online_values = list(online_counts.values())
offline_values = list(offline_counts.values())
ax.bar(labels, online_values, label='ONLINE', color='green')
ax.bar(labels, offline_values, bottom=online_values, label='OFFLINE', color='red')
ax.set_xlabel("Hosty")
ax.set_ylabel("Liczba statusów")
ax.set_title("Statusy hostów w ciągu ostatnich 24 godzin")
ax.legend()
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
# Główna pętla
while True:
print("Pinging hosts...")
ping_hosts()
time.sleep(60) # Odczekaj 60 sekund przed kolejnym pingowaniem
Wersja 0.3 :
Dodałem sprawdzanie nie tylko PING ale sprawdzam jeszcze port 80 czyli http i w wynikach zaznaczam co odpowiada czy PING czy WWW
!pip install ping3 tabulate matplotlib fabulous
# Pinger - skrypt do konsolowego odpytywania hostów w sieci, za pomocą ping
# posiada możliwość generowania wykresów dostępności oraz zapisywania
# wyników do csv
# Autor - Sławomir 'chinczyk' Meredyk
# Data - 2024/10/20
# Wersja - 0.3
!pip install ping3 tabulate matplotlib fabulous
import time
from datetime import datetime, timedelta
from ping3 import ping
from tabulate import tabulate
import matplotlib.pyplot as plt
from IPython.display import clear_output # Umożliwia czyszczenie wyjścia w Google Colab
from fabulous.color import white, green, red # Import kolorów z fabulous
import csv
import socket # Do sprawdzania portów TCP
# Lista hostów do pingowania
hosts = [
{"ip": "8.8.8.8", "name": "DNS Google"},
{"ip": "1.1.1.1", "name": "DNS cloudflare"},
{"ip": "165.153.96.206", "name": "Zakodowani"},
]
# Słownik do przechowywania poprzednich statusów
previous_status = {}
# Lista do przechowywania statusów hostów dla wykresu
status_history = {host['name']: [] for host in hosts}
# Słownik do przechowywania ostatniego czasu, kiedy host był ONLINE
last_online_time = {host['name']: None for host in hosts}
# Flagi do kontrolowania generowania wykresu i logowania
generate_plot = False # Ustaw na False, aby wyłączyć wykres
log_to_csv = True # Ustaw na False, aby wyłączyć logowanie do pliku CSV
# Funkcja do logowania do pliku CSV
def log_to_csv_file(host, status):
if log_to_csv:
with open('ping_log.csv', mode='a', newline='') as csvfile:
log_writer = csv.writer(csvfile)
log_writer.writerow([datetime.now().strftime("%Y-%m-%d %H:%M:%S"), host['ip'], host['name'], status])
# Funkcja do sprawdzania dostępności portu TCP
def check_tcp_port(host, port, timeout=3):
try:
sock = socket.create_connection((host, port), timeout)
sock.close()
return True
except socket.error:
return False
# Funkcja pingująca hosty
def ping_hosts():
table_data = []
for host in hosts:
ip = host["ip"]
name = host["name"]
try:
# Najpierw spróbuj pingować
response_time = ping(ip, timeout=2)
if response_time is None:
# Jeśli ping nie działa, sprawdź port TCP (np. port 80)
if check_tcp_port(ip, 80):
status = "ONLINE (WEB)"
current_status = "ONLINE (WEB)"
else:
status = "OFFLINE"
current_status = "OFFLINE"
else:
status = "ONLINE (PING)"
current_status = "ONLINE (PING)"
# Zaktualizuj czas ostatniego online
last_online_time[name] = datetime.now()
except Exception as e:
status = f"ERROR: {e}"
current_status = "ERROR"
# Powiadomienie o zmianie statusu
if ip in previous_status and previous_status[ip] != current_status:
print(f"Status hosta {name} ({ip}) zmienił się z {previous_status[ip]} na {current_status}")
previous_status[ip] = current_status # Aktualizowanie statusu
# Dodanie danych do tabeli z kolorowaniem
if "ONLINE" in status:
colored_status = green(status)
elif status == "OFFLINE":
colored_status = red(status)
else:
colored_status = white(status)
# Uzyskanie ostatniego czasu online
last_online_str = last_online_time[name].strftime("%Y-%m-%d %H:%M:%S") if last_online_time[name] else "N/A"
table_data.append([ip, name, colored_status, last_online_str])
# Dodaj status do historii
status_history[name].append(current_status)
# Logowanie do pliku CSV
log_to_csv_file(host, status)
headers = ["IP Address", "Host Name", "Status", "Last Online"]
# Tworzenie tabeli za pomocą tabulate
table = tabulate(table_data, headers, tablefmt="pretty")
clear_output(wait=True)
print(table)
# Wywołanie funkcji do tworzenia wykresu, jeśli flaga jest ustawiona na True
if generate_plot:
plot_status_history()
# Funkcja do tworzenia wykresu statusów
def plot_status_history():
# Tworzenie wykresu dla każdego hosta
online_counts = {name: 0 for name in status_history.keys()}
offline_counts = {name: 0 for name in status_history.keys()}
# Liczenie statusów w ciągu ostatnich 24 godzin
for name, statuses in status_history.items():
for status in statuses[-24:]: # Ostatnie 24 wpisy (można dostosować)
if "ONLINE" in status:
online_counts[name] += 1
elif status == "OFFLINE":
offline_counts[name] += 1
# Tworzenie wykresu
fig, ax = plt.subplots()
labels = list(online_counts.keys())
online_values = list(online_counts.values())
offline_values = list(offline_counts.values())
ax.bar(labels, online_values, label='ONLINE', color='green')
ax.bar(labels, offline_values, bottom=online_values, label='OFFLINE', color='red')
ax.set_xlabel("Hosty")
ax.set_ylabel("Liczba statusów")
ax.set_title("Statusy hostów w ciągu ostatnich 24 godzin")
ax.legend()
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
# Główna pętla
while True:
print("Pinging hosts...")
ping_hosts()
time.sleep(60) # Odczekaj 60 sekund przed kolejnym pingowaniem
A mam dla Ciebie taki pomysł na projekt, albo dwa pomysły, które nieco się powielają, ale jednak:
1. Skanowanie hostów w danej sieci, wraz z próbą identyfikacji ich oprogramowania/otwartych portów. Do tego można dołączyć statystyki dostępności tych hostów, choć ta wersja to taki bardziej "pentest", i można to rozwijać w tym kierunku.
2. Wersja dla admina. Cykliczne skanowanie hostów w sieci, identyfikacja ich (może Mac address?), statystyki dostępności, wyróżnianie nowych hostów (urządzeń) w sieci (w celu wychwycenia np. intruza).
Cytat: Ymarg w 22 Paź 2024, 20:39A mam dla Ciebie taki pomysł na projekt, albo dwa pomysły, które nieco się powielają, ale jednak:
1. Skanowanie hostów w danej sieci, wraz z próbą identyfikacji ich oprogramowania/otwartych portów. Do tego można dołączyć statystyki dostępności tych hostów, choć ta wersja to taki bardziej "pentest", i można to rozwijać w tym kierunku.
2. Wersja dla admina. Cykliczne skanowanie hostów w sieci, identyfikacja ich (może Mac address?), statystyki dostępności, wyróżnianie nowych hostów (urządzeń) w sieci (w celu wychwycenia np. intruza).
Mogę podjąć rękawice przy czym musielibyśmy rozpisać konkretniej jakie dane chciałbyś uzyskać i wtedy mogę poczytać, i spróbować coś zakodzić :)