РАЗБОР Pentest Статья

Python для хакера: Начало пути к безопасным исследованиям

vag4b0nd
vag4b0nd Red Team · 299 сообщений
Подписаться
96,1 тыс.

Почему Python — это не просто мода, а реальный инструмент​

В мире кибербезопасности Python — это не просто тренд, а мощный инструмент. Его синтаксис ясен, а возможности безграничны. От автоматизации задач до создания собственных инструментов — Python предоставляет всё необходимое для эффективной работы.

Всех приветствую дорогие друзья! Долго думая, я решил начать цикл статей по сами знаете какой теме. В этой части я посмотрю , нужно ли вам это вообще. Вести я буду этот цикл параллельно с простыми уроками по питону. И собственно проводить в этом разделе. Т.к. относится это к хеку. Начнем)


Почему Python
​
1. Всем итак понятно, что его синтаксис очень и очень понятен.
2. Python имеет много плюшек. Очень много отличных библиотек зачастую повышающих функционал.
3. Python он и в Windows Python.


Как все будет
​
Мы начнем с малого. Сегодня создадим простой сканер портов. А в конце цикла, напишем для себя простенький фреймворк с некоторым количеством полезностей)
Я постараюсь в разы облегчить все что мы будем писать. Ну и как же без практики? Конечно же будут задания! Куда без них.


Пишем простой сканер портов
​
Чтобы особо умные люди не задовали вопросов по типу
Зачем писать если есть nmap?
Отвечаю сразу: А затем, чтобы вырваться из объятий ламера и уметь самому г@вн@кодить писать тулзы.

Для начала обсудим, как же будет работать наш "Hello, world!" в этой сфере)

Для совсем не знающих о портах представляю свои обьяснения ниже:


Постараюсь обойтись без терминов. Представьте себе реальный порт(те что с кораблями). Так вот корабль это определенный кусок данных(пакет), он движется по определенному пути(каналу) к определенному порту. В этом порту с ним произойдет какие либо действия. Этот карабль(пакет) могут разгрузить(получить ланные) , а могут послать подальше если порт закрыт на ремонт.
А вот теперь поговорим про закрытые порты и открытые порты.
Порт закрыт - это значит что установить соединение с этим портом нельзя.
Открытый порт - аналогично, это порт с которым можно установить соединение и обменятся информацией.
Разберемся пока что с этим. Вернемся к обсуждению алгоритма работы нашего простенького сканера.
Код:
1. Спрашивает тип.
2. Спрашивает данные.
3. Создает сокет
4. Подключается к host:port
5. Определяет открыт или закрыт.
6. Красиво выводит)
Да, ребятки, мы будем сегодня пользоватся сокетами. И вообще с ними будем очень часто работать в этом цикле.

Сокет - коротко говоря, интерфейс для обмена данными между устройствами.
Приступим к написанию нашего кода.

1. Подключаем библиотеки. Нам понадобятся 2-е библиотеки, socket и termcolor( отдельное спасибо DarkNode)
Код:
from termcolor import colored
import socket
2. А теперь создадим "меню". Программа будет спрашивать у нас. Сканировать список "популярных портов", или только то, что напишм мы.
Код:
...

print("~"*50)

print("\t[1] --- сканировать отделный порт")
print("\t[2] --- сканировать список")

print("~"*50, "\n")
text_a = input("[scan]--> ")

if text_a == "1":
    fanc1()
elif text_a == "2":
    fanc2()
else:
    print(colored("Параметр введен не правильно!", 'red'))
...
Эту часть кода пока что не пишите! Ее мы используем в конце.

3. Начнем с функции 1.
Код:
color_a = colored("[+] ", 'green')
print("~"*50)
host = input(color_a + "Host --> ")
port = int(input(color_a + "Port --> "))
print("~"*50)
Для декора можно использовать декораторы, но я не стал настолько все усложнять.

Теперь создадим сокет
Код:
scan = socket.socket()
Теперь коннектимся и определяем
Код:
color_b = colored("[!] ", 'red')
color_c = colored("[!] ", 'yellow')

try:
    scan.connect((host, port))
except scan.error:
    print(color_b + "Port -- ", port, " -- [CLOSED]")
else:
    print(color_c + "Port -- ", port, " -- [OPEN]")
