
Приветствуем дорогих читателей! Начинаем рубрику посвящённую нейросетям и их применению в сфере ИБ. В этой статье мы сравним 3 самых популярных и одну малоизвестную ИИ в разработке скриптов для эффективного поиска никнеймов и сканирования хостов на уязвимости.
Дисклеймер: Все данные, предоставленные в статье, взяты из открытых источников. Не призывают к действию и предоставлены только для ознакомления и изучения механизмов используемых технологий.
Постановка задачи
Предположим что требуется создать два скрипта на ЯП Python. Первый скрипт должен сканировать маску подсети или отдельно взятые хосты на сбор следующей информации: открытые порты, сервисы использующие порты и их версии, поиск CVE под эти сервисы. Второй скрипт должен искать никнейм в социальных сетях и иных интернет-ресурсов актуальных для СНГ, в том числе предоставлять краткую информацию о аккаунте если она имеется. В качестве тестируемых ИИ возьмём: ChatGPT, Perplexity, DeepSeek и Together.
Этапы создания и промпты к ним
Этапы создания сетевого сканера:
Сканирование сети.
Промпт: “Напиши на python сетевой сканер в котором можно задавать в параметрах собственную маску подсети”;
Сканирование устройств на открытые порты и версии доступных сервисов.
Промпт: “Теперь нужно чтобы он сканировал порты и отображал работающие на них сервисы с версией ПО”;
Поиск CVE по сервисам и их версиям.
Промпт: “Теперь добавь поиск уязвимостей по каждому сервису”.
Этапы создания скрипта для поиска никнейма:
Проверка наличия на популярных соц.сетях и интернет-ресурсах в странах СНГ.
Промпт: “Напиши скрипт на Python для поиска никнейма по самым популярным социальным сетям и ресурсам СНГ”;
Выдача краткой информации по каждой найденной учётной записи.
Промпт: “Теперь нужно добавить краткую информацию к каждому найденному аккаунту”.
После тестов будем проводить анализ кода каждого скрипта который получиться в итоге.
Инструмент GodMode
Для наибольшего удобства возьмём проект с открытым исходным кодом GodMode, он позволяет превратить браузер Chromium в интерактивную панель для группового запроса в несколько нейросетей.
Установка заключается в клонировании репозитория и его установки через npm
:
git clone https://github.com/smol-ai/GodMode.git
cd GodMode
npm install --force
npm run start

Тест ChatGPT
Создание сетевого сканера
Сканирование сети

В целом скрипт справился успешно со своей прямой задачей и довольно быстро. Помимо IP-адресов никакой дополнительной информации не присутствует.
Сканирование устройств на открытые порты и версии доступных сервисов

Здесь скрипт сработал как и требовалось, видны открытые порты и сервисы на них. Бонусом показан код HTML-страницы которая лежит на 80ом порту. Отображаются состояния сервисов(Bad Request/ready), что добавляет удобства анализу.
Поиск CVE по сервисам и их версиям

