Pspy - это инструмент
Ссылка скрыта от гостей
, предназначенный для слежки за процессами без прав root. Он позволяет вам видеть команды, выполняемые другими пользователями, задания cron и т.д. по мере их выполнения. Отлично подходит для
Ссылка скрыта от гостей
систем Linux в CTF.Инструмент собирает информацию из procfs сканов. Оповещения наблюдателей, размещенных на выбранных частях файловой системы, запускают эти сканирования, чтобы перехватить кратковременные процессы.
Начало работы
Установите инструмент на машину Linux, которую вы хотите проверить. Сначала получите двоичные файлы.
Вы можете создать их самостоятельно, запустив команду make build-build-image для создания образа докера, используемого в make build для создания четырех двоичных файлов:
- 32-битная большая, статическая версия: pspy32
- 64-битная большая, статическая версия: pspy64
- 32-разрядная версия: pspy32s
- 64-битная версия: pspy64s Статически скомпилированные файлы должны работать на любой Linux системе, но они достаточно большие (~4MB). Если проблематичен размер, попробуйте меньшие версии, которые зависят от libc и сжаты с помощью UPX (<1MB).
- -p: включает команды печати в stdout (включено по умолчанию).
- -f: позволяет печатать события файловой системы в stdout (по умолчанию отключено).
- -r: список каталогов для просмотра с Inotify. pspy будет просматривать все подкаталоги рекурсивно (по умолчанию watch /usr, /tmp, /etc, /home, /var, и /opt).
- -d: список каталогов для просмотра Inotify. pspy будет просматривать только эти каталоги, а не подкаталоги (по умолчанию пустые).
- -i: интервал в миллисекундах между procfs сканированиями. pspy регулярно сканирует на наличие новых процессов независимо от событий Inotify, на случай, если некоторые события не будут получены.
- -c: печатать события разными цветами. Красный - для новых процессов, зеленый - для новых событий Inotify.
Настройки по умолчанию должны быть подходящими для большинства приложений. Просмотр файлов внутри /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 "KI5PZQ2ZPWQXJKELnKI5PZQ2ZPWQXJKEL" | 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, используемого в корне private crontab /var/spool/cron/crontabs/root , который выполняет эту команду оболочки (проверьте crontab и script). Обратите внимание, что myuser не может видеть ни crontab, ни скрипт Python. С pspy, тем не менее, он может видеть команды.
Как это работает
Существуют инструменты, позволяющие перечислить все процессы, выполняемые на Linux-системах, в том числе и завершенные. Например, есть форкстат. Он получает уведомления от ядра о событиях, связанных с процессами, таких как fork и exec.
Эти инструменты требуют привилегий root, но это не должно давать вам ложного ощущения безопасности. Ничто не мешает вам следить за процессами, запущенными в системе Linux. Много информации видно в procfs до тех пор, пока запущен процесс. Единственная проблема заключается в том, что вам приходится ловить недолговечные процессы за очень короткий промежуток времени, в течение которого они живы. Сканирование каталога /proc на наличие новых PID в бесконечном цикле делает трюк, но потребляет много CPU.
Более скрытым способом является использование следующего трюка. Процесс стремится получить доступ к таким файлам, как библиотеки в /usr, временные файлы в /tmp, лог-файлы в /var, ... Используя inotify API, вы можете получать уведомления всякий раз, когда эти файлы создаются, изменяются, удаляются, получают доступ к ним и т.д. Linux не требует привилегированных пользователей для этого API, так как он необходим для многих приложений (таких как, текстовые редакторы, показывающие вам обновлённый файловый проводник). Таким образом, хотя не корневые пользователи не могут напрямую следить за процессами, они могут отслеживать влияние процессов на файловую систему.
Мы можем использовать события файловой системы в качестве триггера для сканирования /proc, надеясь, что сможем сделать это достаточно быстро, чтобы перехватить процессы. Это то, что делает pspy. Нет никакой гарантии, что вы не пропустите ни одного, но шансы в моих экспериментах кажутся хорошими. В общем, чем дольше протекают процессы, тем больше шансов их поймать.