
Lord Of Active Directory - Active Directory vulnerável automático na AWS

Baseado em AWS-Redteam-Lab e OCD GOAD
O custo para executar o laboratório por 125 horas durante um mês é de aproximadamente 14$. Com o Free Tier você obtém 750h de EC2 por mês; como há 6 máquinas, são 125h. Mas você só obtém 30Gb de armazenamento. Então você precisa de armazenamento para as outras 5 VMs : 30Gb * 5 = 150Gb = 14$ / mês
Assim como o projeto GOAD, a instalação é dividida em duas partes :
Até agora, o laboratório só foi testado em uma máquina Linux, mas deve funcionar também no macOS. O Ansible tem alguns problemas com hosts Windows, então não sei quanto a isso.
Para que a configuração funcione corretamente, você precisa instalar:
Se você quiser fazer o provisionamento a partir de um container docker, pode executar o seguinte comando para preparar o container
sudo docker build -t loadansible .
Se você quiser executar o ansible a partir do seu host, deve executar os seguintes comandos :
sudo apt install git
git clone [email protected]:0xBallpoint/LOAD.git
cd LOAD/ansible
sudo apt install python3.8-venv
python3.8 -m virtualenv .venv
source .venv/bin/activate
ansible e pywinrm no .venv
python3 -m pip install --upgrade pip
python3 -m pip install ansible-core==2.12.6
python3 -m pip install pywinrm
ansible-galaxy install -r requirements.yml
Você precisa instalar o Terraform seguindo o guia no site deles hashicorp.com
Se quiser instalar o Terraform manualmente no Linux :
sudo apt-get update && sudo apt-get install -y gnupg software-properties-common
# Install the HasiCorp GPG key
wget -O- https://apt.releases.hashicorp.com/gpg | \
gpg --dearmor | \
sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
# Verify the key's fingerprint
gpg --no-default-keyring \
--keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg \
--fingerprint
# It must match E8A0 32E0 94D8 EB4E A189 D270 DA41 8C88 A321 9F7B (from https://www.hashicorp.com/security)
# Add the official HashiCorp repository to your system
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] \
https://apt.releases.hashicorp.com $(lsb_release -cs) main" | \
sudo tee /etc/apt/sources.list.d/hashicorp.list
# Update, install, verify
sudo apt update
sudo apt install terraform
terraform -help
Você precisará do AWS CLI para configurar suas chaves de acesso à AWS. Você deve seguir o guia de instalação no site deles docs.aws.amazon.com
Para Linux :
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
O domínio padrão será middle-earth.local, na sub-rede 10.0.1.0/24, e cada máquina foi alocada com apenas 1 CPU e 1024MB de memória (t2.micro). Se quiser alterar algumas dessas configurações de desempenho, você pode modificar o arquivo : terraform/ami-instance.tf
Para deixar o laboratório funcionando, estes são os comandos que você deve executar:
pwd
/opt/LOAD # place yourself in the LOAD folder (where you cloned the project)
cd terraform # start with AWS configuration
As próximas etapas mostram como configurar suas VMs na AWS:
Copie o var.tf.example para var.tf e altere os valores :
No console da AWS, você deve criar um usuário terraform e obter suas chaves da AWS:
terraformAccess key - Programmatic accessAccess key ID e Secret access keyAdicione as chaves na sua máquina com o AWS CLI:
aws configure --profile terraform
AWS Access Key ID [None]: <access_key_id>
AWS Secret Access Key [None]: <secret_access_key>
cd LOAD
ssh-keygen -t rsa -N "" -b 2048 -C "TerraformKey" -f ./terraform/keys/TerraformKey.pem
terraform init
terraform apply
Se quiser destruir seu laboratório :
terraform destroy
Sempre que suas instâncias EC2 iniciarem, você precisa alterar o IP público delas no arquivo ansible/hosts. Adicione a saída deste comando no final do arquivo :
aws ec2 describe-instances --profile terraform --region eu-central-1 --query "Reservations[*].Instances[*].{Name:Tags[?Key=='Name'].Value|[],PublicIP:PublicIpAddress}" --filters "Name=instance-state-name,Values=running" --output text |tac |awk 'NR%2 ==0 {print $0}; NR%2 != 0 {print "["tolower(substr($2,5))"]"};'
Para configurar as VMs, use o comando ansible-playbook. Tempo normal de execução : 1h30
ansible-playbook main.yml # this will configure the vms in order to play ansible when the vms are ready
Para executar o provisionamento a partir do container docker, execute (você deve estar na mesma pasta do Dockerfile. Ainda não testado):
sudo docker run -ti --rm --network host -h loadansible -v $(pwd):/load -w /load/ansible loadansible ansible-playbook main.yml
Às vezes, um erro pode ocorrer durante a instalação. Na maioria das vezes, você pode simplesmente executar o playbook novamente e deve funcionar. Para executar os playbooks um por um :
# The main.yml playbook is build in multiples parts. each parts can be re-run independently but the play order must be keep in cas you want to play one by one :
ansible-playbook prepare.yml # updates, passwords, dns settings...
ansible-playbook ad-servers.yml # create servers configuration
ansible-playbook ad-trusts.yml # create the trust relationships
ansible-playbook ad-data.yml # import the ad datas : users/groups...
ansible-playbook ad-groups.yml # set the rights and the group domains relations
ansible-playbook servers.yml # create IIS and MSSQL
ansible-playbook adcs.yml # add adcs and adcs templates
ansible-playbook ad-acl.yml # set ACL
ansible-playbook linux.yml # configure linux entrypoint with GLPI
ansible-playbook security.yml # enable or disable windows defender here
ansible-playbook vulnerabilities.yml # specifics vulns linked to the scenario are here
# You can also install wireguard VPN on the linux host, for that check the VPN paragraph
Se quiser executar apenas uma parte específica de um playbook, você pode usar tags (sempre coloque data como tag):
ansible-playbook servers.yml
ansible-playbook servers.yml --tags data,iis
ansible-playbook linux.yml --tags data,glpi
Alguns comandos para ajudar você a gerenciar seu laboratório AWS (é feio, mas funciona):
# aws cli profile : terraform
# region : eu-central-1
# Disable instance metadata
for i in $(aws ec2 --profile terraform --region eu-central-1 describe-instances --filters "Name=tag:Name,Values=lab-*" --query 'Reservations[].Instances[].InstanceId' |cut -d '"' -f2); do aws ec2 --profile terraform --region eu-central-1 modify-instance-metadata-options --http-endpoint disabled --instance-id $i --output json --no-cli-pager;done
# Start instances
aws ec2 --profile terraform --region eu-central-1 start-instances --instance-ids `aws ec2 --profile terraform --region eu-central-1 describe-instances --filters "Name=tag:Name,Values=lab-*" "Name=instance-state-name,Values=stopping,stopped" --query 'Reservations[].Instances[].InstanceId' --output text`
# Get running instance and output it to ansible format
aws ec2 describe-instances --profile terraform --region eu-central-1 --query "Reservations[*].Instances[*].{Name:Tags[?Key=='Name'].Value|[],PublicIP:PublicIpAddress}" --filters "Name=instance-state-name,Values=running" --output text |tac |awk 'NR%2 ==0 {print $0}; NR%2 != 0 {print "["tolower(substr($2,5))"]"};'
Opcionalmente, você pode adicionar um servidor VPN no host Linux e configurar quantos clientes quiser. Comece gerando as chaves para o servidor VPN e altere o número de clientes:
apt install wireguard
# generate wireguard keys
privkey=$(wg genkey) sh -c 'echo "
server_privkey: $privkey
server_pubkey: $(echo $privkey | wg pubkey)"'
# encrypt server_privkey with ansible-vault and
ansible-vault encrypt_string --ask-vault-password --stdin-name server_privkey
# Add the result to group_vars/all.yml
# You can change the number of client configuration files it will create. By default it creates 6 clients.
Execute o playbook VPN com este comando (ele alterará as chaves dos clientes toda vez que você executar o comando):
ansible-playbook --ask-vault-password vpn.yml
Se você obtiver este erro Timeout (12s) waiting for privilege escalation prompt, basta executar o comando novamente.
Você encontrará o arquivo de configuração do seu cliente em ansible/wireguard/lab_client[0-9].conf.
Para se conectar à VPN, você precisa copiar os arquivos de cliente com a chave privada para o seu host local em /etc/wireguard/.
Você inicia a conexão VPN para o primeiro cliente com :
sudo wg-quick up lab_client1
Você receberá um IP em 10.0.20.0/24

