Navegando por el ámbito de los paquetes maliciosos de Python
¿Alguna vez te has encontrado con el término «agente doble»? Recientemente hemos tenido la oportunidad de revisar este concepto en Austria. Dejando de lado los asuntos del mundo real para fiscales y periodistas, exploremos lo que este término significa en el mundo digital a medida que continúo. mi viaje seguimiento de paquetes maliciosos de Python.
¡El código abierto es la clave!
Supongamos que fueras un guión infantil actor de amenaza investigador buscando coger algunas galletas Analizar nuevas herramientas utilizadas para robar información de las víctimas. — ¿Adónde te dirigirías? Puede elegir entre varias opciones, pero supongamos que le encanta el código abierto y decide visitar GitHub, una de las plataformas más grandes para proyectos de código abierto. Es un recurso excelente para casi todo lo relacionado con TI, incluidos materiales educativos sobre creadores de malware.
Te engañé un poco allí, ¿lo captaste? No todo en GitHub es de código abierto, incluso si el código fuente es visible. Además, “código abierto” no significa lo mismo en todos los contextos. Es fundamental comprobar siempre la licencia. Siempre revisa la licencia.
Por ejemplo, en GitHub, puedes encontrar Oak Token Grabber V2. Ofrece un creador para personalizar un capturador (malware ladrón de información). Mira estas características:
Una captura de pantalla del archivo README del repositorio. dreamyoak/Oak-Grabber-V2
Este repositorio no es nuevo; ya existía a mediados del año pasado [1]. Cuando lo visité, había un enlace a un sitio web que ofrecía versiones pagas de capturadores RAT educativos y otros servicios. Esto no es inusual. La revisión del historial del repositorio no mostró actividad durante un año entre marzo de 2023 y marzo de 2024 y, de repente, apareció un autor con un nombre ligeramente diferente (roble de ensueño en lugar del original las dinastías) comenzó a actualizar el código. Esto sugiere que el repositorio fue trasladado o tal vez eliminado durante el año pasado.
Una breve nota sobre el análisis del historial de los repositorios de git: como todo, no puedes confiar ciegamente en los datos proporcionados por git. Por ejemplo, el autor de la confirmación puede alterar fácilmente las fechas. Sin embargo, en este caso, todos los cambios se realizaron a través de la interfaz web de GitHub, lo que significa que GitHub firma automáticamente dichas confirmaciones y podemos verificarlas usando su clave pública. [2].
¿Qué hizo el nuevo autor? El cambio más significativo fue la introducción de una nueva dependencia que hizo bastante: recopilar contraseñas de Wi-Fi, historial de PowerShell, aplicaciones instaladas, capturas de pantalla del escritorio y más. Sin embargo, hubo un pequeño detalle.
Estas no eran características del constructor.
Estos datos se recopilaron de personas que intentaban crear malware, actuando efectivamente como un agente doble que espionaba en ambos lados.
En resumen, un constructor de grabber se transformó en un grabber. El constructor importó la dependencia, un paquete de Python cargado en PyPI, cuando se usó, luego descargó automáticamente un capturador real que recopiló y exfiltró datos. De hecho, este era el capturador anunciado en el sitio web, el Nagogy Grabber, observado por primera vez hace al menos un año. [3]. Se puede detectar fácilmente con una regla YARA de Any.run [4].
Si bien la dependencia maliciosa descargó y ejecutó directamente el capturador real, se utilizó una técnica antigua muy inteligente para evadir los analizadores estáticos. Python es uno de los lenguajes que no requiere que el código fuente se escriba utilizando caracteres ASCII puros. PEP 3131 introdujo soporte para cualquier carácter que pueda normalizarse y definió el comportamiento de Python de la siguiente manera: “Todos los identificadores se convierten a la forma normal NFKC durante el análisis; La comparación de identificadores se basa en NFKC”. [5]
¿Qué quiere decir esto? Considere el siguiente ejemplo. En las dos primeras líneas, utilicé letras simples ‘u’ y ‘a’. Pero los caracteres de la tercera línea ya no son ellos: son “Mathematical Sans-Serif Bold Italic Small U” [6] y “Matemática Sans-Serif Negrita A pequeña”. [7] Ambos son parte de la especificación Unicode y, como puede ver, aunque no coinciden gráficamente con los identificadores de variables de las líneas anteriores, Python pudo procesar la declaración con éxito. Esto fue posible gracias a la normalización, que tradujo los caracteres a ASCII antes de la evaluación.
Un ejemplo de mezcla de caracteres ASCII y Unicode en identificadores que podrían confundir a las personas pero no a Python
Esta característica no se usa con frecuencia, pero los autores de códigos maliciosos aprendieron hace años que muchos analizadores estáticos no siguen PEP 3131 y no reconocen el código en la imagen a continuación, tomado de una muestra del paquete malicioso importado por el generador de grabber mencionado. realmente lo hace.
Este es un código Python completamente válido que descarga y ejecuta un ejecutable malicioso.
El autor del Oak-Grabber-V2 parecía bastante decidido a mantener la característica del agente doble. Después de eliminar paquetes maliciosos de PyPI, rápidamente se introdujeron otros nuevos y se actualizó el repositorio. Al observar las estadísticas de estrellas y bifurcaciones capturadas por archive.org, el repositorio duplicó su popularidad en tan solo unos días entre el 27 de febrero y el 7 de marzo. [8] [9]. Parece que el autor promocionó la herramienta de manera agresiva y luego intentó extraer datos de sus usuarios: la función de ‘agente doble’ se introdujo el 11 de abril. Este juego del gato y el ratón terminó cuando GitHub eliminó el repositorio el 16 de abril.
Control de agente de usuario
No fue sólo un «agente» encontrado recientemente. Encontré otro paquete de Python que ofrecía una funcionalidad única: ¡controlar su servidor a través del encabezado User-Agent!
Una muestra de la user-agents-parser
paquete
Esta característica innovadora se incorporó dentro de un clon de un paquete popular diseñado para analizar cadenas de agente de usuario. [10]que son autodescripciones que los navegadores envían a los servidores con cada solicitud [11]. Las aplicaciones web suelen utilizar estas cadenas para diferentes propósitos, como dirigir a los usuarios a un sitio móvil o recopilar estadísticas. En este caso, el autor replicó un paquete existente pero agregó un giro: las cadenas podrían ejecutarse como comandos de shell antes de ser analizadas. A pesar de la modificación, los paquetes mantuvieron su funcionalidad original, lo que significa que no sabría que estaba utilizando un paquete comprometido a menos que una solicitud específica desencadenara la ejecución del comando.
Además, el creador del paquete empleó otra táctica común digna de mención: conservó el sitio web del proyecto original y la información del autor, que normalmente se muestran en páginas de índice de paquetes como PyPI. Estas estadísticas pueden inducir a error a los usuarios a confiar en un paquete aparentemente popular y seguro.
PyPI recientemente tomó medidas para prevenir tal engaño al indicar claramente qué datos están verificados y cuáles no, una mejora significativa.
Después de informar sobre el paquete, Mike Fiedler del equipo de seguridad de PyPI descubrió que su versión anterior también intentaba establecer un shell inverso persistente registrando un trabajo cron.
Una versión anterior de user-agents-parser
Estaba intentando usar crontab para la persistencia.
Pensamientos finales
Todos los paquetes asociados se eliminaron de PyPI y GitHub cerró el repositorio Oak-Grabber-V2. Sin embargo, esta no es la primera ni la última vez que nos encontraremos con este tipo de amenazas. Si buscas un consejo, he anotado algunos en mi ultima publicación. Pero lo más importante es evitar descargar software aleatorio, incluso si tiene fines educativos.
COI
- Paquetes maliciosos utilizados por Oak-Grabber-V2:
argsreq
,colarg
,colargs
,reqarg
,reqargs
- URL con el capturador real:
hxxps://api.dreamyoak[.]xyz/cdn/file
hxxps://api2.dreamyoak[.]xyz/cdn/file
- Paquetes maliciosos que se hacen pasar por analizadores de agentes de usuario:
user-agents-parser
,user-agents-parsers
- IP utilizada en un intento de shell inverso:
95.179[.]177[.]74
Referencias
[1] https://web.archive.org/web/20230731214919/https://github.com/dreamyoak/
[2] https://github.com/web-flow.gpg
[3] https://twitter.com/MalGamy12/status/1698367753919357255
[4] https://github.com/anyrun/YARA/blob/73fba11a040629e147281aa0528439d72fb5402a/NagogyGrabber.yar
[5] https://peps.python.org/pep-3131/
[6] https://unicodeplus.com/U+1D66A
[7] https://unicodeplus.com/U+1D5EE
[8] https: //web.archive.org/web/20240227221457/https://github.com/c/Oak-Grabber-V2?tab=readme-ov-file
[9] https: //web.archive.org/web/20240307140321/https://github.com/dreamyoak/Oak-Grabber-V2
[10] El paquete original y seguro está aquí: https://pypi.org/project/user-agents/
[11] https://developer.mozilla.org/en-US/docs/Glossary/User_agent
[12] https://web.archive.org/web/20240117161520/https://pypi.org/project/adafruit-circuitpython-htu31d/