
Se utiliza un paquete de Python para ejecutar pruebas de Atomic Red Team (Atomics) en múltiples entornos de sistemas operativos.
Este paquete de Python se utiliza para ejecutar pruebas de Atomic Red Team (Atómicas) en múltiples entornos de sistemas operativos.
atomic-operator permite a los profesionales de seguridad probar sus capacidades de detección y defensa contra las técnicas prescritas definidas en atomic-red-team. Al utilizar un marco de pruebas como atomic-operator, puedes identificar tanto tus capacidades defensivas como las brechas en la cobertura defensiva.
Además, atomic-operator se puede utilizar en muchas otras situaciones como:
iaas:awsatomic-operator es un paquete exclusivo de Python alojado en PyPi y funciona con Python 3.6 y superior.
Si deseas una versión de PowerShell, consulta Invoke-AtomicRedTeam.
pip install atomic-operator
Los siguientes pasos te guiarán en la configuración y ejecución de atomic-operator.
Puedes instalar atomic-operator en OS X, Linux o Windows. También puedes instalarlo directamente desde el código fuente. Para instalarlo, consulta los comandos correspondientes al sistema operativo relevante a continuación.
Las siguientes bibliotecas son requeridas e instaladas por atomic-operator:
pyyaml==5.4.1
fire==0.4.0
requests==2.26.0
attrs==21.2.0
pick==1.2.0
pip install atomic-operator
git clone https://github.com/swimlane/atomic-operator.git
cd atomic-operator
# Satisfacer ModuleNotFoundError: No module named 'setuptools_rust'
brew install rust
pip3 install --upgrade pip
pip3 install setuptools_rust
# Volviendo a nuestra programación habitual . . .
pip install -r requirements.txt
python setup.py install
git clone https://github.com/swimlane/atomic-operator.git
cd atomic-operator
pip install -r requirements.txt
python setup.py install
Puedes ejecutar atomic-operator desde la línea de comandos o dentro de tus propios scripts de Python. Para usar atomic-operator en la línea de comandos, simplemente ingresa lo siguiente en tu terminal:
atomic-operator --help
atomic-operator run -- --help
Ten en cuenta que para ver los detalles del comando run, ejecuta
atomic-operator run -- --helpy NOatomic-operator run --help
Para usar atomic-operator, debes tener una o más pruebas de atomic-red-team (Atómicas) en tu sistema local. atomic-operator te proporciona la capacidad de descargar el repositorio de Atomic Red Team. Puedes hacerlo ejecutando lo siguiente en la línea de comandos:
atomic-operator get_atomics
# Puedes especificar el directorio de destino usando la bandera --destination
atomic-operator get_atomics --destination "/tmp/some_directory"
Para ejecutar una prueba, debes proporcionar algunas propiedades adicionales (y opciones si lo deseas). El método principal para ejecutar pruebas se llama run.
# Esto ejecutará TODAS las pruebas compatibles con tu sistema operativo local
atomic-operator run --atomics-path "/tmp/some_directory/redcanaryco-atomic-red-team-3700624"
Puedes seleccionar pruebas individuales al proporcionar una o más técnicas específicas. Por ejemplo, ejecutando lo siguiente en la línea de comandos:
atomic-operator run --techniques T1564.001 --select_tests
Se le presentará al usuario una lista de selección de pruebas asociadas con esa técnica. Un usuario puede seleccionar una o más pruebas usando la barra espaciadora para resaltar la prueba deseada:
Seleccione Test(s) para la Técnica T1564.001 (Ocultar Artefactos: Archivos y Directorios Ocultos)
* Crear un archivo oculto en un directorio oculto (61a782e5-9a19-40b5-8ba4-69a4b9f3d7be)
Archivo oculto en Mac (cddb9098-3b47-4e01-9d3b-6f5f323288a9)
Crear archivo de sistema de Windows con Attrib (f70974c8-c094-4574-b542-2c545af95a32)
Crear archivo oculto de Windows con Attrib (dadb792e-4358-4d8d-9207-b771faa0daa5)
Archivos ocultos (3b7015f2-3144-4205-b799-b05580621379)
Ocultar un directorio (b115ecaf-3b24-4ed2-aefe-2fcb9db913d3)
Mostrar todos los archivos ocultos (9a1ec7da-b892-449f-ad68-67066d04380c)
Lo siguiente te permitirá proporcionar argumentos de entrada personalizados para las pruebas. Para ello, proporciona un diccionario de claves y valores como un diccionario al parámetro input_arguments en el método run.
atomic-operator run --techniques T1564.001 --input_arguments '{"project-id": "some_value", "another_key": "another value"}'
# Por favor, incluye comillas simples alrededor del valor de input_arguments.
Para ejecutar una prueba de forma remota, debes proporcionar algunas propiedades adicionales (y opciones si lo deseas). El método principal para ejecutar pruebas se llama run.
# Esto ejecutará TODAS las pruebas compatibles con tu sistema operativo local
atomic-operator run --atomics-path "/tmp/some_directory/redcanaryco-atomic-red-team-3700624" --hosts "10.32.1.0" --username "my_username" --password "my_password"
Al ejecutar comandos de forma remota en hosts de Windows, es posible que necesites configurar PSRemoting. Consulta los detalles aquí: Remoting en Windows
Puedes ver parámetros adicionales ejecutando el siguiente comando:
atomic-operator run -- --help
Deberías ver una salida similar a la siguiente:
NOMBRE
atomic-operator run - El método principal para ejecutar pruebas de Atomic Red Team.
SINOPSIS
atomic-operator run <flags>
DESCRIPCIÓN
El método principal para ejecutar pruebas de Atomic Red Team.
BANDERAS
--techniques=TECHNIQUES
Tipo: list
Valor por defecto: ['all']
Una o más técnicas definidas por ID de attack_technique. Por defecto 'all'.
--test_guids=TEST_GUIDS
Tipo: list
Valor por defecto: []
Uno o más GUIDs de pruebas atómicas. Por defecto None.
--select_tests=SELECT_TESTS
Tipo: bool
Valor por defecto: False
Seleccionar una o más pruebas de las técnicas proporcionadas. Por defecto False.
--atomics_path=ATOMICS_PATH
Valor por defecto: '/U...
La ruta de las pruebas atómicas. Por defecto os.getcwd().
--input_arguments={}
Valor por defecto: {}
Un diccionario de argumentos de entrada para pasar a la prueba.
--check_prereqs=CHECK_PREREQS
Valor por defecto: False
Indica si se deben verificar las dependencias de requisitos previos (prereq_comand). Por defecto False.
--get_prereqs=GET_PREREQS
Valor por defecto: False
Indica si deseas obtener los requisitos previos. Por defecto False.
--cleanup=CLEANUP
Valor por defecto: False
Indica si deseas ejecutar comandos de limpieza. Por defecto False.
--copy_source_files=COPY_SOURCE_FILES
Valor por defecto: True
Indica si deseas copiar los archivos fuente relacionados (src, bin, etc.) a un host remoto. Por defecto True.
--command_timeout=COMMAND_TIMEOUT
Valor por defecto: 20
Duración de tiempo de espera para cada comando. Por defecto 20.
--debug=DEBUG
Valor por defecto: False
Indica si deseas mostrar detalles sobre las pruebas que se están ejecutando. Por defecto False.
--prompt_for_input_args=PROMPT_FOR_INPUT_ARGS
Valor por defecto: False
Indica si deseas solicitar argumentos de entrada para cada prueba. Por defecto False.
--return_atomics=RETURN_ATOMICS
Valor por defecto: False
Indica si deseas devolver atómicas en lugar de ejecutarlas. Por defecto False.
--config_file=CONFIG_FILE
Tipo: Optional[]
Valor por defecto: None
Una ruta a un archivo de configuración que se utiliza para automatizar atomic-operator en entornos. Por defecto None.
--config_file_only=CONFIG_FILE_ONLY
Valor por defecto: False
Indica si deseas ejecutar pruebas basadas únicamente en el archivo de configuración proporcionado. Por defecto False.
--hosts=HOSTS
Valor por defecto: []
Una lista de uno o más hosts remotos para ejecutar una prueba. Por defecto [].
--username=USERNAME
Tipo: Optional[]
Valor por defecto: None
Nombre de usuario para la autenticación de conexiones remotas. Por defecto None.
--password=PASSWORD
Tipo: Optional[]
Valor por defecto: None
Contraseña para la autenticación de conexiones remotas. Por defecto None.
--ssh_key_path=SSH_KEY_PATH
Tipo: Optional[]
Valor por defecto: None
Ruta a una clave SSH para la autenticación de conexiones remotas. Por defecto None.
--private_key_string=PRIVATE_KEY_STRING
Tipo: Optional[]
Valor por defecto: None
Una cadena de clave SSH privada utilizada para la autenticación de conexiones remotas. Por defecto None.
--verify_ssl=VERIFY_SSL
Valor por defecto: False
Indica si se debe verificar SSL al conectarse a través de RDP (Windows). Por defecto False.
--ssh_port=SSH_PORT
Valor por defecto: 22
Puerto SSH para la autenticación de conexiones remotas. Por defecto 22.
--ssh_timeout=SSH_TIMEOUT
Valor por defecto: 5
Tiempo de espera SSH para la autenticación de conexiones remotas. Por defecto 5.
Se aceptan banderas adicionales.
Si se proporcionan, las claves que coincidan con las entradas de una prueba serán reemplazadas. Por defecto es None.
Además de la capacidad de pasar parámetros con atomic-operator, también puedes pasar una ruta a un config_file que contiene todas las pruebas atómicas y sus posibles entradas. Puedes ver un ejemplo de este archivo de configuración aquí:
atomic_tests:
- guid: f7e6ec05-c19e-4a80-a7e7-241027992fdb
input_arguments:
output_file:
value: custom_output.txt
input_file:
value: custom_input.txt
- guid: 3ff64f0b-3af2-3866-339d-38d9791407c3
input_arguments:
second_arg:
value: SWAPPPED argument
- guid: 32f90516-4bc9-43bd-b18d-2cbe0b7ca9b2
Para usar atomic-operator debes instanciar un objeto AtomicOperator.
from atomic_operator import AtomicOperator
operator = AtomicOperator()
# Esto descargará una copia local del repositorio atomic-red-team
print(operator.get_atomics('/tmp/some_directory'))
# esto ejecutará pruebas en tu sistema local
operator.run(
technique: str='All',
atomics_path=os.getcwd(),
check_dependencies=False,
get_prereqs=False,
cleanup=False,
command_timeout=20,
debug=False,
prompt_for_input_args=False,
**kwargs
)
Por favor, crea un issue si tienes preguntas o encuentras algún problema.
Por favor, lee CONTRIBUTING.md para obtener detalles sobre nuestro código de conducta y el proceso para enviar pull requests.
Usamos SemVer para el versionado.
Consulta también la lista de contribuidores que participaron en este proyecto.
Este proyecto está licenciado bajo la Licencia MIT - consulta el archivo LICENSE para más detalles.
| Nombre del Parámetro | Tipo | Valor por Defecto | Descripción |
|---|
| techniques | list | all | Una o más técnicas definidas por ID de attack_technique. |
| test_guids | list | None | Uno o más GUIDs de pruebas atómicas. |
| select_tests | bool | False | Seleccionar una o más pruebas atómicas para ejecutar cuando se especifican técnicas. |
| atomics_path | str | os.getcwd() | La ruta de las pruebas atómicas. |
| input_arguments | dict | {} | Un diccionario de argumentos de entrada para pasar a la prueba. |
| check_prereqs | bool | False | Indica si se deben verificar las dependencias de requisitos previos (prereq_comand). |
| get_prereqs | bool | False | Indica si deseas obtener los requisitos previos. |
| cleanup | bool | False | Indica si deseas ejecutar comandos de limpieza. |
| copy_source_files | bool | True | Indica si deseas copiar los archivos fuente relacionados (src, bin, etc.) a un host remoto. |
| command_timeout | int | 20 | Duración de tiempo para cada comando antes del tiempo de espera. |
| debug | bool | False | Indica si deseas mostrar detalles sobre las pruebas que se están ejecutando. |
| prompt_for_input_args | bool | False | Indica si deseas solicitar argumentos de entrada para cada prueba. |
| return_atomics | bool | False | Indica si deseas devolver atómicas en lugar de ejecutarlas. |
| config_file | str | None | Una ruta a un archivo de configuración que se utiliza para automatizar atomic-operator en entornos. |
| config_file_only | bool | False | Indica si deseas ejecutar pruebas basadas únicamente en el archivo de configuración proporcionado. |
| hosts | list | None | Una lista de uno o más hosts remotos para ejecutar una prueba. |
| username | str | None | Nombre de usuario para la autenticación de conexiones remotas. |
| password | str | None | Contraseña para la autenticación de conexiones remotas. |
| ssh_key_path | str | None | Ruta a una clave SSH para la autenticación de conexiones remotas. |
| private_key_string | str | None | Una cadena de clave SSH privada utilizada para la autenticación de conexiones remotas. |
| verify_ssl | bool | False | Indica si se debe verificar SSL al conectarse a través de RDP (Windows). |
| ssh_port | int | 22 | Puerto SSH para la autenticación de conexiones remotas. |
| ssh_timeout | int | 5 | Tiempo de espera SSH para la autenticación de conexiones remotas. |
| **kwargs | dict | None | Si se pasan banderas adicionales al comando run, intentaremos emparejarlas con las entradas definidas en las pruebas atómicas y reemplazar su valor con el valor proporcionado. |