Нейросеть реализовала функцию через локальную базу данных уязвимостей. К сожалению при тестах эта база не дала результата.
#!/usr/bin/env python3
import ipaddress
import subprocess
import concurrent.futures
import argparse
import socket
import platform
# 🔐 Локальная база уязвимостей
VULNERABILITIES = {
"apache/2.4.49": ["CVE-2021-41773", "CVE-2021-42013"],
"nginx/1.18.0": ["CVE-2021-23017"],
"openssh_7.2p2": ["CVE-2016-0777"],
"mysql 5.7.29": ["CVE-2020-2574"],
"proftpd 1.3.5": ["CVE-2019-12815"],
"vsftpd 2.3.4": ["CVE-2011-2523"]
}
def banner():
print("="*60)
print(" Сетевой сканер с определением сервисов и CVE")
print("="*60)
def is_host_alive(ip):
try:
param = "-n" if platform.system().lower() == "windows" else "-c"
result = subprocess.run(
["ping", param, "1", "-W", "1", str(ip)],
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL
)
return ip if result.returncode == 0 else None
except Exception:
return None
def grab_banner(ip, port):
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.settimeout(1)
s.connect((str(ip), port))
s.sendall(b"\r\n")
banner = s.recv(1024).decode(errors="ignore").strip()
return banner
except:
return ""
def scan_port(ip, port):
try:
with socket.socket() as s:
s.settimeout(0.5)
s.connect((str(ip), port))
banner = grab_banner(ip, port)
return (port, banner)
except:
return None
def scan_host_ports(ip, ports):
open_ports = []
for port in ports:
result = scan_port(ip, port)
if result:
port, banner = result
open_ports.append((port, banner))
return open_ports
def scan_network(subnet, ports):
active_hosts = []
with concurrent.futures.ThreadPoolExecutor(max_workers=100) as executor:
futures = {executor.submit(is_host_alive, ip): ip for ip in ipaddress.IPv4Network(subnet)}
for future in concurrent.futures.as_completed(futures):
ip = future.result()
if ip:
print(f"[+] Хост активен: {ip}")
active_hosts.append(ip)
print("\n[~] Сканирование портов на активных хостах...\n")
for ip in active_hosts:
open_ports = scan_host_ports(ip, ports)
if open_ports:
print(f"[•] Хост {ip} — открытые порты:")
for port, banner in open_ports:
service = identify_service(banner, port)
cves = find_vulnerabilities(banner)
print(f" [+] Порт {port}/tcp | Сервис: {service} | Баннер: {banner}")
if cves:
print(f" [!] Уязвимости: {', '.join(cves)}")
print()
else:
print(f"[-] Хост {ip}: открытых портов не найдено.\n")
def identify_service(banner, port):
if banner:
banner = banner.lower()
if "ftp" in banner:
return "FTP"
elif "ssh" in banner:
return "SSH"
elif "http" in banner:
return "HTTP"
elif "smtp" in banner:
return "SMTP"
elif "mysql" in banner:
return "MySQL"
elif "rdp" in banner or "remote desktop" in banner:
return "RDP"
elif "smb" in banner:
return "SMB"
elif "telnet" in banner:
return "Telnet"
known_ports = {
21: "FTP", 22: "SSH", 23: "Telnet", 25: "SMTP", 53: "DNS",
80: "HTTP", 110: "POP3", 139: "SMB", 143: "IMAP", 443: "HTTPS",
3306: "MySQL", 3389: "RDP", 8080: "HTTP-Alt"
}
return known_ports.get(port, "Неизвестно")
def find_vulnerabilities(banner):
banner = banner.lower()
found = []
for vuln_banner, cves in VULNERABILITIES.items():
if vuln_banner in banner:
found.extend(cves)
return found
def main():
banner()
parser = argparse.ArgumentParser(description="Сканирование сети и сервисов с CVE.")
parser.add_argument("subnet", help="Подсеть для сканирования, например 192.168.1.0/24")
parser.add_argument("--ports", help="Список портов через запятую (по умолчанию популярные)", default="21,22,23,25,53,80,110,139,143,443,3306,3389,8080")
args = parser.parse_args()
try:
port_list = [int(p.strip()) for p in args.ports.split(",")]
print(f"[~] Сканирование подсети: {args.subnet}")
scan_network(args.subnet, port_list)
except ValueError:
print("[!] Ошибка: неверный формат портов или подсети.")
if __name__ == "__main__":
main()
Создание скрипта для поиска никнеймов
Проверка наличия на популярных соц.сетях и интернет-ресурсах в странах СНГ

Выдача результатов удобная, имеются статусы отображения(Найден/Нет/Ошибка подключения), список соц.сетей и интернет-ресурсов соответствует действительности.
Выдача краткой информации по каждой найденной учётной записи

Изменения в коде снизили эффективность, видно значительное сокращение списка ресурсов.** Это произошло на этапе промпта “Теперь нужно добавить краткую информацию к каждому найденному аккаунту”. Но в целом с поставленной задачей справился нормально.
#!/usr/bin/env python3
import requests
import concurrent.futures
import argparse
import re
from bs4 import BeautifulSoup
# 📡 Популярные СНГ-платформы
SITES = {
"VK": "https://vk.com/{}",
"Telegram": "https://t.me/{}",
"YouTube": "https://www.youtube.com/@{}",
"GitHub": "https://github.com/{}"
}
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
}
def fetch_profile_info(site, url, username):
try:
r = requests.get(url, headers=HEADERS, timeout=5)
if r.status_code != 200:
return None
soup = BeautifulSoup(r.text, 'html.parser')
if site == "VK":
title = soup.title.string if soup.title else ""
match = re.search(r'(.+)\| ВКонтакте', title)
if match:
return match.group(1).strip()
elif site == "Telegram":
desc = soup.find("meta", {"property": "og:description"})
if desc:
return desc.get("content", "").strip()
elif site == "YouTube":
meta = soup.find("meta", {"name": "title"})
if meta:
return meta.get("content", "").strip()
elif site == "GitHub":
name = soup.find("span", class_="p-name")
if name:
return name.get_text(strip=True)
return None
except Exception:
return None
def check_username(site_name, url_template, username):
url = url_template.format(username)
try:
response = requests.get(url, headers=HEADERS, timeout=5)
if response.status_code == 200:
info = fetch_profile_info(site_name, url, username)
return (site_name, url, "✅ Найден", info)
elif response.status_code in [301, 302, 403]:
return (site_name, url, "⚠️ Возможен, но закрыт", None)
else:
return (site_name, url, "❌ Нет", None)
except requests.RequestException:
return (site_name, url, "❌ Ошибка подключения", None)
def main():
parser = argparse.ArgumentParser(description="Поиск ника по СНГ-сайтам с краткой инфой.")
parser.add_argument("username", help="Никнейм пользователя")
args = parser.parse_args()
print("=" * 60)
print(f"🔍 Поиск ника: {args.username}")
print("=" * 60)
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
futures = []
for site, template in SITES.items():
futures.append(executor.submit(check_username, site, template, args.username))
for future in concurrent.futures.as_completed(futures):
site, url, status, info = future.result()
print(f"[{site:<10}] {status} — {url}")
if info:
print(f" ↪ {info}")
if __name__ == "__main__":
main()
Тест Perplexity
Создание сетевого сканера
Сканирование сети

