РАЗБОР 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? Ответ прост: создание собственного инструмента позволяет глубже понять процессы, улучшить навыки программирования и адаптировать решение под свои конкретные нужды.
Полезно · 89

Комментарии

87
  • Нравится
Реакции: Set Amour, kot-gor, Kalina и ещё 1 человек
4
Надеюсь у Автора хватит энтузиазма на цикл статей. Здорово, что все наглядно и с примерами. Ну и "...порты любого саЙта.." .
 
  • Нравится
Реакции: gushmazuko
1
Надеюсь у Автора хватит энтузиазма на цикл статей. Здорово, что все наглядно и с примерами. Ну и "...порты любого саЙта.." .
Там же написано, что это будет большой цикл))
 
  • Нравится
Реакции: id2746
1
Там же написано, что это будет большой цикл))
Мало ли, что там написано? Может на 3й статье свободное время или энтузиазм иссякнет, т.к. написание и оформление статей требуют времени и сил.
По-этому искренне желаю успехов автору в написании. Почитаю с удовольствием т.к. тема интересная.
 
  • Нравится
Реакции: gushmazuko
1
Очень очень очень плохо. У тебя коннект скан. А если IDS? А как поступить если рейт надо ограничить? А цикл для этого зачем? Очень плохая архитектурная практика для учебного материала.
 
  • Нравится
Реакции: Shadow User, f1tz и (удалённый пользователь)
3
У меня почему-то возникло желание добавить свои комментарии к статье и тем самым дополнить предыдущие ))
Во-первых, хочется поблагодарить автора за старания, за хорошие начинания.
Хочется надеяться, что он не забросит цикл статей, не остановится на пол-пути, так как "цикл статей" - дело непростое ))
В то-же время, на мой взгляд, правила русского языка в подобных статьях играют ничуть не меньшую роль, чем правила языка программирования : ведь статья носит обучающий характер.
Появление в статье Би-Би-кодов также может восприниматься новичками как код языка программирования и вводить в заблуждение.
В подобных статьях не бывает мелочей.
Упомянутые "мелочи" создают картину уровня преподавания, рисуют представление о профессионализме автора и ещё много о чём...
Ещё один момент непонятен.
Одновременно с этой, автор пишет цикл статей под заголовком "Учим Python."
Признаюсь, я читаю их с интересом)
В случае, если данная статья является продолжением упомянутого цикла, то имеет место огромный пробел в преподавании.
В частности, от операторов цикла сразу состоялся переход к функциям без должной подготовки читателей (
Этот пробел в знаниях неплохо было-бы заполнить ))
Но, в случае, если статьи представляют параллели, то последнее моё замечание - не актуально.
Преподавание - дело непростое ))

В остальном хочется ещё раз поблагодарить автора за прекрасное начинание - и это главное.
 
  • Нравится
Реакции: moeimya, id2746, IioS и ещё 1 человек
4
У меня почему-то возникло желание добавить свои комментарии к статье и тем самым дополнить предыдущие ))
Во-первых, хочется поблагодарить автора за старания, за хорошие начинания.
Хочется надеяться, что он не забросит цикл статей, не остановится на пол-пути, так как "цикл статей" - дело непростое ))
В то-же время, на мой взгляд, правила русского языка в подобных статьях играют ничуть не меньшую роль, чем правила языка программирования : ведь статья носит обучающий характер.
Появление в статье Би-Би-кодов также может восприниматься новичками как код языка программирования и вводить в заблуждение.
В подобных статьях не бывает мелочей.
Упомянутые "мелочи" создают картину уровня преподавания, рисуют представление о профессионализме автора и ещё много о чём...
Ещё один момент непонятен.
Одновременно с этой, автор пишет цикл статей под заголовком "Учим Python."
Признаюсь, я читаю их с интересом)
В случае, если данная статья является продолжением упомянутого цикла, то имеет место огромный пробел в преподавании.
В частности, от операторов цикла сразу состоялся переход к функциям без должной подготовки читателей (
Этот пробел в знаниях неплохо было-бы заполнить ))
Но, в случае, если статьи представляют параллели, то последнее моё замечание - не актуально.
Преподавание - дело непростое ))

В остальном хочется ещё раз поблагодарить автора за прекрасное начинание - и это главное.


Этот цикл не являнтся продолжением тех уроков которые я тоже пишу.

П.С: все пробелы легко заполним новыми знаниями в цикле простых уроков)
 
  • Нравится
Реакции: tech494, (удалённый пользователь) и (удалённый пользователь)
3
AL04E, спасибо за статью. Исключительно актуальная лично для меня тема! Обязательно буду читать...

Если вдруг у Вас программа на этот цикл статей учитывает пожелания, можно попросить написать когда-нибудь алгоритм создания полезной нагрузки на питоне?
 
  • Нравится
Реакции: vag4b0nd
1
Во норм, спасибо!... буду после работы заниматься понемногу
 
  • Нравится
Реакции: The Vincenzo
1
Напомнило книгу Coding for Penetration Testers. Там все примеры даются в виде сканеров. Вообще интересная книга по скриптовым языкам.
 
Цикл обещает быть интересным, что же, удачи и энтузиазма автору!
Допустим это самый тестовый сканер для примера в плане 'изучения' python. Было бы неплохо в будущем усложнение/реструктурирование кода и логики, дабы складывалось полное впечатление от написания подобных скриптов и применения их в реальной жизни, нежели просто в локалке по баловаться)
 
так...изи ... ждем продолженице :}
 
В описании 2й функции ошибка закралась;)

Код:
except scan.error:
 
  • Нравится
Реакции: vag4b0nd
1
Всем доброго времени суток. Это мой первый пост на этом форуме. Статья суппер. Жду продолжения.
Но есть и нюансы. Не хочу прослыть занудой, но раз был вопрос про правописание, то может тогда и функции можно называть по-человечески? Но даже если нет, то почему fanc1, а не func1
 
  • Нравится
Реакции: The Vincenzo
1
Как в "Операция "Ы"", чтобы никто не догадался.
Названия переменных тоже не информативны.
Код:
color_a = colored("[+] ", 'green')
Что же мне интересно тебе не понравилось в переменных?)
Этот цикл расчитан на более или менее знающих основы python людей. По этому, если тебе в переменных что-то не нравится, то просто придумай свои:)
[doublepost=1511857643,1511857266][/doublepost]
Всем доброго времени суток. Это мой первый пост на этом форуме. Статья суппер. Жду продолжения.
Но есть и нюансы. Не хочу прослыть занудой, но раз был вопрос про правописание, то может тогда и функции можно называть по-человечески? Но даже если нет, то почему fanc1, а не func1
Потому что автор любит случайный набор букв схожый с другими словами)
Можете изменинть название функции.
Я хотел func, но это примитивно.
[doublepost=1511857777][/doublepost]
В описании 2й функции ошибка закралась;)

Код:
except scan.error:

Код:
except socket.error:
    ...
*

Я заметил, спасибо ;D
 
  • Нравится
Реакции: The Vincenzo
1
Что же мне интересно тебе не понравилось в переменных?)
Просто, если посмотреть, например, на
Код:
print(color_b + "Port -- ", port, " -- [CLOSED]")
, то с port понятно, а с color_b - нет. Можно только догадываться, что это какой-то цвет.
"color black" или "color blue" или вообще что-то цветное и жирное ("color bold")
Я хотел func, но это примитивно.
И не информативно. Название ф-и должно говорить, что она делает.