Gitea Security
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Gitea é uma solução leve de hospedagem de código gerenciada pela comunidade e auto-hospedada escrita em Go.
Para executar uma instância do Gitea localmente, você pode simplesmente executar um contêiner docker:
Conecte-se à porta 3000 para acessar a página da web.
Você também pode executá-lo com kubernetes:
Repos públicos: http://localhost:3000/explore/repos
Usuários registrados: http://localhost:3000/explore/users
Organizações registradas: http://localhost:3000/explore/organizations
Note que por padrão, o Gitea permite que novos usuários se registrem. Isso não dará acesso especialmente interessante aos novos usuários sobre os repositórios de outras organizações/usuários, mas um usuário autenticado pode ser capaz de visualizar mais repositórios ou organizações.
Para este cenário, vamos supor que você obteve algum acesso a uma conta do github.
Se de alguma forma você já tem credenciais de um usuário dentro de uma organização (ou você roubou um cookie de sessão), você pode apenas fazer login e verificar quais permissões você tem sobre quais repositórios, em quais equipes você está, listar outros usuários, e como os repositórios estão protegidos.
Note que 2FA pode ser usado, então você só poderá acessar essas informações se também conseguir passar por essa verificação.
Note que se você conseguir roubar o cookie i_like_gitea
(atualmente configurado com SameSite: Lax) você pode impersonar completamente o usuário sem precisar de credenciais ou 2FA.
O Gitea permite que usuários configurem chaves SSH que serão usadas como método de autenticação para implantar código em seu nome (nenhuma 2FA é aplicada).
Com esta chave, você pode realizar alterações em repositórios onde o usuário tem alguns privilégios, no entanto, você não pode usá-la para acessar a API do gitea para enumerar o ambiente. No entanto, você pode enumerar configurações locais para obter informações sobre os repositórios e usuários aos quais você tem acesso:
Se o usuário configurou seu nome de usuário como seu nome de usuário do gitea, você pode acessar as chaves públicas que ele configurou em sua conta em https://github.com/<gitea_username>.keys, você pode verificar isso para confirmar se a chave privada que você encontrou pode ser usada.
Chaves SSH também podem ser configuradas em repositórios como chaves de implantação. Qualquer pessoa com acesso a essa chave poderá iniciar projetos a partir de um repositório. Normalmente, em um servidor com diferentes chaves de implantação, o arquivo local ~/.ssh/config
fornecerá informações sobre a chave relacionada.
Como explicado aqui, às vezes é necessário assinar os commits ou você pode ser descoberto.
Verifique localmente se o usuário atual possui alguma chave com:
Para uma introdução sobre Tokens de Usuário, verifique as informações básicas.
Um token de usuário pode ser usado em vez de uma senha para autenticar contra o servidor Gitea via API. ele terá acesso completo sobre o usuário.
Para uma introdução sobre Aplicações Oauth do Gitea, verifique as informações básicas.
Um atacante pode criar uma Aplicação Oauth maliciosa para acessar dados/ações privilegiados dos usuários que a aceitam, provavelmente como parte de uma campanha de phishing.
Como explicado nas informações básicas, a aplicação terá acesso total à conta do usuário.
No Github temos github actions que por padrão obtêm um token com acesso de escrita sobre o repositório que pode ser usado para contornar as proteções de branch. Neste caso, isso não existe, então os bypasses são mais limitados. Mas vamos dar uma olhada no que pode ser feito:
Habilitar Push: Se alguém com acesso de escrita pode fazer push para a branch, basta fazer push nela.
Whitelist de Push Restrito: Da mesma forma, se você faz parte desta lista, faça push para a branch.
Habilitar Whitelist de Merge: Se houver uma whitelist de merge, você precisa estar dentro dela.
Requerer aprovações maiores que 0: Então... você precisa comprometer outro usuário.
Restringir aprovações a usuários na whitelist: Se apenas usuários na whitelist podem aprovar... você precisa comprometer outro usuário que esteja nessa lista.
Desconsiderar aprovações obsoletas: Se as aprovações não forem removidas com novos commits, você pode sequestrar um PR já aprovado para injetar seu código e mesclar o PR.
Note que se você é um admin de org/repo você pode contornar as proteções.
Webhooks são capazes de enviar informações específicas do gitea para alguns lugares. Você pode ser capaz de explorar essa comunicação. No entanto, geralmente um segredo que você não pode recuperar é definido no webhook que irá prevenir usuários externos que conhecem a URL do webhook, mas não o segredo, de explorar esse webhook. Mas em algumas ocasiões, as pessoas, em vez de definir o segredo em seu lugar, o definem na URL como um parâmetro, então verificar as URLs pode permitir que você encontre segredos e outros lugares que você poderia explorar mais.
Webhooks podem ser definidos em nível de repo e de org.
Se de alguma forma você conseguiu entrar no servidor onde o gitea está rodando, você deve procurar pelo arquivo de configuração do gitea. Por padrão, ele está localizado em /data/gitea/conf/app.ini
Neste arquivo você pode encontrar chaves e senhas.
No caminho do gitea (por padrão: /data/gitea) você também pode encontrar informações interessantes como:
O DB sqlite: Se o gitea não estiver usando um db externo, ele usará um db sqlite.
As sessões dentro da pasta de sessões: Executando cat sessions/*/*/*
você pode ver os nomes de usuário dos usuários logados (o gitea também pode salvar as sessões dentro do DB).
A chave privada jwt dentro da pasta jwt.
Mais informações sensíveis podem ser encontradas nesta pasta.
Se você estiver dentro do servidor, você também pode usar o binário gitea
para acessar/modificar informações:
gitea dump
irá despejar o gitea e gerar um arquivo .zip.
gitea generate secret INTERNAL_TOKEN/JWT_SECRET/SECRET_KEY/LFS_JWT_SECRET
irá gerar um token do tipo indicado (persistência).
gitea admin user change-password --username admin --password newpassword
Muda a senha.
gitea admin user create --username newuser --password superpassword --email user@user.user --admin --access-token
Cria um novo usuário admin e obtém um token de acesso.
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)