pspy

Post-Exploitation v1.2.1 · 17.01.2023 не обновлялся >2 лет

Мониторинг процессов Linux без root-доступа. Перехватывает procfs-события в реальном времени — видит все запускаемые процессы, их аргументы и переменные окружения. Незаменим для обнаружения cron-задач, скриптов запускаемых от root и других путей privilege escalation.

v1.2.1
17.01.2023 current
Добавлен 07.07.2026 · Обновлён 07.07.2026 · Post-Exploitation
Установка
# Скачать готовый статически скомпилированный бинарь:
# https://github.com/DominicBreuker/pspy/releases

# x64:
wget https://github.com/DominicBreuker/pspy/releases/latest/download/pspy64
chmod +x pspy64
./pspy64

# Только процессы (без файловых событий):
./pspy64 -p

# Сборка из исходников:
git clone https://github.com/DominicBreuker/pspy
cd pspy && go build -ldflags "-s -w" .
переведено ИИ

pspy - перехват процессов в Linux без привилегий root

Go Report Card Maintainability Test Coverage CircleCI

pspy — это инструмент командной строки, предназначенный для перехвата процессов без необходимости иметь прав root. Он позволяет видеть команды, запускаемые другими пользователями, задания cron и т.д. в момент их выполнения. Отлично подходит для перечисления систем Linux в CTF. Также отлично демонстрирует коллегам, почему передача секретов в качестве аргументов командной строки — плохая идея.

Инструмент собирает информацию из сканирования procfs. Вотчины inotify, размещённые на выбранных частях файловой системы, запускают эти сканирования для поимки кратковременных процессов.

Начало работы

Загрузка

Получите инструмент на машину Linux, которую вы хотите проверить. Сначала получите бинарные файлы. Скачайте выпущенные бинарные файлы здесь: - 32-битная большая статическая версия: pspy32 скачать - 64-битная большая статическая версия: pspy64 скачать - 32-битная малая версия: pspy32s скачать - 64-битная малая версия: pspy64s скачать

Статически скомпилированные файлы должны работать в любой системе Linux, но они довольно велики (~4MB). Если размер имеет значение, попробуйте меньшие версии, которые зависят от libc и сжаты с помощью UPX (~1MB).

Сборка

Используйте Go, установленный в вашей системе, или запустите процесс сборки на основе Docker, который использовался для создания релиза. Для второго варианта убедитесь, что Docker установлен, а затем выполните make build-build-image для сборки Docker-образа, за которым следует make build для сборки бинарных файлов с его помощью.

Вы можете запустить pspy --help, чтобы узнать о флагах и их назначении. Краткое описание: - -p: включает вывод команд в stdout (включено по умолчанию) - -f: включает вывод событий файловой системы в stdout (отключено по умолчанию) - -r: список каталогов для отслеживания с помощью Inotify. pspy будет рекурсивно отслеживать все подкаталоги (по умолчанию отслеживает /usr, /tmp, /etc, /home, /var и /opt). - -d: список каталогов для отслеживания с помощью Inotify. pspy будет отслеживать только эти каталоги, но не подкаталоги (пусто по умолчанию). - -i: интервал в миллисекундах между сканированиями procfs. pspy регулярно сканирует наличие новых процессов, независимо от событий Inotify, на случай, если некоторые события не будут получены. - -c: печатает команды разными цветами. События файловой системы больше не окрашиваются, команды имеют разные цвета в зависимости от UID процесса. - --debug: печатает подробные сообщения об ошибках, которые в противном случае скрыты.

Настройки по умолчанию должны подойти для большинства приложений. Наблюдение за файлами внутри /usr наиболее важно, так как многие инструменты обращаются к библиотекам внутри него.

Несколько более сложных примеров:

# print both commands and file system events and scan procfs every 1000 ms (=1sec)
./pspy64 -pf -i 1000 

# place watchers recursively in two directories and non-recursively into a third
./pspy64 -r /path/to/first/recursive/dir -r /path/to/second/recursive/dir -d /path/to/the/non-recursive/dir

# disable printing discovered commands but enable file system events
./pspy64 -p=false -f

Примеры

Наблюдение за заданием cron

Чтобы увидеть инструмент в действии, просто клонируйте репозиторий и выполните make example (нужен Docker). Известно, что передача паролей в качестве аргументов командной строки небезопасна, и этот пример может это продемонстрировать. Команда запускает контейнер Debian, в котором секретное задание cron, выполняемое от root, каждую минуту меняет пароль пользователя. pspy запускается в фоне, от имени пользователя myuser, и сканирует процессы. Вы должны увидеть вывод, подобный следующему:

~/pspy (master) $ make example
[...]
docker run -it --rm local/pspy-example:latest
[+] cron started
[+] Running as user uid=1000(myuser) gid=1000(myuser) groups=1000(myuser),27(sudo)
[+] Starting pspy now...
Watching recursively    : [/usr /tmp /etc /home /var /opt] (6)
Watching non-recursively: [] (0)
Printing: processes=true file-system events=false
2018/02/18 21:00:03 Inotify watcher limit: 524288 (/proc/sys/fs/inotify/max_user_watches)
2018/02/18 21:00:03 Inotify watchers set up: Watching 1030 directories - watching now
2018/02/18 21:00:03 CMD: UID=0    PID=9      | cron -f
2018/02/18 21:00:03 CMD: UID=0    PID=7      | sudo cron -f
2018/02/18 21:00:03 CMD: UID=1000 PID=14     | pspy
2018/02/18 21:00:03 CMD: UID=1000 PID=1      | /bin/bash /entrypoint.sh
2018/02/18 21:01:01 CMD: UID=0    PID=20     | CRON -f
2018/02/18 21:01:01 CMD: UID=0    PID=21     | CRON -f
2018/02/18 21:01:01 CMD: UID=0    PID=22     | python3 /root/scripts/password_reset.py
2018/02/18 21:01:01 CMD: UID=0    PID=25     |
2018/02/18 21:01:01 CMD: UID=???  PID=24     | ???
2018/02/18 21:01:01 CMD: UID=0    PID=23     | /bin/sh -c /bin/echo -e "KI5PZQ2ZPWQXJKEL\nKI5PZQ2ZPWQXJKEL" | passwd myuser
2018/02/18 21:01:01 CMD: UID=0    PID=26     | /usr/sbin/sendmail -i -FCronDaemon -B8BITMIME -oem root
2018/02/18 21:01:01 CMD: UID=101  PID=27     |
2018/02/18 21:01:01 CMD: UID=8    PID=28     | /usr/sbin/exim4 -Mc 1enW4z-00000Q-Mk

Сначала pspy печатает все текущие запущенные процессы, каждый с PID, UID и командной строкой. Когда pspy обнаруживает новый процесс, он добавляет строку в этот лог. В этом примере вы найдете процесс с PID 23, который, похоже, меняет пароль пользователя myuser. Это результат Python-скрипта, используемого в приватном crontab root /var/spool/cron/crontabs/root, который выполняет эту shell-команду (см. crontab и скрипт). Обратите внимание, что пользователь myuser не может видеть ни crontab, ни Python-скрипт. С помощью pspy он всё равно может видеть команды.

Пример CTF из Hack The Box

Ниже приведён пример из машины Shrek на Hack The Box. В этом CTF-задании задача состоит в том, чтобы эксплуатировать скрытое задание cron, которое изменяет владельца всех файлов в папке. Уязвимость заключается в небезопасном использовании подстановочного знака вместе с chmod (подробности для заинтересованного читателя: ссылка). Для его нахождения и эксплуатации требуется значительная догадка. Однако с помощью pspy задание cron легко найти и проанализировать:

animated demo gif

Как это работает

Существуют инструменты для перечисления всех процессов, выполняемых в системах Linux, включая те, которые уже завершились. Например, есть forkstat. Он получает уведомления от ядра о событиях, связанных с процессами, таких как fork и exec.

Эти инструменты требуют привилегий root, но это не должно создавать ложное чувство безопасности. Ничто не мешает вам следить за процессами, работающими в системе Linux. Много информации доступно в procfs, пока процесс работает. Единственная проблема — вы должны поймать кратковременные процессы в очень короткий промежуток времени, пока они существуют. Сканирование каталога /proc в бесконечном цикле для поиска новых PID решает задачу, но потребляет много CPU.

Более скрытный способ — использовать следующий трюк. Процесы склонны обращаться к файлам, таким как библиотеки в /usr, временные файлы в /tmp, файлам журналов в /var, ... Используя API inotify, вы можете получать уведомления, когда эти файлы создаются, модифицируются, удаляются, используются и т.д. Linux не требует привилегированных пользователей для этого API, поскольку он необходим для многих безобидных приложений (например, текстовых редакторов, показывающих вам актуальный обзор файлов). Таким образом, хотя пользователи без root не могут напрямую мониторить процессы, они могут мониторить влияние процессов на файловую систему.

Мы можем использовать события файловой системы как триггер для сканирования /proc, надеясь, что мы сможем сделать это достаточно быстро, чтобы поймать процессы. Это то, что делает pspy. Нет гарантии, что вы не пропустите ни одного процесса, но в моих экспериментах шансы кажутся хорошими. В общем, чем дольше работают процессы, тем выше вероятность их поймать.

Разное

Логотип: "By Creative Tail [CC BY 4.0 (http://creativecommons.org/licenses/by/4.0)], via Wikimedia Commons" (ссылка)

Комментарии
Войдите, чтобы оставить комментарий