• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

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


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

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


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

SooLFaa

Platinum
15.07.2016
898
1 560
BIT
22
**Версия, проходящая цензуру***


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

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


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

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

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

ActionNum

Red Team
27.11.2016
80
93
BIT
0
Посчитал вмешаться. Да простит меня автор поста.Даже если Вы уважаемый призёр соревнований по этому языку,то нельзя же так..
имею в виду задевание Личности.Критика аргументированной должна быть,без негативных последствий,как для автора,так и для читателей.Может и для Вас самих.Зачем задевать-то? Откуда всё это берётся? Вы уж меня простите,новичка в Питоне.Не за это тяну,а за общее уважение и нормальные интересные дискуссии.В дружеском русле критика никогда не помешает,но никак не в таком.
Мы ,Линуксоиды,нас мало,давайте уважать друг друга,давайте жить в мире ,в том,котырый мы только в силах создать и поддерживать.

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

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

ziky

Можно дополнить чтобы результат в отдельный файл сохранял и в конце сканирования было что то типо отчёта. Много чего ещё можно дополнить. Статья огонь, продолжай в том же духе!
 
B

bolshoyseven

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

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

Снимок.JPG
Почему?
 

Dr.Lafa

Green Team
30.12.2016
507
1 049
BIT
0
У меня вместо подсвеченных разным цветом символов выдает следующее:

[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
 

Tayler

Green Team
08.07.2017
40
46
BIT
1
И для аргументов есть даже специальная библиотека
 

Tayler

Green Team
08.07.2017
40
46
BIT
1
Зря, говнокодить зачеркнул.
Хотелось бы услышать комментарий о моем коде)

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)
 
B

bolshoyseven

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

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
 
  • Нравится
Реакции: Tayler

Tayler

Green Team
08.07.2017
40
46
BIT
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)
 
B

bolshoyseven

Если ввести 2, тоже ошибку выдает.
Можно исправить так:
Код:
        print('[+] ' + str(port))
    except:
        print('[-] ' + str(port))
 

MLNK

Mod. Ethical Hacking
Red Team
23.01.2018
560
706
BIT
6
Отличная статья написал бы что жду продолжения но перешол сюда со второй части )))
 

|Snake|

Green Team
14.03.2018
37
3
BIT
0
Приветствую. Тема весьма интересная. Но есть одно замечание в логике работы программы. Именно в логике, архитектура и изящество - вещи не первостепенные и проделываются уже после написания логической базы (понимайте пожалуйста эти слова правильно все здесь присутствующие). Дело вот в чём:
Python:
scan.settimeout(0.5)
Эта функция уменьшает время ожидания. Это не есть хорошо, и эксперименты это подтвердили. Дело в том, что программа просто не дожидается ответа от сканируемого порта, пишет "недоступен" и приступает к следующему. Это актуально для проверки по списку. Единичные не проверял. Вот пруфы:
С функцией
Снимок экрана от 2018-03-15 21-49-23.png
Без функции
Снимок экрана от 2018-03-15 22-05-39.png
Дайте проге время приконнектится...
 
  • Нравится
Реакции: Сергей Попов

SamSepiol

New member
19.06.2017
1
0
BIT
0
import socket


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

Ты очень хорошо и четко объясняешь! Хотел бы задать один вопрос. Где учился всему этому. Хакингу, программированию и тд
 
Последнее редактирование:

shArky

Green Team
07.01.2017
47
41
BIT
0
Статья занимательная, не без ошибок (как раз о них и пойдёт речь), но все мы не идеальны. Если нужна будет помощь в оформлении/орфографии - обращайтесь! С радостью помогу.
 
I

IIzobanII

прошу прощения.... я в целях образования не копипастил а написал весь скрипт руками... я не кодер и вообще это мой первый раз)))
Но нашел следующие ошибки

в блоке

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 -->
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



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

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

explorer

Platinum
05.08.2018
1 080
2 471
BIT
0
У меня вместо подсвеченных разным цветом символов выдает следующее:

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

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


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

cmd.png
 
  • Нравится
Реакции: Unison
Мы в соцсетях:

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