Van-e mód arra, hogy programozottan megszerezzük az SSH szerver kulcs ujjlenyomatát hitelesítés nélkül hozzá?

Megpróbálom a ssh -v user@host false 2>&1 | grep "Server host key" fájlt, de ez jelszóra vár, ha a kulcs alapú hitelesítés nincs beállítva.

Válasz

Ezt úgy teheti meg, hogy egyesíti a ssh-keyscan és a ssh-keygen:

$ file=$(mktemp) $ ssh-keyscan host > $file 2> /dev/null $ ssh-keygen -l -f $file 521 de:ad:be:ef:de:ad:be:ef:de:ad:be:ef:de:ad:be:ef host (ECDSA) 4096 8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d host (RSA) $ rm $file 

(sajnos a sokkal egyszerűbb ssh-keyscan host | ssh-keygen -l -f /dev/stdin nem működik)

Megjegyzések

  • Talán ssh-keygen -l -f - <(ssh-keyscan host) mégis?
  • OpenSSH > = 7.2 Az ssh-keyscan képes olvasni a stdin-ből: ssh-keyscan host | ssh-keygen -lf -
  • Csak tegye: ssh-keygen -l -f <(ssh-keyscan host)
  • ssh-keygen -l -f - a várakozásoknak megfelelően működik az ssh-keygen 7.2 és újabb verziókban. Néhány STDERR-hez hozzárendelhet megjegyzést, amelyeket ki lehet szűrni, amint az a válaszban szerepel írta Anthony Geoghegan vagy ssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
  • Az openssh új verziói (legalább 7.2) az ujjlenyomatot SHA256 formátumban jelenítik meg (például: 2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY) Ha a régi formátumban szeretné megadni, akkor adja meg az -E md5 szolgáltatást, és ‘ olyasmit fog látni, hogy 2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33.

Válasz

Nemrég magamnak kellett ezt megtenni, úgy gondoltam, hogy adj hozzá egy választ, amely megmutatja, hogyan lehet ezt megtenni (az OpenSSH 7.2 vagy újabb verzióival) egy sorban a folyamat helyettesítésével:

ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null) 

A következő szöveg elmagyarázza ezeknek a parancsoknak a működését, és kiemeli az OpenSSH segédprogramok régebbi és újabb verziói közötti viselkedésbeli különbségeket.

Nyilvános gazdagépkulcsok lekérése

A ssh-keyscan parancsot úgy fejlesztették ki, hogy a felhasználók nyilvános gazdagépkulcsokat szerezhessenek, anélkül, hogy hitelesíteni kellene őket az SSH szerveren. Man oldaláról:

ssh-keyscan egy segédprogram számos nyilvános ssh gazdagépkulcs összegyűjtéséhez otthont ad. Úgy tervezték, hogy segítsen a ssh_known_hosts fájlok összeállításában és ellenőrzésében.

Kulcs típusa

A beolvasandó kulcs típusát a -t opcióval lehet megadni.

  • rsa1 (elavult SSH protokoll 1. verzió)
  • rsa
  • dsa
  • ecdsa (az OpenSSH legújabb verziói)
  • ed25519 (az OpenSSH legújabb verziói)

A modern OpenSSH kiadásokban a beolvasandó alapértelmezett kulcs típusok rsa (az 5.1-es verzió óta), ecdsa (a 6.0 verzió óta) és ed25519 (a 6.7 verzió óta).

A iv id régebbi verzióival = “959be47752”>

(az OpenSSH 5.1-es verziója előtt) az alapértelmezett kulcstípus az elavultrsa1volt (1. SSH protokoll), tehát a kulcstípusokat kifejezetten meg kell határozni:

ssh-keyscan -t rsa,dsa hostname 

Base64 kulcsok ujjlenyomat-kivonatainak megszerzése

ssh-keyscan kinyomtatja az SSH szerver gazdagépkulcsát a Base64-kódolású formátum. Ennek átalakításához ujjlenyomat-kivonatként a ssh-keygen segédprogram használható a -l opcióval a megadott nyilvános kulcs ujjlenyomatának kinyomtatásához.

