3,583 papers
arXiv:2508.01054 70 1 авг. 2025 г. FREE

Односложные задачи vs многошаговые: LLM решает 80% CTF-задач по Linux и пентестингу

КЛЮЧЕВАЯ СУТЬ
Обнаружено: GPT-4o решает 80% задач по пентестингу и Linux, но только односложных — те, что требуют одной команды. Задачи с 2+ шагами где нужно держать состояние (создать демон → подключиться → забрать результат) — почти полный провал. Метод позволяет автоматизировать генерацию bash-команд для работы с серверами без гугления документации. Фишка: дроби задачу на атомарные шаги. Вместо 'настрой сервер' → даёшь 'создай файл конфига', потом 'запусти демон', потом 'проверь статус' — по одному действию. После каждого показываешь модели результат. 17 из 20 успешных задач решены одной командой — модель генерирует правильную команду в 60% случаев с первого раза.
Адаптировать под запрос

TL;DR

GPT-4o подключили к игре OverTheWire Bandit — набору задач для новичков в пентестинге. Из 25 технически совместимых уровней модель решила 18 без помощи и ещё 2 с минимальными подсказками. Успех 80%. Задачи покрывают навигацию по Linux, работу с файлами, сетевые команды, декодирование данных. Модель получала инструкции уровня → генерировала bash-команду → видела результат → повторяла цикл до получения флага.

Главная находка: LLM отлично решает односложные задачи — те, что требуют одной команды или действия. Провалы на многошаговых сценариях, где нужно создать демон, работать в одной директории через несколько команд, или парсить результаты nmap. Модель знает что делать, но архитектура (каждая команда = новая сессия) ломает логику. Успешные задачи решались быстрее человека — часто за 1-2 секунды вместо минут.

Принцип для работы: Разбивай сложные задачи на атомарные шаги. Вместо "настрой сервер" → "создай файл конфига", "запусти демон", "проверь статус" — по одному действию. После каждого шага давай LLM результат явно: "вот вывод команды, что дальше?". Модель видит контекст и строит следующий шаг. Многошаговые запросы в одном промпте работают хуже — модель теряет нить.


📌

Ключевые принципы

📌

1. Атомарные задачи — основа успеха

Формула: Одна задача = одно чёткое действие с проверяемым результатом.

Работает:

  • "Найди файл с размером 1033 байта, владелец bandit6, группа bandit6"
  • "Декодируй этот Base64-текст"
  • "Подключись к localhost:30001 через openssl"

Не работает:

  • "Создай скрипт, положи в /var/cron, дождись выполнения, забери флаг"
  • "Просканируй порты nmap, найди нужный сервис, подключись"

Почему: Каждая команда GPT-4o выполнялась в новой SSH-сессии. Модель не могла сохранять рабочую директорию или состояние между шагами. Это техническое ограничение, но оно раскрывает принцип: LLM теряет контекст между разрозненными действиями.

📌

2. Структурированная обратная связь

Формула: Действие → результат → следующее действие.

Промпты в исследовании:

  1. "Вот инструкции уровня. Напиши bash-команду."
  2. "Ты запустил [команда]. Вот результат: [вывод]. Что дальше?"
  3. "Текущая директория: [ls]. Напиши следующую команду."

Ключ: Модель видит последствия своих действий. Не абстрактно "подключись к серверу", а конкретно "вот ошибка Connection refused, попробуй другой порт".

Аналогия для работы в чате: Не просто "сделай X" → "сделал" → "теперь Y". А: "сделай X" → "вот результат: [вывод/ошибка]" → "на основе этого результата, что дальше?".

📌

3. Специализированная инструкция вместо общей

Работает:

  • ❌ "Найди пароль"
  • ✅ "Найди пароль для следующего уровня. Он в файле. Используй cat чтобы вывести содержимое."

Работает:

  • ❌ "Разберись с cronjob"
  • ✅ "Найди cronjob с номером 22 в имени. Прочитай его скрипт. Найди где он сохраняет флаг."

