Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов. chatgpt.. chatgpt. deepseek.. chatgpt. deepseek. osint.. chatgpt. deepseek. osint. perplexity.. chatgpt. deepseek. osint. perplexity. together.. chatgpt. deepseek. osint. perplexity. together. Геоинформационные сервисы.. chatgpt. deepseek. osint. perplexity. together. Геоинформационные сервисы. Информационная безопасность.. chatgpt. deepseek. osint. perplexity. together. Геоинформационные сервисы. Информационная безопасность. искусственный интеллект.. chatgpt. deepseek. osint. perplexity. together. Геоинформационные сервисы. Информационная безопасность. искусственный интеллект. нейронные сети.. chatgpt. deepseek. osint. perplexity. together. Геоинформационные сервисы. Информационная безопасность. искусственный интеллект. нейронные сети. сканирование хостов.
Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 1

Введение

Приветствуем дорогих читателей! Начинаем рубрику посвящённую нейросетям и их применению в сфере ИБ. В этой статье мы сравним 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
Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 2

Тест ChatGPT

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

Сканирование сети

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 3

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

Сканирование устройств на открытые порты и версии доступных сервисов

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 4

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

Поиск CVE по сервисам и их версиям

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 5

Нейросеть реализовала функцию через локальную базу данных уязвимостей. К сожалению при тестах эта база не дала результата.

#!/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"rn")
            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()

Создание скрипта для поиска никнеймов

Проверка наличия на популярных соц.сетях и интернет-ресурсах в странах СНГ

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 6

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

Выдача краткой информации по каждой найденной учётной записи

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 7

Изменения в коде снизили эффективность, видно значительное сокращение списка ресурсов.** Это произошло на этапе промпта “Теперь нужно добавить краткую информацию к каждому найденному аккаунту”. Но в целом с поставленной задачей справился нормально.

#!/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

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

Сканирование сети

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 8

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

Сканирование устройств на открытые порты и версии доступных сервисов

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 9

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

Поиск CVE по сервисам и их версиям

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 10

Заметно, что результатов в выдаче стало сильно меньше и скрипт даже не перешёл к проверке следующего адреса. Функцию поиска 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()

Создание скрипта для поиска никнеймов

Проверка наличия на популярных соц.сетях и интернет-ресурсах в странах СНГ

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 11

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

Выдача краткой информации по каждой найденной учётной записи

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 12

В этот раз получилось реализовать поиск. Набор соц.сетей и ресурсов подходит под СНГ. Результатом работы скрипта является информация, полученная путем парсинга 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

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

Сканирование сети

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 13

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

Сканирование устройств на открытые порты и версии доступных сервисов

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 14

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

Поиск CVE по сервисам и их версиям

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 15

Нейросеть попыталась реализовать поиск средствами 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()

Создание скрипта для поиска никнеймов

Проверка наличия на популярных соц.сетях и интернет-ресурсах в странах СНГ

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 16

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

Выдача краткой информации по каждой найденной учётной записи

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 17

Как и в случае с 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

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

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 18

Результат идентичен Perplexity и DeepSeek.

Сканирование устройств на открытые порты и версии доступных сервисов

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 19

Также совпадает с Perplexity и DeepSeek.

Поиск CVE по сервисам и их версиям

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 20

Наконец появилась первая нейросеть, которая действительно впечатлила нас отображением 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()

Создание скрипта для поиска никнеймов

Проверка наличия на популярных соц.сетях и интернет-ресурсах в странах СНГ

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 21

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

Выдача краткой информации по каждой найденной учётной записи

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 22

К сожалению, скрипт не смог вывести никакой информации, несмотря на попытку реализовать отдельные функции для каждого ресурса и собрать данные по аналогии с методом 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) и данный метод проверки можно легко обмануть.

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 23

Анализ OSINT-скриптов

  • Устаревшие методы парсинга:

    • В скрипте от ChatGPT и от Perplexity используется BeautifulSoup для парсинга соцсетей, но структура HTML часто меняется.

  • Неполный охват ресурсов:

    • В скрипте от DeepSeek проверяются только VK, Telegram, OK и GitHub, а в Together.ai добавлен TikTok, но нет Одноклассников.

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 24

Заключение

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

Сравнение нейросетей для создания ПО. Для сканирования хостов и поиска никнеймов - 25

Ещё больше познавательного контента в Telegram-канале — AI-шная

Полезные OSINT инструменты в телеграме (всегда рабочие ссылки) и отличный контент.

Автор: Adm1ngmz

Источник

Rambler's Top100