A Bash, Zsh (vagy a Korn shell) használata esetén a folyamathelyettesítés használható egy praktikus egybetéteshez:

ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null) 

Megjegyzés : Az OpenSSH 7.2 előtti verzióival a ssh-keygen által használt funkciók fájlok, nem nagyon kezelték a megnevezett csöveket (FIFO), így ez a módszer nem fog működni, ezért ideiglenes fájlok használatát igényli.

Hasító algoritmusok

A (z) ssh-keygen print SHA256 ujjlenyomat-kivonatok a billentyűkről. MD5 kivonatok megszerzéséhez a szerverkulcs ujjlenyomataiból (a régi viselkedés) a -E opcióval megadható a kivonatoló algoritmus:

ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null) 

Egy csővezeték használata

POSIX héj (például dash), amely nem tartalmazza a folyamatok helyettesítését, az ideiglenes fájlokat használó egyéb megoldások működni fognak. Az OpenSSH újabb verzióival (7.2-től kezdve) azonban egyszerű pipeline használható, mivel a ssh-keygen elfogadja a - fájlt a szabványos bemeneti adatfolyam, egyvonalas pipeline parancs használatával.

ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf - 

Megjegyzések

  • Szép és alapos válasz, ez minden bizonnyal jobb, mint egy ideiglenes fájl!Javasolhatom, hogy kezdetben adjon meg egy TL; DR-t a folyamathelyettesítő verzióval, hogy a türelmetlen emberek gyorsabban megtalálják? 🙂
  • Úgy tűnik, hogy nem működik az Ubuntu 14.04 LTS-en; Hibaüzenetet kapok ” / dev / fd / 63 nem nyilvános kulcsfájl “. Az alfolyamat valóban működik.
  • @melleb Ugyanezt találtam egy 12.04-es rendszeren, amelyhez hozzáférhetek. Gyanítom, hogy az OpenSSH régebbi verzióinak ssh-keygen problémája van a FIFO / named pipe-ból való olvasással. ‘ Megnézem ezt (és frissítem a válaszomat), amikor szabadidőm lesz.
  • @melleb Miután elköltöttem az olvasási időmet különféle forráskód-kiadások letöltésével és a printf hibakeresési utasításokat beszúrva az do_fingerprint() függvénybe, azt tapasztaltam, hogy az OpenSSH 7.2 előtti verzióival a ssh-keygen fájlok olvasásához nem nagyon kezelte az elnevezett csöveket (FIFO), így a folyamat-helyettesítési módszer nem fog működni.
  • Ez működik, de ha az ujjlenyomat ellenőrzéséhez használja, a felhasználóknak tisztában kell lenniük azzal, hogy van ‘ sa versenyfeltétel: az ezzel a paranccsal ellenőrzött ujjlenyomat nem feltétlenül az Ön által használt kulcsé letöltés, hacsak nem dobja ki a kulcsot, mielőtt meghívná az ssh-keygen-t.

Válasz

nmap biztosítja ezt a képességet a ssh-hostkey szkript használatával.

A kulcs hexadecimális ujjlenyomatának visszaadásához:

$ nmap [SERVER] --script ssh-hostkey 

A kulcs tartalmának visszaadásához:

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full 

A kulcs vizuális buborékának visszaküldése

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey="visual bubble" 

A fentiek visszaadásához:

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all 

Forrás: nmap dokumentumok

Megjegyzések

  • Ezek a példák feltételezik, hogy az SSH mindig a 22-es porton fut? Mi van, ha az ssh nem szabványos porton hallgat?
  • @MartinVegter (Guarin42 átfogalmazása, aki nem tudta ‘ t comment 🙂 Az nmap rendelkezik a -p opcióval, amely megadhat egy portot, pl. -p 22000. ‘ a -vv opciót is használhatja a bőbeszédűség (a megadott információk mennyisége) növelésére

Válasz

A filezilla megjeleníti a kulcsokat az md5-tel hashedálva hexadecimális formátum.

ennek megtalálásához a ubuntu linux gépen használja ezt a parancsot:

ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null) 

megjegyzés: cserélje le a “localhost” szót az ellenőrizni kívánt gép ip-jére.