Тут все просто. Если не удалось соедениться, то порт закрыт. Если приконнектились, то соответственно открыт ;)
Все это поместим в функцию fanc1().
Код:
def fanc1():
    color_a = colored("[+] ", 'green')
    print("~"*50)
    host = input(color_a + "Host --> ")
    port = int(input(color_a + "Port --> "))
    print("~"*50)

    scan = socket.socket()

    color_b = colored("[!] ", 'red')
    color_c = colored("[!] ", 'yellow')

    try:
        scan.connect((host, port))
    except scan.error:
        print(color_b + "Port -- ", port, " -- [CLOSED]")
    else:
        print(color_c + "Port -- ", port, " -- [OPEN]")
4. Вторая функция)

Тут все на мноого проще. Спросим у пользователя только хост. А порты зададим в список. Естественно проверять их будем еще и циклом
Код:
def fanc2():
    color_a = colored("[+] ", 'green')
    color_b = colored("[!] ", 'red')
    color_c = colored("[!] ", 'yellow')

    host = input(color_a + "Host --> ")
    port = [20, 21, 22, 23, 42, 43, 53, 67, 69, 80]
В список port можете добавить какие хотите порты. Я для примера добавил малость. А теперь к самому интересному. В цикле повторим прошлые действия(немного видоизменив)
Код:
...

for i in port:
    try:
        scan = socket.socket()
        scan.connect((host, i))
    except scan.error:
        print(color_b + "Port -- ", i, " -- [CLOSED]\n")
    else:
        print(color_c + "Port -- ", i, " -- [OPEN]\n")
И все вместе(функция 2)
Код:
def fanc2():
    color_a = colored("[+] ", 'green')
    color_b = colored("[!] ", 'red')
    color_c = colored("[!] ", 'yellow')

    host = input(color_a + "Host --> ")
    port = [20, 21, 22, 23, 42, 43, 53, 67, 69, 80]

    for i in port:
        try:
            scan = socket.socket()
            scan.settimeout(0.5)
            scan.connect((host, i))
        except scan.error:
            print(color_b + "Port -- ", i, " -- [CLOSED]")
        else:
            print(color_c + "Port -- ", i, " -- [OPEN]")
Также для быстроты сканирования я добавил строчку
Код:
scan.settimeout(0.5)
Я был удивлен результатом, но он очень быстро начал сканировать.

А теперь осталось все соединить.
Код:
# -*- coding:utf -8 -*-

from termcolor import colored
import socket

def fanc1():
    color_a = colored("[+] ", 'green')
    print("~"*50)
    host = input(color_a + "Host --> ")
    port = int(input(color_a + "Port --> "))
    print("~"*50)

    scan = socket.socket()

    color_b = colored("[!] ", 'red')
    color_c = colored("[!] ", 'yellow')

    try:
        scan.connect((host, port))
    except socket.error:
        print(color_b + "Port -- ", port, " -- [CLOSED]")
    else:
        print(color_c + "Port -- ", port, " -- [OPEN]")

def fanc2():
    color_a = colored("[+] ", 'green')
    color_b = colored("[!] ", 'red')
    color_c = colored("[!] ", 'yellow')

    host = input(color_a + "Host --> ")
    print("\n")
    port = [20, 21, 22, 23, 42, 43, 53, 67, 69, 80]

    for i in port:
        try:
            scan = socket.socket()
            scan.settimeout(0.5)
            scan.connect((host, i))
        except socket.error:
            print(color_b + "Port -- ", i, " -- [CLOSED]")
        else:
            print(color_c + "Port -- ", i, " -- [OPEN]")

print("~"*50)

print("\t[1] --- сканировать отделный порт")
print("\t[2] --- сканировать список")

print("~"*50, "\n")
text_a = input("[scan]--> ")

if text_a == "1":
    fanc1()
elif text_a == "2":
    fanc2()
else:
    print(colored("Параметр введен не правильно!", 'red'))
Итог:

2017_11_27_02.24.57-1.png

2017_11_27_02.14.12-1-1.png

2017_11_27_01.44.49-1-1-1.png

2017_11_27_01.35.43-1-1-1-1.png


Надеюсь вам понравилась данная статья!

Ваше задание будет очень простым. На первый раз просто разберитесь в выше мною написанном и просканируйте порты любого сайта))


🎓 Курс Python для пентестеров: от теории к практике​

