Начало работы

Требования

  • Python 3.8+
  • bash/zsh (для скриптов)
  • curl или wget
  • git
  • Базовые знания командной строки

Установка зависимостей (Linux/Mac)

# Ubuntu/Debian sudo apt-get update sudo apt-get install python3 python3-pip curl git # macOS brew install python3 curl git # Windows # Используйте WSL или установите Python с python.org

API гайды

Google Custom Search API

Назначение: Добавить мощный поиск на ваш сайт

Документация: developers.google.com

Шаги для начала:

  1. Создайте Google Cloud проект
  2. Включите Custom Search API
  3. Создайте API ключ
  4. Создайте поисковый движок на cse.google.com

Пример запроса

curl "https://www.googleapis.com/customsearch/v1" \ -G \ -d "q=OSINT" \ -d "key=YOUR_API_KEY" \ -d "cx=YOUR_SEARCH_ENGINE_ID"

Shodan API

Назначение: Поиск интернет-подключенных устройств

Документация: developer.shodan.io

Получение API ключа

  1. Зарегистрируйтесь на shodan.io
  2. Перейдите в Settings > API
  3. Скопируйте ваш API ключ

Пример на Python

import shodan api = shodan.Shodan('YOUR_API_KEY') try: # Поиск сервера results = api.search('Apache/2.4.41') print('Results found: {}'.format(results['total'])) for result in results['matches']: print('IP: {}'.format(result['ip_str'])) print('Port: {}'.format(result['port'])) print('') except shodan.APIError as e: print('Error: {}'.format(e))

Twitter API

Назначение: Работа с твитами и профилями

Документация: developer.twitter.com

Пример на Python

import tweepy # Аутентификация auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth) # Поиск твитов tweets = api.search_tweets(q="OSINT", count=10) for tweet in tweets: print(tweet.text)

Примеры кода

Пример 1: Поиск email адреса

import re def find_emails(text): """Найти все email адреса в тексте""" email_pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' return re.findall(email_pattern, text) # Использование text = "Contact us at support@example.com or info@example.org" emails = find_emails(text) print(emails) # ['support@example.com', 'info@example.org']

Пример 2: Извлечение EXIF данных

from PIL import Image from PIL.ExifTags import TAGS def get_exif_data(image_path): """Извлечь EXIF данные из фотографии""" image = Image.open(image_path) exif_data = image._getexif() if not exif_data: return None exif = {} for tag_id, value in exif_data.items(): tag = TAGS.get(tag_id, tag_id) exif[tag] = value return exif # Использование exif = get_exif_data('photo.jpg') if exif: for key, value in exif.items(): print(f"{key}: {value}")

Пример 3: Проверка доступности сайта

import requests from datetime import datetime def check_website(url): """Проверить доступность и статус сайта""" try: response = requests.get(url, timeout=5) return { 'url': url, 'status': response.status_code, 'time': datetime.now(), 'available': response.status_code == 200 } except requests.exceptions.RequestException as e: return { 'url': url, 'status': None, 'time': datetime.now(), 'error': str(e), 'available': False } # Использование result = check_website('https://example.com') print(result)

Пример 4: Анализ структуры сайта

import requests from bs4 import BeautifulSoup from urllib.parse import urljoin, urlparse def crawl_website(url, max_depth=2): """Простой краулер для сбора информации со страниц""" visited = set() to_visit = [url] results = [] while to_visit and len(visited) < max_depth * 10: current_url = to_visit.pop(0) if current_url in visited: continue visited.add(current_url) try: response = requests.get(current_url, timeout=5) soup = BeautifulSoup(response.content, 'html.parser') # Извлечение ссылок for link in soup.find_all('a', href=True): href = urljoin(current_url, link['href']) if urlparse(href).netloc == urlparse(url).netloc: if href not in visited: to_visit.append(href) results.append({ 'url': current_url, 'title': soup.title.string if soup.title else 'No title', 'links_count': len(soup.find_all('a')) }) except Exception as e: print(f"Error crawling {current_url}: {e}") return results # Использование results = crawl_website('https://example.com', max_depth=2) for result in results: print(result)

Bash скрипты

Скрипт 1: Сбор информации о домене

#!/bin/bash # domain_info.sh - Сбор информации о домене domain=$1 if [ -z "$domain" ]; then echo "Usage: $0 domain.com" exit 1 fi echo "=== Информация о домене: $domain ===" # WHOIS информация echo -e "\n[WHOIS]" whois $domain | head -20 # DNS записи echo -e "\n[DNS A records]" nslookup $domain # MX записи echo -e "\n[MX records]" dig +short mx $domain # NS записи echo -e "\n[NS records]" dig +short ns $domain # TXT записи echo -e "\n[TXT records]" dig +short txt $domain # HTTP заголовки echo -e "\n[HTTP Headers]" curl -I https://$domain 2>/dev/null | head -10 echo -e "\n=== Завершено ==="

Скрипт 2: Сканирование портов

