Worker
Difficulty: Medium | OS: Windows | SubVersion(SVN) - Azure DevOps Server
Last updated
Difficulty: Medium | OS: Windows | SubVersion(SVN) - Azure DevOps Server
Last updated
Em breve ...
Apenas pรกgina default do IIS. O que caracteriza que estamos em um Windows Server
Atravรฉs de uma pesquisa passiva pelas tecnologias com Wappalyzer podemos confirmar isso tambรฉm.
Porรฉm, no nosso escaneamento por versรตes e serviรงos, encontramos uma pรกgina de autenticaรงรฃo com o domรญnio devops.worker.htb
, vamos colocar isso no arquivo /etc/hosts
para termos rota e vamos testar.
Se cancelarmos o login, ele exibe uma mensagem de erro, onde informa que nรฃo podemos acessar com o modo anรดnimo esse recurso.
Ele tambรฉm exibe em baixo, que se trata do Azure DevOps Server, uma plataforma de desenvolvimento de software que permite que equipes colaborem e gerenciem projetos de software.
No nosso escaneamento tambรฉm encontramos o serviรงo do SubVersion (SVN Server)
Ele รฉ um sistema de controle de versรฃo, utilizado para desenvolvimento de software. ร como se fosse um Github.
Podemos entรฃo iniciar uma enumeraรงรฃo nesse sistema:
Vamos listar o conteรบdo desse repositรณrio:
Aqui encontramos um arquivo.txt e mais um possรญvel subdomรญnio que รฉ uma pasta nesse sistema.
Vamos baixar esse repositรณrio para nossa mรกquina
No arquivo moved.txt
descobrimos que o repositรณrio estรก sendo migrado, e podemos encontrar a รบltima versรฃo dele em devops.worker.htb
o mesmo repositรณrio que encontramos no nosso escaneamento que necessita de uma autenticaรงรฃo para acesso.
Vamos colocar no /etc/hosts
o domรญnio que encontramos antes dimension.worker.htb
Temos mais uma pรกgina web no sistema.
Analisando o seu cรณdigo-fonte, encontramos mais alguns subdomรญnios:
Vamos colocรก-los tambรฉm no /etc/hosts
Podemos criar um arquivo de texto, copiar toda essa parte do cรณdigo fonte, e ai filtramos para termos os domรญnios certinhos.
Bom, eles nรฃo tinham nada de interessante que nos desse um entrypoint para o nosso alvo. Vamos continuar nossa enumeraรงรฃo do serviรงo SVN
Ver os logs do repositรณrio:
Observe, estamos na revisรฃo 5, e na revisรฃo 2 ele tinha adicionado um script de deploy que nรฃo encontramos na versรฃo 5.
Podemos entรฃo retornar a essa versรฃo com o seguinte comando:
Observe que โatualizandoโ para a revisรฃo 2, temos uma adiรงรฃo do arquivo deploy.ps1
, se listarmos o nosso diretรณrio que baixamos o repositรณrio, iremos verificar que ele mudou. Ele deletou o arquivo moved.txt
e adicionou o deploy.ps1
E conseguimos obter uma credencial nesse arquivo.
Na nossa anรกlise, encontramos um local para podermos logar, mas tambรฉm precisamos lembrar que temos a porta 5985 que รฉ do WinRM, serรก que conseguimos logar nela com essas credenciais ?
Nรฃo podemos conectar com essas credenciais no WinRM.
Vamos retornar entรฃo para a aplicaรงรฃo da porta 80 que estรก rodando o Azure DevOps Server
Apรณs utilizarmos as credenciais obtidas no arquivo deploy.ps1
conseguimos conectar nessa aplicaรงรฃo.
Em vista temos um projeto chamado SmartHotel360
Podemos clicar nele para entendermos mais sobre ele.
Analisando o projeto, podemos ver que fazemos parte do time SmartHotel360 Team
Se analisarmos a Pipeline
do projeto, conseguimos ver onde que รฉ a pasta alvo dele no servidor.
Ou seja, a pasta do servidor que esse repositรณrio esta colocando como Target
รฉ w:\sites\
Se analisarmos o repositรณrio, vamos ver que jรก caรญmos no repositรณrio chamado Spectral
que รฉ um dos subdomรญnios que encontramos anteriormente. Ele esta na branch de master
nesse repositรณrio e nรฃo hรก outra.
Ao tentarmos criar um novo arquivo nesse repositรณrio ele funciona normalmente, mas ao tentar realizar o commit
recebemos um erro. Esse erro refere-se a nรฃo termos permissรฃo de editar essa branch(master
) e como o erro nos orienta, temos que usar um pull request
para podermos atualizar essa branch.
Vamos criar entรฃo essa branch para atualizarmos a branch principal.
Em Work Items to link,
coloque qualquer um, eu usei o referente ao User Registration
e clique em Create Branch
Refaรงa oq fizemos anteriormente, crie um novo arquivo agora na nova branch
e depois clique em commit
. Apรณs isso, selecione o Work Items to link
e clique em commit
Apรณs โcommitarโ vai aparecer uma mensagem acima jรก dando a possibilidade de criarmos um pull request
. Pode clicar no link.
Podemos clicar em Create
Agora que fizemos o pull request
ele foi para revisรฃo do time de desenvolvedores do projeto. Como fazemos parte, entรฃo podemos aprovar essa alteraรงรฃo:
Apรณs aprovaรงรฃo, podemos clicar em Complete
Pode escolher o tipo de Merge
eu mantenho no Squash
e vai deletar a nossa branch criada apรณs esse merge.
Se der tudo certo, vai aparecer assim:
Se retornarmos a branch master
do projeto, vamos ver que o nosso arquivo foi inserido com sucesso.
Se fizermos o mesmo procedimento, colocando em html, podemos ver de uma forma mais legal via Web no subdomรญnio spectral.worker.htb
que รฉ o repositรณrio que alteramos.
Entendido isso, que podemos alterar a aplicaรงรฃo web do alvo, commitando com uma nova branch para atualizar na master. E o alvo se tratando de um Windows Server, podemos entรฃo colocar um webshell em aspx
para podermos explorar essa misconfiguration e obter um acesso ao alvo.
Vamos usar um payload de webshell aspx disponรญvel publicamente no github
Repetimos todos os passos feitos anteriormente para criar uma branch, criar um arquivo no repositรณrio, commitar, e realizar o pull request. Sรณ que dessa vez com a intenรงรฃo de realizar o upload do reverse shell.
Feito isso, basta acessar o caminho na url e teremos o nosso webshell funcional.
Jรก temos um webshell, podemos entรฃo criar um payload com msfvenom
para obter um shell reverso. Ou podemos usar reverse shell em powershell tambรฉm, a gosto do freguรชs aqui.
Agora abrimos um webserver em python na nossa mรกquina para servir esse payload. E baixamos no alvo via webshell.
E nรฃo se esqueรงa de abrir um listening com o netcat.
O comando para baixar no alvo fica o seguinte:
Podemos confirmar que o alvo fez um GET para obter o arquivo do nosso servidor.
Se listarmos vamos ver que ele foi salvo com sucesso
Sรณ executarmos ele agora que vamos receber nosso reverse shell
Utilizei o rlwrap
antes do nc
para deixar o shell mais interativo. No contexto de mรกquinas Windows, eu gosto dessa trick.
Nรฃo conseguimos entrar no รบnico usuรกrio diferente do padrรฃo no alvo, ou seja, temos que acessar ele para podermos pegar a primeira flag de user.txt
Na nossa enumeraรงรฃo do Azure DevOps, descobrimos que o caminho alvo do repositรณrio, estava em: w:\sites
Como estamos em um contexto do powershell, alguns comandos de linux funcionam aqui, entรฃo, mas eu desconfio que estamos dentro de um contexto de WSL tambรฉm.
Pelo motivo do link para /c/users
Bom, isso era sรณ curiosidade da enumeraรงรฃo. Podemos entรฃo utilizar o comando df -u
para listar os Filesystems
e vamos ver que realmente temos um W:\
Por algum motivo eu nรฃo estava conseguindo entrar nesse diretรณrio, mas eu consigo listรก-lo normalmente.
Ao fazer uma enumeraรงรฃo manual, entro na pasta de repositรณrios do SVN, e encontro uma pasta bem chamativa conf
e db
Em conf
temos um arquivo chamado passwd
, um nome bem sugestivo.
E o arquivo informa que รฉ o name
e senha
de cada usuรกrio, um por linha.
Podemos entรฃo salvar essa lista em um arquivo de texto, formatar ela apenas com os usuรกrios e apenas com as senhas e fazer um teste com cada credencial.
Podemos usar o Crackmapexec, pois ele informa quando temos uma saรญda esperada de um usuรกrio que pode executar comandos no sistema. E como temos um serviรงo de WinRM aberta no alvo, podemos usar ele para confirmar.
E agora podemos fazer a tentativa de login com o protocolo WinRM com o Crackmapexec, sem fazer bruteforce.
E apรณs a execuรงรฃo, realmente tรญnhamos uma senha correta para o usuรกrio robisl
que encontramos no alvo.
Podemos entรฃo agora logar com o Evil-WinRm
E assim conseguimos a nossa primeira flag.
Enumeramos o alvo como usuรกrio robisl
e nรฃo encontramos nada que nos ajudasse a escalar privilรฉgio para administrador do sistema para ler a รบltima flag.
Podemos tentar reutilizar as credenciais do usuรกrio robisl
na aplicaรงรฃo Azure DevOps que exploramos anteriormente.
Conseguimos logar com ele na aplicaรงรฃo, e vemos que temos um outro Projeto, agora chamado PartsUnlimited
Uma boa enumeraรงรฃo comeรงa em descobrir quais grupos que o nosso usuรกrio faz parte nesse projeto. Nesse caso, descobrimos que estamos no grupo de Administradores desse projeto, ou seja, temos poder total.
Verificando tambรฉm as configuraรงรตes das Pipelines, o agent
Hamilton11 esta sendo executado no alvo com o username WORKER$
E o hostname do alvo se chama WORKER
, ou seja, nossas definiรงรตes de compilaรงรฃo estรฃo sendo executadas como SYSTEM
Vamos criar uma pipeline para confirmar isso, vamos colocar etapas de execuรงรฃo gerenciadas por nรณs.
Hรก muitas coisas prontas, vamos usar um editor clรกssico, onde podemos deixar as coisas mais genรฉricas.
Podemos apenas avanรงar, pois iremos utilizar o repositรณrio da prรณpria Azure.
Na seleรงรฃo do template, colocamos Empty pipeline
pois como a descriรงรฃo informa, iniciamos a pipeline zerada e adicionamos nossas prรณprias etapas.
Selecionamos o Agent pool como Setup
, pois รฉ o รบnico que aparece.
E vamos criar um nova job para o nosso agent. Nesse caso quero uma tarefa de powershell, pois que o sistema execute comandos de powershell.
Entรฃo selecionamos o tipo de comando do powershell como in line
pois quero que execute uma linha de comando. Apรณs isso, eu crio um novo usuรกrio e depois adiciono esse usuรกrio ao grupo local de administradores. Se o processo estiver mesmo sendo executado como SYSTEM
teremos a permissรฃo de colocar esse usuรกrio nesse grupo.
Apรณs isso, clique em Save & Queue
para que a pipeline seja executada.
Depois de um certo tempo, podemos confirmar que o usuรกrio foi criado e esta no grupo de administradores.
Entรฃo conectamos via WinRM novamente, e conseguimos entrar na pasta do administrador e pegar a รบltima flag root.txt