• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Статья Злой сканер, как написать инструмент что всегда под рукой

1605972672700.png

Введение

В течении нескольких месяцев при активных тестах на проникновения я очень часто сталкивался с проблемой наличия под рукой быстрых программ. Чтобы можно было не запуская вторую OS (linux) быстро провести анализ. В моем случае это сканирования. Поэтому для решения данной проблемы пришлось прийти к написанию своей программы. Да, скорее всего таких софтов будет очень много, но у каждого есть свое преимущество. В нашем случае, что будет рассмотрен далее это скорость и постоянное наличие под рукой. Данная статья крайне полезна новичкам и тем кто не знаком с Python. Приступим.

Что это и зачем мне нужно?

Представим ситуацию. Вы спокойно гуляете по интернету, посещаете нужные сайты и ищите полезную информацию. Но тут приходит идея посмотреть безопасность одного из сайта. Ваша операционная система (основная) Windows и провести какие либо действия связанные с анализом займут достаточно много времени. А точнее узнавание поткрытых портов и ip адреса сайта. Но что если можно сделать все в один клик и получить нужные данные не отходя далеко от ПК? Именно эту задачу мы будем решать. Постараемся создать такую вещь.

От теории к практике!

Основную цель этой статьи мы разобрали, теперь приступим к реализации. Использовать мы как всегда будет старый, добрый Python в связке с PyCharm. Сразу скажу, что наш код будет на удивление очень прост но эффективен. Похожий код вы можете найти на сайтах, но здесь все же будут отличия, что сделают работу уникальной. Давайте начнем с простого. Импорта библиотек:
Python:
import socket    # Основная библиотека
from datetime import datetime    # Нужно для отслеживания времени
from colorama import Fore, init        # Создает оформление
Комментарии к коду стараюсь делать на каждом шагу, чтобы было просто и понятно. Далее мы создаем каркас, что будет держать нашу программу:
Python:
init()    # Требуется для цветокоррекции

start = datetime.now()        # Начинает отсчет времени
ports = [20, 21, 22, 23, 25, 42, 43, 53, 67, 69, 80, 115, 123, 137, 138, 139, 143, 161, 179, 443, 445, 514, 515, 993,
         995, 1080, 1194, 1433, 1723, 3128, 3268, 3306, 3389, 5432, 5060, 5900, 8080, 10000, 20000]
# | Порты для сканирования |

А вот здесь будет более подробное описание. Именно в этом моменте мы используем методы и контейнеры.

Метод - функция связанная с определенным типом данных. Пример:
Python:
"Hello, World!".upper()
Контейнер - место для хранения информации в определенном порядке. Пример:
Python:
h = ["Hello, World!"]
print(h)
В нашем случае мы используем кортеж, это контейнер, который хранит объекты в неизменяемом порядке. Именно в нем мы сможем сохранить порты для сканирования. Теперь давайте сделаем красивый ввод и дополнительную функцию для распознавания ip-адреса сайта.
Python:
ip = input("Site Name / IP Address: ")        # Ввод текста
print(f"{Fore.LIGHTGREEN_EX}IP address:", socket.gethostbyname(ip))        # Распознаем IP
print(f"{Fore.LIGHTRED_EX}<===============>")    # Украшение
print(f"{Fore.WHITE}Loading Ports...")
print(f"{Fore.LIGHTGREEN_EX}##################")
Совет: использовать изменения цвета вместе с функцией input() не советуется (отображение не будет).

Следом нам нужно создать цикл, который будет производить подключение к сайту по IP и порту. Для этого печатаем следующее:
Python:
for port in ports:        # Создаем цикл
    s = socket.socket()        # Обозначаем переменную для подключения
    s.settimeout(1)        # Создаем задержку между подключениями
    try:
        s.connect((ip, port))    # Подключаемся
    except socket.error:    # Пропускаем ошибки неудачного подключения
        pass
    else:
        s.close()
