Gitea Security

Support HackTricks

O que é Gitea

Gitea é uma solução leve de hospedagem de código gerenciada pela comunidade e auto-hospedada escrita em Go.

Informações Básicas

Laboratório

Para executar uma instância do Gitea localmente, você pode simplesmente executar um contêiner docker:

docker run -p 3000:3000 gitea/gitea

Conecte-se à porta 3000 para acessar a página da web.

Você também pode executá-lo com kubernetes:

helm repo add gitea-charts https://dl.gitea.io/charts/
helm install gitea gitea-charts/gitea

Enumeração Não Autenticada

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.

Exploração Interna

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.

Com Chave SSH de Usuário

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:

# Go to the the repository folder
# Get repo config and current user name and email
git config --list

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.

Chaves GPG

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:

gpg --list-secret-keys --keyid-format=long

Com Token de Usuário

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.

Com Aplicação Oauth

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.

Bypass de Proteção de Branch

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 contornos 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, pode contornar as proteções.

Enumerar Webhooks

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 verificando as URLs pode permitir que você encontre segredos e outros lugares que você poderia explorar mais.

Webhooks podem ser definidos em nível de repositório e de org.

Pós Exploração

Dentro do servidor

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.

Support HackTricks

Last updated