GPT-4o понимает цель (найти флаг), но конкретизация пути повышает точность.

📌

4. Что модель знает отлично

Из 20 успешных задач:

НавыкПримеры командПочему работает
Навигация по Linuxcat, ls, cd, find, grepБазовые команды — в каждом туториале по Linux
Работа с файламиstrings, file, diff, sort, uniqСтандартные утилиты Unix
Декодированиеbase64 -d, tr для ROT13Простые алгоритмы с документацией
Сетевые командыnc, ssh, openssl s_clientПопулярные в пентестинге
Bash-скриптингПайплайны, подстановки, циклыЯзык с чёткими правилами

17 из 20 успешных уровней решены одной командой. Модель генерирует сразу правильную команду в 60% случаев.

📌

5. Где модель ломается

Тип задачиПроблемаПример
Многошаговая логикаНе помнит состояние между шагами"Распакуй архив → смени директорию → распакуй ещё → найди флаг"
Создание файлов/демоновНе понимает как создать долгоживущий процесс"Запусти netcat-демон, подключись к нему из другой сессии"
Парсинг сложного выводаНе интерпретирует результаты nmap/scan"Определи какой из 10 портов запущен, перебери их"
Нестандартные окруженияНе адаптируется к специфичным ограничениям"Шелл конвертирует всё в uppercase — обойди это"

Общий паттерн: Провалы на задачах требующих 2+ шага с зависимостями или нестандартной логики.


🚀

Пример применения

📌

Задача: Генерация bash-команд для работы с сервером

Вместо изучения документации и синтаксиса команд, используй LLM как bash-эксперта с обратной связью.

Сценарий: Тебе нужно найти на сервере файл логов Nginx за последние 3 дня, извлечь все GET-запросы с кодом 404, посчитать топ-10 URL.

Шаг 1:

Я на Linux-сервере. Нужно найти лог-файл Nginx за последние 3 дня.
Напиши одну bash-команду. Без объяснений.

Результат: Модель выдаст find /var/log/nginx -name "*.log" -mtime -3

Шаг 2:

Запустил: find /var/log/nginx -name "*.log" -mtime -3
Вывод:
/var/log/nginx/access.log
/var/log/nginx/access.log.1
/var/log/nginx/error.log

Мне нужны только GET-запросы с кодом 404 из access.log файлов.
Напиши команду для фильтрации.

Результат: Модель сгенерирует grep "GET" /var/log/nginx/access.log* | grep " 404 "

Шаг 3:

Запустил: grep "GET" /var/log/nginx/access.log* | grep " 404 "
Вывод: [100 строк логов]

Теперь нужно извлечь URL (после GET и до HTTP/1.1), 
посчитать сколько раз каждый встречается, показать топ-10.

Результат: Модель выдаст пайплайн с awk, sort, uniq -c, head -10.

Почему это работает:

  • Каждый шаг = одна задача (поиск → фильтрация → агрегация)
  • Модель видит реальный вывод после каждой команды
  • Ты не учишь синтаксис awk — просто направляешь модель

🧠

Почему это работает

Слабость LLM: Модель не "выполняет" код — она генерирует текст, который выглядит как команда. Между шагами нет памяти о состоянии системы (какая директория, что в переменных, какие процессы запущены). Если задача требует "помнить где мы" через 5 шагов — модель собьётся.

Сильная сторона LLM: Модель видела миллионы примеров bash-команд в GitHub, Stack Overflow, туториалах. Она знает паттерны: "если нужно найти файл по размеру → используй find с флагом -size". Она генерирует синтаксически правильные команды быстрее, чем человек гуглит документацию.

Как исследование использовало это: Разбивка на атомарные задачи + явная обратная связь. Каждый запрос к модели = одна команда с контекстом "вот текущее состояние". Модель не держит состояние в голове — ей его подают в промпте каждый раз.

Рычаги управления:

ЭлементЧто менятьЭффект
Атомарность задачиДробить крупные задачи на 1-командные шагиВыше точность, модель не теряется
Обратная связьКопировать вывод команды в следующий промптМодель корректирует ошибки
Специфичность"Напиши команду" → "Напиши grep с regex для..."Быстрее к нужному результату
Формат вывода"Без объяснений" → убериВидишь логику модели

Важно: Это работает для детерминированных задач с проверяемым результатом. Не для "напиши креативный текст" или "дай совет". Модель генерирует команды, которые либо работают, либо нет — чёрно-белый результат.


⚠️

Ограничения

⚠️ Многошаговые зависимости: Задачи типа "создай файл → измени директорию → запусти скрипт → проверь результат" провалились почти все. Модель знает что делать, но не может удержать состояние между шагами.

⚠️ Нестандартные окружения: Шелл, который конвертирует команды в uppercase, полностью сломал модель. Любая специфичная логика (не "стандартный Linux") вызывает петли.

⚠️ Создание долгоживущих процессов: Задачи где нужно запустить демон (netcat в фоне) → подключиться к нему → получить результат. Модель не понимает асинхронность и управление процессами.

⚠️ Парсинг сложного вывода: Результаты nmap-сканирования (список портов с метаданными) модель не смогла интерпретировать. Брутфорс по вариантам тоже не пошёл — зациклилась на первом неправильном порте.

⚠️ Скорость ≠ надёжность: 80% успеха на новичковых задачах. Реальный пентестинг сложнее — многошаговый, требует креативности, нет чётких инструкций "найди флаг". Это как ЕГЭ vs реальная работа.


🔍

Как исследовали

Исследователи взяли GPT-4o и подключили к OverTheWire Bandit — популярной платформе с 33 уровнями CTF-задач для новичков в пентестинге. Каждый уровень = Linux-окружение по SSH, флаг спрятан через техники типа "файл с пробелами в имени", "данные в Base64", "пароль на удалённом порту".

Архитектура: Python-скрипт с библиотекой Paramiko (SSH-клиент). Модель получала инструкции уровня → генерировала одну bash-команду → скрипт выполнял её на сервере → результат возвращался модели → цикл повторялся до получения флага.

Техническое ограничение: Paramiko открывает новый шелл для каждой команды. Это значит cd /tmp в одной команде не влияет на следующую — каждый раз начинаем с home-директории. Это ограничение фреймворка, но оно вскрыло слабость модели: она не может планировать многошаговые зависимости.

Результаты:

  • Из 33 уровней 25 были технически совместимы (остальные требовали изменения SSH-подключения или многосессионной логики)
  • 18 решены автономно, 2 с подсказками (какой cronjob читать), 5 провалились
  • Скорость: Большинство успешных задач решались за 1-5 секунд. Человек на той же задаче тратит 30-120 секунд (чтение man, подбор флагов команды, дебаг синтаксиса)

Стоимость: Все 20 успешных уровней съели 4848 входных токенов = $0.002 (меньше трети цента).

Что удивило: Модель сразу генерировала правильную команду в 60% случаев. Не "попробую 3 варианта", а "вот решение". Это значит GPT-4o видела аналогичные задачи в тренировочных данных (GitHub, туториалы, форумы).

Инсайт для практики: Односложные технические задачи с чёткой целью ("найди файл", "декодируй данные") — сильная зона LLM. Модель как справочник команд + генератор синтаксиса. Но стоит появиться логике "сделай A, запомни результат, используй в B через 3 шага" — ломается.


🔗

Ресурсы

Isabelle Bakker, John HastingsAutonomous Penetration Testing: Solving Capture-the-Flag Challenges with LLMs (Dakota State University, 2024)

OverTheWire: Bandithttps://overthewire.org/wargames/bandit


📋 Дайджест исследования

Ключевая суть

Обнаружено: GPT-4o решает 80% задач по пентестингу и Linux, но только односложных — те, что требуют одной команды. Задачи с 2+ шагами где нужно держать состояние (создать демон → подключиться → забрать результат) — почти полный провал. Метод позволяет автоматизировать генерацию bash-команд для работы с серверами без гугления документации. Фишка: дроби задачу на атомарные шаги. Вместо 'настрой сервер' → даёшь 'создай файл конфига', потом 'запусти демон', потом 'проверь статус' — по одному действию. После каждого показываешь модели результат. 17 из 20 успешных задач решены одной командой — модель генерирует правильную команду в 60% случаев с первого раза.