А вот дальше я пошел более трудным путем и решил создать часть кода, что будет распознавать тип открытого порта (все что приведены у нас в кортеже). Внимание, дальше будет очень много кода (делаете отступ после s.close() и пишите туда):
Python:
        if port == 20:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/FTP-DATA")
        elif port == 21:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/FTP")
        elif port == 22:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SSH")
        elif port == 23:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/Telnet")
        elif port == 25:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SMTP")
        elif port == 43:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/WHOIS")
        elif port == 53:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/DNS")
        elif port == 80:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/http")
        elif port == 115:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SFTP")
        elif port == 123:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/NTP")
        elif port == 143:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/IMAP")
        elif port == 161:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SNMP")
        elif port == 179:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/BGP")
        elif port == 443:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/HTTPS")
        elif port == 445:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/MICROSOFT-DS")
        elif port == 514:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SYSLOG")
        elif port == 515:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/PRINTER")
        elif port == 993:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/IMAPS")
        elif port == 995:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/POP3S")
        elif port == 1080:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SOCKS")
        elif port == 1194:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/OpenVPN")
        elif port == 1433:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SQL Server")
        elif port == 1723:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/PPTP")
        elif port == 3128:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/HTTP")
        elif port == 3268:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/LDAP")
        elif port == 3306:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/MySQL")
        elif port == 3389:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/RDP")
        elif port == 5432:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/PostgreSQL")
        elif port == 5060:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SIP")
        elif port == 5900:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/VNC")
        elif port == 8080:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/Tomcat")
        elif port == 10000:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/Webmin")
        else:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/unknown")
Я предупреждал, метод достаточно нестандартный к решению задачи. Простыми словами данный код берет из нашего контейнера ports каждое число и сравнивает его с тем числом, что ему задали. То есть если ports равен 80, то выводим такой текст, в противном случае пропускаем. Я добавил для четкости немного цветов, чтобы было проще отличить нужное от ненужного. Нам остается только теперь завершить нашу программу кодом:
Python:
print(f"{Fore.LIGHTGREEN_EX}##################")    # Украшение
ends = datetime.now()    # Останавливаем таймер
print(f"{Fore.LIGHTRED_EX}" + "<Time:{}>".format(ends - start))        # Выводим время сканирования

print("Scan completed!")    # Делаем задержку, чтобы программа не закрылась после завершения сканирования
input("Press Enter to the exit....")
Чтобы все работало как нам нужно мы воспользуемся конвертацией. При помощи pyinstaller собираем программу в единый exe-файл командой:
Код:
pyinstaller -F --onefile имя_программы.py
Совет: если хотите добавить иконку воспользуйтесь флагом -i перед --onefile указав путь до вашего .ico файла.

Вывод

Надеюсь данный код было полезен вам. Если хотите скачать уже готовую программу без каких-либо заморочек, то рекомендую заглянуть сюда. Так же ниже я оставлю свой код с полным оформлением.
Python:
# -*- coding: utf-8 -*-
import socket
from datetime import datetime
from colorama import Fore, init

init()

print(f'''{Fore.LIGHTRED_EX}
Сюда поместите картинку
''')
print(f"{Fore.LIGHTCYAN_EX} [#=>] Coded by ваш_никнейм")

start = datetime.now()
ports = [20, 21, 22, 23, 25, 42, 43, 53, 67, 69, 80, 115, 123, 137, 138, 139, 143, 161, 179, 443, 445, 514, 515, 993,
         995, 1080, 1194, 1433, 1723, 3128, 3268, 3306, 3389, 5432, 5060, 5900, 8080, 10000, 20000]

print(f"{Fore.LIGHTYELLOW_EX}")
ip = input("Site Name / IP Address: ")
print(f"{Fore.LIGHTGREEN_EX}IP address:", socket.gethostbyname(ip))
print(f"{Fore.LIGHTRED_EX}<===============>")
print(f"{Fore.WHITE}Loading Ports...")
print(f"{Fore.LIGHTGREEN_EX}##################")
for port in ports:
    s = socket.socket()
    s.settimeout(1)
    try:
        s.connect((ip, port))
    except socket.error:
        pass
    else:
        s.close()

        if port == 20:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/FTP-DATA")
        elif port == 21:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/FTP")
        elif port == 22:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SSH")
        elif port == 23:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/Telnet")
        elif port == 25:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SMTP")
        elif port == 43:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/WHOIS")
        elif port == 53:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/DNS")
        elif port == 80:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/http")
        elif port == 115:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SFTP")
        elif port == 123:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/NTP")
        elif port == 143:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/IMAP")
        elif port == 161:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SNMP")
        elif port == 179:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/BGP")
        elif port == 443:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/HTTPS")
        elif port == 445:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/MICROSOFT-DS")
        elif port == 514:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SYSLOG")
        elif port == 515:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/PRINTER")
        elif port == 993:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/IMAPS")
        elif port == 995:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/POP3S")
        elif port == 1080:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SOCKS")
        elif port == 1194:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/OpenVPN")
        elif port == 1433:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SQL Server")
        elif port == 1723:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/PPTP")
        elif port == 3128:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/HTTP")
        elif port == 3268:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/LDAP")
        elif port == 3306:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/MySQL")
        elif port == 3389:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/RDP")
        elif port == 5432:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/PostgreSQL")
        elif port == 5060:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/SIP")
        elif port == 5900:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/VNC")
        elif port == 8080:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/Tomcat")
        elif port == 10000:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/Webmin")
        else:
            print(ip + ":" + str(port) + f" {Fore.LIGHTGREEN_EX}is open/unknown")

print(f"{Fore.LIGHTGREEN_EX}##################")
ends = datetime.now()
print(f"{Fore.LIGHTRED_EX}" + "<Time:{}>".format(ends - start))

print(f"{Fore.MAGENTA}Scan completed!")
input("Press Enter to the exit....")
 
T

to_0day

Ещё одна статья о сканере на питоне. Хоть бы че то новое было и интересное. А так - статья ради статьи. Останется в песочнице.
Пока что особо глобальных идей нету, думаю что можно сделать крупного и уникального
 
  • Нравится
Реакции: Crazy Jack

mrOkey

Grey Team
14.11.2017
967
976
BIT
0
Пока что особо глобальных идей нету, думаю что можно сделать крупного и уникального
Да даже тут, написал бы ты хотя бы многопоточный сканер, ну или базу бы nmap'овскую подрубил. Предусмотрел бы место для расширения в архитектуре. Был бы другой разговор. А 10ая статья на форуме как скопипастить сканер - ну пожалуй не нужна
 
  • Нравится
Реакции: Shadow User и Crazy Jack
T

to_0day

Да даже тут, написал бы ты хотя бы многопоточный сканер, ну или базу бы nmap'овскую подрубил. Предусмотрел бы место для расширения в архитектуре. Был бы другой разговор. А 10ая статья на форуме как скопипастить сканер - ну пожалуй не нужна
Хм.. идея интересная, но я кажется уже нашел, то что может заинтересовать
 
  • Нравится
Реакции: Сергей Попов

explorer

Platinum
05.08.2018
1 081
2 469
BIT
14
В списке есть порт 20000, но ниже по коду он нигде не используется.
 
  • Нравится
Реакции: dennykit25

Pernat1y

Red Team
05.04.2018
1 443
134
BIT
0
Раз уж на то пошло, то лучше-бы было порты и дефолтные службы в dict забить
Python:
ports_services = {
    21: 'ftp',
    22: 'ssh',
    53: 'dns',
    80: 'http'
}

for port in ports_services:
    print(f'Port {port} is used by service {ports_services[port]}')
А не тащить паровозик из if/elif.

В результате код будет более чем 2 раза короче, чище, и проще для дальнейших обнов:
Python:
# -*- coding: utf-8 -*-
import socket
from datetime import datetime

from colorama import Fore, init

init()

print(f'''{Fore.LIGHTRED_EX}
Сюда поместите картинку
''')
print(f"{Fore.LIGHTCYAN_EX} [#=>] Coded by ваш_никнейм")

start = datetime.now()
ports_services = {20: "FTP-DATA", 21: "FTP", 22: "SSH", 23: "Telnet", 25: "SMTP", 43: "WHOIS", 53: "DNS", 80: "http",
                  115: "SFTP", 123: "NTP", 143: "IMAP", 161: "SNMP", 179: "BGP", 443: "HTTPS", 445: "MICROSOFT-DS",
                  514: "SYSLOG", 515: "PRINTER", 993: "IMAPS", 995: "POP3S", 1080: "SOCKS", 1194: "OpenVPN",
                  1433: "SQL Server", 1723: "PPTP", 3128: "HTTP", 3268: "LDAP", 3306: "MySQL", 3389: "RDP",
                  5432: "PostgreSQL", 5060: "SIP", 5900: "VNC", 8080: "Tomcat", 10000: "Webmin"}

