• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Скрипт на python

G68

Member
26.01.2023
6
0
BIT
0
Здравствуйте. Есть файл с доменными именами. Написал скрипт на питоне, но не уверен в правильности результата. В результате на выходе должен получиться файл с доступными из сети интернет хостами, относящимеся к доменам * *lmru.tech, их открытыми портами и сервисами находящимися за ними(если есть возможность определить) в формате json {"* ": [{"hostname": name, "ports": [{“port”: “service”}]}], "*lmru.tech": [{"hostname": name, "ports": [{“port”: “service”}]}]}.

Подскажите, все ли у меня правильно. Или где-то ошибся? Ниже скрипт в pdf есть скрипт (тут не получилось загрузить PY файл)

Python:
import nmap
import json

#Чтение хостов из файла
file = open('list_of_hosts.txt', 'r', errors="ignore")
lines = file.readlines()
nmScan = nmap.PortScanner()
result = {'*leroymerlin.ru': [], '*lmru.tech': []}

for line in lines:
    line = line.replace(' ', '')
    line = line.replace('\n', '')
    
    
    if 'leroymerlin.ru' in line:
        if not nmScan.scan(line)['scan']:
            pass
    else:
        ports = []
        
        for host in nmScan.all_hosts():
            for proto in nmScan[host].all_protocols():
                lport = nmScan[host][proto].keys()
                
                for port in lport:
                    # print(nmScan[host].hostname()) # ВЫВОД ИМЯ ХОСТА
                    
                    ports += [{port: nmScan[host][proto][port]['name']}]
    
        leroymerlin = [{"hostname": line, "ports": ports}]
        
        result['*leroymerlin.ru'] += leroymerlin
    
    if 'lmru.tech' in line:
        if not nmScan.scan(line)['scan']:
            pass
            
    else:
        ports = []
    
        for host in nmScan.all_hosts():
            for proto in nmScan[host].all_protocols():
                lport = nmScan[host][proto].keys()
                
                for port in lport:
                    # print(nmScan[host].hostname()) # ВЫВОД ИМЯ ХОСТА
                    ports += [{port: nmScan[host][proto][port]['name']}]
                    
        lmru = [{"hostname": line, "ports": ports}]
        result['*lmru.tech'] += lmru
        with open('result.json', 'w') as write_file:
            json.dump(result, write_file)
 

Вложения

  • list_of_hosts.txt
    1,9 МБ · Просмотры: 55
Последнее редактирование модератором:

f22

Codeby Academy
Gold Team
05.05.2019
1 940
228
BIT
1 772
Добрый день!

должен получиться файл с доступными из сети интернет хостами
Что значит доступными?
Если хост пингуется, значит он доступен?
Или вам нужен какой-то конкретный доступный сервис на конкретном порту?
Или нужно получить ответ веб сервера?
Попробуйте сначала чуть более конкретно сформулировать задачу.

относящимеся к доменам *leroymerlin.ru *lmru.tech,
Ваш подход - не использовать функции обречён на провал.
Поверьте, функциональное программирование облегчает задачу в разы.

Чтобы извлечь строки с нужными вам подстроками, можно написать простейший код:
Python:
def get_pattern_lines(patterns=('leroymerlin.ru', 'lmru.tech'),
                      file_name='list_of_hosts.txt'):
    res = []
 
    with open(file_name, 'r') as reader:
        for line in reader.readlines():
            if any(line for pattern in patterns if pattern in line):
                res.append(line)
            
    return res
Таким образом функция вернёт только подходящие строки из файла.
Дальше уже можно написать функцию тестирования этих хостов

В вашем файле больше 50К строк, в однопоточном режиме проверка nmap займёт уйму времени.
Проще использовать не nmap, а для начала стандартные сокеты в многопоточном режиме
Вот отличная статья на эту тему

Второй вариант - банально записать полученные хосты в файл и запустить nmap, передав ему конкретный список хостов и аргументы
nmap -iL targets.txt -p- --open -sV -oX nmap_output.xml



(тут не получилось загрузить PY файл)
Используйте теги python и спойлер



Что касается вашего кода, то он довольно слабый с точки зрения и форматирования, и подходов, и соблюдения стандартов.
Попробуйте для начала использовать утилиты вроде pylint, которые подскажут вам что в коде не так.
Ну или используйте среды разработки вроде PyCharm, где подсветка проблем в коде осуществляется в режиме реального времени
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!