Lab 11.3: Mini-CTF de Síntese
Introdução
Bem-vindo ao Mini-CTF de síntese do curso de Sistemas Operacionais!
Este desafio integra as competências adquiridas ao longo do semestre:
- Configuração de sistema
- Análise de processos e memória
- Segurança no Windows
- PowerShell e scripting
- Comunicação entre processos
- Detecção de ameaças
Formato
- Tipo: Capture The Flag (CTF)
- Duração: 90 minutos
- Pontos: 100 pontos no total
- Flags: Formato
FLAG{texto_do_flag}
Regras
- Trabalho individual - Não é permitida colaboração durante o CTF
- Recursos permitidos:
- Anotações do curso
- Documentação da Microsoft
- Ferramentas Sysinternals
- Recursos proibidos:
- Comunicação com outros estudantes
- Soluções online
- Submissão: Copie os flags no documento de resposta
Ambiente
Você dispõe de uma VM Windows preparada com:
- Ferramentas Sysinternals instaladas
- PowerShell disponível
- Dicas escondidas no sistema
Certifique-se de criar um snapshot antes de começar!
Desafios
Desafio 1: Reconhecimento do Sistema (15 pontos)
Objetivo: Encontrar informações escondidas na configuração do sistema.
Instruções:
- Um flag está escondido nas variáveis de ambiente do usuário
- Encontre a variável que contém o flag
Dica: O nome da variável começa com "SECRET_"
Configuração para o professor (a ser feita antes do CTF):
# Adicionar a variável de ambiente
[Environment]::SetEnvironmentVariable("SECRET_CTF", "FLAG{env_vars_reveal_secrets}", "User")
Solução esperada: FLAG{env_vars_reveal_secrets}
Desafio 2: Registro do Windows (15 pontos)
Objetivo: Explorar o registro para encontrar um flag escondido.
Instruções:
- Um flag está escondido em uma chave do registro
- Procure em HKCU:\Software\
Dica: A chave se chama "CoursSE"
Configuração:
# Criar a chave do registro
New-Item -Path "HKCU:\Software\CoursSE" -Force
Set-ItemProperty -Path "HKCU:\Software\CoursSE" -Name "Flag" -Value "FLAG{registry_hunter_pro}"
Comando útil:
Get-ItemProperty -Path "HKCU:\Software\CoursSE"
Desafio 3: Arquivos Ocultos (15 pontos)
Objetivo: Encontrar um arquivo escondido no sistema.
Instruções:
- Um arquivo oculto contém o flag
- Ele está na pasta Documentos do usuário
- O arquivo utiliza um Alternate Data Stream (ADS)
Configuração:
# Criar o arquivo com ADS
$path = [Environment]::GetFolderPath("MyDocuments")
Set-Content "$path\readme.txt" -Value "Ceci est un fichier normal."
Set-Content "$path\readme.txt:secret" -Value "FLAG{ads_are_sneaky}" -Stream "secret"
Comando útil:
Get-Item "$path\readme.txt" -Stream *
Get-Content "$path\readme.txt" -Stream secret
Desafio 4: Serviço Suspeito (20 pontos)
Objetivo: Identificar um serviço suspeito e encontrar seu flag.
Instruções:
- Um serviço foi criado com uma descrição contendo um flag
- O serviço não está iniciado
- Encontre-o entre os serviços instalados
Configuração:
# Criar um serviço falso (necessita admin)
New-Service -Name "SvcCTF" -BinaryPathName "C:\Windows\System32\cmd.exe" `
-DisplayName "Windows CTF Helper" `
-Description "FLAG{service_enumeration_master}" `
-StartupType Manual
Comandos úteis:
Get-Service | Where-Object { $_.DisplayName -like "*CTF*" }
Get-WmiObject Win32_Service | Where-Object { $_.Description -like "*FLAG*" }
Desafio 5: Processos e Memória (20 pontos)
Objetivo: Analisar um processo para encontrar um flag.
Instruções:
- Um script PowerShell está rodando em segundo plano
- Ele contém o flag em seus argumentos de linha de comando
- Use ferramentas de análise para encontrá-lo
Configuração:
# Iniciar um processo com o flag no argumento
Start-Process powershell -ArgumentList "-NoExit -Command `"Write-Host 'Background process'; while(`$true){Start-Sleep 60}`"" -WindowStyle Hidden
# O flag real estaria nos argumentos
Start-Process powershell -ArgumentList "-NoExit -Command `"`$flag='FLAG{process_forensics_win}'; while(`$true){Start-Sleep 60}`"" -WindowStyle Hidden
Comandos úteis:
Get-WmiObject Win32_Process | Select-Object Name, ProcessId, CommandLine
Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -like "*FLAG*" }
Desafio 6: Rede e Conexões (15 pontos)
Objetivo: Analisar as conexões de rede para encontrar uma pista.
Instruções:
- Um servidor está ouvindo em uma porta incomum
- Conecte-se ao servidor para obter o flag
- A porta está entre 8000 e 9000
Configuração:
# Script do servidor a ser executado antes do CTF
$listener = [System.Net.Sockets.TcpListener]::new([System.Net.IPAddress]::Loopback, 8888)
$listener.Start()
Write-Host "Servidor CTF ouvindo na porta 8888"
while ($true) {
$client = $listener.AcceptTcpClient()
$stream = $client.GetStream()
$writer = [System.IO.StreamWriter]::new($stream)
$writer.WriteLine("FLAG{network_detective}")
$writer.Flush()
$client.Close()
}
Comandos úteis:
# Encontrar portas em escuta
Get-NetTCPConnection -State Listen | Where-Object { $_.LocalPort -gt 8000 -and $_.LocalPort -lt 9000 }
# Conectar
$client = New-Object System.Net.Sockets.TcpClient("127.0.0.1", 8888)
$reader = New-Object System.IO.StreamReader($client.GetStream())
$reader.ReadLine()
Desafio Bônus (10 pontos)
Desafio 7: Tarefa Agendada
Objetivo: Encontrar um flag escondido em uma tarefa agendada.
Configuração:
# Criar uma tarefa agendada com o flag
$action = New-ScheduledTaskAction -Execute "cmd.exe" -Argument "/c echo FLAG{scheduled_task_investigator}"
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date).AddYears(1)
Register-ScheduledTask -TaskName "CTF_Task" -Action $action -Trigger $trigger -Description "Hidden CTF challenge"
Comando útil:
Get-ScheduledTask | Where-Object { $_.TaskName -like "*CTF*" }
(Get-ScheduledTask -TaskName "CTF_Task").Actions
Folha de Respostas
Nome: ______________________
Data: ______________________
Desafio 1 (15 pts): FLAG{_____________________}
Desafio 2 (15 pts): FLAG{_____________________}
Desafio 3 (15 pts): FLAG{_____________________}
Desafio 4 (20 pts): FLAG{_____________________}
Desafio 5 (20 pts): FLAG{_____________________}
Desafio 6 (15 pts): FLAG{_____________________}
Bônus (10 pts): FLAG{_____________________}
Total: _____ / 110 pontos
Critérios de Avaliação
| Desafio | Pontos | Dificuldade |
|---|---|---|
| 1. Variáveis env | 15 | Fácil |
| 2. Registro | 15 | Fácil |
| 3. ADS | 15 | Médio |
| 4. Serviços | 20 | Médio |
| 5. Processos | 20 | Difícil |
| 6. Rede | 15 | Médio |
| 7. Bônus | 10 | Difícil |
Guia para o Professor
Preparação da VM
# Script de configuração completa do CTF
# Executar como administrador antes do início
Write-Host "Configuração do Mini-CTF..." -ForegroundColor Cyan
# Desafio 1 - Variável de ambiente
[Environment]::SetEnvironmentVariable("SECRET_CTF", "FLAG{env_vars_reveal_secrets}", "User")
# Desafio 2 - Registro
New-Item -Path "HKCU:\Software\CoursSE" -Force | Out-Null
Set-ItemProperty -Path "HKCU:\Software\CoursSE" -Name "Flag" -Value "FLAG{registry_hunter_pro}"
# Desafio 3 - ADS
$docPath = [Environment]::GetFolderPath("MyDocuments")
Set-Content "$docPath\readme.txt" -Value "Ceci est un fichier normal de documentation."
Set-Content "$docPath\readme.txt:secret" -Value "FLAG{ads_are_sneaky}" -Stream "secret"
# Desafio 4 - Serviço (necessita admin)
if ((New-Service -Name "SvcCTF" -BinaryPathName "C:\Windows\System32\cmd.exe" `
-DisplayName "Windows CTF Helper" `
-Description "FLAG{service_enumeration_master}" `
-StartupType Manual -ErrorAction SilentlyContinue)) {
Write-Host "Serviço criado" -ForegroundColor Green
}
# Desafio 5 - Processo
Start-Process powershell -ArgumentList "-WindowStyle Hidden -NoExit -Command `"`$flag='FLAG{process_forensics_win}'; while(`$true){Start-Sleep 60}`""
# Desafio 7 - Tarefa agendada
$action = New-ScheduledTaskAction -Execute "cmd.exe" -Argument "/c echo FLAG{scheduled_task_investigator}"
$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date).AddYears(1)
Register-ScheduledTask -TaskName "CTF_Task" -Action $action -Trigger $trigger -Description "Hidden CTF" -Force | Out-Null
Write-Host "Configuração finalizada!" -ForegroundColor Green
Write-Host "Não se esqueça de iniciar o servidor de rede (Desafio 6) separadamente."
Iniciando o servidor de rede (Desafio 6)
# Executar em uma janela separada
$listener = [System.Net.Sockets.TcpListener]::new([System.Net.IPAddress]::Loopback, 8888)
$listener.Start()
Write-Host "Servidor CTF ouvindo na porta 8888..."
while ($true) {
$client = $listener.AcceptTcpClient()
$stream = $client.GetStream()
$writer = [System.IO.StreamWriter]::new($stream)
$writer.WriteLine("FLAG{network_detective}")
$writer.Flush()
$client.Close()
Write-Host "Cliente atendido."
}
Limpeza após o CTF
# Script de limpeza
[Environment]::SetEnvironmentVariable("SECRET_CTF", $null, "User")
Remove-Item "HKCU:\Software\CoursSE" -Recurse -Force -ErrorAction SilentlyContinue
$docPath = [Environment]::GetFolderPath("MyDocuments")
Remove-Item "$docPath\readme.txt" -Force -ErrorAction SilentlyContinue
Stop-Service "SvcCTF" -ErrorAction SilentlyContinue
sc.exe delete "SvcCTF"
Get-Process powershell | Where-Object { $_.CommandLine -like "*flag=*" } | Stop-Process -Force
Unregister-ScheduledTask -TaskName "CTF_Task" -Confirm:$false -ErrorAction SilentlyContinue
Write-Host "Limpeza finalizada." -ForegroundColor Green
Conclusão
Este Mini-CTF testa seu domínio dos conceitos fundamentais:
- Exploração do sistema Windows
- Uso do PowerShell
- Análise forense básica
- Segurança e detecção
Boa sorte! 🎯
Mini-CTF desenvolvido no âmbito do curso de Sistemas Operacionais - MÓDULO 11