Статья [Python для хакера] - Часть 1. Начало.

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

Почему 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


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

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


Буду признателен, если укажете орфографические ошибки.
 
Последнее редактирование:
K

koctuk

Я так понимаю программа сканирует только tcp-порты?а как же udp?
 

Shihskauskas

Green Team
06.11.2017
41
14
BIT
0
Можно ещё на выходе просто список открытых портов выводить. Ну этот так, предложение;)
 
  • Нравится
Реакции: IioS

gerd

Green Team
21.09.2017
97
18
BIT
0
root@gnom:~/p# python p.py
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[1] --- сканировать отделный порт
[2] --- сканировать список
('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', '\n')------эта строка неправильно отображается?
[scan]--> 1
Параметр введен не правильно!
Здравствуйте! Что у меня не так? что надо ввести после scan]--> ????
 

vag4b0nd

Red Team
24.05.2017
314
1 497
BIT
85
root@gnom:~/p# python p.py
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[1] --- сканировать отделный порт
[2] --- сканировать список
('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', '\n')------эта строка неправильно отображается?
[scan]--> 1
Параметр введен не правильно!
Здравствуйте! Что у меня не так? что надо ввести после scan]--> ????

Можно пожалуйста скрин?
 
T

TST

Не могу запустить скрипт выдает ошибку
Код все проверил и указано как написано по уроку
Screenshot from 2017-11-29 10-38-24.png
 

rink0

Green Team
28.11.2017
62
65
BIT
0
Информативно и полезно, жду ещё статьи :3
А те кто пристают к написанию переменных то это дебилизм, ибо переменные это можно сказать имя которое даёт автор, люди же не говорят другим почему ты назвал своего сына Алексей а не Александр.
Если вам не нравится измените)
 

mrOkey

Well-known member
14.11.2017
967
975
BIT
0
Ты видимо сам недавно начал питон учить, в лучшем случае по статьям в гугле, в худшем ты вообще далёк от программирования в целом. Зря, говнокодить зачеркнул.
Но, чтоб не быть многословным пройдусь по самым очевидным проблемам:
1. Наименования:
1.1. Что такое color_a, color_b, color_c (тебе уже указывал на это до меня и правильно)? Переменные нужны, чтоб любой человек мог в любой момент понять что скрывается за ней. Будь намного удачнее назови ты их по смыслу: color_a - у тебя это зелёный плюсик в квадратных скобках, так бы и назвал ( на английском, разумеется) не вдумываясь, потом бы до чего-нибудь нормального дошёл, с тем же успехом можно x/y/z назвать было. По-правде говоря я не совсем понимаю зачем тебе целых три переменных для этого, ну допустим для удобочитаемости, но так нет, не очевидно ведь.
1.2. У нас принято любые коллекции (перечисления, списки и т.д.) называть множественным числом, потому что их бл**ь много.
1.3. Fanc1-2\Func1-2. Ну это совсем п***. Это даже не уровень джуна. А что ты будешь делать когда у тебя счётчик до 10 дойдёт? А через 2 месяца, зайдя ты будешь опять заново во всём разбираться?

2. Архитектура: ну тут совсем всё просто - тебе незнакомо сиё понятие в принципе. Ты нарушаешь вообще все принципы хорошей архитектуры (да что лукавить, ты вообще нарушил всё что связано с программированием). Ну если хочешь конкретики: наглухо нарушены SOLID принципы, причём все и одновременно, пусть это даже "функциональщина" такие принципы как единственная обязанность и "не повторяйся" должны хоть как-то отражаться у разработчика, который взялся учить других.
3. Захардкордить всё или пусть сами разберутся. (Под захардкордить я подразумеваю "твой" список популярных портов, написать прямо в коде). Я согласен - этим ****мом никто пользоваться не станет, но если ты для себя такие утилы пишешь как заявлено в статье, то тебе действительно стоит задуматься о смене деятельности.

Я не сказал ещё о многих проблемах присущих этому коду, не хочу тратить время на это и делать "учителю" код-ревью. Я могу допустить что пентестер может быть слаб в программировании, но какого чёрта ты показываешь свою некомпетентность? Фраза "молчи - за умного сойдёшь" уместна как никогда.

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

vag4b0nd

