เป็นไปได้ไหมที่จะหาโฮสต์ในไฟล์ known_hosts?


115

ฉันต้องการดูว่าโฮสต์ใดอยู่ในไฟล์ known_hosts ของฉัน แต่ดูเหมือนว่ามนุษย์จะไม่สามารถอ่านได้ เป็นไปได้ไหมที่จะอ่าน

โดยเฉพาะมีโฮสต์ที่ฉันสามารถเชื่อมต่อผ่านหลายชื่อและฉันต้องการค้นหาลายนิ้วมือที่ฉันคาดหวังจากแฟ้มโฮสต์ที่รู้จัก

อัปเดต: ฉันใช้ OpenSSH_5.3p1 Debian-3ubuntu7, OpenSSL 0.9.8k 25 มีนาคม 2552

บรรทัดจากไฟล์ known_hosts ของฉันมีลักษณะเช่นนี้

|1|guO7PbLLb5FWIpxNZHF03ESTTKg=|r002DA8L2JUYRVykUh7jcVUHeYE= ssh-rsa AAAAB3NzaC1yc2EAAFADAQABAAABAQDWp73ulfigmbbzif051okmDMh5yZt/DlZnsx3DEOYHu3Nu/+THJnUAfkfEc1XkOFiFgbUyK/08Ty0K6ExUaffb1ERfXXyyp63rpCTHOPonSrnK7adl7YoPDd4BcIUZd1Dk7HtuShMmuk4l83X623cr9exbfm+DRaeyFNMFSEkMzztBYIkhpA2DWlDkd90OfVAvyoOrJPxztmIZR82qu/5t2z58sJ6Jm2xdp2ckySgXulq6S4k+hnnGuz2p1klviYCWGJMZfyAB+V+MTjGGD/cj0SkL5v/sa/Fie1zcv1SLs466x3H0kMllz6gAk0/FMi7eULspwnIp65g45qUAL3Oj

หากไม่มีการแฮชคุณสามารถใช้: unix.stackexchange.com/questions/236192/…
Benjamin Goodacre

คำตอบ:


135

คุณได้HashKnownHostsตั้งค่าเป็น " yes" ในssh_configไฟล์ของคุณดังนั้นชื่อโฮสต์จะไม่สามารถใช้ได้ในแบบธรรมดา

หากคุณรู้ชื่อโฮสต์ที่คุณกำลังมองหาล่วงหน้าคุณสามารถค้นหาด้วย:

    ssh-keygen -H -F hostname

นี่คือส่วนที่เกี่ยวข้องจากssh-keygen(1)หน้าคน:

 -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.

3
โฮสต์ที่รู้จักกันว่าแฮชหมายถึงเป็นไปไม่ได้ใช่หรือไม่ เช่นฉันจำเป็นต้องรู้ชื่อของโฮสต์เพื่อที่จะดูข้อมูลหรือไม่
โคลินนิวเวล

7
@ColinNewell ถูกต้องคุณต้องรู้ชื่อโฮสต์ เป็นมาตรการรักษาความปลอดภัยเพื่อป้องกันไม่ให้ผู้โจมตีทำการรวบรวมชื่อโฮสต์ / ที่อยู่ IP ของกล่องอื่น ๆ ที่คุณใช้บ่อยหากเครื่องของคุณถูกบุกรุก
pdo

1
อย่ากลัวเมื่อไม่มีเอาต์พุตเลย แต่ลองไม่ใช้ชื่อโฮสต์แบบเต็ม แต่เป็นชื่อโฮสต์แทน
คณิตศาสตร์

6
ไม่ใช่ sshd_config แต่เป็น ssh_config
Fish Monitor

9
@pdo - คำสั่งของคุณใช้ไม่ได้เสมอไป หากโฮสต์มี SSH บนพอร์ตอื่นที่ไม่ใช่22รูปแบบknown_hostsจะแตกต่างกัน จากนั้นคุณต้องใช้คำสั่งต่อไปนี้: ssh-keygen -H -F [host.example.com]:2222
Martin Vegter

17

สำหรับผู้ค้นหาในอนาคตบทความนี้ (ไม่ใช่ Disclaimer: ฉันไม่ได้ affilated) มีสคริปต์ Perl ค่อนข้างง่ายที่จะแรงเดรัจฉานถก IPs known_hostsและชื่อโฮสต์ใน

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

อนุญาตให้เริ่มจากที่อยู่ IP ที่เฉพาะเจาะจง นอกจากนี้ยังสามารถแก้ไขได้อย่างง่ายดายเพื่อใช้พจนานุกรม

