Skip to content

Commit

Permalink
Recognize LANcom LCOS software and support extraction of ssh-ed448 ke…
Browse files Browse the repository at this point in the history
…y type

LANcom router devices appear to be primarily used in Germany (see [1]
for examples on the public Internet), and they appear to support the
`ssh-ed448` key type which is documented in [2], but which has never
been supported by any as-yet-released version of OpenSSH.

[1] https://www.shodan.io/search?query=ssh+%22ed448%22
[2] https://datatracker.ietf.org/doc/html/rfc8709#name-public-key-format
  • Loading branch information
dlenskiSB committed Jul 5, 2024
1 parent df8f238 commit c9769b3
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 0 deletions.
3 changes: 3 additions & 0 deletions src/ssh_audit/hostkeytest.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ class HostKeyTest:

'ssh-ed25519': {'cert': False, 'variable_key_len': False},
'[email protected]': {'cert': True, 'variable_key_len': False},

'ssh-ed448': {'cert': False, 'variable_key_len': False},
# '[email protected]': {'cert': True, 'variable_key_len': False},
}

TWO2K_MODULUS_WARNING = '2048-bit modulus only provides 112-bits of symmetric strength'
Expand Down
3 changes: 3 additions & 0 deletions src/ssh_audit/kexdh.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,9 @@ def recv_reply(self, s: 'SSH_Socket', parse_host_key_size: bool = True) -> Optio
if self.__hostkey_type == 'ssh-ed25519':
self.out.d("%s has a fixed host key modulus of 32." % self.__hostkey_type)
self.__hostkey_n_len = 32
elif self.__hostkey_type == 'ssh-ed448':
self.out.d("%s has a fixed host key modulus of 57." % self.__hostkey_type)
self.__hostkey_n_len = 57
else:
# Here is the modulus size & actual modulus of the host key public key.
hostkey_n, self.__hostkey_n_len, ptr = KexDH.__get_bytes(hostkey, ptr)
Expand Down
4 changes: 4 additions & 0 deletions src/ssh_audit/software.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,4 +224,8 @@ def parse(cls, banner: 'Banner') -> Optional['Software']:
mx = re.match(r'^PuTTY_Release_(.*)', software)
if mx:
return cls(None, Product.PuTTY, mx.group(1), None, None)
mx = re.match(r'^lancom(.*)', software)
if mx:
v, p = 'LANcom', 'LCOS sshd'
return cls(v, p, mx.group(1), None, None)
return None

0 comments on commit c9769b3

Please sign in to comment.