mirror of
https://github.com/codingo/Interlace.git
synced 2025-12-17 06:44:23 +01:00
Fixed issue 52
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
from argparse import ArgumentParser
|
||||
from netaddr import IPNetwork, IPRange, IPGlob
|
||||
from Interlace.lib.core.output import OutputHelper, Level
|
||||
import os.path
|
||||
from os import access, W_OK
|
||||
import sys
|
||||
from re import compile
|
||||
from random import sample
|
||||
from argparse import ArgumentParser
|
||||
from math import ceil
|
||||
from os import access, W_OK
|
||||
from random import sample
|
||||
|
||||
from netaddr import IPNetwork, IPRange, IPGlob
|
||||
from Interlace.lib.threader import TaskBlock, Task
|
||||
|
||||
|
||||
class InputHelper(object):
|
||||
@@ -62,35 +62,83 @@ class InputHelper(object):
|
||||
return ips
|
||||
|
||||
@staticmethod
|
||||
def _replace_variable_for_commands(commands, variable, replacements):
|
||||
tmp_commands = set()
|
||||
def _process_port(port_type):
|
||||
if "," in port_type:
|
||||
return port_type.split(",")
|
||||
elif "-" in port_type:
|
||||
tmp = port_type.split("-")
|
||||
begin_range = int(tmp[0])
|
||||
end_range = int(tmp[1])
|
||||
if begin_range >= end_range:
|
||||
raise Exception("Invalid range provided")
|
||||
return list(range(begin_range, end_range + 1))
|
||||
return [port_type]
|
||||
|
||||
test = list()
|
||||
@staticmethod
|
||||
def _pre_process_commands(command_list, task_name):
|
||||
task_block = TaskBlock(task_name)
|
||||
parent_task = None
|
||||
for command in command_list:
|
||||
command = str(command).strip()
|
||||
if not command:
|
||||
continue
|
||||
if command.startswith('_block:') and command.endswith('_'):
|
||||
new_task_name = command.split('_block:')[1][:-1].strip()
|
||||
if task_name == new_task_name:
|
||||
return task_block
|
||||
task = InputHelper._pre_process_commands(command_list, new_task_name)
|
||||
else:
|
||||
task = Task(command)
|
||||
if command == '_blocker_':
|
||||
parent_task = task_block.last()
|
||||
parent_task.set_lock()
|
||||
continue
|
||||
if parent_task:
|
||||
task.wait_for(parent_task.get_lock())
|
||||
task_block.add_task(task)
|
||||
return task_block
|
||||
|
||||
@staticmethod
|
||||
def _pre_process_hosts(host_ranges, destination_set, arguments):
|
||||
for host in host_ranges:
|
||||
host = host.replace(" ", "")
|
||||
for ips in host.split(","):
|
||||
# check if it is a domain name
|
||||
if ips.split(".")[-1][0].isalpha():
|
||||
destination_set.add(ips)
|
||||
continue
|
||||
# checking for CIDR
|
||||
if not arguments.nocidr and "/" in ips:
|
||||
destination_set.update(InputHelper._get_cidr_to_ips(ips))
|
||||
# checking for IPs in a range
|
||||
elif "-" in ips:
|
||||
destination_set.update(InputHelper._get_ips_from_range(ips))
|
||||
# checking for glob ranges
|
||||
elif "*" in ips:
|
||||
destination_set.update(InputHelper._get_ips_from_glob(ips))
|
||||
else:
|
||||
destination_set.add(ips)
|
||||
|
||||
@staticmethod
|
||||
def _replace_variable_with_commands(commands, variable, replacements):
|
||||
for replacement in replacements:
|
||||
for command in commands:
|
||||
test.append(str(command).replace(variable, str(replacement)))
|
||||
if isinstance(command, TaskBlock):
|
||||
InputHelper._replace_variable_with_commands(command, variable, replacements)
|
||||
else:
|
||||
command.replace(variable, str(replacement))
|
||||
|
||||
tmp_commands.update(test)
|
||||
return tmp_commands
|
||||
|
||||
@staticmethod
|
||||
def _replace_variable_array(commands, variable, replacement):
|
||||
tmp_commands = set()
|
||||
counter = 0
|
||||
|
||||
test = list()
|
||||
|
||||
if not variable in sample(commands, 1)[0]:
|
||||
return commands
|
||||
|
||||
for command in commands:
|
||||
test.append(str(command).replace(variable, str(replacement[counter])))
|
||||
counter += 1
|
||||
|
||||
tmp_commands.update(test)
|
||||
return tmp_commands
|
||||
# TODO
|
||||
if variable not in sample(commands, 1)[0]:
|
||||
return
|
||||
|
||||
for counter, command in enumerate(commands):
|
||||
if isinstance(command, TaskBlock):
|
||||
InputHelper._replace_variable_array(command, variable, replacement)
|
||||
else:
|
||||
command.replace(variable, str(replacement[counter]))
|
||||
|
||||
@staticmethod
|
||||
def process_commands(arguments):
|
||||
@@ -99,98 +147,37 @@ class InputHelper(object):
|
||||
targets = set()
|
||||
exclusions_ranges = set()
|
||||
exclusions = set()
|
||||
final_commands = set()
|
||||
output = OutputHelper(arguments)
|
||||
|
||||
# checking for whether output is writable and whether it exists
|
||||
# checking if output is writable and exists
|
||||
if arguments.output:
|
||||
if not access(arguments.output, W_OK):
|
||||
raise Exception("Directory provided isn't writable")
|
||||
|
||||
if arguments.port:
|
||||
if "," in arguments.port:
|
||||
ports = arguments.port.split(",")
|
||||
elif "-" in arguments.port:
|
||||
tmp_ports = arguments.port.split("-")
|
||||
if int(tmp_ports[0]) >= int(tmp_ports[1]):
|
||||
raise Exception("Invalid range provided")
|
||||
ports = list(range(int(tmp_ports[0]), int(tmp_ports[1]) + 1))
|
||||
else:
|
||||
ports = [arguments.port]
|
||||
ports = InputHelper._process_port(arguments.port)
|
||||
|
||||
if arguments.realport:
|
||||
if "," in arguments.realport:
|
||||
real_ports = arguments.realport.split(",")
|
||||
elif "-" in arguments.realport:
|
||||
tmp_ports = arguments.realport.split("-")
|
||||
if int(tmp_ports[0]) >= int(tmp_ports[1]):
|
||||
raise Exception("Invalid range provided")
|
||||
real_ports = list(range(int(tmp_ports[0]), int(tmp_ports[1]) + 1))
|
||||
else:
|
||||
real_ports = [arguments.realport]
|
||||
|
||||
real_ports = InputHelper._process_port(arguments.realport)
|
||||
|
||||
# process targets first
|
||||
if arguments.target:
|
||||
ranges.add(arguments.target)
|
||||
else:
|
||||
targetFile = arguments.target_list
|
||||
target_file = arguments.target_list
|
||||
if not sys.stdin.isatty():
|
||||
targetFile = sys.stdin
|
||||
for target in targetFile:
|
||||
if target.strip():
|
||||
ranges.add(target.strip())
|
||||
target_file = sys.stdin
|
||||
ranges.update([target for target in target_file if target.strip()])
|
||||
|
||||
# process exclusions first
|
||||
if arguments.exclusions:
|
||||
exclusions_ranges.add(arguments.exclusions)
|
||||
else:
|
||||
if arguments.exclusions_list:
|
||||
for exclusion in arguments.exclusions_list:
|
||||
exclusions_ranges.add(target.strip())
|
||||
exclusions_ranges.update([exclusion for exclusion in arguments.exclusions_list if exclusion.strip()])
|
||||
|
||||
# removing elements that may have spaces (helpful for easily processing comma notation)
|
||||
for target in ranges:
|
||||
target = target.replace(" ", "")
|
||||
|
||||
for ips in target.split(","):
|
||||
|
||||
# check if it is a domain name
|
||||
if ips.split(".")[-1][0].isalpha():
|
||||
targets.add(ips)
|
||||
continue
|
||||
# checking for CIDR
|
||||
if not arguments.nocidr and "/" in ips:
|
||||
targets.update(InputHelper._get_cidr_to_ips(ips))
|
||||
# checking for IPs in a range
|
||||
elif "-" in ips:
|
||||
targets.update(InputHelper._get_ips_from_range(ips))
|
||||
# checking for glob ranges
|
||||
elif "*" in ips:
|
||||
targets.update(InputHelper._get_ips_from_glob(ips))
|
||||
else:
|
||||
targets.add(ips)
|
||||
|
||||
# removing elements that may have spaces (helpful for easily processing comma notation)
|
||||
for exclusion in exclusions_ranges:
|
||||
exclusion = exclusion.replace(" ", "")
|
||||
|
||||
for ips in exclusion.split(","):
|
||||
# check if it is a domain name
|
||||
if ips.split(".")[-1][0].isalpha():
|
||||
targets.add(ips)
|
||||
continue
|
||||
# checking for CIDR
|
||||
if not arguments.nocidr and "/" in ips:
|
||||
exclusions.update(InputHelper._get_cidr_to_ips(ips))
|
||||
# checking for IPs in a range
|
||||
elif "-" in ips:
|
||||
exclusions.update(InputHelper._get_ips_from_range(ips))
|
||||
# checking for glob ranges
|
||||
elif "*" in ips:
|
||||
exclusions.update(InputHelper._get_ips_from_glob(ips))
|
||||
else:
|
||||
exclusions.add(ips)
|
||||
InputHelper._pre_process_hosts(ranges, targets, arguments)
|
||||
InputHelper._pre_process_hosts(exclusions_ranges, exclusions, arguments)
|
||||
|
||||
# difference operation
|
||||
targets -= exclusions
|
||||
@@ -201,41 +188,36 @@ class InputHelper(object):
|
||||
if arguments.command:
|
||||
commands.add(arguments.command.rstrip('\n'))
|
||||
else:
|
||||
for command in arguments.command_list:
|
||||
commands.add(command.rstrip('\n'))
|
||||
tasks = InputHelper._pre_process_commands(arguments.command_list, '')
|
||||
commands.update(tasks.get_tasks())
|
||||
|
||||
final_commands = InputHelper._replace_variable_for_commands(commands, "_target_", targets)
|
||||
final_commands = InputHelper._replace_variable_for_commands(final_commands, "_host_", targets)
|
||||
InputHelper._replace_variable_with_commands(commands, "_target_", targets)
|
||||
InputHelper._replace_variable_with_commands(commands, "_host_", targets)
|
||||
|
||||
if arguments.port:
|
||||
final_commands = InputHelper._replace_variable_for_commands(final_commands, "_port_", ports)
|
||||
InputHelper._replace_variable_with_commands(commands, "_port_", ports)
|
||||
|
||||
if arguments.realport:
|
||||
final_commands = InputHelper._replace_variable_for_commands(final_commands, "_realport_", real_ports)
|
||||
InputHelper._replace_variable_with_commands(commands, "_realport_", real_ports)
|
||||
|
||||
if arguments.output:
|
||||
final_commands = InputHelper._replace_variable_for_commands(final_commands, "_output_", [arguments.output])
|
||||
InputHelper._replace_variable_with_commands(commands, "_output_", [arguments.output])
|
||||
|
||||
if arguments.proto:
|
||||
if "," in arguments.proto:
|
||||
protocols = arguments.proto.split(",")
|
||||
else:
|
||||
protocols = arguments.proto
|
||||
final_commands = InputHelper._replace_variable_for_commands(final_commands, "_proto_", protocols)
|
||||
|
||||
InputHelper._replace_variable_with_commands(commands, "_proto_", protocols)
|
||||
|
||||
# process proxies
|
||||
if arguments.proxy_list:
|
||||
proxy_list = list()
|
||||
for proxy in arguments.proxy_list:
|
||||
if proxy.strip():
|
||||
proxy_list.append(proxy.strip())
|
||||
proxy_list = [proxy for proxy in arguments.proxy_list if proxy.strip()]
|
||||
if len(proxy_list) < len(commands):
|
||||
proxy_list = ceil(len(commands) / len(proxy_list)) * proxy_list
|
||||
|
||||
if len(proxy_list) < len(final_commands):
|
||||
proxy_list = ceil(len(final_commands) / len(proxy_list)) * proxy_list
|
||||
|
||||
final_commands = InputHelper._replace_variable_array(final_commands, "_proxy_", proxy_list)
|
||||
|
||||
return final_commands
|
||||
InputHelper._replace_variable_array(commands, "_proxy_", proxy_list)
|
||||
return commands
|
||||
|
||||
|
||||
class InputParser(object):
|
||||
|
||||
Reference in New Issue
Block a user