นอกจากนี้ในเดือนมิถุนายน 2014 โครงการ John the Ripper ได้เพิ่มการสนับสนุนสำหรับการถอดรหัสแบบรู้จัก _hostsซึ่งสามารถใช้ประโยชน์จากคอร์ซีพียูหลายคอร์, GPU, พจนานุกรม mangling เป็นต้น

คุณยังสามารถใช้ส่วนย่อย nmap นี้เพื่อสร้างพจนานุกรมของที่อยู่ IP RFC1918 ทั้งหมดเพื่อใช้เป็นพจนานุกรม:

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

1
นอกจากนี้ยังมีการใช้งาน python พร้อมคุณสมบัติที่คล้ายกันซึ่งสามารถดูได้ที่: blog.tremily.us/posts/known_hosts
Lars Nordin

Lars Nordin ขอบคุณสำหรับเคล็ดลับ ฉันส่งข้อมูลของ Remily ให้กับทีม John the Ripper แล้วและพวกเขาก็เพิ่มการสนับสนุนสิ่งนี้ใน blood-jumbo: openwall.com/lists/john-users/2014/07/02/2
Royce Williams

1
และนี่คือวิธีทำด้วย hashcat: up1ink.tumblr.com/post/132370869368/ …
Royce Williams

4

ไม่ssh-keygen -l -f ~/.ssh/known_hostsช่วย? (การใช้งาน-vคุณจะได้รับแผนที่ขุมสมบัติเล็ก ๆ น้อย ๆ เช่น

+--[ RSA 2048]----+
|        .        |
|       + .       |
|      . B .      |
|     o * +       |
|    X * S        |
|   + O o . .     |
|    .   E . o    |
|       . . o     |
|        . .      |
+-----------------+

2
ไม่ใช่ในความหมายที่เข้มงวดที่สุดทุกอย่างยังคงเป็นฐาน 64 คำอธิบายของ pdo เกี่ยวกับการถูกแฮชแสดงให้เห็นว่ามันเป็นวิธีหนึ่งดังนั้นฉันเดาว่าฉันติดอยู่เว้นแต่ว่าฉันรู้ชื่อโฮสต์
โคลินนิวเวล

นั่นช่วยฉัน สิ่งที่ฉันต้องการโดยเฉพาะคือการรวมกัน ในการค้นหาลายนิ้วมือ ssh ที่ตรวจสอบก่อนหน้านี้คุณสามารถเรียกใช้:ssh-keygen -l -f ~/.ssh/known_hosts -F <hostname>
isaaclw

เอ่อssh-keygen -l -F <hostname>ยังง่ายกว่านี้อีกด้วย
isaaclw

2

มีโฮสต์สตริง / ip ที่จุดเริ่มต้นของแต่ละบรรทัด "known_hosts" (ก่อนหน้าสตริง "ssh-dss" หรือ "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 [...] ==

2
... และด้วยเหตุawk '{print $1}' known_hostsนี้จึงเป็นการหลอกลวง โปรดทราบว่าเซิร์ฟเวอร์ฟังบนพอร์ตที่ไม่ได้มาตรฐานจบลงเช่นการพูด ใน[some-server]:5555 known_hosts
sr_

3
น่าเสียดายที่ไม่ใช่ของฉัน ฉันดูเหมือนข้อมูลที่เข้ารหัส base64 ข้อมูลจะถูกคั่นด้วยไพพ์ในไฟล์ของฉัน
โคลินนิวเวล

คุณใช้ซอฟต์แวร์ ssh รุ่นใด (เราสมมุติว่าคุณใช้ซอฟต์แวร์ openssh เกือบเป็นมาตรฐาน)
Ouki

ฉันได้เพิ่มรายละเอียดเพิ่มเติมลงในคำถามของฉัน
โคลินนิวเวล

7
ตามที่ระบุไว้โดย @pdo sshd ของคุณเป็น "HashKnownHosts" ตั้งค่าเป็น on ซึ่งอาจปรากฏขึ้นเล็กน้อย แต่มีความกังวลด้านความปลอดภัย และแน่นอนว่าไม่มีทางที่จะย้อนแฮชและรับชื่อโฮสต์จาก "known_hosts" ของคุณ
Ouki

2

ใช้-lตัวเลือกเพื่อssh-keygenแสดงรายการลายนิ้วมือและ-Fตัวเลือกในการค้นหาชื่อโฮสต์ในknown_hostsไฟล์ของคุณ

$ 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)

คุณสามารถใช้ssh-keyscanเพื่อเปรียบเทียบลายนิ้วมือในของคุณknown_hostsกับหนึ่งจากเซิร์ฟเวอร์

$ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.