Если вы хотите углубить свои знания и научиться применять Python в сфере кибербезопасности, обратите внимание на курс «Python для пентестера». Он предлагает 3,5 месяца практического обучения, включая создание собственных инструментов, работу с базами данных, многопоточность и основы криптографии. Курс ориентирован на разработку реальных приложений и предоставляет подробные методички, поддержку наставников и возможность общения с коллегами в чате. Это отличная возможность для тех, кто хочет перейти от теории к практике и начать создавать собственные решения.

Если вы уже знакомы с основами Python и хотите развить свои навыки в области кибербезопасности, этот курс может стать отличным следующим шагом в вашем обучении.

Обсудим: зачем писать свой сканер портов, если есть готовые решения?​

Вопрос, который часто возникает: зачем разрабатывать собственные инструменты, если существуют готовые решения, такие как Nmap? Ответ прост: создание собственного инструмента позволяет глубже понять процессы, улучшить навыки программирования и адаптировать решение под свои конкретные нужды.
 
AI-выжимка (тезисы)
Почему Python — это не просто мода, а реальный инструмент :: Python в кибербезопасности ценят за понятный синтаксис, богатые библиотеки и кроссплатформенность.
🎓 Курс Python для пентестеров: от теории к практике :: Курс «Python для пентестера» — 3,5 месяца практики: свои инструменты, базы данных, многопоточность и криптография.
Обсудим: зачем писать свой сканер портов, если есть готовые решения? :: Свой сканер даёт глубокое понимание процессов и адаптацию под свои задачи, чего готовый Nmap не гарантирует.
Домен (таксономия витрины «Разборы»)
Pentest
Последнее редактирование:

Комментарии

87
**Версия, проходящая цензуру***


Моя критика достаточно аргументирована. Я считаю, что не нужно порождать быдло-кодеров. Сегодня перечитал, да, действительно, довольно грубая форма получилась, надо бы наверное извиниться, но нет. Не нужно учить плохому.
Поверьте, вы думаете это мелочи, но я имею опыт "отбивания" привычки с фанк1, фанк2.

Если новички недайбоже привыкнут так писать, их оооочень сложно переучивать.


Молодец, что знаешь питон, однако рекомендую тебе ознакомиться с программированием.
Код должен читаться как текст. В нём не должно быть не одного непонятного места. В нём не должно быть дублирования.
Так у тебя в коде одно и то же, ты в каждой функции прописываешь цвета, о чём следует вывод: с принципом Don't repeat your self. Не волнуйся, 60% о нём узнают на первом месте работы. Однако, учись и раз взялся учить - правильно

Вот тебе - авторитетные источники две книги:
Роберт Мартин - "Чистый код",
Стив Макконнелл - "Совершенный код"
Вот с этого запроса для гугла стоит начать: ***Скрытый текст******Скрытый текст***
Рекомендую, вырабатывать чувство хорошего кода и практик, используя гитхаб(не реклама). Вот пример ***Скрытый текст***
Как ты можешь заметить наименований: фанк1, фанк2 там отсутствует, ровно как и дублирование.

Постарайся в следующий раз при получении критики (от меня, я просто так поливать не стану) проверить, действительно ли твоё виденье совпадает с общепринятыми практиками.
Жаль, что я тебя раньше не замечал. Все по делу сказал. А за SOLID отдельный респект. К сожалению среди хекеров очень редко я слышал абривиатуру эту, точнее вообще никогда. Кто не в курсе это 5 фундаментальных архитектурных принципа разработки, следуя которым можно построить гибкую и масштабируемую арх Все по делу сказал так же и на счёт именования. Привет РЕР8. И если браться учить, то делать это должен тот, кто сам умеет. А те кто кричат от новичка новичку идиоты трижды. Учиться нужно сразу у профессионалов и учиться правильным вещам. Так что думайте.... И да. Книга макконела или Мартина это Библия которую прочитать должен любой кодер. Я бы ещё добавил Фаулера, паттерны и ООП. Я заметил DRY прозвучал. Не забываем про KISS бритву ОККАМА и такое модное слово как антипаттерны
 
Последнее редактирование:
  • Нравится
