É possível descobrir os hosts no arquivo known_hosts?

115

Gostaria de ver o que os hosts estão no meu arquivo known_hosts, mas ele não parece legível por humanos. É possível lê-lo?

Mais especificamente, há um host ao qual posso conectar-me através de vários nomes e quero descobrir qual é a impressão digital que espero do meu arquivo de hosts conhecidos.

Atualização: Estou usando o OpenSSH_5.3p1 Debian-3ubuntu7, OpenSSL 0.9.8k 25 de março de 2009

Uma linha do meu arquivo known_hosts se parece com isso,

|1|guO7PbLLb5FWIpxNZHF03ESTTKg=|r002DA8L2JUYRVykUh7jcVUHeYE= ssh-rsa AAAAB3NzaC1yc2EAAFADAQABAAABAQDWp73ulfigmbbzif051okmDMh5yZt/DlZnsx3DEOYHu3Nu/+THJnUAfkfEc1XkOFiFgbUyK/08Ty0K6ExUaffb1ERfXXyyp63rpCTHOPonSrnK7adl7YoPDd4BcIUZd1Dk7HtuShMmuk4l83X623cr9exbfm+DRaeyFNMFSEkMzztBYIkhpA2DWlDkd90OfVAvyoOrJPxztmIZR82qu/5t2z58sJ6Jm2xdp2ckySgXulq6S4k+hnnGuz2p1klviYCWGJMZfyAB+V+MTjGGD/cj0SkL5v/sa/Fie1zcv1SLs466x3H0kMllz6gAk0/FMi7eULspwnIp65g45qUAL3Oj
Colin Newell
fonte
Se não estiver com hash, você pode usar: unix.stackexchange.com/questions/236192/…
Benjamin Goodacre

Respostas:

135

Você HashKnownHostsdefiniu " yes" em seu ssh_configarquivo, para que os nomes de host não estejam disponíveis em texto sem formatação.

Se você souber o nome do host que procura com antecedência, poderá pesquisá-lo com:

    ssh-keygen -H -F hostname

Aqui está a seção relevante da ssh-keygen(1)página de manual:

 -F hostname
         Search for the specified hostname in a known_hosts file, listing
         any occurrences found.  This option is useful to find hashed host
         names or addresses and may also be used in conjunction with the
         -H option to print found keys in a hashed format.
pdo
fonte
3
Hosts conhecidos com hash significam essencialmente que não é possível? ou seja, eu preciso saber o nome do host para ver as informações?
Colin Newell
7
@ColinNewell É isso mesmo, você precisa saber o (s) nome (s) do host. É uma medida de segurança para impedir que um invasor colha nomes de host / endereços IP de outras caixas que você frequenta se sua máquina estiver comprometida.
pdo
1
Não se assuste quando não houver saída, mas tente não o nome completo do host qualificado, mas o nome do host.
math
6
Não sshd_config, mas ssh_config.
Fish Monitor
9
@pdo - seu comando nem sempre funciona. Se o host tiver SSH na porta diferente de 22, o formato known_hostsserá diferente. Então você deve usar o seguinte comando: ssh-keygen -H -F [host.example.com]:2222
Martin Vegter
17

Para futuros pesquisadores, este artigo (sem exoneração de responsabilidade: não sou afiliado) tem um script Perl relativamente simples para inserir IPs e nomes de host com força bruta known_hosts.

http://blog.rootshell.be/2010/11/03/bruteforcing-ssh-known_hosts-files/

Permite iniciar a partir de um endereço IP específico. Também poderia ser facilmente modificado para usar um dicionário.

Além disso, em junho de 2014, o projeto John the Ripper adicionou suporte ao cracking unknown_hosts , que pode tirar proveito de vários núcleos de CPU, GPUs, manipulação de dicionário etc.

Você também pode usar esse snippet do nmap para gerar um dicionário de todos os endereços IP do RFC1918 para usar como dicionário:

nmap -sL -Pn -n 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8 |\
    grep '^Nmap scan report for' | cut -d\  -f5 >ips.list
