
Lo sviluppatore hammer83 ha rilasciato un nuovo aggiornamento di PlayStation 5 Remote JAR Loader con una nuova versione 4.0.1.Questo progetto utilizza vulnerabilità scoperte nel livello BD-J (da TheFlow) del firmware PS5 versione 7.61 e precedenti per distribuire un loader in grado di ascoltare i file JAR ed eseguire la loro classe principale. Ciò semplifica la masterizzazione del disco BD-R con il loader una sola volta e quindi l’esecuzione di nuove versioni del codice sperimentale. Questo tool fornisce tutta la configurazione necessaria per creare sia il file system del disco BD-R del loader sia il JAR da inviare alla PS5.
Avvio rapido
- Scarica la versione ISO di JAR Loader.
- Masterizzalo su un disco BD-R(E) ed eseguilo dalla scheda “Media” della PS5.
- Scarica uno dei JAR precompilati oppure compilane uno tuo seguendo i passaggi riportati di seguito.
- Inviare il file JAR al JAR Loader tramite NetCat oppure tramite il file JAR stesso, se Java è installato sulla macchina:
java -jar [jarfile].jar [ip] [host]
.
Prerequisiti
- JDK 11 (PS5 utilizza Java 11 runtime)
- Maestro Apache
- IntelliJ IDEA Community Edition (facoltativo, ma consigliato)
Struttura
Il progetto comprende i seguenti componenti:
- Root
pom.xml
definisce le proprietà comuni e la configurazione del plugin Maven per tutti i progetti. assembly
subproject crea la directory che dovrebbe essere masterizzata su un disco BD-R. ConsiglioImgBurn
un software per farlo. Assicurati di usare il filesystem UDF 2.50, quindi trascina semplicemente il contenuto dellaassembly/target/assembly-[version]
directory nell’editor di layout del disco.bdj-tools
sottoprogetto non ha bisogno di essere toccato. Queste sono le utility di HD Cookbook, adattate per funzionare su JDK 11 e integrate nel processo di compilazione del filesystem del disco BD-R.stubs
subproject contiene lo script di compilazione per scaricare i file di classe BD-J da HD Cookbook e organizzarli per l’uso con JDK 11 locale. È anche un posto in cui i file stub specifici di PS5 devono essere dichiarati in modo che possano essere usati in Xlet e nel JAR remoto.sdk
subproject contiene classi helper che semplificano l’invocazione nativa nel codice eseguito. Le classi in questo modulo sono incorporate nel JAR finale che verrà inviato a PS5 per l’esecuzione.xlet
subproject contiene il codice dell’Xlet che si avvia quando il disco BD-R viene lanciato su PS5. Avvia semplicemente il caricatore JAR (di default sulla porta 9025).xploit
subproject contiene vari payload da inviare per l’esecuzione su PS5. Ogni payload è un sottomodulo dixploit
module e produce il proprio file JAR. Il codice nel JAR può fare riferimento a classi daxlet
, come la classe Status per l’output sullo schermo.jar
– Classi di utilità per interagire con il JAR Loader. Non è un payload di per sé, ma è impacchettato in ogni payload JAR per gestire il passaggio dal JAR loader alrun
metodo del payload.umtx/umtx1
– Implementazione dell’exploit UMTX per ottenere capacità di lettura/scrittura del kernel. Nota che a partire dal firmware 6.00, il segmento dati del kernel è protetto dalle scritture.umtx/umtx2
– Implementazione alternativa dell’exploit UMTX.byepervisor
– Implementazione dell’exploit Byepervisor, che consente di bypassare l’hypervisor PS5 per ottenere capacità di lettura/scrittura del codice kernel su firmware precedenti alla versione 3.00.kerneldump
– In combinazione con UMTX e/o Byepervisor, questo payload invia il dump del kernel tramite la rete.ftpserver
– Server FTP limitato.samples
– Vari esempi banali per dimostrare le varie capacità della piattaforma BD-J.
Configurazione
Le seguenti proprietà in xlet/pom.xml possono essere modificate prima di compilare e masterizzare il JAR Loader sul disco:
loader.port
– Porta su cui il caricatore JAR ascolterà i dati.loader.resolution.width
,loader.resolution.height
– Risoluzione dello schermo da impostare in vari file. Non sono sicuro di come questo influisca su qualcosa, non ho sperimentato abbastanza.loader.logger.host
– Indirizzo IP dove echo i messaggi mostrati sullo schermo. Se vuoto, la registrazione remota non verrà utilizzata. Questo host può anche ricevere dati binari, vedere RemoteLogger#sendBytes .loader.logger.port
– Porta sulla quale il logger remoto invierà i messaggi di stato.loader.logger.timeout
– Numero di millisecondi da attendere prima di abbandonare i tentativi di connessione all’host di registrazione remota. Se l’host è inattivo dopo questo timeout al primo tentativo di invio, non verranno eseguiti ulteriori tentativi di registrazione remota.loader.payload.root
– È possibile includere payload JAR nell’assemblaggio del disco (vedere sotto). Questo parametro di configurazione specifica il percorso relativo alla radice del disco in cui verranno posizionati i payload.
Modificare direttamente il POM oppure passare i nuovi valori dalla riga di comando, ad esempio: mvn clean package -Dloader.port=9025 -Dloader.logger.host=192.168.1.100
. Per ascoltare i messaggi sulla macchina remota quando il logger remoto è attivato, utilizzare socat udp-recv:[remote.logger.port] stdout
.
Anche se il logger remoto non è attivo di default nell’Xlet masterizzato su disco, è possibile modificare la configurazione del server remoto utilizzando uno dei due approcci:
- Specificare
xploit.logger.host
e facoltativamentexploit.logger.port
le proprietà quando si compila il JAR. Queste possono essere impostate in xploit/pom.xml o sulla riga di comandomvn clean package -Dxploit.logger.host=192.168.1.110
. - A livello di programmazione nel payload JAR chiamando Status#resetLogger .
Utilizzo
- Assicurarsi che la variabile d’ambiente
JAVA_HOME
punti alla radice di JDK 11. Aggiungere${JAVA_HOME}/bin
la directory a${PATH}
. - Assicurati anche che
MAVEN_HOME
punti alla radice dell’installazione di Apache Maven. Aggiungi${MAVEN_HOME}/bin
directory a${PATH}
. - Per creare il payload, seguire questi passaggi:
- Crea una copia di uno dei payload di esempio copiando l’intera directory e posizionandola nella directory xploit .
- Nel
pom.xml
nuovo payload, impostaartifactId
il genitore su “xploit”, impostagroupId
il modulo su “org.ps5jb.xploit” e impostaartifactId
il modulo sul nome del tuo payload. - Crea una classe che implementa l’interfaccia “Runnable” nel pacchetto “org.ps5jb.client.payloads” del nuovo modulo. Il codice all’interno del metodo “run” sarà il punto di ingresso del payload.
- Tornando a
pom.xml
, imposta la proprietàxploit.payload
sul nome della classe sopra. Se la classe è stata creata in un sotto-pacchetto, allora è richiesto il nome completo della classe. Altrimenti, specifica semplicemente il nome della classe senza il pacchetto.
- Eseguire
mvn clean package
dalla radice del progetto. Dovrebbe produrre i seguenti artefatti:- La directory
assembly/target/assembly-[version]
contiene tutti i file che devono essere masterizzati su un disco BD-R. - Il file
xploit/[payload]/target/[payload]-[version].jar
contiene il codice che può essere inviato ripetutamente alla PS5 una volta che il loader è stato distribuito. È possibile includere il JAR del payload generato nell’assemblaggio del disco per il caricamento dal menu anziché da remoto. Per farlo, attiva il profiloxploitOnDisc
durante la compilazione, ad esempiomvn clean package -P xploitOnDisc
.
- La directory
- Masterizzare il BD-R (meglio ancora BD-RE) con il contenuto della directory menzionata nel passaggio 4a. Si noti che la rimasterizzazione del disco del caricatore JAR è necessaria solo quando la sorgente dei moduli xlet o assembly viene modificata o se il payload è stato incluso nell’assembly del disco nel passaggio precedente.
- Inserisci il disco nella PS5 e avvia “PS5 JAR Loader” da Media/Disc Player.
- Un messaggio sullo schermo dovrebbe informare che il caricatore è in attesa del JAR oppure verrà visualizzato il menu se vengono trovati payload sul disco.
- Per l’esecuzione remota, inviare il JAR utilizzando il comando:
java -jar xploit/[payload]/target/[payload]-[version].jar <ps5 ip address>`
PS5 dovrebbe informare sullo schermo sullo stato del caricamento e dell’esecuzione.
- Una volta completata l’esecuzione remota, il loader attenderà un nuovo JAR. Effettua le modifiche necessarie nel
xploit
progetto, ricompila usandomvn package
e riesegui il passaggio 8 per riprovare tutte le volte necessarie.
Appunti
- Per utilizzare con IntelliJ, puntare
File -> Open
il dialogo alla radice del progetto. Verrà eseguita l’importazione di Maven. Quindi seguire i passaggi manuali in IntelliJ Project Structure per regolare le dipendenze in modo che IntelliJ veda le classi BD-J prima delle classi JDK. - Se uno qualsiasi dei POM viene modificato, è necessario farlo
Maven -> Reload Project
in IntelliJ per sincronizzare i file di progetto. - Per generare Javadoc, utilizzare
mvn verify
piuttosto chemvn package
. I Javadoc sono abilitati per i moduli sdk , xlet e xploit e vengono generati nellatarget/site/apidocs
directory di ciascun modulo. - Per eseguire unit test, usa
mvn test
. I test vengono eseguiti automaticamente anche su ogni compilazione. Per saltarli, aggiungi-DskipTests
proprietà sulla riga di comando. Nota che al momento non sono presenti molti unit test, poiché molte funzionalità dipendono da PS5. - Se il
xploit
JAR non ha dipendenze specifiche per PS5, può essere testato localmente. La parte importante è averexlet
,stubs
exploit
JAR tutti nella stessa cartella. Se il payload fa riferimento a GEM, BD-J o Java TV API, i file JAR corrispondenti generati nella directory lib dovrebbero essere presenti nella stessa cartella. Maven build crea automaticamente questa disposizione nellatarget
directory di ogni payload, quindi il comando per eseguire il payload sulla macchina di sviluppo è molto simile a quello che invia il JAR a PS5:java -jar xploit/[payload]/target/[payload]-[version].jar
Quando viene eseguita localmente, la
Status
classe stampa sull’output/errore standard, anziché suScreen
. - Attualmente il progetto utilizza due numeri di versione distinti:
- La
xlet
versione è indipendente e verrà incrementata solo quando sarà necessario masterizzare un nuovo disco con le classi di caricamento JAR aggiornate. Se la PS5 mostra una versione diversa da quella prodotta dal codice di questo repo, non è garantito che i payload siano compatibili, quindi è meglio masterizzare un nuovo disco di caricamento. Non è previsto che questa versione venga incrementata spesso poiché il caricamento è piuttosto stabile. Per incrementare questa versione, modifica il valore dellaxlet.version
proprietà in pom.xml . - Il resto dei moduli usa la versione del POM padre. Questa versione verrà incrementata con la nuova release e riflette il fatto che l’SDK o i payload sono cambiati. Se la versione del loader è rimasta la stessa, queste nuove versioni dei payload possono comunque essere inviate al loader JAR senza dover masterizzare nuovamente il disco. Questa versione può essere incrementata eseguendo
mvn versions:set -DnewVersion=[version]
, quindi aggiornando il progetto IntelliJ Maven come descritto nel punto elenco numero 2.
- La
Struttura del progetto IntelliJ
I file di progetto IntelliJ Maven si trovano in una cartella locale privata di IntelliJ. L’apertura iniziale e i successivi ricaricamenti del progetto Maven importano in modo errato alcune impostazioni. In particolare, i JAR dello stack BD-J vengono completamente ignorati o importati con un ambito errato. Sfortunatamente, a causa di questo fatto, i seguenti passaggi devono essere eseguiti ogni volta che si verifica un ricaricamento del progetto Maven:
- La sincronizzazione del progetto Maven modifica .idea/compiler.xml per contenere percorsi di sistema assoluti. Sostituisci semplicemente quelli con
$PROJECT_DIR$
macro di nuovo. - Vai alla finestra
Project Structure
e passa alla schedaModules
. Esamina ogni modulo e assicurati che i modulibdj-api
,javatv-api
egem-api
abbiano l’ambito “Fornito”. - Inoltre, per tutti i moduli che hanno le dipendenze sopra menzionate, clicca sul
+ (Add) -> Library
pulsante e aggiungibdjstack
dipendenza libreria. Assicurati che venga spostata nella posizione superiore sopra la voce SDK 11. Questa impostazione era usata per il controllo di versione e poteva essere semplicemente ripristinata, ma negli aggiornamenti recenti, deve essere eseguita ogni volta.