Реакции: Shihskauskas
1
Посчитал вмешаться. Да простит меня автор поста.Даже если Вы уважаемый призёр соревнований по этому языку,то нельзя же так..
имею в виду задевание Личности.Критика аргументированной должна быть,без негативных последствий,как для автора,так и для читателей.Может и для Вас самих.Зачем задевать-то? Откуда всё это берётся? Вы уж меня простите,новичка в Питоне.Не за это тяну,а за общее уважение и нормальные интересные дискуссии.В дружеском русле критика никогда не помешает,но никак не в таком.
Мы ,Линуксоиды,нас мало,давайте уважать друг друга,давайте жить в мире ,в том,котырый мы только в силах создать и поддерживать.

P/S Статья всё-таки для новичков,и то ,для них это слишком навёрнуто,это надо понимать.

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

[32m[+] [0mHost --> yahoo.com
[32m[+] [0mPort --> 80

Снимок.JPG
Почему?
 
У меня вместо подсвеченных разным цветом символов выдает следующее:

[32m[+] [0mHost --> yahoo.com
[32m[+] [0mPort --> 80

Посмотреть вложение 14638
Почему?
Код:
from termcolor import colored
print(colored('test', 'green'))

или так:
Код:
class bcolors:
    HEADER = '\033[95m'
    OKBLUE = '\033[94m'
    OKGREEN = '\033[92m'
    WARNING = '\033[93m'
    FAIL = '\033[91m'
    ENDC = '\033[0m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'
    
print( bcolors.OKGREEN + 'OK' )

все цвета по аналогии с bcolors
 
Не помогло!
Снимок.JPG
 
Код:
port = int(input(color_a + "Port --> "))
Лучше обернуть в try|except:
Python:
try:
    [SIZE=5]port = int(input(color_a + "Port --> "))[/SIZE]
except:
    print('Вы ошиблись при указании порта,пожалуйста повторите')
    exit()
 
Зря, говнокодить зачеркнул.
Хотелось бы услышать комментарий о моем коде)

Python:
# -*- coding:utf -8 -*-

import sys
import argparse
import socket


def scan_port(host, port):
    try:
        scan = socket.socket()
        scan.settimeout(0.5)
        scan.connect((host, int(port)))
        print('[+] ' + port)
    except:
        print('[-] ' + port)

if __name__ == "__main__":

    parser = argparse.ArgumentParser()
    parser.add_argument('-m', '--mode', choices=['1', '2'], nargs='+')
    parser.add_argument('-p', '--port')
    parser.add_argument('--host', nargs='+')

    arguments = parser.parse_args(sys.argv[1:])

    mode = arguments.mode
    host = arguments.host
    port = arguments.port

    if mode == '1' and port != None:
        scan_port(host, port)
    elif mode == '2':
        for port in [20, 21, 22, 23, 42, 43, 53, 67, 69, 80]:
            scan_port(host, port)

Ну или так(Отличается только приемом входных данных):

Python:
# -*- coding:utf -8 -*-

import sys
import argparse
import socket


def scan_port(host, port):
    try:
        scan = socket.socket()
        scan.settimeout(0.5)
        scan.connect((host, int(port)))
        print('[+] ' + port)
    except:
        print('[-] ' + port)

if __name__ == "__main__":

    mode = input('1. Один порт\n2. Список портов\nВведите номер режима сканирования: ')
    host = input('\nВведите хост: ')

    if mode == '1' and port != None:
        port = input('\nВведите порт: ')
        scan_port(host, port)
    elif mode == '2':
        for port in [20, 21, 22, 23, 42, 43, 53, 67, 69, 80]:
            scan_port(host, port)
 
Ну или так(Отличается только приемом входных данных):
Вы сами свой код тестировали?

1. Один порт
2. Список портов
Введите номер режима сканирования: 1

Введите хост: yahoo.com
Traceback (most recent call last):
File "C:/Python34/myProgram/port_scan2.py", line 22, in <module>
if mode == '1' and port != None:
NameError: name 'port' is not defined
 
  • Нравится
Реакции: krasov_rf
1
Вы сами свой код тестировали?

1. Один порт
2. Список портов
Введите номер режима сканирования: 1

Введите хост: yahoo.com
Traceback (most recent call last):
File "C:/Python34/myProgram/port_scan2.py", line 22, in <module>
if mode == '1' and port != None:
NameError: name 'port' is not defined
Извиняюсь,быстро накидал
Python:
# -*- coding:utf -8 -*-

import sys
import argparse
import socket


def scan_port(host, port):
    try:
        scan = socket.socket()
        scan.settimeout(0.5)
        scan.connect((host, int(port)))
        print('[+] ' + port)
    except:
        print('[-] ' + port)

if __name__ == "__main__":

    mode = input('1. Один порт\n2. Список портов\nВведите номер режима сканирования: ')
    host = input('\nВведите хост: ')

    if mode == '1':
        port = input('\nВведите порт: ')
        scan_port(host, port)
    elif mode == '2':
        for port in [20, 21, 22, 23, 42, 43, 53, 67, 69, 80]:
            scan_port(host, port)
 
Если ввести 2, тоже ошибку выдает.
Можно исправить так:
Код:
        print('[+] ' + str(port))
    except:
        print('[-] ' + str(port))
 
Если ввести 2, тоже ошибку выдает.
Можно исправить так:
Эстетичнее будет так.Извиняюсь за ошибки,отлучен он пк,приходится тупо по логике писать)
Python:
for port in [20, 21, 22, 23, 42, 43, 53, 67, 69, 80]:
            scan_port(host, str(port))
 
Отличная статья написал бы что жду продолжения но перешол сюда со второй части )))
 
Приветствую. Тема весьма интересная. Но есть одно замечание в логике работы программы. Именно в логике, архитектура и изящество - вещи не первостепенные и проделываются уже после написания логической базы (понимайте пожалуйста эти слова правильно все здесь присутствующие). Дело вот в чём:
Python:
scan.settimeout(0.5)
Эта функция уменьшает время ожидания. Это не есть хорошо, и эксперименты это подтвердили. Дело в том, что программа просто не дожидается ответа от сканируемого порта, пишет "недоступен" и приступает к следующему. Это актуально для проверки по списку. Единичные не проверял. Вот пруфы:
С функцией
Снимок экрана от 2018-03-15 21-49-23.png
Без функции
Снимок экрана от 2018-03-15 22-05-39.png
Дайте проге время приконнектится...
 
  • Нравится
Реакции: Сергей Попов
1
import socket


host = input('Введите ваш хост ---> ')
port = int(input('Введите ваш порт ---> '))
try:
scan = socket.socket()
scan.connect((host, port))
print('Порт открыт')
except socket.error:
print('Порт закрыт!')

Ты очень хорошо и четко объясняешь! Хотел бы задать один вопрос. Где учился всему этому. Хакингу, программированию и тд
 
Последнее редактирование:
Статья занимательная, не без ошибок (как раз о них и пойдёт речь), но все мы не идеальны. Если нужна будет помощь в оформлении/орфографии - обращайтесь! С радостью помогу.
 
прошу прощения.... я в целях образования не копипастил а написал весь скрипт руками... я не кодер и вообще это мой первый раз)))
Но нашел следующие ошибки