Royce Williams
fonte
1
Há também uma aplicação python com características semelhantes, pode ser encontrado em: blog.tremily.us/posts/known_hosts
Lars Nordin
Lars Nordin, obrigado pela dica. Eu submeti informações de Remily ao John a equipe Ripper, e adicionou suporte para isso em sangramento-jumbo: openwall.com/lists/john-users/2014/07/02/2
Royce Williams
1
E aqui está como fazê-lo com hashcat: up1ink.tumblr.com/post/132370869368/...
Royce Williams
4

Será que ssh-keygen -l -f ~/.ssh/known_hostsajuda? (Usando -vvocê também obtém bons mapas de tesouros, por exemplo,

+--[ RSA 2048]----+
|        .        |
|       + .       |
|      . B .      |
|     o * +       |
|    X * S        |
|   + O o . .     |
|    .   E . o    |
|       . . o     |
|        . .      |
+-----------------+
sr_
fonte
2
Não no sentido mais estrito, não, ainda é tudo base64. A explicação de pdo sobre o hash sugere que é uma coisa de sentido único, então acho que estou preso a menos que conheça o nome do host.
Colin Newell
Isso me ajudou. O que eu queria especificamente era uma combinação. Para encontrar a impressão digital ssh anteriormente verificado, você pode executar:ssh-keygen -l -f ~/.ssh/known_hosts -F <hostname>
isaaclw
uh, ssh-keygen -l -F <hostname>é ainda simplier
isaaclw
2

Há uma string de host / ip no início de cada linha "unknown_hosts" (antes da string "ssh-dss" ou "ssh-rsa"):

hostgn6 ssh-dss AAAB3NzaC1kc3MAAACBAIfGV4+/28Zr+dT/i+ifydUBS0dMRUjCtExIThOj3Yexynu+wSRGjMm4GfF+og2kAljZyUjhBFeM+WYbJzcDSDB [...] ==
yumyumn6.dik6.dir2g.some.net ssh-dss AAAAB3NzaC1kc3MAAACBAIfGV4+/28Zr+dT/i+ifydUBS0dMRUjCtExITh [...] ==
Ouki
fonte
2
... e, assim, awk '{print $1}' known_hostsfaz o truque. Esteja ciente de que os servidores que escutam em portas não padrão acabam como, digamos, [some-server]:5555em known_hosts.
sr_
3
Infelizmente não na minha. O meu parece mais com dados codificados em base64. Os dados também são delimitados por canal no meu arquivo.
Colin Newell
Qual software ssh você está usando na época (estávamos assumindo que você estava usando o software openssh quase padrão)?
Ouki
Adicionei mais detalhes à minha pergunta.
Colin Newell
7
Conforme afirmado por @pdo, seu sshd como "HashKnownHosts" está ativado, o que pode parecer um pouco anal, mas é uma preocupação de segurança. E é claro que não há como simplesmente reverter os hashes e obter os nomes de host de seus "hos_conhecidos ".
Ouki
2

Use a -lopção para ssh-keygenlistar impressões digitais e a -Fopção para procurar um nome de host no seu known_hostsarquivo.

$ ssh-keygen -l -F sdf.org
# Host sdf.org found: line 835 type RSA
2048 6e:cd:53:4f:75:a1:e8:5b:63:74:32:4f:0c:85:05:17 |1|9J47PEllvWk/HJ6LPz5pOB2/7rc=|ld0BtQh5V3NdhBHBwR/ZqSv8bqY= (RSA)

Você pode usar ssh-keyscanpara comparar a impressão digital na sua known_hostscom a do servidor.

$ ssh-keyscan sdf.org | awk '{print $3}' | base64 -d | openssl md5 -c
# sdf.org SSH-2.0-OpenSSH_7.1
# sdf.org SSH-2.0-OpenSSH_7.1
no hostkey alg
(stdin)= 6e:cd:53:4f:75:a1:e8:5b:63:74:32:4f:0c:85:05:17
xn.
fonte