Скрипт справился со своей задачей и дополнительно отобразил MAC-адреса.
Сканирование устройств на открытые порты и версии доступных сервисов

Отображение портов и информации по ним происходило корректно, но скорость скрипта была настолько медленной, что пришлось остановить его работу через 10 минут.
Поиск CVE по сервисам и их версиям

Заметно, что результатов в выдаче стало сильно меньше и скрипт даже не перешёл к проверке следующего адреса. Функцию поиска CVE нейросеть реализовала средствами API сайта. Использовав API сайта, скрипт не вывел уязвимостей, не проверил следующие адреса и забыл про выдачу MAC-адресов.
import argparse
import requests
import subprocess
from scapy.all import ARP, Ether, srp
import xml.etree.ElementTree as ET
VULNERS_API_KEY = "YOUR_API_KEY"
VULNERS_URL = "https://vulners.com/api/v3/search/lucene/"
def get_vulnerabilities(service, version):
"""Получение уязвимостей через Vulners API"""
headers = {'Content-Type': 'application/json'}
query = f'type:cve AND affectedSoftware.name:"{service}" AND affectedSoftware.version:"{version}"'
try:
response = requests.get(
VULNERS_URL,
headers=headers,
params={
'query': query,
'apiKey': VULNERS_API_KEY
}
)
return response.json().get('data', {}).get('search', [])
except Exception as e:
return [f"Ошибка запроса: {str(e)}"]
def parse_nmap_xml(xml_output):
"""Парсинг вывода Nmap XML"""
root = ET.fromstring(xml_output)
results = []
for host in root.findall('host'):
ip = host.find('address').get('addr')
for port in host.findall('ports/port'):
if port.find('state').get('state') == 'open':
service = port.find('service')
service_name = service.get('name', 'unknown')
product = service.get('product', '')
version = service.get('version', '')
results.append({
'ip': ip,
'port': port.get('portid'),
'service': f"{product} {version}".strip(),
'name': service_name
})
return results
def enhanced_service_scan(target, ports):
"""Улучшенное сканирование с XML-выводом"""
try:
ports_str = ','.join(map(str, ports))
result = subprocess.run(
['nmap', '-sV', '-oX', '-', '-p', ports_str, target],
capture_output=True,
text=True,
check=True
)
return parse_nmap_xml(result.stdout)
except subprocess.CalledProcessError as e:
return [f"Ошибка Nmap: {e.stderr}"]
except FileNotFoundError:
return ["Nmap не установлен"]
def main():
parser = argparse.ArgumentParser(description='Сканер уязвимостей сетевых сервисов')
parser.add_argument('-t', '--target', required=True, help='Целевой IP или подсеть')
parser.add_argument('-p', '--ports', default='1-1024',
help='Диапазон портов (по умолчанию: 1-1024)')
args = parser.parse_args()
ports = range(*map(int, args.ports.split('-')))
services = enhanced_service_scan(args.target, ports)
print(f"\nРезультаты сканирования {args.target}:")
for service in services:
print(f"\n{service['ip']}:{service['port']} - {service['service']}")
if service['service'] != '':
vulns = get_vulnerabilities(service['name'], service['service'])
if vulns:
print("Найденные уязвимости:")
for vuln in vulns[:3]: # Показываем топ-3 уязвимости
print(f" - {vuln.get('_source', {}).get('title', 'Unknown')}")
print(f" CVE: {vuln.get('_source', {}).get('cvelist', ['N/A'])[0]}")
print(f" Ссылка: {vuln.get('_source', {}).get('href', 'N/A')}")
else:
print("Уязвимостей не обнаружено")
if __name__ == "__main__":
main()
Создание скрипта для поиска никнеймов
Проверка наличия на популярных соц.сетях и интернет-ресурсах в странах СНГ

Реализация скрипта получилась настолько медленной, что в течение 10 минут так и не было найдено ни одного совпадения и пришлось завершить его работу.
Выдача краткой информации по каждой найденной учётной записи

В этот раз получилось реализовать поиск. Набор соц.сетей и ресурсов подходит под СНГ. Результатом работы скрипта является информация, полученная путем парсинга HTML-страниц. К сожалению, добиться таких же результатов, как у GPT, не удалось. ChatGPT нашёл ссылку на ВК и предоставил краткую информацию, скрипт от Perplexity совсем не увидел наличие никнейма на этой платформе.
import requests
from bs4 import BeautifulSoup
def get_account_info(url, platform):
"""Получение краткой информации о профиле"""
try:
response = requests.get(url, timeout=10)
soup = BeautifulSoup(response.text, 'html.parser')
info = {
'url': url,
'platform': platform.capitalize(),
'name': 'Не удалось получить',
'bio': 'Нет информации',
'posts': 'Нет данных',
'followers': 'Нет данных'
}
if platform == 'vk':
name_tag = soup.find('h1', class_='page_name')
if name_tag: info['name'] = name_tag.text.strip()
bio_tag = soup.find('div', class_='page_current_info')
if bio_tag: info['bio'] = bio_tag.text.strip()
counters = soup.find_all('div', class_='counts_module_info')
if counters:
if len(counters) > 0: info['posts'] = counters[0].text.strip()
if len(counters) > 1: info['followers'] = counters[1].text.strip()
elif platform == 'instagram':
meta = soup.find('meta', property='og:description')
if meta:
content = meta['content']
parts = content.split(' - ')
if len(parts) > 0:
followers = parts[0].split(' ')[0]
posts = parts[1].split(' ')[0]
info['followers'] = followers
info['posts'] = posts
name_tag = soup.find('title')
if name_tag: info['name'] = name_tag.text.split('•')[0].strip()
elif platform == 'twitter':
name_tag = soup.find('div', {'data-testid': 'UserName'})
if name_tag: info['name'] = name_tag.text.strip()
bio_tag = soup.find('div', {'data-testid': 'UserDescription'})
if bio_tag: info['bio'] = bio_tag.text.strip()
stats = soup.find_all('span', {'data-testid': 'app-text-transition-container'})
if stats:
if len(stats) > 0: info['posts'] = stats[0].text.strip()
if len(stats) > 1: info['followers'] = stats[1].text.strip()
elif platform == 'youtube':
name_tag = soup.find('meta', property='og:title')
if name_tag: info['name'] = name_tag['content']
subs_tag = soup.find('meta', itemprop='subscriberCount')
if subs_tag: info['followers'] = f"{subs_tag['content']} подписчиков"
return info
except Exception as e:
return {'error': str(e), 'platform': platform, 'url': url}
def check_username(username):
"""Проверка и сбор информации о профилях"""
platforms = {
'vk': f'https://vk.com/{username}',
'instagram': f'https://www.instagram.com/{username}/',
'twitter': f'https://twitter.com/{username}',
'youtube': f'https://www.youtube.com/{username}',
'tiktok': f'https://www.tiktok.com/@{username}',
'github': f'https://github.com/{username}',
'habr': f'https://habr.com/ru/users/{username}/',
'pikabu': f'https://pikabu.ru/@{username}',
'telegram': f'https://t.me/{username}',
'ok': f'https://ok.ru/{username}'
}
results = {}
for platform, url in platforms.items():
try:
response = requests.head(url, timeout=5)
if response.status_code == 200:
print(f"Анализируем {platform}...")
info = get_account_info(url, platform)
results[platform] = info
else:
results[platform] = {'status': 'Не найден'}
except Exception as e:
results[platform] = {'error': str(e)}
return results
def display_results(results):
"""Вывод результатов с форматированием"""
print("\nРезультаты поиска:")
for platform, data in results.items():
print(f"\n▬▬▬ {platform.upper()} ▬▬▬")
if 'status' in data:
print("Профиль не найден")
continue
if 'error' in data:
print(f"Ошибка: {data['error']}")
continue
print(f"Ссылка: {data['url']}")
print(f"Имя: {data.get('name', 'Нет данных')}")
print(f"Описание: {data.get('bio', 'Нет данных')}")
print(f"Публикации: {data.get('posts', 'Нет данных')}")
print(f"Подписчики: {data.get('followers', 'Нет данных')}")
def main():
username = input("Введите никнейм для поиска: ")
results = check_username(username)
display_results(results)
if __name__ == "__main__":
main()
Тест DeepSeek
Создание сетевого сканера
Сканирование сети

Результат идентичен Perplexity, но добавился ненужный параметр ввода маски, когда её можно просто прописать через /
.
Сканирование устройств на открытые порты и версии доступных сервисов

Порты, сервисы и их версии отображаются правильно. В положительную сторону можно отметить наличие параметра для выбора диапазона портов. Сканирование выполнено быстро.
Поиск CVE по сервисам и их версиям

