ssh-audit is a tool for ssh server & client configuration auditing.
jtesta/ssh-audit (v2.0+) is the updated and maintained version of ssh-audit forked from arthepsy/ssh-audit (v1.x) due to inactivity.
- SSH1 and SSH2 protocol server support;
- analyze SSH client configuration;
- grab banner, recognize device or software and operating system, detect compression;
- gather key-exchange, host-key, encryption and message authentication code algorithms;
- output algorithm information (available since, removed/disabled, unsafe/weak/legacy, etc);
- output algorithm recommendations (append or remove based on recognized software version);
- output security information (related issues, assigned CVE list, etc);
- analyze SSH version compatibility based on algorithm information;
- historical information from OpenSSH, Dropbear SSH and libssh;
- policy scans to ensure adherence to a hardened/standard configuration;
- runs on Linux and Windows;
- no dependencies
usage: ssh-audit.py [options] <host>
-h, --help print this help
-1, --ssh1 force ssh version 1 only
-2, --ssh2 force ssh version 2 only
-4, --ipv4 enable IPv4 (order of precedence)
-6, --ipv6 enable IPv6 (order of precedence)
-b, --batch batch output
-c, --client-audit starts a server on port 2222 to audit client
software config (use -p to change port;
use -t to change timeout)
-j, --json JSON output
-l, --level=<level> minimum output level (info|warn|fail)
-L, --list-policies list all the official, built-in policies
--lookup=<alg1,alg2,...> looks up an algorithm(s) without
connecting to a server
-M, --make-policy=<policy.txt> creates a policy based on the target server
(i.e.: the target server has the ideal
configuration that other servers should
adhere to)
-n, --no-colors disable colors
-p, --port=<port> port to connect
-P, --policy=<policy.txt> run a policy test using the specified policy
-t, --timeout=<secs> timeout (in seconds) for connection and reading
(default: 5)
-T, --targets=<hosts.txt> a file containing a list of target hosts (one
per line, format HOST[:PORT])
-v, --verbose verbose output
- if both IPv4 and IPv6 are used, order of precedence can be set by using either
-46
or-64
. - batch flag
-b
will output sections without header and without empty lines (implies verbose flag). - verbose flag
-v
will prefix each line with section type and algorithm name. - an exit code of 0 is returned when all algorithms are considered secure (for a standard audit), or when a policy check passes (for a policy audit).
Basic server auditing:
ssh-audit localhost
ssh-audit 127.0.0.1
ssh-audit 127.0.0.1:222
ssh-audit ::1
ssh-audit [::1]:222
To run a standard audit against many servers (place targets into servers.txt, one on each line in the format of HOST[:PORT]
):
ssh-audit -T servers.txt
To audit a client configuration (listens on port 2222 by default; connect using ssh anything@localhost
):
ssh-audit -c
To audit a client configuration, with a listener on port 4567:
ssh-audit -c -p 4567
To list all official built-in policies (hint: use resulting file paths with -P
/--policy
):
ssh-audit -L
To run a policy audit against a server:
ssh-audit -P path/to/server_policy targetserver
To run a policy audit against a client:
ssh-audit -c -P path/to/client_policy
To run a policy audit against many servers:
ssh-audit -T servers.txt -P path/to/server_policy
To create a policy based on a target server (which can be manually edited; see official built-in policies for syntax examples):
ssh-audit -M new_policy.txt targetserver
Below is a screen shot of the standard server-auditing output when connecting to an unhardened OpenSSH v5.3 service:
Below is a screen shot of the policy auditing output when connecting to an un-hardened Ubuntu Server 20.04 machine:
After applying the steps in the hardening guide (see below), the output changes to the following:
Below is a screen shot of the client-auditing output when an unhardened OpenSSH v7.2 client connects:
Guides to harden server & client configuration can be found here: https://www.ssh-audit.com/hardening_guides.html
Pre-built packages are available for Windows (see the releases page), on PyPI, Snap, and Homebrew.
To install from PyPI:
$ pip3 install ssh-audit
To install the Snap package:
$ snap install ssh-audit
To install on Homebrew:
$ brew install ssh-audit
For convenience, a web front-end on top of the command-line tool is available at https://www.ssh-audit.com/.
- Added new policy auditing functionality to test adherence to a hardening guide/standard configuration (see
-L
/--list-policies
,-M
/--make-policy
and-P
/--policy
). For an in-depth tutorial, see https://www.positronsecurity.com/blog/2020-09-27-ssh-policy-configuration-checks-with-ssh-audit/. - Created new man page (see
ssh-audit.1
file). - 1024-bit moduli upgraded from warnings to failures.
- Many Python 2 code clean-ups, testing framework improvements, pylint & flake8 fixes, and mypy type comments; credit Jürgen Gmach.
- Added feature to look up algorithms in internal database (see
--lookup
); credit Adam Russell. - Suppress recommendation of token host key types.
- Added check for use-after-free vulnerability in PuTTY v0.73.
- Added 11 new host key types:
ssh-rsa1
,ssh-dss-sha256@ssh.com
,ssh-gost2001
,ssh-gost2012-256
,ssh-gost2012-512
,spki-sign-rsa
,ssh-ed448
,x509v3-ecdsa-sha2-nistp256
,x509v3-ecdsa-sha2-nistp384
,x509v3-ecdsa-sha2-nistp521
,x509v3-rsa2048-sha256
. - Added 8 new key exchanges:
diffie-hellman-group1-sha256
,kexAlgoCurve25519SHA256
,Curve25519SHA256
,gss-group14-sha256-
,gss-group15-sha512-
,gss-group16-sha512-
,gss-nistp256-sha256-
,gss-curve25519-sha256-
. - Added 5 new ciphers:
blowfish
,AEAD_AES_128_GCM
,AEAD_AES_256_GCM
,crypticore128@ssh.com
,seed-cbc@ssh.com
. - Added 3 new MACs:
chacha20-poly1305@openssh.com
,hmac-sha3-224
,crypticore-mac@ssh.com
.
- Marked host key type
ssh-rsa
as weak due to practical SHA-1 collisions. - Added Windows builds.
- Added 10 new host key types:
ecdsa-sha2-1.3.132.0.10
,x509v3-sign-dss
,x509v3-sign-rsa
,x509v3-sign-rsa-sha256@ssh.com
,x509v3-ssh-dss
,x509v3-ssh-rsa
,sk-ecdsa-sha2-nistp256-cert-v01@openssh.com
,sk-ecdsa-sha2-nistp256@openssh.com
,sk-ssh-ed25519-cert-v01@openssh.com
, andsk-ssh-ed25519@openssh.com
. - Added 18 new key exchanges:
diffie-hellman-group14-sha256@ssh.com
,diffie-hellman-group15-sha256@ssh.com
,diffie-hellman-group15-sha384@ssh.com
,diffie-hellman-group16-sha384@ssh.com
,diffie-hellman-group16-sha512@ssh.com
,diffie-hellman-group18-sha512@ssh.com
,ecdh-sha2-curve25519
,ecdh-sha2-nistb233
,ecdh-sha2-nistb409
,ecdh-sha2-nistk163
,ecdh-sha2-nistk233
,ecdh-sha2-nistk283
,ecdh-sha2-nistk409
,ecdh-sha2-nistp192
,ecdh-sha2-nistp224
,ecdh-sha2-nistt571
,gss-gex-sha1-
, andgss-group1-sha1-
. - Added 9 new ciphers:
camellia128-cbc
,camellia128-ctr
,camellia192-cbc
,camellia192-ctr
,camellia256-cbc
,camellia256-ctr
,aes128-gcm
,aes256-gcm
, andchacha20-poly1305
. - Added 2 new MACs:
aes128-gcm
andaes256-gcm
.
- Added 2 new host key types:
rsa-sha2-256-cert-v01@openssh.com
,rsa-sha2-512-cert-v01@openssh.com
. - Added 2 new ciphers:
des
,3des
. - Added 3 new PuTTY vulnerabilities.
- During client testing, client IP address is now listed in output.
- Added client software auditing functionality (see
-c
/--client-audit
option). - Added JSON output option (see
-j
/--json
option; credit Andreas Jaggi). - Fixed crash while scanning Solaris Sun_SSH.
- Added 9 new key exchanges:
gss-group1-sha1-toWM5Slw5Ew8Mqkay+al2g==
,gss-gex-sha1-toWM5Slw5Ew8Mqkay+al2g==
,gss-group14-sha1-
,gss-group14-sha1-toWM5Slw5Ew8Mqkay+al2g==
,gss-group14-sha256-toWM5Slw5Ew8Mqkay+al2g==
,gss-group15-sha512-toWM5Slw5Ew8Mqkay+al2g==
,diffie-hellman-group15-sha256
,ecdh-sha2-1.3.132.0.10
,curve448-sha512
. - Added 1 new host key type:
ecdsa-sha2-1.3.132.0.10
. - Added 4 new ciphers:
idea-cbc
,serpent128-cbc
,serpent192-cbc
,serpent256-cbc
. - Added 6 new MACs:
hmac-sha2-256-96-etm@openssh.com
,hmac-sha2-512-96-etm@openssh.com
,hmac-ripemd
,hmac-sha256-96@ssh.com
,umac-32@openssh.com
,umac-96@openssh.com
.
- Forked from https://github.com/arthepsy/ssh-audit (development was stalled, and developer went MIA).
- Added RSA host key length test.
- Added RSA certificate key length test.
- Added Diffie-Hellman modulus size test.
- Now outputs host key fingerprints for RSA and ED25519.
- Added 5 new key exchanges:
sntrup4591761x25519-sha512@tinyssh.org
,diffie-hellman-group-exchange-sha256@ssh.com
,diffie-hellman-group-exchange-sha512@ssh.com
,diffie-hellman-group16-sha256
,diffie-hellman-group17-sha512
. - Added 3 new encryption algorithms:
des-cbc-ssh1
,blowfish-ctr
,twofish-ctr
. - Added 10 new MACs:
hmac-sha2-56
,hmac-sha2-224
,hmac-sha2-384
,hmac-sha3-256
,hmac-sha3-384
,hmac-sha3-512
,hmac-sha256
,hmac-sha256@ssh.com
,hmac-sha512
,hmac-512@ssh.com
. - Added command line argument (
-t
/--timeout
) for connection & reading timeouts. - Updated CVEs for libssh & Dropbear.
- implement options to allow specify IPv4/IPv6 usage and order of precedence
- implement option to specify remote port (old behavior kept for compatibility)
- add colors support for Microsoft Windows via optional colorama dependency
- fix encoding and decoding issues, add tests, do not crash on encoding errors
- use mypy-lang for static type checking and verify all code
- implement algorithm recommendations section (based on recognized software)
- implement full libssh support (version history, algorithms, security, etc)
- fix SSH-1.99 banner recognition and version comparison functionality
- do not output empty algorithms (happens for misconfigured servers)
- make consistent output for Python 3.x versions
- add a lot more tests (conf, banner, software, SSH1/SSH2, output, etc)
- use Travis CI to test for multiple Python versions (2.6-3.5, pypy, pypy3)
- create security section for related security information
- match and output assigned CVE list and security issues for Dropbear SSH
- implement full SSH1 support with fingerprint information
- automatically fallback to SSH1 on protocol mismatch
- add new options to force SSH1 or SSH2 (both allowed by default)
- parse banner information and convert it to specific software and OS version
- do not use padding in batch mode
- several fixes (Cisco sshd, rare hangs, error handling, etc)
- implement batch output option
- implement minimum output level option
- fix compatibility with Python 2.6
- implement SSH version compatibility feature
- fix wrong mac algorithm warning
- fix Dropbear SSH version typo
- parse pre-banner header
- better errors handling
- use OpenSSH 7.3 banner
- add new key-exchange algorithms
- use OpenSSH 7.2 banner
- additional warnings for OpenSSH 7.2
- fix OpenSSH 7.0 failure messages
- add rijndael-cbc failure message from OpenSSH 6.7
- multiple additional warnings
- support for none algorithm
- better compression handling
- ensure reading enough data (fixes few Linux SSH)
- Dropbear SSH support
- initial version