mirror of
https://github.com/Pardus-LiderAhenk/ahenk
synced 2024-12-24 20:52:27 +03:00
189 lines
6.7 KiB
Python
189 lines
6.7 KiB
Python
|
#!/usr/bin/python3
|
|||
|
# -*- coding: utf-8 -*-
|
|||
|
# Author:Mine DOGAN <mine.dogan@agem.com.tr>
|
|||
|
# Author: Caner Feyzullahoglu <caner.feyzullahoglu@agem.com.tr>
|
|||
|
"""
|
|||
|
Style Guide is PEP-8
|
|||
|
https://www.python.org/dev/peps/pep-0008/
|
|||
|
"""
|
|||
|
|
|||
|
import json
|
|||
|
|
|||
|
from base.plugin.abstract_plugin import AbstractPlugin
|
|||
|
|
|||
|
|
|||
|
class ScanNetwork(AbstractPlugin):
|
|||
|
def __init__(self, task, context):
|
|||
|
super(AbstractPlugin, self).__init__()
|
|||
|
|
|||
|
self.logger.debug('Initialized')
|
|||
|
self.task = task
|
|||
|
self.context = context
|
|||
|
self.logger = self.get_logger()
|
|||
|
self.message_code = self.get_message_code()
|
|||
|
|
|||
|
self.logger.debug('Creating nmap command')
|
|||
|
uuid = self.generate_uuid()
|
|||
|
self.file_path = self.Ahenk.received_dir_path() + uuid
|
|||
|
self.command = self.get_nmap_command()
|
|||
|
|
|||
|
def handle_task(self):
|
|||
|
self.logger.debug('Handling task')
|
|||
|
try:
|
|||
|
self.logger.debug('Executing command: {0}'.format(self.command))
|
|||
|
result_code, p_out, p_err = self.execute(self.command)
|
|||
|
|
|||
|
if result_code != 0:
|
|||
|
self.logger.error('Error occurred while executing nmap command')
|
|||
|
self.logger.error('Error message: {0}'.format(str(p_err)))
|
|||
|
self.context.create_response(code=self.message_code.TASK_ERROR.value,
|
|||
|
message='NETWORK INVENTORY Nmap komutu çalıştırılırken hata oluştu')
|
|||
|
else:
|
|||
|
self.logger.debug('Nmap command successfully executed')
|
|||
|
|
|||
|
data = {}
|
|||
|
self.logger.debug('Getting md5 of file')
|
|||
|
md5sum = self.get_md5_file(str(self.file_path))
|
|||
|
|
|||
|
self.logger.debug('{0} renaming to {1}'.format(self.file_path, md5sum))
|
|||
|
self.rename_file(self.file_path, self.Ahenk.received_dir_path() + md5sum)
|
|||
|
self.logger.debug('Renamed file.')
|
|||
|
|
|||
|
data['md5'] = md5sum
|
|||
|
|
|||
|
self.logger.debug('Creating response message')
|
|||
|
self.context.create_response(code=self.message_code.TASK_PROCESSED.value,
|
|||
|
message='NETWORK INVENTORY görevi başarıyla çalıştırıldı.',
|
|||
|
data=json.dumps(data),
|
|||
|
content_type=self.get_content_type().TEXT_PLAIN.value)
|
|||
|
|
|||
|
self.logger.info('NETWORK INVENTORY task is handled successfully')
|
|||
|
except Exception as e:
|
|||
|
self.logger.error(
|
|||
|
'A problem occured while handling NETWORK INVENTORY task: {0}'.format(str(e)))
|
|||
|
self.context.create_response(code=self.message_code.TASK_ERROR.value,
|
|||
|
message='NETWORK INVENTORY görevi çalıştırılırken bir hata oluştu.')
|
|||
|
|
|||
|
def get_result(self, root):
|
|||
|
self.logger.debug('Parsing nmap xml output')
|
|||
|
result_list = {}
|
|||
|
index = 1
|
|||
|
|
|||
|
for host in root.findall('host'):
|
|||
|
result = {}
|
|||
|
|
|||
|
host_names = host.find('hostnames')
|
|||
|
ports = host.find('ports')
|
|||
|
os = host.find('os')
|
|||
|
distance = host.find('distance')
|
|||
|
status = host.find('status')
|
|||
|
self.logger.debug('STATUS: ++++++ ' + str(status))
|
|||
|
|
|||
|
self.logger.debug('Getting hostname list')
|
|||
|
result['hostnames'] = self.get_hostname_list(host_names)
|
|||
|
self.logger.debug('Getting port list')
|
|||
|
result['ports'] = self.get_port_list(ports)
|
|||
|
self.logger.debug('Getting os list')
|
|||
|
result['os'] = self.get_os_list(os)
|
|||
|
self.logger.debug('Getting distance list')
|
|||
|
result['distance'] = self.get_distance(distance)
|
|||
|
self.logger.debug('Getting IP, MAC and MAC provider list')
|
|||
|
result['ipAddress'], result['macAddress'], result['macProvider'] = self.get_addresses(host)
|
|||
|
self.logger.debug('Getting status')
|
|||
|
result['status'] = self.get_status(host)
|
|||
|
|
|||
|
result_list[index] = result
|
|||
|
index += 1
|
|||
|
|
|||
|
return result_list
|
|||
|
|
|||
|
def get_addresses(self, host):
|
|||
|
ip_address = ''
|
|||
|
mac_address = ''
|
|||
|
mac_provider = ''
|
|||
|
if host is not None:
|
|||
|
for address in host.findall('address'):
|
|||
|
if address.get('addrtype') == 'ipv4':
|
|||
|
ip_address = address.get('addr')
|
|||
|
if address.get('addrtype') == 'mac':
|
|||
|
mac_address = address.get('addr')
|
|||
|
mac_provider = address.get('vendor')
|
|||
|
return ip_address, mac_address, mac_provider
|
|||
|
|
|||
|
def get_hostname_list(self, hostnames):
|
|||
|
hostname_list = ''
|
|||
|
if hostnames is not None:
|
|||
|
for hostname in hostnames.findall('hostname'):
|
|||
|
name = hostname.get('name')
|
|||
|
if hostname_list != '':
|
|||
|
hostname_list = hostname_list + ', ' + name
|
|||
|
else:
|
|||
|
hostname_list = name
|
|||
|
|
|||
|
return hostname_list
|
|||
|
|
|||
|
def get_port_list(self, ports):
|
|||
|
port_list = ''
|
|||
|
if ports is not None:
|
|||
|
for port in ports.findall('port'):
|
|||
|
service = port.find('service')
|
|||
|
service_name = service.get('name')
|
|||
|
port_id = port.get('portid') + '/' + port.get('protocol') + ' ' + service_name
|
|||
|
if port_list != '':
|
|||
|
port_list = port_list + ', ' + port_id
|
|||
|
else:
|
|||
|
port_list = port_id
|
|||
|
|
|||
|
return port_list
|
|||
|
|
|||
|
def get_status(self, host):
|
|||
|
state = False
|
|||
|
if host is not None:
|
|||
|
for status in host.findall('status'):
|
|||
|
if status.get('state') == 'up':
|
|||
|
state = True
|
|||
|
if status.get('state') == 'down':
|
|||
|
state = False
|
|||
|
|
|||
|
return state
|
|||
|
|
|||
|
def get_os_list(self, os):
|
|||
|
os_list = ''
|
|||
|
if os is not None:
|
|||
|
for os_match in os.findall('osmatch'):
|
|||
|
name = os_match.get('name')
|
|||
|
if os_list != '':
|
|||
|
os_list = os_list + ', ' + name
|
|||
|
else:
|
|||
|
os_list = name
|
|||
|
|
|||
|
return os_list
|
|||
|
|
|||
|
def get_distance(self, distance):
|
|||
|
if distance is not None:
|
|||
|
return distance.get('value')
|
|||
|
return ''
|
|||
|
|
|||
|
def get_nmap_command(self):
|
|||
|
command = 'nmap -v -oX'
|
|||
|
command += ' - ' + self.task['ipRange']
|
|||
|
if self.task['timingTemplate']:
|
|||
|
command += ' -T' + str(self.task['timingTemplate'])
|
|||
|
else:
|
|||
|
# average speed
|
|||
|
command += ' -T3'
|
|||
|
|
|||
|
if self.task['ports']:
|
|||
|
command += ' -p' + self.task['ports']
|
|||
|
else:
|
|||
|
command += ' --top-ports 10'
|
|||
|
|
|||
|
command += ' > ' + self.file_path
|
|||
|
|
|||
|
return command
|
|||
|
|
|||
|
|
|||
|
def handle_task(task, context):
|
|||
|
scan = ScanNetwork(task, context)
|
|||
|
scan.handle_task()
|