Нейросеть попыталась реализовать поиск средствами API сайтов: cve.circl.lu и www.exploit-db.com, но данная функция не была реализована до конца.
import argparse
from scapy.all import ARP, Ether, srp
import ipaddress
import nmap
import requests
import json
from datetime import datetime
# Конфигурация API для проверки уязвимостей
CVE_API_URL = "https://cve.circl.lu/api/search"
EXPLOIT_DB_API = "https://www.exploit-db.com/search"
def scan_network(subnet, mask):
"""Сканирует подсеть и возвращает активные хосты."""
network = f"{subnet}/{mask}"
try:
ip_network = ipaddress.ip_network(network, strict=False)
except ValueError as e:
print(f"Ошибка в подсети или маске: {e}")
return []
arp_request = ARP(pdst=str(ip_network))
ether_frame = Ether(dst="ff:ff:ff:ff:ff:ff")
packet = ether_frame / arp_request
result = srp(packet, timeout=3, verbose=0)[0]
return [{'ip': received.psrc, 'mac': received.hwsrc} for sent, received in result]
def scan_ports(host, ports="1-1000"):
"""Сканирует порты и возвращает информацию о сервисах."""
nm = nmap.PortScanner()
nm.scan(hosts=host, ports=ports, arguments='-sV --version-intensity 3')
open_ports = []
for proto in nm[host].all_protocols():
for port, info in nm[host][proto].items():
if info['state'] == 'open':
open_ports.append({
'port': port,
'service': info['name'],
'version': info.get('version', 'не определена'),
'product': info.get('product', 'не определен')
})
return open_ports
def check_cve(service, version):
"""Проверяет уязвимости через CVE API."""
try:
params = {'product': service, 'version': version}
response = requests.get(CVE_API_URL, params=params)
if response.status_code == 200:
return response.json().get('results', [])
except Exception as e:
print(f"Ошибка при запросе CVE: {e}")
return []
def check_exploits(service, version):
"""Проверяет эксплойты для сервиса (заглушка, нужен реальный API Exploit-DB)."""
# В реальном коде здесь должен быть запрос к Exploit-DB или Vulners
return []
def check_common_vulns(service, version, port):
"""Проверяет известные уязвимости для популярных сервисов."""
vulns = []
if service == 'http':
if 'Apache' in version and '2.4.49' in version:
vulns.append('CVE-2021-41773 (Path Traversal in Apache 2.4.49)')
elif service == 'smb' and 'Samba' in version:
vulns.append('CVE-2017-7494 (Samba RCE)')
elif service == 'ssh' and 'OpenSSH' in version and '7.9' in version:
vulns.append('CVE-2021-41617 (OpenSSH 7.9 уязвимость)')
return vulns
def get_vulnerabilities(host_info):
"""Анализирует сервис на уязвимости."""
service = host_info['service']
version = host_info['version']
port = host_info['port']
vulns = []
# Проверка CVE
cve_list = check_cve(service, version)
for cve in cve_list:
vulns.append(f"{cve.get('id', 'CVE-XXXX')}: {cve.get('summary', 'Уязвимость обнаружена')}")
# Проверка общих уязвимостей
vulns.extend(check_common_vulns(service, version, port))
return vulns if vulns else ["Уязвимости не найдены"]
def main():
parser = argparse.ArgumentParser(description="Сетевой сканер с поиском уязвимостей")
parser.add_argument("--subnet", required=True, help="Подсеть (например, 192.168.1.0)")
parser.add_argument("--mask", required=True, help="Маска (например, 24)")
parser.add_argument("--ports", default="1-1000", help="Порты (например, 80,443)")
args = parser.parse_args()
print(f"[*] Сканирование {args.subnet}/{args.mask}...")
hosts = scan_network(args.subnet, args.mask)
if not hosts:
print("[!] Активные хосты не найдены.")
return
print("\n[+] Активные хосты:")
for host in hosts:
print(f"IP: {host['ip']}\tMAC: {host['mac']}")
open_ports = scan_ports(host['ip'], args.ports)
if not open_ports:
print(f" [!] Нет открытых портов.")
continue
for port_info in open_ports:
print(f"\n [Порт {port_info['port']}] {port_info['service']} ({port_info['product']} {port_info['version']})")
# Поиск уязвимостей
vulns = get_vulnerabilities({
'service': port_info['service'],
'version': port_info['version'],
'port': port_info['port']
})
print(" [Уязвимости]:")
for vuln in vulns:
print(f" - {vuln}")
if __name__ == "__main__":
main()
Создание скрипта для поиска никнеймов
Проверка наличия на популярных соц.сетях и интернет-ресурсах в странах СНГ

