Skip to content

Commit

Permalink
initial
Browse files Browse the repository at this point in the history
  • Loading branch information
Ben Reardon committed Mar 13, 2024
0 parents commit 85beb20
Show file tree
Hide file tree
Showing 17 changed files with 400 additions and 0 deletions.
43 changes: 43 additions & 0 deletions LICENSE.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
BSD 3-Clause License

Copyright (c) 2024, Corelight, Inc.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.

3. Neither the name of the copyright holder nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
___________________________________________________________________________

Copyright (c) 2018, Salesforce.com, Inc.
All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

* Neither the name of Salesforce.com nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
87 changes: 87 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# "HASSH" - a Profiling Method for SSH Clients and Servers.

<p align="center">
<img src="images/logo.png" width="850" title="hassh">

</p>


"HASSH" is a network fingerprinting standard which can be used to identify specific Client and Server SSH implementations. The fingerprints can be easily stored, searched and shared in the form of an MD5 fingerprint.

[![License: BSD 3-Clause License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)
## What can HASSH help with:
- Use in highly controlled, well understood environments, where any fingerprints outside of a known good set are alertable.
- It is possible to detect, control and investigate brute force or Cred Stuffing password attempts at a higher level of granularity than IP Source - which may be impacted by NAT or botnet-like behaviour. The hassh will be a feature of the specific Client software implementation being used, even if the IP is NATed such that it is shared by many other SSH clients.
- Detect covert exfiltration of data within the components of the Client algorithm sets. In this case, a specially coded SSH Client can send data outbound from a trusted to a less trusted environment within a series of SSH_MSG_KEXINIT packets. In a scenario similar to the more known exfiltration via DNS, data could be sent as a series of attempted, but incomplete and unlogged connections to an SSH server controlled by bad actors who can then record, decode and reconstitute these pieces of data into their original form. Until now such attempts - much less the contents of the clear text packets - are not logged even by mature packet analyzers or on end point systems. Detection of this style of exfiltration can now be performed easily by using anomaly detection or alerting on SSH Clients with multiple different hassh
- Use in conjunction with other contextual indicators, for example detect Network discovery and Lateral movement attempts by unusual hassh such as those used by Paramiko, Powershell, Ruby, Meterpreter, Empire.
- Share malicious hassh as Indicators of Compromise.
- Create an additional level of Client application control, for example one could block all Clients from connecting to an SSH server that are outside of an approved known set of hassh values.
- Contribute to Non Repudiation in a Forensic context - at a higher level of abstraction than IPSource - which may be impacted by NAT, or where multiple IP Sources are used.
- Detect Deceptive Applications. Eg a hasshServer value known to belong to the Cowry/Kippo SSH honeypot server installation, which is purporting to be a common OpenSSH server in the Server String.
- Detect devices having a hassh known to belong to IOT embedded systems. Examples may include cameras, mics, keyloggers, wiretaps that could be easily be hidden from view and communicating quietly over encrypted channels back to a control server.

## How does HASSH work:
"hassh" and "hasshServer" are MD5 hashes constructed from a specific set of algorithms that are supported by various SSH Client and Server Applications. These algorithms are exchanged after the initial TCP three-way handshake as clear-text packets known as "SSH_MSG_KEXINIT" messages, and are an integral part of the setup of the final encrypted SSH channel.
The existence and ordering of these algorithms can be unique enough such that it can be used as a fingerprint to help identify the underlying Client and Server application or unique implementation, regardless of higher level ostensible identifiers such as "Client" or "Server" strings.
<p align="center">
<img src="images/packet_sequence.png" width="700" title="Packet sequence">
</p>

## Example 1: Client Fingerprinting - the "hassh"
For the "Cyberduck" SFTP client ```SSH-2.0-Cyberduck/6.7.1.28683 (Mac OS X/10.13.6) (x86_64)``` , the set of supported algorithms is as follows :

|Function|Algorithms seen in SSH_MSG_KEXINIT packets|
| ------------- | ------------- |
|Key Exchange methods| ```[email protected],diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group14-sha256,diffie-hellman-group15-sha512,diffie-hellman-group16-sha512,diffie-hellman-group17-sha512,diffie-hellman-group18-sha512,[email protected],diffie-hellman-group15-sha256,[email protected],[email protected],diffie-hellman-group16-sha256,[email protected],[email protected],[email protected]```|
|Encryption| ```aes128-cbc,aes128-ctr,aes192-cbc,aes192-ctr,aes256-cbc,aes256-ctr,blowfish-cbc,blowfish-ctr,cast128-cbc,cast128-ctr,idea-cbc,idea-ctr,serpent128-cbc,serpent128-ctr,serpent192-cbc,serpent192-ctr,serpent256-cbc,serpent256-ctr,3des-cbc,3des-ctr,twofish128-cbc,twofish128-ctr,twofish192-cbc,twofish192-ctr,twofish256-cbc,twofish256-ctr,twofish-cbc,arcfour,arcfour128,arcfour256```|
|Message Authentication| ```hmac-sha1,hmac-sha1-96,hmac-md5,hmac-md5-96,hmac-sha2-256,hmac-sha2-512```|
|Compression| ```[email protected],zlib,none```|

Concatenating these algorithms together with a delimiter of ";" gives the hasshAlgorithms, which is useful for detailed analysis.
```[email protected],diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group14-sha256,diffie-hellman-group15-sha512,diffie-hellman-group16-sha512,diffie-hellman-group17-sha512,diffie-hellman-group18-sha512,[email protected],diffie-hellman-group15-sha256,[email protected],[email protected],diffie-hellman-group16-sha256,[email protected],[email protected],[email protected];aes128-cbc,aes128-ctr,aes192-cbc,aes192-ctr,aes256-cbc,aes256-ctr,blowfish-cbc,blowfish-ctr,cast128-cbc,cast128-ctr,idea-cbc,idea-ctr,serpent128-cbc,serpent128-ctr,serpent192-cbc,serpent192-ctr,serpent256-cbc,serpent256-ctr,3des-cbc,3des-ctr,twofish128-cbc,twofish128-ctr,twofish192-cbc,twofish192-ctr,twofish256-cbc,twofish256-ctr,twofish-cbc,arcfour,arcfour128,arcfour256;hmac-sha1,hmac-sha1-96,hmac-md5,hmac-md5-96,hmac-sha2-256,hmac-sha2-512;[email protected],zlib,none```

Finally the hassh is simply the MD5 of hasshAlgorithms, and is used for storage, searching and sharing. Some examples follow:
```
de30354b88bae4c2810426614e1b6976 Powershell Renci.SshNet.SshClient.0.0.1 (used by Empire exploit modules)
fafc45381bfde997b6305c4e1600f1bf Ruby/Net::SSH_5.0.2 x86_64-linux (used by Metasploit exploit modules)
b5752e36ba6c5979a575e43178908adf Python Paramiko_2.4.1 (used by Metasploit exploit modules)
16f898dd8ed8279e1055350b4e20666c Dropbear_2012.55 (used in IOT embedded systems)
8a8ae540028bf433cd68356c1b9e8d5b CyberDuck Version 6.7.1 (28683)
06046964c022c6407d15a27b12a6a4fb OpenSSH_7.7p1 Ubuntu-4
```

## Example 2: Server Fingerprinting - the "hasshServer"
For a standard SSH-2.0-OpenSSH_5.3 SSH server, the set of supported algorithms is as follows :

|Function|Algorithms seen in SSH_MSG_KEXINIT packets|
| ------------- | ------------- |
|Key Exchange methods| ```diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1```|
|Encryption| ```aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,[email protected]```|
|Message Authentication| ```hmac-md5,hmac-sha1,[email protected],hmac-ripemd160,[email protected],hmac-sha1-96,hmac-md5-96```|
|Compression| ```none,[email protected]```|

Concatenating these algorithms together with a delimiter of ";" gives the hasshServerAlgorithms, which is useful for detailed analysis.
```diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1;aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,[email protected];hmac-md5,hmac-sha1,[email protected],hmac-ripemd160,[email protected],hmac-sha1-96,hmac-md5-96;none,[email protected]```

Finally the hasshServer is simply the MD5 of hasshServerAlgorithms, some examples follow:
```
c1c596caaeb93c566b8ecf3cae9b5a9e SSH-2.0-dropbear_2016.74
d93f46d063c4382b6232a4d77db532b2 SSH-2.0-dropbear_2016.72
2dd9a9b3dbebfaeec8b8aabd689e75d2 SSH-2.0-AWSCodeCommit
696e7f84ac571fdf8fa5073e64ee2dc8 SSH-2.0-FTP
```

## Options
By default, the raw algorithm string and the key algorithm are logged, and can be controlled by setting these boolean variables in the script.
```
option log_raw_hasshAlgorithms = T;
option log_key_algorithm = T;
```

## References:
- [Salesforce Engineering blog](https://engineering.salesforce.com/open-sourcing-hassh-abed3ae5044c)
- [BSides 2019 - HASSH - a Profiling Method for SSH Clients and Servers](https://github.com/benjeems/Presentations/blob/master/BSides%202019%20%20-%20HASSH%20-%20a%20Profiling%20Method%20for%20SSH%20Clients%20and%20Servers.pdf)
- [RFC4253 The Secure Shell (SSH) Transport Layer Protocol](https://www.ietf.org/rfc/rfc4253.txt)

## Credits:
hassh and hasshServer were conceived and developed by [Ben Reardon](mailto:[email protected]) within the Detection Cloud Team at Salesforce, with inspiration and contributions from Adel Karimi (@0x4d31) and the JA3 crew.
Binary file added images/logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/packet_sequence.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions scripts/__load__.zeek
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
@load ./hassh.zeek
89 changes: 89 additions & 0 deletions scripts/hassh.zeek
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
module SSH;

redef record SSH::Info += {
# The version is just in case the method changes in the future,
# as it may be handy to reference the version historically.
hasshVersion: string &log &default="1.0";

# Client/server hashes.
hassh: string &log &optional;
hasshServer: string &log &optional;

# Server host key as seen by a client.
cshka: string &log &optional;

# The algorithms that went into the client hash.
hasshAlgorithms: string &log &optional;

# Server host key as seen by a server.
sshka: string &log &optional;

# The algorithms that went into the server hash.
hasshServer_Algorithms: string &log &optional;
};

option log_raw_hassh_algorithms = T;
option log_key_algorithm = T;

# Takes key exchange, encryption, mac, and compression algorithm vectors and
# returns the corresponding algorithm list.
function extract_algo_list(kex: string_vec, enc: string_vec, mac: string_vec,
cmp: string_vec) : string
{
local kex_list = join_string_vec(kex, ",");
local enc_list = join_string_vec(enc, ",");
local mac_list = join_string_vec(mac, ",");
local cmp_list = join_string_vec(cmp, ",");

return kex_list + ";" + enc_list + ";" + mac_list + ";" + cmp_list;
}

# Build client fingerprint.
function get_hassh(c: connection, capabilities: SSH::Capabilities)
{
local algo_list = extract_algo_list(
capabilities$kex_algorithms,
capabilities$encryption_algorithms$client_to_server,
capabilities$mac_algorithms$client_to_server,
capabilities$compression_algorithms$client_to_server);

c$ssh$hassh = md5_hash(algo_list);

if ( log_raw_hassh_algorithms )
c$ssh$hasshAlgorithms = algo_list;

if ( log_key_algorithm )
c$ssh$cshka = join_string_vec(capabilities$server_host_key_algorithms, ",");
}

# Build server fingerprint.
function get_hasshServer(c: connection, capabilities: SSH::Capabilities)
{
local algo_list = extract_algo_list(
capabilities$kex_algorithms,
capabilities$encryption_algorithms$server_to_client,
capabilities$mac_algorithms$server_to_client,
capabilities$compression_algorithms$server_to_client);

c$ssh$hasshServer = md5_hash(algo_list);

if ( log_raw_hassh_algorithms )
c$ssh$hasshServer_Algorithms = algo_list;

if ( log_key_algorithm )
c$ssh$sshka = join_string_vec(capabilities$server_host_key_algorithms, ",");
}

event ssh_capabilities(c: connection, cookie: string,
capabilities: SSH::Capabilities)
{
# This should really never apply, but just in case.
if ( ! c?$ssh )
return;

if ( capabilities$is_server && ! c$ssh?$hasshServer )
get_hasshServer(c, capabilities);

else if ( ! capabilities$is_server && ! c$ssh?$hassh )
get_hassh(c, capabilities);
}
3 changes: 3 additions & 0 deletions testing/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.btest.failed.dat
.tmp
.DS_STORE
Loading

0 comments on commit 85beb20

Please sign in to comment.