#!/bin/bash # port_scan.sh - Сканирование открытых портов target=$1 port_start=${2:-1} port_end=${3:-1000} if [ -z "$target" ]; then echo "Usage: $0 target [start_port] [end_port]" exit 1 fi echo "Сканирование портов на $target (порты $port_start-$port_end)" for port in $(seq $port_start $port_end); do timeout 0.1 bash -c "echo >/dev/tcp/$target/$port" 2>/dev/null && \ echo "Port $port: OPEN" done echo "Сканирование завершено"

Скрипт 3: Мониторинг файлов

#!/bin/bash # file_monitor.sh - Мониторинг изменений файла file=$1 check_interval=${2:-5} if [ -z "$file" ]; then echo "Usage: $0 file [interval_seconds]" exit 1 fi prev_hash="" echo "Мониторинг файла: $file" while true; do current_hash=$(md5sum "$file" 2>/dev/null | cut -d' ' -f1) if [ "$prev_hash" != "$current_hash" ]; then echo "[$(date +'%Y-%m-%d %H:%M:%S')] Файл изменен!" prev_hash=$current_hash fi sleep $check_interval done

Python инструменты

Создание вашего первого инструмента

requirements.txt

requests==2.31.0 beautifulsoup4==4.12.0 pillow==10.0.0 shodan==1.30.0 tweepy==4.14.0 python-dotenv==1.0.0

osint_tool.py

#!/usr/bin/env python3 import requests import argparse from bs4 import BeautifulSoup import json class OSINTTool: def __init__(self): self.session = requests.Session() def get_website_info(self, url): """Получить базовую информацию о сайте""" try: response = self.session.get(url, timeout=5) soup = BeautifulSoup(response.content, 'html.parser') info = { 'url': url, 'status_code': response.status_code, 'title': soup.title.string if soup.title else None, 'meta_description': None, 'links_count': len(soup.find_all('a')), 'scripts': len(soup.find_all('script')), 'forms': len(soup.find_all('form')) } # Метаданные for meta in soup.find_all('meta'): if meta.get('name') == 'description': info['meta_description'] = meta.get('content') return info except Exception as e: return {'error': str(e)} def check_email_validity(self, email): """Простая проверка email""" import re pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$' return bool(re.match(pattern, email)) def main(): parser = argparse.ArgumentParser(description='OSINT Tool') parser.add_argument('--url', help='Анализировать URL') parser.add_argument('--email', help='Проверить email') args = parser.parse_args() tool = OSINTTool() if args.url: info = tool.get_website_info(args.url) print(json.dumps(info, indent=2, ensure_ascii=False)) elif args.email: valid = tool.check_email_validity(args.email) print(f"Email {args.email}: {'Valid' if valid else 'Invalid'}") if __name__ == '__main__': main()

Использование

python3 osint_tool.py --url https://example.com python3 osint_tool.py --email test@example.com

Лучшие практики

1. Управление API ключами

Никогда не размещайте API ключи в коде!

# .env файл SHODAN_API_KEY=xxxxxxxxxxxxxxxx TWITTER_API_KEY=yyyyyyyyyyyyyy # Python код from dotenv import load_dotenv import os load_dotenv() api_key = os.getenv('SHODAN_API_KEY')

2. Обработка ошибок

try: response = requests.get(url, timeout=5) response.raise_for_status() except requests.exceptions.Timeout: print("Timeout: сервер не ответил") except requests.exceptions.ConnectionError: print("Connection error: нет интернета") except requests.exceptions.HTTPError as e: print(f"HTTP error: {e}") except Exception as e: print(f"Unexpected error: {e}")

3. Rate limiting

import time def rate_limited_request(urls, delay=1): """Запросы с задержкой между ними""" for url in urls: try: response = requests.get(url, timeout=5) yield response except Exception as e: print(f"Error: {e}") finally: time.sleep(delay) # Использование for response in rate_limited_request(url_list, delay=2): print(response.status_code)

4. Логирование

import logging # Настройка логирования logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler('app.log'), logging.StreamHandler() ] ) logger = logging.getLogger(__name__) logger.info("Приложение запущено") logger.warning("Предупреждение") logger.error("Ошибка произошла")

Решение проблем

Проблема: SSL Certificate Error

Ошибка: SSLError: certificate verify failed

Решение:

# Не рекомендуется! Используйте для отладки import requests requests.get(url, verify=False) # Правильное решение: обновите сертификаты # macOS /Applications/Python\ 3.x/Install\ Certificates.command # Linux pip install --upgrade certifi

Проблема: Module not found

Ошибка: ModuleNotFoundError: No module named 'requests'

Решение:

# Установите зависимости pip install requests # Или все зависимости сразу pip install -r requirements.txt # Проверьте версию Python python3 --version

Проблема: Rate limiting

Ошибка: 429 Too Many Requests

Решение:

import time import random def retry_with_backoff(func, max_retries=3): for attempt in range(max_retries): try: return func() except Exception as e: if attempt < max_retries - 1: wait_time = 2 ** attempt + random.random() print(f"Retry in {wait_time:.1f}s...") time.sleep(wait_time) else: raise e

Проблема: Encoding issues

Ошибка: UnicodeDecodeError

Решение:

# При работе с файлами with open('file.txt', 'r', encoding='utf-8') as f: content = f.read() # При работе с веб-контентом response = requests.get(url) response.encoding = 'utf-8' # Установить кодировку text = response.text