1. Введение: Зачем Python специалисту по кибербезопасности?
Python — это язык №1 в мире кибербезопасности. Почему? Потому что он позволяет невероятно быстро превращать идеи в работающие инструменты. Вам не нужно тратить недели на написание сложного кода на C++. На Python вы можете написать простой сканер портов или скрипт для брутфорса за 15 минут.
Где используется Python в нашей сфере:
- Автоматизация рутины: Написание скриптов для сканирования сетей, сбора информации, анализа логов.
- Написание эксплойтов: Быстрое прототипирование и написание PoC (Proof of Concept) для уязвимостей.
- Анализ вредоносного ПО: Разбор и анализ поведения вирусов.
- Веб-скрапинг и OSINT: Автоматический сбор информации из открытых источников.
- Работа с сетью: Анализ и создание сетевых пакетов с помощью библиотек вроде Scapy.
Установка: Перейдите на официальный сайт Python, скачайте и установите последнюю версию. При установке на Windows обязательно поставьте галочку "Add Python to PATH". Проверить установку можно в терминале:
python --version
2. Основы: Переменные и Типы данных
Переменная — это именованный контейнер для хранения данных. Вы даете имя, кладете в него значение, и потом можете это значение использовать или изменять.
Python — язык с динамической типизацией. Это значит, что вам не нужно объявлять тип переменной. Интерпретатор сам поймет, что вы в нее положили.
Основные типы данных:
- str (строка): Текст. Заключается в одинарные
'
или двойные"
кавычки.target_ip = "192.168.1.1"
- int (целое число):
port = 80
- float (число с плавающей точкой):
version = 2.1
- bool (булево значение): Только
True
илиFalse
(с большой буквы!).is_open = True
# Создаем переменные разных типов
target_host = "scanme.nmap.org"
port_to_scan = 443
scan_timeout = 5.5
verbose_mode = True
# Выводим значения и их типы
print(f"Цель: {target_host}, Тип: {type(target_host)}")
print(f"Порт: {port_to_scan}, Тип: {type(port_to_scan)}")
Конструкция f"..."
называется f-строкой. Это самый современный и удобный способ форматирования строк в Python.
3. Операторы и выражения
Операторы — это символы, которые выполняют операции над переменными и значениями.
Арифметические операторы:
+
, -
, *
, /
(деление), //
(целочисленное деление), %
(остаток от деления), **
(возведение в степень).
Операторы сравнения:
==
(равно), !=
(не равно), >
, <
, >=
, <=
. Результат всегда True
или False
.
Логические операторы:
and
(логическое И), or
(логическое ИЛИ), not
(логическое НЕ). Используются для комбинирования условий.
port = 80
is_encrypted = False
# Проверить, является ли порт стандартным веб-портом
if port == 80 or port == 443:
print("Это веб-порт")
# Проверить, является ли соединение небезопасным
if port == 80 and not is_encrypted:
print("ВНИМАНИЕ: Небезопасное HTTP соединение!")
4. Условный оператор: if / elif / else
Это основа логики любой программы. Конструкция `if` позволяет выполнять код только при выполнении определенного условия.
Внимание на отступы! В Python блоки кода определяются не фигурными скобками, а отступами (обычно 4 пробела). Это строгое правило. Неправильный отступ — синтаксическая ошибка.
- if: Проверяет первое условие. Если оно истинно, выполняет блок кода и выходит.
- elif (else if): Если `if` ложно, проверяет это условие. `elif` блоков может быть сколько угодно.
- else: Если все предыдущие условия ложны, выполняется этот блок.
# Простой анализатор портов
port = 22
if port == 21:
print("Обнаружен FTP-сервер.")
elif port == 22:
print("Обнаружен SSH-сервер. Проверьте безопасность!")
elif port == 80:
print("Обнаружен HTTP веб-сервер.")
elif port == 443:
print("Обнаружен HTTPS веб-сервер.")
else:
print(f"Неизвестный сервис на порту {port}.")
5. Цикл For: Перебор всего
Цикл for
— это ваш главный инструмент для итерации. Он позволяет "пройтись" по любому итерируемому объекту (строке, списку, диапазону чисел) и выполнить действие для каждого его элемента.
Перебор диапазона чисел с `range()`
Функция range(start, stop, step)
генерирует последовательность чисел. stop
не включается в диапазон!
# Сканируем "хорошо известные" порты от 1 до 1024
print("Начинаем сканирование...")
for port in range(1, 1025):
# Здесь будет логика сканирования
print(f"Сканирую порт {port}...")
print("Сканирование завершено.")
Перебор символов в строке
Строка — это тоже последовательность. Цикл `for` может пройтись по каждому ее символу.
password_hash = "5f4dcc3b5aa765d61d8327deb882cf99"
allowed_chars = "0123456789abcdef"
for char in password_hash:
if char not in allowed_chars:
print(f"Ошибка: хэш содержит недопустимый символ '{char}'!")
break # Прерываем цикл
6. Цикл While и вложенные циклы
Цикл `while`
Цикл `while` выполняется до тех пор, пока его условие истинно. Он идеален, когда вы не знаете заранее, сколько итераций потребуется.
Следите за условием выхода! Если условие никогда не станет ложным, вы получите бесконечный цикл, и программа зависнет.
# Простая симуляция подбора пароля
attempts = 0
max_attempts = 1000
while attempts < max_attempts:
print(f"Попытка №{attempts + 1}...")
# Здесь была бы логика проверки пароля
attempts += 1 # <- Критически важная строка, изменяющая условие!
print("Достигнут лимит попыток.")
Вложенные циклы
Это цикл внутри другого цикла. Они используются для перебора комбинаций. Классический пример в кибербезопасности — брутфорс по словарю.
# Брутфорс по маленьким словарям
logins = ["admin", "root", "user"]
passwords = ["12345", "password", "qwerty"]
for login in logins:
for password in passwords:
print(f"Пробую комбинацию: {login}:{password}")
# Здесь была бы логика отправки запроса на аутентификацию
7. Работа с числами: int/float и их особенности
Мы уже знакомы с типами int
и float
. Но у `float` есть важная особенность, о которой нужно знать.
Компьютеры хранят числа в двоичной системе, и некоторые десятичные дроби (например, 0.1) не могут быть представлены точно. Это приводит к микроскопическим ошибкам округления.
# Этот код выведет False, что может удивить!
print(0.1 + 0.2 == 0.3)
# Вывод: False
# Потому что реальный результат будет примерно 0.30000000000000004
print(0.1 + 0.2)
Для большинства задач в нашей сфере эта точность не критична. Но если вы работаете с криптографией или финансовыми расчетами, нужно использовать специальный модуль `Decimal` для точных вычислений.
Преобразование типов делается просто: int()
, float()
, str()
.
user_input = "8080"
port_number = int(user_input) # Превращаем строку в число
8. Функции: Строительные блоки ваших программ
Функция — это именованный, многократно используемый блок кода, который выполняет определенную задачу. Функции — основа хорошего, читаемого и поддерживаемого кода. Принцип DRY (Don't Repeat Yourself) — Не повторяйся!
Функция определяется с помощью ключевого слова def
. Она может принимать аргументы (входные данные) и возвращать результат с помощью return
.
# Определяем функцию для проверки порта
def check_port_service(port_number):
"""
Эта функция принимает номер порта и возвращает
название предполагаемого сервиса.
"""
if port_number == 80:
return "HTTP"
elif port_number == 443:
return "HTTPS"
elif port_number == 22:
return "SSH"
else:
return "Unknown"
# Используем (вызываем) нашу функцию
service1 = check_port_service(80)
service2 = check_port_service(9999)
print(f"Сервис на порту 80: {service1}")
print(f"Сервис на порту 9999: {service2}")
Текст в тройных кавычках называется docstring (строка документации). Это хорошая практика, объясняющая, что делает функция.
9. Практика: Пишем свой первый инструмент
Давайте объединим все, что мы выучили, и напишем простой, но полезный скрипт — сканер портов. Он будет проверять, какие из заданных портов "открыты" на целевом хосте.
Задача: Написать скрипт, который:
- Определяет целевой хост (IP-адрес или доменное имя) в переменной.
- Определяет список портов для сканирования (например, 21, 22, 80, 443, 8080).
- Использует цикл `for` для перебора портов из списка.
- Внутри цикла вызывает функцию `scan_port(host, port)`.
- Функция `scan_port` должна имитировать проверку (мы пока не умеем работать с сетью по-настоящему) и случайным образом возвращать `True` (порт открыт) или `False` (порт закрыт).
- Скрипт должен выводить на экран результат для каждого порта, используя конструкцию `if/else`.
Это задание заставит вас использовать переменные, списки, циклы, функции и условные операторы — весь арсенал, который мы освоили сегодня.
Подсказка: для случайного выбора используйте модуль `random`. В начале файла напишите import random
, а в функции используйте return random.choice([True, False])
.