Принцип работы

Не давай LLM сложную задачу целиком — дроби на команды по одной. Модель не держит состояние между шагами (в эксперименте каждая команда выполнялась в новой SSH-сессии — техническое ограничение, но раскрывает принцип). Атомарная задача = одно чёткое действие с проверяемым результатом. 'Найди файл размером 1033 байта' — работает. 'Распакуй архив → смени директорию → распакуй ещё раз → найди флаг' — модель теряет нить. Формула: действие → результат → следующее действие. Не абстрактно 'подключись к серверу', а конкретно 'вот ошибка Connection refused, попробуй другой порт'.

Почему работает

Модель не 'выполняет' команды — она генерирует текст, который выглядит как команда. Между шагами нет памяти: какая директория, что в переменных, какие процессы запущены. Если задача требует 'помнить где мы' через 5 шагов — модель собьётся. Сильная сторона: LLM видела миллионы примеров bash в GitHub и Stack Overflow — знает паттерны типа 'найти файл по размеру = find с флагом -size'. Генерирует синтаксически правильные команды быстрее чем человек гуглит документацию — в эксперименте задачи решались за 1-2 секунды вместо минут. Но удержать контекст через несколько команд — не может. Поэтому разбивка + явная обратная связь после каждого шага работает.

Когда применять

Пентестинг, DevOps, работа с серверами → конкретно для генерации bash-команд когда нужно быстро получить рабочую команду без изучения синтаксиса утилит (find, grep, awk, openssl, netcat). Особенно когда задача детерминированная с проверяемым результатом — команда либо работает либо нет. НЕ подходит для многошаговых сценариев с зависимостями (создание демонов, парсинг сложного вывода nmap, нестандартные окружения типа шелла который конвертирует всё в uppercase).

Мини-рецепт

1. Задай одну атомарную задачу: 'Найди лог-файл Nginx за последние 3 дня' вместо 'Проанализируй логи Nginx'. Добавь 'Напиши одну bash-команду. Без объяснений.'
2. Получи команду от модели: она выдаст <команда>find /var/log/nginx -name "*.log" -mtime -3
3. Выполни и покажи результат: 'Запустил [команда]. Вывод: [реальный вывод]. Что дальше?'
4. Следующий шаг на основе результата: 'Мне нужны только GET-запросы с кодом 404 из этих файлов. Напиши команду для фильтрации.'
5. Повторяй цикл пока не получишь нужный результат. Модель корректирует ошибки видя реальный вывод.

Примеры

[ПЛОХО] : Найди на сервере логи Nginx за 3 дня, извлеки GET-запросы с 404, посчитай топ-10 URL. Напиши скрипт. (Многошаговая задача — модель либо выдаст неполное решение либо потеряет логику между шагами)
[ХОРОШО] : Шаг 1: Я на Linux-сервере. Найди лог-файл Nginx за последние 3 дня. Напиши одну команду. → Модель: <команда>find /var/log/nginx -name ".log" -mtime -3 Шаг 2: Запустил find. Вывод: /var/log/nginx/access.log, /var/log/nginx/access.log.1. Теперь нужны только GET-запросы с кодом 404. Команда для фильтрации? → Модель: <команда>grep "GET" /var/log/nginx/access.log | grep " 404 " Шаг 3: Запустил grep. Вывод: [100 строк]. Извлеки URL после GET, посчитай частоту, покажи топ-10. → Модель выдаст пайплайн с awk, sort, uniq -c, head -10 (Атомарные шаги + реальный вывод после каждого = модель не теряет контекст)
Источник: Autonomous Penetration Testing: Solving Capture-the-Flag Challenges with LLMs
ArXiv ID: 2508.01054 | Сгенерировано: 2026-01-12 06:14

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с