This commit is contained in:
2025-06-02 14:53:26 +03:00
parent dc735acfd1
commit 91231b6a53
26 changed files with 4657 additions and 1 deletions

95
src/core/api/nmap.py Normal file
View File

@ -0,0 +1,95 @@
import re
import json
from typing import Any, Dict
import nmap3
from src.utils.logger import get_logger
logger = get_logger("nmap_scanner")
class NmapScanner:
def __init__(self, ip: str, args: str = "-sV"):
"""
Инициализация сканера Nmap
:param ip: целевой IP-адрес
:param args: аргументы для сканирования (по умолчанию: -sV)
"""
self.ip = ip
self.args = args
self.nmap = nmap3.Nmap()
logger.info(f"Инициализация NmapScanner для IP: {ip}, аргументы: {args}")
def start_scan(self) -> Dict[str, Any]:
"""
Запуск сканирования и возврат очищенных результатов
:return: словарь с разделенными результатами
"""
logger.info(f"🚀 Запуск сканирования Nmap для {self.ip} с аргументами: {self.args}")
try:
# Запуск сканирования с определением версий
scan_result = self.nmap.nmap_version_detection(self.ip, args=self.args)
logger.debug(f"Сырые результаты сканирования: {json.dumps(scan_result, indent=2)}")
# Очистка и структурирование результатов
cleaned_result = self.return_clear_result(scan_result)
logger.success(f"✅ Сканирование завершено для {self.ip}. Найдено хостов: {len(cleaned_result['hosts'])}")
return cleaned_result
except Exception as e:
logger.error(f"Ошибка при выполнении сканирования Nmap: {e}")
return {"hosts": {}, "service_info": {}}
@staticmethod
def return_clear_result(raw_data: Dict[str, Any]) -> Dict[str, Any]:
"""
Очистка и структурирование сырых данных от Nmap
:param raw_data: сырые данные от nmap_version_detection
:return: словарь с разделенными результатами
"""
logger.info("Начало обработки сырых данных Nmap")
try:
# Регулярное выражение для проверки IPv4
ip_pattern = re.compile(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$')
hosts = {}
service_info = {}
for key, value in raw_data.items():
# Проверяем, является ли ключ IP-адресом
if ip_pattern.match(key):
# Проверяем, в каком состоянии находится хост
if value.get('state', {}).get('state') == "up":
hosts[key] = value
logger.debug(f"Обнаружен активный хост: {key}")
else:
logger.debug(
f"Хост {key} не активен (состояние: {value.get('state', {}).get('state', 'unknown')})")
else:
service_info[key] = value
logger.info(
f"Обработка завершена. Активных хостов: {len(hosts)}, сервисная информация: {len(service_info)}")
return {
"hosts": hosts,
"service_info": service_info
}
except Exception as e:
logger.error(f"Ошибка при обработке данных Nmap: {e}")
return {"hosts": {}, "service_info": {}}
if __name__ == "__main__":
try:
scanner = NmapScanner("192.168.1.0/24", "-p 1-10000")
result = scanner.start_scan()
path = "/home/lodqa/attack_module_data/nmap.json"
logger.info(f"Сохранение результатов в файл: {path}")
with open(path, 'w', encoding='utf-8') as file:
json.dump(result, file, ensure_ascii=False, indent=4)
logger.success(f"Результаты успешно сохранены в {path}")
except Exception as e:
logger.error(f"Ошибка в главном блоке: {e}")