Результат практически совпадает с ответом ChatGPT. К количеству ресурсов претензий нет. Появился статус "Ручная проверка", но отсутствуют ссылки на профили.
Выдача краткой информации по каждой найденной учётной записи

Как и в случае с ChatGPT, нейросеть заметно сократила список ресурсов. Но с поставленной задачей справилась, при помощи проверки конкретных элементов на страницах.
import requests
from bs4 import BeautifulSoup
import time
import json
# Обновленный словарь с корректными проверками
SITES = {
"VK": {
"url": "https://vk.com/{}",
"check": lambda response, soup: response.status_code == 200 and not soup.find("div", class_="profile_deleted"),
"info": lambda soup: {
"Имя": soup.find("h1", class_="page_name").get_text(strip=True) if soup.find("h1", class_="page_name") else "Не указано",
"Статус": soup.find("div", class_="page_current_info").get_text(strip=True) if soup.find("div", class_="page_current_info") else "Нет статуса",
}
},
"Telegram": {
"url": "https://t.me/{}",
"check": lambda response, _: response.status_code == 200 and response.url == response.request.url,
"info": lambda soup: {
"Имя": soup.find("div", class_="tgme_page_title").get_text(strip=True) if soup.find("div", class_="tgme_page_title") else "Не указано",
"Описание": soup.find("div", class_="tgme_page_description").get_text(strip=True) if soup.find("div", class_="tgme_page_description") else "Нет описания",
}
},
"Odnoklassniki": {
"url": "https://ok.ru/{}",
"check": lambda response, _: response.status_code == 200,
"info": lambda soup: {
"Имя": soup.find("h1", class_="profile-user-name").get_text(strip=True) if soup.find("h1", class_="profile-user-name") else "Не указано",
}
},
"GitHub": {
"url": "https://api.github.com/users/{}",
"check": lambda response, _: response.status_code == 200,
"info": lambda data: {
"Имя": data.get("name", "Не указано"),
"Репозитории": data.get("public_repos", 0),
"Подписчики": data.get("followers", 0),
}
},
}
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
def get_account_info(nickname, site_name, site_data):
"""Получает информацию об аккаунте на конкретной платформе."""
url = site_data["url"].format(nickname)
try:
response = requests.get(url, headers=HEADERS, timeout=10)
if "api.github.com" in url:
if site_data["check"](response, None):
return site_data["info"](response.json())
else:
soup = BeautifulSoup(response.text, 'html.parser')
if site_data["check"](response, soup):
return site_data["info"](soup)
except Exception as e:
return {"Ошибка": f"{type(e).__name__}: {str(e)}"}
return None
def check_nickname(nickname):
"""Проверяет никнейм на всех платформах и возвращает результаты."""
results = {}
for site_name, site_data in SITES.items():
time.sleep(1)
info = get_account_info(nickname, site_name, site_data)
if info:
results[site_name] = {"status": "✅ Занят", "info": info}
else:
results[site_name] = {"status": "❌ Свободен или ошибка"}
return results
def print_results(nickname, results):
"""Выводит результаты в читаемом формате."""
print(f"\n🔍 Результаты поиска для '{nickname}':")
for site, data in results.items():
print(f"\n{site}: {data['status']}")
if "info" in data:
for key, value in data["info"].items():
print(f" {key}: {value}")
def main():
nickname = input("Введите никнейм для поиска: ").strip()
results = check_nickname(nickname)
print_results(nickname, results)
if __name__ == "__main__":
main()
Тест Together.ai
Создание сетевого сканера

Результат идентичен Perplexity и DeepSeek.
Сканирование устройств на открытые порты и версии доступных сервисов

Также совпадает с Perplexity и DeepSeek.
Поиск CVE по сервисам и их версиям

