Gitea Security
O que é Gitea
Gitea é uma solução de hospedagem de código leve, gerida pela comunidade e auto-hospedada escrita em Go.
Informações Básicas
Basic Gitea InformationLaboratório
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 web.
Você também pode executá-lo com kubernetes:
Enumeração Não Autenticada
Repositórios 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 logado 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.
Com Credenciais de Usuário/Cookie da Web
Se de alguma forma você já tem credenciais para um usuário dentro de uma organização (ou você roubou um cookie de sessão), você pode simplesmente 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 puder 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
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 (nenhum 2FA é aplicado).
Com esta chave, você pode realizar mudanças 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 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 deploy. Qualquer pessoa com acesso a essa chave poderá lançar projetos a partir de um repositório. Normalmente, em um servidor com diferentes chaves de deploy, 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:
Com Token de Usuário
Para uma introdução sobre Tokens de Usuário, confira 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, confira as informações básicas.
Um atacante pode criar uma Aplicação Oauth maliciosa para acessar dados/ações privilegiadas dos usuários que as aceitam, provavelmente como parte de uma campanha de phishing.
Como explicado nas informações básicas, a aplicação terá acesso total sobre a 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 burlar proteções de branch. Neste caso, isso não existe, então os bypasses são mais limitados. Mas vamos ver o que pode ser feito:
Habilitar Push: Se qualquer pessoa com acesso de escrita pode fazer push para a branch, basta fazer push para ela.
Whitelist de Push Restrito: Da mesma forma, se você faz parte dessa 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 maior que 0: Então... você precisa comprometer outro usuário.
Restringir aprovações a usuários da whitelist: Se apenas usuários da whitelist podem aprovar... você precisa comprometer outro usuário que esteja nessa lista.
Descartar aprovações obsoletas: Se as aprovações não são 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 burlar 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 impedirá 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, 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 no nível de repo e de org.
Pós-Explotaçã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 banco de dados sqlite: Se o gitea não estiver usando um banco de dados externo, ele usará um banco de dados 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 banco de dados).A chave privada jwt dentro da pasta jwt.
Mais informações sensíveis podem ser encontradas nesta pasta.
Se você estiver dentro do servidor, também pode usar o binário gitea
para acessar/modificar informações:
gitea dump
irá fazer um dump do 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
Mudar a senha.gitea admin user create --username newuser --password superpassword --email user@user.user --admin --access-token
Criar novo usuário admin e obter um token de acesso.
Last updated