print(f"{Fore.LIGHTYELLOW_EX}")
ip = input("Site Name / IP Address: ")
print(f"{Fore.LIGHTGREEN_EX}IP address:", socket.gethostbyname(ip))
print(f"{Fore.LIGHTRED_EX}<===============>")
print(f"{Fore.WHITE}Loading Ports...")
print(f"{Fore.LIGHTGREEN_EX}##################")
for port in ports_services:
    s = socket.socket()
    s.settimeout(1)
    try:
        s.connect((ip, port))
    except socket.error:
        pass
    else:
        print(f"{ip} {str(port)} {Fore.LIGHTGREEN_EX}is open/{ports_services[port]}")
        s.close()

print(f"{Fore.LIGHTGREEN_EX}##################")
ends = datetime.now()
print(f"{Fore.LIGHTRED_EX}" + "<Time:{}>".format(ends - start))

print(f"{Fore.MAGENTA}Scan completed!")
input("Press Enter to the exit....")

s.settimeout(1) # Создаем задержку между подключениями
Это таймаут, а не задержка.

Я предупреждал, метод достаточно нестандартный к решению задачи.
Не нужно оправдывать костыли банальным "я автор, я так вижу".
Если ты пишешь много повторяющихся условий/функций, то, скорее всего, что-то нужно оптимизировать.
 
Последнее редактирование:

KaPToHHbIu_EHoT

Green Team
08.11.2020
79
12
BIT
0
Хм, сканер как сканер )
Всего лишь сканирование портов.
Вероятнее всего, в процессе использовании данного сканера будут возникать различные ошибки, приводящие к окончанию работы.
Автор использовал этот сканер всего на нескольких IP. При сканировании диапазонов - ошибки неизбежны.
НО ЭТО - НЕ ТОЧНО. Слишком примитивный алгоритм ))

Теперь перепиши данный сканер портов ещё два раза, используя ещё два модуля python (не модуль socket).
Вывод должен быть аналогичен твоему-же.
Используемые модули найди самостоятельно.
Выбери наилучший из трёх написанных тобою скриптов ))
 
T

to_0day

Хм, сканер как сканер )
Всего лишь сканирование портов.
Вероятнее всего, в процессе использовании данного сканера будут возникать различные ошибки, приводящие к окончанию работы.
Автор использовал этот сканер всего на нескольких IP. При сканировании диапазонов - ошибки неизбежны.
НО ЭТО - НЕ ТОЧНО. Слишком примитивный алгоритм ))

Теперь перепиши данный сканер портов ещё два раза, используя ещё два модуля python (не модуль socket).
Вывод должен быть аналогичен твоему-же.
Используемые модули найди самостоятельно.
Выбери наилучший из трёх написанных тобою скриптов ))
Спасибо за совет) Пока что я только работаю над данным софтом. Постараюсь реализовать сканирование диапазонов
 
T

to_0day

Раз уж на то пошло, то лучше-бы было порты и дефолтные службы в dict забить
Python:
ports_services = {
    21: 'ftp',
    22: 'ssh',
    53: 'dns',
    80: 'http'
}

for port in ports_services:
    print(f'Port {port} is used by service {ports_services[port]}')
А не тащить паровозик из if/elif.

В результате код будет более чем 2 раза короче, чище, и проще для дальнейших обнов:
Python:
# -*- coding: utf-8 -*-
import socket
from datetime import datetime

from colorama import Fore, init

init()

print(f'''{Fore.LIGHTRED_EX}
Сюда поместите картинку
''')
print(f"{Fore.LIGHTCYAN_EX} [#=>] Coded by ваш_никнейм")

