Gidroponika
VIP
- Joined
- Aug 17, 2016
- Messages
- 1,788
- Reaction score
- 826
Всех приветствую дорогие друзья! Долго думая, я решил начать цикл статей по сами знаете какой теме. В этой части я посмотрю , нужно ли вам это вообще. Вести я буду этот цикл параллельно с простыми уроками по питону. И собственно проводить в этом разделе. Т.к. относится это к хеку. Начнем)
Почему Python?
1. Всем итак понятно, что его синтаксис очень и очень понятен.Почему Python?
2. Python имеет много плюшек. Очень много отличных библиотек зачастую повышающих функционал.
3. Python он и в Windows Python.
Как все будет?
Мы начнем с малого. Сегодня создадим простой сканер портов. А в конце цикла, напишем для себя простенький фреймворк с некоторым количеством полезностей)Я постараюсь в разы облегчить все что мы будем писать. Ну и как же без практики? Конечно же будут задания! Куда без них.
Пишем простой сканер портов.
Чтобы особо умные люди не задавали вопросов по типу:
Зачем писать если есть nmap?
Отвечаю сразу: А затем, чтобы вырваться из объятий ламера и уметь самому г@вн@кодить писать тулзы.
Для начала обсудим, как же будет работать наш "Hello, world!" в этой сфере)
Для совсем не знающих о портах представляю свои обьяснения ниже:
Постараюсь обойтись без терминов. Представьте себе реальный порт(те что с кораблями). Так вот корабль это определенный кусок данных(пакет), он движется по определенному пути(каналу) к определенному порту. В этом порту с ним произойдет какие либо действия. Этот карабль(пакет) могут разгрузить(получить ланные) , а могут послать подальше если порт закрыт на ремонт.
А вот теперь поговорим про закрытые порты и открытые порты.
Code:
Порт закрыт - это значит что установить соединение с этим портом нельзя.
Code:
Открытый порт - аналогично, это порт с которым можно установить соединение и обменятся информацией.
Разберемся пока что с этим. Вернемся к обсуждению алгоритма работы нашего простенького сканера.
Code:
1. Спрашивает тип.
2. Спрашивает данные.
3. Создает сокет
4. Подключается к host:port
5. Определяет открыт или закрыт.
6. Красиво выводит)
Да, ребятки, мы будем сегодня пользоватся сокетами. И вообще с ними будем очень часто работать в этом цикле.
Code:
Сокет - коротко говоря, интерфейс для обмена данными между устройствами.
Приступим к написанию нашего кода.
1. Подключаем библиотеки. Нам понадобятся 2-е библиотеки, socket и termcolor( отдельное спасибо DarkNode)
Code:
from termcolor import colored
import socket
2. А теперь создадим "меню". Программа будет спрашивать у нас. Сканировать список "популярных портов", или только то, что напишм мы.
Code:
...
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.
Code:
color_a = colored("[+] ", 'green')
print("~"*50)
host = input(color_a + "Host --> ")
port = int(input(color_a + "Port --> "))
print("~"*50)
Для декора можно использовать декораторы, но я не стал настолько все усложнять.
Теперь создадим сокет
Code:
scan = socket.socket()
Теперь коннектимся и определяем
Code:
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().
Code:
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. Вторая функция)
Тут все на мноого проще. Спросим у пользователя только хост. А порты зададим в список. Естественно проверять их будем еще и циклом
Code:
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 можете добавить какие хотите порты. Я для примера добавил малость. А теперь к самому интересному. В цикле повторим прошлые действия(немного видоизменив)
Code:
...
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)
Code:
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]")
Также для быстроты сканирования я добавил строчку
Code:
scan.settimeout(0.5)
Я был удивлен результатом, но он очень быстро начал сканировать.
А теперь осталось все соединить.
Code:
# -*- 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'))
Итог:
View attachment 8820
View attachment 8821
View attachment 8822
View attachment 8823
Надеюсь вам понравилась данная статья!
Ваше задание будет очень простым. На первый раз просто разберитесь в выше мною написанном и просканируйте порты любого сайта))
СЛЕДУЮЩАЯ ЧАСТЬ
Last edited: