
Heavily-modified fork of David Buchanan's dlinject project. Injects arbitrary assembly (or precompiled binary) payloads directly into x86-64, x86, and ARM32 Linux processes without the use of ptrace by accessing /proc/<pid>/mem. Useful for certain post-exploitation scenarios, recovering content from process memory, etc..
asminject.py — это значительно модифицированный форк проекта dlinject Дэвида Бьюкенена. Внедряет произвольные ассемблерные (или предварительно скомпилированные бинарные) полезные нагрузки непосредственно в процессы Linux на архитектурах x86-64, x86 и ARM32, обращаясь к /proc/<pid>/mem вместо присоединения через ptrace. Полезен для вмешательства в работу доверенных процессов, реализации некоторых сценариев постэксплуатации, извлечения содержимого из памяти процессов и обхода ряда средств контроля безопасности. Может внедрять код в процессы внутри контейнеров извне контейнера, при условии наличия root-доступа к хосту.
Подробнее о asminject.py и его происхождении можно также прочитать на странице инструмента Bishop Fox, включая подробный разбор работы, вдохновившей создание этого инструмента.
В этом документе:
Отдельная, более подробная документация:
asminject.py похож на dlinject, за исключением того, что позволяет внедрять любую нужную полезную нагрузку, а не только загружать библиотеку, и работает на нескольких архитектурах."asminject.py отдалённо напоминает Frida, но не присоединяется через интерфейс ptrace, поэтому процессы не могут заблокировать его, вызывая ptrace по отношению к самим себе."asminject.py был написан для двух основных сценариев в пентесте Linux-окружений:
Например, рассмотрим пентест, в ходе которого тестировщик получил root-доступ к серверу, на котором размещено множество контейнеров. В одном из контейнеров обрабатываются банковские переводы, и внутри него установлен очень надёжный продукт для защиты конечных точек. Когда пентестер пытается изменить данные банковского перевода изнутри контейнера, ПО для защиты конечных точек обнаруживает и блокирует эту попытку. asminject.py позволяет пентестеру внедрять произвольный код непосредственно в память процесса банковского ПО или даже в продукт защиты конечных точек извне контейнера. Подобно жертве «злого демона» Декарта, программное обеспечение безопасности внутри контейнера беспомощно, поскольку оно существует в среде, полностью контролируемой атакующим.
Оригинальный dlinject.py был разработан специально для загрузки общих библиотек Linux в существующий процесс. asminject.py делает всё, что делал оригинал, и гораздо больше. Он выполняет произвольный ассемблерный код и включает шаблоны для множества атак. Он также был переработан, чтобы помогать избегать обнаружения механизмами безопасности, которые реагируют на потенциально подозрительную активность, например на события загрузки библиотек.
Каталог practice этого репозитория содержит простой код цикла, который выводит на консоль метку времени и номер итерации цикла, чтобы вы могли попрактиковаться во внедрении различных типов кода в контролируемой среде. На эти тренировочные циклы ссылаются в остальных примерах.
Базовый синтаксис вызова asminject.py выглядит следующим образом:
# python3 ./asminject.py <target_process_id> <payload> \
--arch [x86-64|x86|arm32] --relative-offsets-from-binaries --stop-method "slow" \
--var <payload_variable_1_name> <payload_variable_1_value> \
# ... \
--var <payload_variable_n_name> <payload_variable_n_value>
В большинстве случаев любая из полезных нагрузок, используемых в примерах, будет работать на любой из поддерживаемых архитектур.
Большинство дистрибутивов Linux включают модуль безопасности ядра под названием Yama, который контролирует доступ к использованию возможности ptrace в отношении других процессов. Хотя asminject.py не присоединяется к интерфейсу отладчика, ему всё равно требуется разрешение на использование возможности ptrace. Если вы получаете ошибки, связанные с этой возможностью, проверьте содержимое /proc/sys/kernel/yama/ptrace_scope. Если оно установлено в 2, выполните следующую команду от имени root:
echo 1 > /proc/sys/kernel/yama/ptrace_scope
Значения 3 и выше нельзя сбросить без перезагрузки. Однако, если вы являетесь уполномоченным администратором Linux-системы, где кто-то случайно установил /proc/sys/kernel/yama/ptrace_scope в 3, или проводите санкционированный пентест окружения, где установлено это значение, обратитесь к каталогу ptrace_scope_kernel_module — там описан возможный обходной путь, не требующий перезагрузки.
gcc.eval) предоставить полезные нагрузки, использующие эту возможность для ещё большей скрытности.dlinject.py.asminject.py — требуется дополнительное исследование.asminject.py мог бы запрашивать у оператора строку кода для внедрения, внедрять её, возвращать полученный результат и затем запрашивать следующую строку кода.
asminject.py так, чтобы избежать необходимости Frida во временном обращении к интерфейсу отладчика.asminject.py/proc/mem