Наконец появилась первая нейросеть, которая действительно впечатлила нас отображением CVE для сервисов! Для этого используется API vulners.com. Чтобы запустить код, нужно прописать свой API-ключ в соответствующую переменную.
import argparse
import requests
import subprocess
from scapy.all import ARP, Ether, srp
import xml.etree.ElementTree as ET
VULNERS_API_KEY = "YOUR_API_KEY"
VULNERS_URL = "https://vulners.com/api/v3/search/lucene/"
def get_vulnerabilities(service, version):
"""Получение уязвимостей через Vulners API"""
headers = {'Content-Type': 'application/json'}
query = f'type:cve AND affectedSoftware.name:"{service}" AND affectedSoftware.version:"{version}"'
try:
response = requests.get(
VULNERS_URL,
headers=headers,
params={
'query': query,
'apiKey': VULNERS_API_KEY
}
)
return response.json().get('data', {}).get('search', [])
except Exception as e:
return [f"Ошибка запроса: {str(import ipaddress
from scapy.all import ARP, Ether, srp
import nmap
import requests
def network_scanner(ip_range):
"""
Сканирует сеть и возвращает список активных хостов.
:param ip_range: Диапазон IP-адресов в формате "192.168.1.0/24"
:return: Список активных хостов
"""
# Создаем объект ipaddress.ip_network для работы с диапазоном IP-адресов
network = ipaddress.ip_network(ip_range, strict=False)
# Создаем пакет ARP-запроса
arp = ARP(pdst=str(network))
ether = Ether(dst="ff:ff:ff:ff:ff:ff")
packet = ether/arp
# Отправляем пакет и получаем ответ
result = srp(packet, timeout=3, verbose=0)[0]
# Анализируем ответ и формируем список активных хостов
active_hosts = []
for sent, received in result:
active_hosts.append({'ip': received.psrc, 'mac': received.hwsrc})
return active_hosts
def port_scanner(host):
"""
Сканирует порты хоста и возвращает информацию о сервисах.
:param host: IP-адрес хоста
:return: Информация о сервисах
"""
# Создаем объект nmap.PortScanner для сканирования портов
nm = nmap.PortScanner()
# Сканируем порты
nm.scan(host, arguments='-sV')
# Анализируем результаты сканирования
services = []
for proto in nm[host].all_protocols():
lport = sorted(nm[host][proto].keys())
for port in lport:
service = nm[host][proto][port]
services.append({
'port': port,
'protocol': proto,
'service': service['name'],
'version': service['product'] + ' ' + service['version']
})
return services
def vulnerability_scanner(service):
"""
Ищет уязвимости для сервиса.
:param service: Информация о сервисе
:return: Список уязвимостей
"""
api_key = "" # замените на свой API-ключ
url = f"https://vulners.com/api/v3/search/lucene/?query={service['service']}%20{service['version']}&size=10"
headers = {"Authorization": f"Bearer {api_key}"}
response = requests.get(url, headers=headers)
if response.status_code == 200:
data = response.json()
vulnerabilities = []
for result in data['data']['search']:
vulnerability = {
'id': result.get('_id', 'N/A'),
'title': result.get('title', 'N/A'),
'cvss': result.get('cvss', {}).get('score', 'N/A')
}
vulnerabilities.append(vulnerability)
return vulnerabilities
else:
return []
def main():
# Запрашиваем у пользователя маску подсети
ip_range = input("Введите диапазон IP-адресов (например, 192.168.1.0/24): ")
# Сканируем сеть
active_hosts = network_scanner(ip_range)
# Выводим результаты
for host in active_hosts:
print(f"Хост: {host['ip']} ({host['mac']})")
services = port_scanner(host['ip'])
if services:
print("Сервисы:")
for service in services:
print(f" {service['port']}/{service['protocol']}: {service['service']} ({service['version']})")
vulnerabilities = vulnerability_scanner(service)
if vulnerabilities:
print(" Уязвимости:")
for vulnerability in vulnerabilities:
print(f" ID: {vulnerability['id']}, Заголовок: {vulnerability['title']}, CVSS: {vulnerability['cvss']}")
else:
print(" Уязвимости не обнаружены.")
else:
print("Сервисы не обнаружены.")
print()
if __name__ == "__main__":
main()
e)}"]
def parse_nmap_xml(xml_output):
"""Парсинг вывода Nmap XML"""
root = ET.fromstring(xml_output)
results = []
for host in root.findall('host'):
ip = host.find('address').get('addr')
for port in host.findall('ports/port'):
if port.find('state').get('state') == 'open':
service = port.find('service')
service_name = service.get('name', 'unknown')
product = service.get('product', '')
version = service.get('version', '')
results.append({
'ip': ip,
'port': port.get('portid'),
'service': f"{product} {version}".strip(),
'name': service_name
})
return results
def enhanced_service_scan(target, ports):
"""Улучшенное сканирование с XML-выводом"""
try:
ports_str = ','.join(map(str, ports))
result = subprocess.run(
['nmap', '-sV', '-oX', '-', '-p', ports_str, target],
capture_output=True,
text=True,
check=True
)
return parse_nmap_xml(result.stdout)
except subprocess.CalledProcessError as e:
return [f"Ошибка Nmap: {e.stderr}"]
except FileNotFoundError:
return ["Nmap не установлен"]
def main():
parser = argparse.ArgumentParser(description='Сканер уязвимостей сетевых сервисов')
parser.add_argument('-t', '--target', required=True, help='Целевой IP или подсеть')
parser.add_argument('-p', '--ports', default='1-1024',
help='Диапазон портов (по умолчанию: 1-1024)')
args = parser.parse_args()
ports = range(*map(int, args.ports.split('-')))
services = enhanced_service_scan(args.target, ports)
print(f"\nРезультаты сканирования {args.target}:")
for service in services:
print(f"\n{service['ip']}:{service['port']} - {service['service']}")
if service['service'] != '':
vulns = get_vulnerabilities(service['name'], service['service'])
if vulns:
print("Найденные уязвимости:")
for vuln in vulns[:3]: # Показываем топ-3 уязвимости
print(f" - {vuln.get('_source', {}).get('title', 'Unknown')}")
print(f" CVE: {vuln.get('_source', {}).get('cvelist', ['N/A'])[0]}")
print(f" Ссылка: {vuln.get('_source', {}).get('href', 'N/A')}")
else:
print("Уязвимостей не обнаружено")
if __name__ == "__main__":
main()
Создание скрипта для поиска никнеймов
Проверка наличия на популярных соц.сетях и интернет-ресурсах в странах СНГ

