Files
attack_module/src/core/api/nmap.py
2025-06-02 14:53:57 +03:00

95 lines
4.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.55", "-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}")