в блоке

print("~"*50, "\n")
text_a = input("[scan]--> ")

if text_a == "1":
fanc1()
elif text_a == "2":
fanc2()
else:
print(colored("Параметр введен не правильно!", 'red'))

------------
для того что бы он заработал пишем

print("~"*50)
text_a = input("[scan]--> ")

if text_a == 1:
fanc1()
elif text_a == 2:
fanc2()
else:
print(colored("Параметр введен не правильно!", 'red'))

----------------------
простите за мою наглость. скрипт пока у меня не заработал но тут я разобрался сейчас выдает

└──╼ #python scanport.py
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[1] -- сканировать отдельный порт
[2] -- сканировать список
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[scan]--> 1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[+] Host --> Mail.Ru: почта, поиск в интернете, новости, игры
Traceback (most recent call last):
File "scanport.py", line 56, in <module>
fanc1()
File "scanport.py", line 9, in fanc1
host = input(color_a + "Host --> ")
File "<string>", line 1
Mail.Ru: почта, поиск в интернете, новости, игры


пойду на работу потом по разбираюсь..

Спасибо автору за статью мне она очень помогла! Ждумся продолжения
 
У меня вместо подсвеченных разным цветом символов выдает следующее:

[32m[+] [0mHost --> yahoo.com
[32m[+] [0mPort --> 80

Посмотреть вложение 14638
Почему?
Потому что на винде запускаешь. ANSI символы cmd нишиша не конвертирует. Я с этим же вопросом славно проколупался, лишь частично решил. Но потом нашёл чудесный заменитель стандартному cmd с поддержкой конвертации ANSI (y)


А так это выглядит. Куча цветовых схем присутствует и другие плюшки ;)

cmd.png
 
  • Нравится
Реакции: Unison
1