Список ресурсов значительно меньше, чем в скриптах других ИИ, зато есть ссылки и статусы.
Выдача краткой информации по каждой найденной учётной записи

К сожалению, скрипт не смог вывести никакой информации, несмотря на попытку реализовать отдельные функции для каждого ресурса и собрать данные по аналогии с методом DeepSeek, но в более упрощённом виде.
import requests
from bs4 import BeautifulSoup
def search_nickname(nickname):
# Список ресурсов для поиска
resources = [
{"name": "ВКонтакте", "url": f"https://vk.com/{nickname}"},
{"name": "Instagram", "url": f"https://www.instagram.com/{nickname}/"},
{"name": "Telegram", "url": f"https://t.me/{nickname}"},
{"name": "Twitter", "url": f"https://twitter.com/{nickname}"},
{"name": "TikTok", "url": f"https://www.tiktok.com/@{nickname}"},
{"name": "Reddit", "url": f"https://www.reddit.com/user/{nickname}"},
{"name": "GitHub", "url": f"https://github.com/{nickname}"},
]
# Поиск никнейма на ресурсах
results = []
for resource in resources:
url = resource["url"].format(nickname=nickname)
try:
response = requests.get(url, timeout=5)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
info = ''
if resource['name'] == 'ВКонтакте':
info = get_vk_info(soup)
elif resource['name'] == 'Instagram':
info = get_instagram_info(soup)
elif resource['name'] == 'Twitter':
info = get_twitter_info(soup)
results.append({"name": resource["name"], "url": url, "status": "Найден", "info": info})
else:
results.append({"name": resource["name"], "url": url, "status": "Не найден", "info": ''})
except requests.exceptions.RequestException as e:
results.append({"name": resource["name"], "url": url, "status": f"Ошибка: {e}", "info": ''})
return results
def get_vk_info(soup):
try:
name = soup.find('h1', class_='page_name').text.strip()
return f'Имя: {name}'
except AttributeError:
return ''
def get_instagram_info(soup):
try:
name = soup.find('meta', property='og:title')['content']
return f'Имя: {name}'
except (AttributeError, TypeError):
return ''
def get_twitter_info(soup):
try:
name = soup.find('span', class_='ProfileHeaderCard-name').text.strip()
return f'Имя: {name}'
except AttributeError:
return ''
def main():
# Запрашиваем у пользователя никнейм
nickname = input("Введите никнейм: ")
# Ищем никнейм на ресурсах
results = search_nickname(nickname)
# Выводим результаты
print("Результаты поиска:")
for result in results:
print(f"{result['name']}: {result['url']} ({result['status']})")
if result['info']:
print(f" {result['info']}")
if __name__ == "__main__":
main()
Анализ кода скриптов
Анализ скриптов для сканирования сети
Ошибки обработки сетевых запросов:
В скрипте от Together.ai нет обработки
requests.exceptions.RequestException
для API Vulners.В скрипте от ChatGPT отсутствует проверка доступности хоста перед сканированием портов.
Проблемы производительности:
В скрипте от ChatGPT используется
ThreadPoolExecutor(max_workers=100)
, это может привести к ненамеренной DoS сети или блокировке IP.В скрипте от Perplexity сканирование портов синхронное и это может значительно замедлить работу.
Ненадежное определение сервисов:
В скрипте от ChatGPT функция
identify_service
использует простые строковые проверки (if "ftp" in banner
) и данный метод проверки можно легко обмануть.

Анализ OSINT-скриптов
Устаревшие методы парсинга:
В скрипте от ChatGPT и от Perplexity используется
BeautifulSoup
для парсинга соцсетей, но структура HTML часто меняется.
Неполный охват ресурсов:
В скрипте от DeepSeek проверяются только VK, Telegram, OK и GitHub, а в Together.ai добавлен TikTok, но нет Одноклассников.

Заключение
Исходя из проведённых тестов, мы можем представить общий результат в виде таблицы:

Ещё больше познавательного контента в Telegram-канале — AI-шная
Полезные OSINT инструменты в телеграме (всегда рабочие ссылки) и отличный контент.