SHIRE (srv02)
- GLPI SQLi
- GLPI-htmlawed-CVE-2022-35914
USERS
- privesc user with vulnerable crontab
- privesc root with password in bash_history and sudo nopasswd for /bin/systemctl
RIVENDELL (dc02)
- anonymous RPC (enum users, pass pol, groups / rpcclient)
- brute force users names
ELF
- celebrian Responder crack hash (bot 3min)
- elrond: Responder with NTLM relay domain admin (bot 5min)
HOBBIT
- bilbo: password in description
- pippin: ASREPROAST
- merry: Constrained delegation with protocol transition / Kerberoasting
- froddo:
- sam:
MINAS-TIRITH(dc01)
- Open share RW, LNK exploit
- khamul.easterling : Open backup share, with GPO with cpassword, password increment
MORIA (srv01)
- MSSQL trusted link : donPapi to get sql_svc password
- mitm6 SRV01 -> DC01
MEN
- denethor: DOMAIN ADMIN
- theoden: ACL self-self-membership-on-group DOMAIN ADMIN
- faramir: ACL genericwrite-on-user Denethor
- boromir: ACL genericall-on-user Denethor
ACL forcechangepassword on Faramir
WriteDACL MEN
FELLOWSHIP
- legolas: execute as user on MSSQL
KERBEROASTING
- gimli: ACL genericall-on-computer MORIA
ACL writeproperty-self-membership DOMAIN ADMIN
- aragorn: execute as login on mssql / administrator
- gandalf: mssql admin
group cross domain
mssql trusted link
ACL writeproperty-self-membership Domain Admins #TODO change for someone who is not administrator, he has DCSYNC (administrator?)
ENTS
- treebeard: ACL writeproperty-on-group DOMAIN ADMIN
- skinbark: ACL genericall-on-group DOMAIN ADMIN
- ginglas: ACL write owner on group DOMAIN ADMIN
BARAD-DUR (dc03)
- Coerced DC + ntlmrelayx to ldaps
- ADCS ESC1, ESC2, ESC3, ESC4, ESC8
- NTLM downgrade attack
MINAS-MORGL (srv03)
- IIS upload webshell
- Privilege escalation Windows 2016 : SeImpersontePrivilege
DARKFORCE
- sauron: domain admin MORDOR
- saruman: mssql admin / GenericAll on gothmog (shadow credentials) / GenericAll on ECS4
- balrog:
PRISONER
- gollum: mssql trusted link
password spray -> user=pwd
ORC
- gothmog: DOMAIN ADMIN
- lurtz:
- ugluk:
- guritz:
NAZGUL
- angmar: