#python #python-3.x #linux #networking #tcp
#python #python-3.x #linux #networking #tcp
Вопрос:
У меня есть машина злоумышленника, которая устанавливает SSH-соединение с хостом в моей сети, и я хотел бы отключить/сбросить это соединение. В настоящее время я запускаю этот скрипт на маршрутизаторе/шлюзе, и весь трафик сначала проходит здесь. Когда идентификатор вызывает предупреждение, мой скрипт анализирует данные и блокирует IP — адрес источника. Мне удалось заставить скрипт отключить/сбросить TCP-соединение от злоумышленника, но я думаю, что природа tcpkill заставляет его контролировать терминал сеанса.
Из-за этого я получаю результат ниже. Похоже, tcpkill будет работать бесконечно долго, если я не использую CTRL C, чтобы прервать его. Я верю в циклы tcpkill, потому что мой скрипт запускается каждые несколько секунд, чтобы проверить наличие новых предупреждений от идентификаторов.
Ниже приведен код, который я нашел для использования tcpkill в скрипте Python3. Я довольно новичок в подпроцессах и потоковой обработке, но я подумал, что эту проблему можно было бы исправить, если бы я отключил все выходные данные tcpkill и автоматически убил команду через 30 секунд, не прерывая остальную часть программы. Возможно ли это или мне следует изучить другой метод сброса/отключения TCP-соединений? Я изучил такие инструменты, как conntrack и iptables, но не похоже, что они убивают/сбрасывают установленное TCP-соединение для меня (возможно, я использую их неправильно). Все мои системы в настоящее время работают под управлением Ubuntu 18.04, за исключением атакующей машины, использующей Kali Linux.
def kill_connection(address, interface): tcp_kill(address,interface) t = threading.Thread(target=tcp_kill, args=(address, interface)) t.daemon = True t.start() def tcp_kill(address, interface): p = subprocess.Popen(f'sudo tcpkill host {address}', stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True) time.sleep(10) p.terminate()
Я не уверен, поможет ли это, но я опубликую код, который вызывает эти функции. При необходимости я могу опубликовать полный исходный код.
def add_faucet_yaml(block_addresses): #Global variable to store ACL rules added global global_acl_rules #Error handling try: #Reads Faucet YAMAL file faucet_yaml = open("/etc/faucet/faucet.yaml") yaml_data = yaml.load(faucet_yaml, Loader=yaml.FullLoader) faucet_yaml.close() except Exception as e: print(f"Error Code: {e}") SystemExit(1) for address in block_addresses: #Template for ACL to block IP address (192.168.50.10) or network using (192.168.50.0/24) new_rule = {'rule': {'dl_type': 2048, 'ipv4_src': '', 'ipv4_dst': '192.168.50.0/24', 'actions': {'allow': False}}} new_rule['rule']['ipv4_src'] = address #Checks if rule exists if new_rule not in yaml_data['acls']['block-addresses']: #Adds rule to beginning of YAML ACL dictionary yaml_data['acls']['block-addresses'].insert(0, new_rule) #Appends current time the ACL was added global_new_rule = dict(new_rule) #Records current datetime of ACL being added current_datetime = datetime.datetime.now() #Add 1 minute from current time minutes_added = datetime.timedelta(minutes=1) #Date time of ACL to be removed future_datetime = current_datetime minutes_added global_new_rule['time_to_remove'] = str(future_datetime) global_acl_rules.append(global_new_rule) print(f"Blocking {address} until {future_datetime}") #Error handling try: #Writes new rules to Faucet YAML file faucet_yaml = open("/etc/faucet/faucet.yaml", "w") yaml.dump(yaml_data, faucet_yaml) faucet_yaml.close() #Reloads faucet os.system("sudo systemctl reload faucet") #Kills established TCP connections kill_connection(address, "vi0") except Exception as e: print(f"Error Code: {e}") SystemExit(1) #If rule is in YAML, extend duration of temporary block else: #Records current datetime of ACL being added current_datetime = datetime.datetime.now() #Add 1 minute from current time minutes_added = datetime.timedelta(minutes=1) #Date time of ACL to be removed future_datetime = current_datetime minutes_added #Loops through ACL rules to identify rule with maliicous IPv4 address for global_rule in global_acl_rules: if new_rule['rule']['ipv4_src'] == global_rule['rule']['ipv4_src']: global_rule['time_to_remove'] = str(future_datetime) print(f"Extending {global_rule['rule']['ipv4_src']} block time to {future_datetime}")