Статья [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


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

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


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

Dmitry88

Надеюсь у Автора хватит энтузиазма на цикл статей. Здорово, что все наглядно и с примерами. Ну и "...порты любого саЙта.." .
 
  • Нравится
Реакции: gushmazuko
D

Dmitry88

Там же написано, что это будет большой цикл))
Мало ли, что там написано? Может на 3й статье свободное время или энтузиазм иссякнет, т.к. написание и оформление статей требуют времени и сил.
По-этому искренне желаю успехов автору в написании. Почитаю с удовольствием т.к. тема интересная.
 
  • Нравится
Реакции: gushmazuko

SooLFaa

Platinum
15.07.2016
898
1 560
BIT
36
Очень очень очень плохо. У тебя коннект скан. А если IDS? А как поступить если рейт надо ограничить? А цикл для этого зачем? Очень плохая архитектурная практика для учебного материала.
 
V

Valkiria

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

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

vag4b0nd

Red Team
24.05.2017
315
1 499
BIT
68
У меня почему-то возникло желание добавить свои комментарии к статье и тем самым дополнить предыдущие ))
Во-первых, хочется поблагодарить автора за старания, за хорошие начинания.
Хочется надеяться, что он не забросит цикл статей, не остановится на пол-пути, так как "цикл статей" - дело непростое ))
В то-же время, на мой взгляд, правила русского языка в подобных статьях играют ничуть не меньшую роль, чем правила языка программирования : ведь статья носит обучающий характер.
Появление в статье Би-Би-кодов также может восприниматься новичками как код языка программирования и вводить в заблуждение.
В подобных статьях не бывает мелочей.
Упомянутые "мелочи" создают картину уровня преподавания, рисуют представление о профессионализме автора и ещё много о чём...
Ещё один момент непонятен.
Одновременно с этой, автор пишет цикл статей под заголовком "Учим Python."
Признаюсь, я читаю их с интересом)
В случае, если данная статья является продолжением упомянутого цикла, то имеет место огромный пробел в преподавании.
В частности, от операторов цикла сразу состоялся переход к функциям без должной подготовки читателей (
Этот пробел в знаниях неплохо было-бы заполнить ))
Но, в случае, если статьи представляют параллели, то последнее моё замечание - не актуально.
Преподавание - дело непростое ))

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


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

П.С: все пробелы легко заполним новыми знаниями в цикле простых уроков)
 

Urfin--Juice

Green Team
14.11.2017
203
74
BIT
3
AL04E, спасибо за статью. Исключительно актуальная лично для меня тема! Обязательно буду читать...

Если вдруг у Вас программа на этот цикл статей учитывает пожелания, можно попросить написать когда-нибудь алгоритм создания полезной нагрузки на питоне?
 
  • Нравится
Реакции: vag4b0nd
I

in1rovert

Во норм, спасибо!... буду после работы заниматься понемногу
 
  • Нравится
Реакции: The Vincenzo

mCstl

Green Team
08.08.2017
83
71
BIT
0
Напомнило книгу Coding for Penetration Testers. Там все примеры даются в виде сканеров. Вообще интересная книга по скриптовым языкам.
 
D

Darius

Цикл обещает быть интересным, что же, удачи и энтузиазма автору!
Допустим это самый тестовый сканер для примера в плане 'изучения' python. Было бы неплохо в будущем усложнение/реструктурирование кода и логики, дабы складывалось полное впечатление от написания подобных скриптов и применения их в реальной жизни, нежели просто в локалке по баловаться)
 

cherubot

Green Team
08.11.2017
40
19
BIT
0
Всем доброго времени суток. Это мой первый пост на этом форуме. Статья суппер. Жду продолжения.
Но есть и нюансы. Не хочу прослыть занудой, но раз был вопрос про правописание, то может тогда и функции можно называть по-человечески? Но даже если нет, то почему fanc1, а не func1
 
  • Нравится
Реакции: The Vincenzo

vag4b0nd

Red Team
24.05.2017
315
1 499
BIT
68
Как в "Операция "Ы"", чтобы никто не догадался.
Названия переменных тоже не информативны.
Код:
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

Citizen0

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

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