start = datetime.now()
ports_services = {20: "FTP-DATA", 21: "FTP", 22: "SSH", 23: "Telnet", 25: "SMTP", 43: "WHOIS", 53: "DNS", 80: "http",
                  115: "SFTP", 123: "NTP", 143: "IMAP", 161: "SNMP", 179: "BGP", 443: "HTTPS", 445: "MICROSOFT-DS",
                  514: "SYSLOG", 515: "PRINTER", 993: "IMAPS", 995: "POP3S", 1080: "SOCKS", 1194: "OpenVPN",
                  1433: "SQL Server", 1723: "PPTP", 3128: "HTTP", 3268: "LDAP", 3306: "MySQL", 3389: "RDP",
                  5432: "PostgreSQL", 5060: "SIP", 5900: "VNC", 8080: "Tomcat", 10000: "Webmin"}

print(f"{Fore.LIGHTYELLOW_EX}")
ip = input("Site Name / IP Address: ")
print(f"{Fore.LIGHTGREEN_EX}IP address:", socket.gethostbyname(ip))
print(f"{Fore.LIGHTRED_EX}<===============>")
print(f"{Fore.WHITE}Loading Ports...")
print(f"{Fore.LIGHTGREEN_EX}##################")
for port in ports_services:
    s = socket.socket()
    s.settimeout(1)
    try:
        s.connect((ip, port))
    except socket.error:
        pass
    else:
        print(f"{ip} {str(port)} {Fore.LIGHTGREEN_EX}is open/{ports_services[port]}")
        s.close()

print(f"{Fore.LIGHTGREEN_EX}##################")
ends = datetime.now()
print(f"{Fore.LIGHTRED_EX}" + "<Time:{}>".format(ends - start))

print(f"{Fore.MAGENTA}Scan completed!")
input("Press Enter to the exit....")


Это таймаут, а не задержка.


Не нужно оправдывать костыли банальным "я автор, я так вижу".
Если ты пишешь много повторяющихся условий/функций, то, скорее всего, что-то нужно оптимизировать.
Код будет переписан по вашему совету. Спасибо за помощь
 
  • Нравится
Реакции: Pernat1y

Pernat1y

Red Team
05.04.2018
1 443
134
BIT
0
Я перестал читать как, дошёл до этого куска пода. Миллионы лет эволюции впустую....
Мне кажется что все, кто кодит не в тиме, где твой код ревьювят, начинают с такого. Потом оптимизируют/переписывают, по мере улучшения скилла.
Я тоже так учился, правда туториалы по пайтону при этом не писал. По понятным причинам.
 

MLNK

Mod. Ethical Hacking
Red Team
23.01.2018
560
706
BIT
1
Мне кажется что все, кто кодит не в тиме, где твой код ревьювят, начинают с такого. Потом оптимизируют/переписывают, по мере улучшения скилла.
Я тоже так учился, правда туториалы по пайтону при этом не писал. По понятным причинам.
Это понятно, изучить код самому точнее синтаксис несложно. А вот начать грамотно писать без менторства и ревью уже в тягость. Сам говнокодил и говнокожу, но только для себя.
@to_0day закидывай такие штуки на гит. Есть шанс, что кто-то отревьювит да и контроль версий мастхэв скил.
 
  • Нравится
Реакции: to_0day

MLNK

Mod. Ethical Hacking
Red Team
23.01.2018
560
706
BIT
1
Добавлю, подобное лучше не выкладывать как статью. если бы @to_0day не преподносил это как конечный продукт пусть и фришный то, отношение было бы другим.
Всегда можно написать что-то вроде "приму любую критику и улучшения кода" и подобное, я думаю многие бы откликнулись как @Pernat1y и хоть как да заревьювели бы и помогли советом.
 
  • Нравится
Реакции: rwxrwxrwx и Pernat1y

shinza

Green Team
28.08.2017
18
10
BIT
1
Мне был бы интересен вот такой сканер - сканирует диапазоны по заданному пользователем банеру и выдавал список ip:port искомого в сети. (пример: RDP *.*.*.*:3389, *.*.*.*:2289, *.*.*.*:3389, *.*.*.*:3399)
 
  • Нравится
Реакции: Bars228

Bars228

Member
29.04.2018
7
0
BIT
0
Для Windows есть удобный и мощный Advanced Port Scanner - который к тому же определяет порты по баннерам, а не по списку.
 
Мы в соцсетях:

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