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


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

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


Буду признателен, если укажете орфографические ошибки.
 
Последнее редактирование:
У меня выбивает Invalid syntax и подсвечен except в функции fanc1()

Использую Python 3.4.3

Там же понятным английским языком все написано

Теперь я могу называть себя настоящим мамкиным хаЦкером!
Кстати, в коде вагонетка ошибок и недочетов (мб спецально? :unsure:). Пришлось многое править и дополнять. Довел дело до ума и получилась неплохая такая миним-программка с анимационной превьющкой. Код где то вышел строк на 500-600 (хз точно, у меня все по отдельным объектам разбито, для удобства).
Только начал изучать пайтон и этот урок подтолкнул к изучению сетевого программирования.
Спасибо за труд)
 
  • Нравится
Реакции: u7u
Привет, у меня не находит библиотеку termcolor, че делать?
 
Привет, у меня не находит библиотеку termcolor, че делать?

pip install termcolor

Если чего-то не хватает, всегда нужно это устанавливать. И всегда в трейсе будет написана причина неработоспособности, так что читайте вывод программы и устанавливайте необходимые модули.
 
pip install termcolor

Если чего-то не хватает, всегда нужно это устанавливать. И всегда в трейсе будет написана причина неработоспособности, так что читайте вывод программы и устанавливайте необходимые модули.
Да, спасибо, уже разобрался, просто я новичок в этой сфере и некоторые вещи мне даются с трудом))
 
Последнее редактирование:
Да, спасибо, уже разобрался, просто я новичок в этой сфере и некоторые вещи мне даются с трудом))

Держи сайт и сохрани в закладках
Вбиваешь там название библиотеки - напишет что вбивать в консоль и распишет что по чем там)
 
  • Нравится
Реакции: Alex Trim и explorer
Спасибо автору за старания я все делал с помощью termux и у меня возникли трудности с модулем termcolor, если кто то тоже делает это в termux то решается эта проблема вот так: pip install termcolor

До меня уже это писали, извините не заметил 😂😂😂
 
Привет из 2019!

Интересная статья. Спасибо.
 
лучше не использовать scan.settimeout(0.5), а то он быстро сканирует и не может найти порт
 
Что-то у меня библиотека termcolor тупит, у всех так? Или я особенный? Писал сам, пробовал так же скопипастить код автора, результат один и тот же :э
1591544087692.png
1591544087692.png
 
Что-то у меня библиотека termcolor тупит, у всех так? Или я особенный? Писал сам, пробовал так же скопипастить код автора, результат один и тот же :э
Просто termcolor не работает в Windows, пользуйтесь модулем .
 
Просто termcolor не работает в Windows, пользуйтесь модулем .
Почему нет? На Stackoverflow нашел решение, надо после:
from termcolor import colored
import socket
дописать:
import subprocess
subprocess.call('', shell=True)

После этого каракули исчезли, termcolor заработал :)
 
Почему нет? На Stackoverflow нашел решение, надо после:
from termcolor import colored
import socket
дописать:
import subprocess
subprocess.call('', shell=True)

После этого каракули исчезли, termcolor заработал :)

Это вы про суп из топора написали топор (termcolor) + крупа, соль (subprocess) = костыльное решение. Любые модули пишутся как независимое решение.
 
  • Нравится
Реакции: init_error
А на винде библиотека termcolor работает??? И если ее заменять colorama, то тогда что импортировать вместо colored???

Почему нет? На Stackoverflow нашел решение, надо после:
from termcolor import colored
import socket
дописать:
import subprocess
subprocess.call('', shell=True)

После этого каракули исчезли, termcolor заработал :)
Не работает. Только что скопипастил...
 
Вроде ,как всё супер ,да вот только цвета не работают (модули есть всё есть)
 
Спасибо за статью. Нашёл несколько опечаток в тексте:

Чтобы особо умные люди не задовали вопросов по типу
Чтобы особо умные люди не задавали вопросов по типу

Представьте себе реальный порт(те что с кораблями).
Представьте себе реальный порт (тот, что с кораблями).

Так вот корабль это определенный кусок данных(пакет),
Так вот, корабль это определённый кусок данных (пакет),

В этом порту с ним произойдет какие либо действия.
В этом порту с ним произойдут какие-либо действия.
 
  • Нравится
Реакции: vag4b0nd
В новом Python нужно заменить except scan.error на просто except. И порт должен быть преобразован в int()
 
Мы в соцсетях:

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