Red Team
24.05.2017
314
1 497
BIT
85
Ты видимо сам недавно начал питон учить, в лучшем случае по статьям в гугле, в худшем ты вообще далёк от программирования в целом. Зря, говнокодить зачеркнул.
Но, чтоб не быть многословным пройдусь по самым очевидным проблемам:
1. Наименования:
1.1. Что такое color_a, color_b, color_c (тебе уже указывал на это до меня и правильно)? Переменные нужны, чтоб любой человек мог в любой момент понять что скрывается за ней. Будь намного удачнее назови ты их по смыслу: color_a - у тебя это зелёный плюсик в квадратных скобках, так бы и назвал ( на английском, разумеется) не вдумываясь, потом бы до чего-нибудь нормального дошёл, с тем же успехом можно x/y/z назвать было. По-правде говоря я не совсем понимаю зачем тебе целых три переменных для этого, ну допустим для удобочитаемости, но так нет, не очевидно ведь.
1.2. У нас принято любые коллекции (перечисления, списки и т.д.) называть множественным числом, потому что их бл**ь много.
1.3. Fanc1-2\Func1-2. Ну это совсем п***. Это даже не уровень джуна. А что ты будешь делать когда у тебя счётчик до 10 дойдёт? А через 2 месяца, зайдя ты будешь опять заново во всём разбираться?

2. Архитектура: ну тут совсем всё просто - тебе незнакомо сиё понятие в принципе. Ты нарушаешь вообще все принципы хорошей архитектуры (да что лукавить, ты вообще нарушил всё что связано с программированием). Ну если хочешь конкретики: наглухо нарушены SOLID принципы, причём все и одновременно, пусть это даже "функциональщина" такие принципы как единственная обязанность и "не повторяйся" должны хоть как-то отражаться у разработчика, который взялся учить других.
3. Захардкордить всё или пусть сами разберутся. (Под захардкордить я подразумеваю "твой" список популярных портов, написать прямо в коде). Я согласен - этим ****мом никто пользоваться не станет, но если ты для себя такие утилы пишешь как заявлено в статье, то тебе действительно стоит задуматься о смене деятельности.

Я не сказал ещё о многих проблемах присущих этому коду, не хочу тратить время на это и делать "учителю" код-ревью. Я могу допустить что пентестер может быть слаб в программировании, но какого чёрта ты показываешь свою некомпетентность? Фраза "молчи - за умного сойдёшь" уместна как никогда.

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

Я конечно уважаю мнение других, но ваш комментарий расцениваю как очень тонкое оскорбление каким он и является.

Ваша рекоммендация удалить статью из главной стр. и не советовать ее другим - это полный бред. Статью отценили положительно и нет плохих отзывов не считая вашего.

Возьмите себе на заметку 2-е вещи.
  • Я знаю Python)
  • Еслиб я как вы не имел уважение к автору, то написал бы вам в ответ нечто подобноеЕдинственное что я могу сделать с твоим комментарием так это зусуну.....
 
  • Нравится
Реакции: Vertigo

Vertigo

Lex mea est Vulgate Linux
Gold Team
15.02.2017
1 318
3 999
BIT
3
Максимально не рекомендую читать статью и копипастить данный материал, а с главной так вообще удалить - засмеют).
Посчитал вмешаться. Да простит меня автор поста.Даже если Вы уважаемый призёр соревнований по этому языку,то нельзя же так..
имею в виду задевание Личности.Критика аргументированной должна быть,без негативных последствий,как для автора,так и для читателей.Может и для Вас самих.Зачем задевать-то? Откуда всё это берётся? Вы уж меня простите,новичка в Питоне.Не за это тяну,а за общее уважение и нормальные интересные дискуссии.В дружеском русле критика никогда не помешает,но никак не в таком.
Мы ,Линуксоиды,нас мало,давайте уважать друг друга,давайте жить в мире ,в том,котырый мы только в силах создать и поддерживать.

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

mrOkey

Well-known member
14.11.2017
967
975
BIT
0
**Версия, проходящая цензуру***
Посчитал вмешаться. Да простит меня автор поста.Даже если Вы уважаемый призёр соревнований по этому языку,то нельзя же так..
имею в виду задевание Личности.Критика аргументированной должна быть,без негативных последствий,как для автора,так и для читателей.Может и для Вас самих.Зачем задевать-то? Откуда всё это берётся? Вы уж меня простите,новичка в Питоне.Не за это тяну,а за общее уважение и нормальные интересные дискуссии.В дружеском русле критика никогда не помешает,но никак не в таком.
Мы ,Линуксоиды,нас мало,давайте уважать друг друга,давайте жить в мире ,в том,котырый мы только в силах создать и поддерживать.

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

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

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

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

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

Постарайся в следующий раз при получении критики (от меня, я просто так поливать не стану) проверить, действительно ли твоё виденье совпадает с общепринятыми практиками.
 
Последнее редактирование:
  • Нравится
Реакции: Polyglot

Shihskauskas

Green Team
06.11.2017
41
14
BIT
0
Вроде взрослый форум, а такие словесные вбросы происходят
 

wooolff

Green Team
19.02.2017
233
36
BIT
0
а что такая за библиотека termcolor? Она по ходу не встроенная?
 
Мы в соцсетях:

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