Megjegyzések

  • Ez nekem bevált az Ubuntu 18-on, de vegye figyelembe, hogy a localhost 127.0.0.1 különbségeket kapja vagy domain.tld. Ellenőrizze az érintett URL URL-jének ujjlenyomatát!!

Válasz

Itt van egy shell szkript (főleg Bourne shell, de local kulcsszót használ, amely a legmodernebb /bin/sh) változatban érhető el. Erre már írtam. Használja, mint a ssh-hostkey hostname. Mind az sha256, mind az md5 formátumú ujjlenyomatokat megjeleníti az összes hosztkulcshoz az adott hosztnévhez vagy IP-címhez. Azt is megadhatja manuálisan, hogy “md5 “vagy” sha256 “második argumentumként, amely csak az adott formátumot jeleníti meg.

A piping helyett ideiglenes fájlt használ, hogy kompatibilis legyen a régebbi OpenSSH csomagokkal (a többi válaszban leírtak szerint). Az ideiglenes fájl /dev/shm (megosztott memória) funkciót használ, ha rendelkezésre áll.

#!/bin/sh usage () { printf "%s\n" "Usage: ssh-hostkey HOSTNAME [FPRINTHASH]" } ssh_hostkey () { local host="$1" local fprinthash="$2" local tmp= case "$host" in -h|--help|"") usage >&2 return 1 ;; esac case "$fprinthash" in md5|sha256|"") true;; *) usage >&2 printf "%s\n" "Fingerprint hash may be "md5" or "sha256"" >&2 return 2 ;; esac if test -d /dev/shm then tmp="$(mktemp -d -p /dev/shm)" else tmp="$(mktemp -d)" fi trap "trap - INT TERM EXIT; rm -rf "$tmp"" INT TERM EXIT ssh-keyscan "$host" > "$tmp/f" 2> /dev/null case "$fprinthash" in sha256|"") ssh-keygen -l -f "$tmp/f" 2> /dev/null;; esac case "$fprinthash" in md5|"") ssh-keygen -l -E md5 -f "$tmp/f" 2> /dev/null;; esac trap - INT TERM EXIT rm -rf "$tmp" > /dev/null 2>&1 } ssh_hostkey "$@" 

Megjegyzések

  • Ez egy jó bemutató az alacsonyabb szintű eszközök parancssori opciókkal történő csomagolásáról. Bónuszt tartalmaz a használat módjáról megosztott memória /dev/shm, amiről soha nem tudtam, hogy ilyen kényelmes lenne. Köszönjük a megosztást !

Válasz

Saját szerveremnél ezt használom:

ssh-keygen -l -E md5 -f <(cat /etc/ssh/ssh_host_*_key.pub) ssh-keygen -l -E sha256 -f <(cat /etc/ssh/ssh_host_*_key.pub) 

Válasz

Az egyszerű válasz amikor már van hozzáférése a szerverre a következő:

ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub 

Most lehet, hogy nem használja az RSA kulcsot: ha csatlakozáskor, akkor ssh elmondja

ECDSA kulcs ujjlenyomata SHA256: XXXXX

Helyette a /etc/ssh/ssh_host_ecdsa_key.pub parancsot kell használnia. (értesítés _ecdsa_ ). Így összeállítható egy univerzálisabb parancs, amely felsorolja az összes kulcsot ( forrás ):

for f in /etc/ssh/ssh_host_*_key.pub; do ssh-keygen -lf "$f"; done 

A szerver felállításakor felírhatja a listát, későbbi felhasználásra.Egy másik lehetőség az, hogy tárolja őket a DNS-rekordokban


Az ssh-keygen (1) kezelőoldalról:

-l A megadott nyilvános kulcs fájl ujjlenyomatának megjelenítése. Az RSA és a DSA kulcsoknál az ssh-keygen megpróbálja megtalálni a megfelelő nyilvános kulcsfájlt, és kinyomtatja az ujjlenyomatát. Ha -v-vel kombináljuk, akkor a kulcs vizuális ASCII ábrázolását az ujjlenyomat tartalmazza.

-f filename Megadja a kulcsfájl fájlnevét.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük