Начало работы
Требования
- 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
Шаги для начала:
- Создайте Google Cloud проект
- Включите Custom Search API
- Создайте API ключ
- Создайте поисковый движок на 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 ключа
- Зарегистрируйтесь на shodan.io
- Перейдите в Settings > API
- Скопируйте ваш 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