v 0.1
This commit is contained in:
95
src/core/api/nmap.py
Normal file
95
src/core/api/nmap.py
Normal 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}")
|
Reference in New Issue
Block a user