Merge pull request #1689 from guardicore/1676-remove-agent-bootloader
Remove agent bootloader
|
@ -41,6 +41,7 @@ Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
- Max victims to find/exploit, TCP scan interval and TCP scan get banner internal options. #1597
|
- Max victims to find/exploit, TCP scan interval and TCP scan get banner internal options. #1597
|
||||||
- MySQL fingerprinter. #1648
|
- MySQL fingerprinter. #1648
|
||||||
- MS08-067 (Conficker) exploiter. #1677
|
- MS08-067 (Conficker) exploiter. #1677
|
||||||
|
- Agent bootloader. #1676
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- A bug in network map page that caused delay of telemetry log loading. #1545
|
- A bug in network map page that caused delay of telemetry log loading. #1545
|
||||||
|
|
|
@ -44,21 +44,4 @@ Compatibility depends on GLIBC version (2.14+)[^1]. By default, these distributi
|
||||||
|
|
||||||
We also provide a Dockerfile on our [website](http://infectionmonkey.com/) that lets the Monkey Island run inside a container.
|
We also provide a Dockerfile on our [website](http://infectionmonkey.com/) that lets the Monkey Island run inside a container.
|
||||||
|
|
||||||
### Old machine bootloader
|
|
||||||
|
|
||||||
Some **older machines** still have partial compatibility and will be exploited and reported, but the Infection Monkey agent can't run on them. In these cases, old machine bootloader (a small C program) will be run, which reports some minor info like network interface configuration, GLIBC version, OS, etc.
|
|
||||||
|
|
||||||
**Old machine bootloader** also has a GLIBC 2.14+ requirement for Linux because the bootloader is included in the Pyinstaller bootloader, which uses Python 3.7 that in turn requires GLIBC 2.14+. If you think partial support for older machines is important, don't hesitate to open a new issue about it.
|
|
||||||
|
|
||||||
**Old machine bootloader** runs on machines with:
|
|
||||||
|
|
||||||
- Centos 7+
|
|
||||||
- Debian 7+
|
|
||||||
- Kali 2019+
|
|
||||||
- Oracle 7+
|
|
||||||
- Rhel 7+
|
|
||||||
- Suse 12+
|
|
||||||
- Ubuntu 14+
|
|
||||||
- **Windows XP/Server 2003+**
|
|
||||||
|
|
||||||
[^1]: The GLIBC >= 2.14 requirement exists because the Infection Monkey was built using this GLIBC version, and GLIBC is not backward compatible. We are also limited to the oldest GLIBC version compatible with Python 3.7.
|
[^1]: The GLIBC >= 2.14 requirement exists because the Infection Monkey was built using this GLIBC version, and GLIBC is not backward compatible. We are also limited to the oldest GLIBC version compatible with Python 3.7.
|
||||||
|
|
|
@ -5,10 +5,9 @@ name = "pypi"
|
||||||
|
|
||||||
[packages]
|
[packages]
|
||||||
cryptography = "==2.5" # We can't build 32bit ubuntu12 binary with newer versions of cryptography
|
cryptography = "==2.5" # We can't build 32bit ubuntu12 binary with newer versions of cryptography
|
||||||
pyinstaller = {git = "git://github.com/guardicore/pyinstaller"}
|
pyinstaller = "==4.2"
|
||||||
pyinstaller-hooks-contrib = "==2021.1" # Required to build docker with our pyinstaller branch
|
setuptools = "<=60.6.0" # https://github.com/pypa/setuptools/issues/3072 and https://github.com/pyinstaller/pyinstaller/issues/6564
|
||||||
impacket = ">=0.9"
|
impacket = ">=0.9"
|
||||||
importlib-metadata = "==4.0.1" # Required to build docker with our pyinstaller branch
|
|
||||||
ipaddress = ">=1.0.23"
|
ipaddress = ">=1.0.23"
|
||||||
netifaces = ">=0.10.9"
|
netifaces = ">=0.10.9"
|
||||||
odict = "==1.7.0"
|
odict = "==1.7.0"
|
||||||
|
@ -23,7 +22,6 @@ ScoutSuite = {git = "git://github.com/guardicode/ScoutSuite"}
|
||||||
pyopenssl = "==19.0.0" # We can't build 32bit ubuntu12 binary with newer versions of pyopenssl
|
pyopenssl = "==19.0.0" # We can't build 32bit ubuntu12 binary with newer versions of pyopenssl
|
||||||
pypsrp = "*"
|
pypsrp = "*"
|
||||||
typing-extensions = "*" # Allows us to use 3.9 typing features on 3.7 project
|
typing-extensions = "*" # Allows us to use 3.9 typing features on 3.7 project
|
||||||
altgraph = "*" # Required for pyinstaller branch, without it agents fail to build
|
|
||||||
pysmb = "*"
|
pysmb = "*"
|
||||||
"WinSys-3.x" = "*"
|
"WinSys-3.x" = "*"
|
||||||
ldaptor = "*"
|
ldaptor = "*"
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"_meta": {
|
"_meta": {
|
||||||
"hash": {
|
"hash": {
|
||||||
"sha256": "945e6a45bb4d4e87d66a82b788937b323596e4366daa44f743bca6eaf193045d"
|
"sha256": "250fc3013e7083083999fbf289f8898d63ceffc95a02e87920d254950832ea68"
|
||||||
},
|
},
|
||||||
"pipfile-spec": 6,
|
"pipfile-spec": 6,
|
||||||
"requires": {
|
"requires": {
|
||||||
|
@ -29,7 +29,6 @@
|
||||||
"sha256:743628f2ac6a7c26f5d9223c91ed8ecbba535f506f4b6f558885a8a56a105857",
|
"sha256:743628f2ac6a7c26f5d9223c91ed8ecbba535f506f4b6f558885a8a56a105857",
|
||||||
"sha256:ebf2269361b47d97b3b88e696439f6e4cbc607c17c51feb1754f90fb79839158"
|
"sha256:ebf2269361b47d97b3b88e696439f6e4cbc607c17c51feb1754f90fb79839158"
|
||||||
],
|
],
|
||||||
"index": "pypi",
|
|
||||||
"version": "==0.17.2"
|
"version": "==0.17.2"
|
||||||
},
|
},
|
||||||
"asn1crypto": {
|
"asn1crypto": {
|
||||||
|
@ -48,11 +47,11 @@
|
||||||
},
|
},
|
||||||
"asysocks": {
|
"asysocks": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:9b33fe5ab6853ed2ac9eb1652f4a8593a78ad5ba258bd10fa4b81801e38729c2",
|
"sha256:5ec0582252b0085d9337d13c6b03ab7fd062e487070667f9140e6972bd9db256",
|
||||||
"sha256:a0a20e583fedb08c962a68dd50764a34424c41bd59a0ae952d8bb368a03eaa45"
|
"sha256:b97ac905cd4ca1e7a8e7c295f9cb22ced5dfd3f17e888e71cbf05a1d67a4d393"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.6'",
|
"markers": "python_version >= '3.6'",
|
||||||
"version": "==0.1.2"
|
"version": "==0.1.6"
|
||||||
},
|
},
|
||||||
"attrs": {
|
"attrs": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -87,19 +86,19 @@
|
||||||
},
|
},
|
||||||
"boto3": {
|
"boto3": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:49499acf3f1dbb5f09eb93abfeb4025cd76fb7880c16a01a2901dfa335496f0d",
|
"sha256:1903e4462b08f7696a8d0977361fe9e35e7a50d9e70d7abd72a3a17012741938",
|
||||||
"sha256:d2fce99e42cb7cb263f3ff272bc707aa6a66bc6ab30d90bf0ff6cbdddd867cfa"
|
"sha256:34e5ae33ef65b1c4e2e197009e88df5dc217386699939ae897d7fcdb5a6ff295"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.6'",
|
"markers": "python_version >= '3.6'",
|
||||||
"version": "==1.20.42"
|
"version": "==1.20.47"
|
||||||
},
|
},
|
||||||
"botocore": {
|
"botocore": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:a58f1e559ff2c65495f55ac48217afefb56f2d709d30f7377c40287e8c5765d0",
|
"sha256:82da38e309bd6fd6303394e6e9d1ea50626746f2911e3fec996f9046c5d85085",
|
||||||
"sha256:e2e5509934e634a374afa560de4ddc770bb562c7259cb63cd92aa7e54f943bc1"
|
"sha256:a89b1be0a7f235533d8279d90b0b15dc2130d0552a9f7654ba302b564ab5688a"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.6'",
|
"markers": "python_version >= '3.6'",
|
||||||
"version": "==1.23.42"
|
"version": "==1.23.47"
|
||||||
},
|
},
|
||||||
"certifi": {
|
"certifi": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -173,11 +172,11 @@
|
||||||
},
|
},
|
||||||
"charset-normalizer": {
|
"charset-normalizer": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:876d180e9d7432c5d1dfd4c5d26b72f099d503e8fcc0feb7532c9289be60fcbd",
|
"sha256:2842d8f5e82a1f6aa437380934d5e1cd4fcf2003b06fed6940769c164a480a45",
|
||||||
"sha256:cb957888737fc0bbcd78e3df769addb41fd1ff8cf950dc9e7ad7793f1bf44455"
|
"sha256:98398a9d69ee80548c762ba991a4728bfc3836768ed226b3945908d1a688371c"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3'",
|
"markers": "python_version >= '3'",
|
||||||
"version": "==2.0.10"
|
"version": "==2.0.11"
|
||||||
},
|
},
|
||||||
"cheroot": {
|
"cheroot": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -211,14 +210,6 @@
|
||||||
"markers": "python_version >= '3.6'",
|
"markers": "python_version >= '3.6'",
|
||||||
"version": "==8.0.3"
|
"version": "==8.0.3"
|
||||||
},
|
},
|
||||||
"colorama": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b",
|
|
||||||
"sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"
|
|
||||||
],
|
|
||||||
"markers": "platform_system == 'Windows' and sys_platform == 'win32' and platform_system == 'Windows'",
|
|
||||||
"version": "==0.4.4"
|
|
||||||
},
|
|
||||||
"coloredlogs": {
|
"coloredlogs": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:34fad2e342d5a559c31b6c889e8d14f97cb62c47d9a2ae7b5ed14ea10a79eff8",
|
"sha256:34fad2e342d5a559c31b6c889e8d14f97cb62c47d9a2ae7b5ed14ea10a79eff8",
|
||||||
|
@ -263,7 +254,7 @@
|
||||||
"sha256:081649da27ced5e75709a1ee542136eaba9842a0fe4c03da4fb0a3d3ed1f3c44",
|
"sha256:081649da27ced5e75709a1ee542136eaba9842a0fe4c03da4fb0a3d3ed1f3c44",
|
||||||
"sha256:e79351e032d0b606b98d38a4b0e6e2275b31a5b85c873e587cc11b73aca026d6"
|
"sha256:e79351e032d0b606b98d38a4b0e6e2275b31a5b85c873e587cc11b73aca026d6"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.6' and python_version < '4'",
|
"markers": "python_version >= '3.6' and python_version < '4.0'",
|
||||||
"version": "==2.2.0"
|
"version": "==2.2.0"
|
||||||
},
|
},
|
||||||
"flask": {
|
"flask": {
|
||||||
|
@ -283,9 +274,9 @@
|
||||||
},
|
},
|
||||||
"httpagentparser": {
|
"httpagentparser": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:ef763d31993dd761825acee6c8b34be32b95cf1675d1c73c3cd35f9e52831b26"
|
"sha256:a190dfdc5e63b2f1c87729424b19cbc49263d6a1fb585a16ac1c9d9ce127a4bf"
|
||||||
],
|
],
|
||||||
"version": "==1.9.1"
|
"version": "==1.9.2"
|
||||||
},
|
},
|
||||||
"humanfriendly": {
|
"humanfriendly": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -319,11 +310,11 @@
|
||||||
},
|
},
|
||||||
"importlib-metadata": {
|
"importlib-metadata": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:8c501196e49fb9df5df43833bdb1e4328f64847763ec8a50703148b73784d581",
|
"sha256:899e2a40a8c4a1aec681feef45733de8a6c58f3f6a0dbed2eb6574b4387a77b6",
|
||||||
"sha256:d7eb1dea6d6a6086f8be21784cc9e3bcfa55872b52309bc5fad53a8ea444465d"
|
"sha256:951f0d8a5b7260e9db5e41d429285b5f451e928479f19d80818878527d36e95e"
|
||||||
],
|
],
|
||||||
"index": "pypi",
|
"markers": "python_version < '3.8'",
|
||||||
"version": "==4.0.1"
|
"version": "==4.10.1"
|
||||||
},
|
},
|
||||||
"importlib-resources": {
|
"importlib-resources": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -523,18 +514,18 @@
|
||||||
},
|
},
|
||||||
"minikerberos": {
|
"minikerberos": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:30d0fbaf81a4c7d46710c80497ad905c562bd4d125a22850d87794f61ca1b31f",
|
"sha256:eba89d5c649241a3367839ebd1c0333b9a9e4fe514746e246a6a1f2cb7bde26e",
|
||||||
"sha256:ef64434457cf1c89d8f5d6ae91748775ac8adfa917ddc21d12838d3c43e6e979"
|
"sha256:f556a6015904147c3302e9038b49f766c975df6aeb1725027cd7fc68ba993864"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.6'",
|
"markers": "python_version >= '3.6'",
|
||||||
"version": "==0.2.14"
|
"version": "==0.2.16"
|
||||||
},
|
},
|
||||||
"more-itertools": {
|
"more-itertools": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:43e6dd9942dffd72661a2c4ef383ad7da1e6a3e968a927ad7a6083ab410a688b",
|
"sha256:43e6dd9942dffd72661a2c4ef383ad7da1e6a3e968a927ad7a6083ab410a688b",
|
||||||
"sha256:7dc6ad46f05f545f900dd59e8dfb4e84a4827b97b3cfecb175ea0c7d247f6064"
|
"sha256:7dc6ad46f05f545f900dd59e8dfb4e84a4827b97b3cfecb175ea0c7d247f6064"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.6'",
|
"markers": "python_version >= '3.5'",
|
||||||
"version": "==8.12.0"
|
"version": "==8.12.0"
|
||||||
},
|
},
|
||||||
"msldap": {
|
"msldap": {
|
||||||
|
@ -634,11 +625,11 @@
|
||||||
},
|
},
|
||||||
"prompt-toolkit": {
|
"prompt-toolkit": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:1bb05628c7d87b645974a1bad3f17612be0c29fa39af9f7688030163f680bad6",
|
"sha256:4bcf119be2200c17ed0d518872ef922f1de336eb6d1ddbd1e089ceb6447d97c6",
|
||||||
"sha256:e56f2ff799bacecd3e88165b1e2f5ebf9bcd59e80e06d395fa0cc4b8bd7bb506"
|
"sha256:a51d41a6a45fd9def54365bca8f0402c8f182f2b6f7e29c74d55faeb9fb38ac4"
|
||||||
],
|
],
|
||||||
"markers": "python_full_version >= '3.6.2'",
|
"markers": "python_full_version >= '3.6.2'",
|
||||||
"version": "==3.0.24"
|
"version": "==3.0.26"
|
||||||
},
|
},
|
||||||
"psutil": {
|
"psutil": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -722,89 +713,55 @@
|
||||||
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
||||||
"version": "==2.21"
|
"version": "==2.21"
|
||||||
},
|
},
|
||||||
"pycryptodome": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:008ef2c631f112cd5a58736e0b29f4a28b4bb853e68878689f8b476fd56e0691",
|
|
||||||
"sha256:073dedf0f9c490ae22ca081b86357646ac9b76f3e2bd89119d137fc697a9e3b6",
|
|
||||||
"sha256:0896d5d15ffe584d46cb9b69a75cf14a2bc8f6daf635b7bf16c1b041342a44b1",
|
|
||||||
"sha256:1fb7a6f222072412f320b9e48d3ce981920efbfce37b06d028ec9bd94093b37f",
|
|
||||||
"sha256:4f1b594d0cf35bd12ec4244df1155a7f565bf6e6245976ac36174c1564688c90",
|
|
||||||
"sha256:51ebe9624ad0a0b4da1aaaa2d43aabadf8537737fd494cee0ffa37cd6326de02",
|
|
||||||
"sha256:681ac47c538c64305d710eaed2bb49532f62b3f4c93aa7c423c520df981392e5",
|
|
||||||
"sha256:702446a012fd9337b9327d168bb0c7dc714eb93ad361f6f61af9ca8305a301f1",
|
|
||||||
"sha256:720fafdf3e5c5de93039d8308f765cc60b8e9e7e852ad7135aa65dd89238191f",
|
|
||||||
"sha256:72de8c4d71e6b11d54528bb924447fa4fdabcbb3d76cc0e7f61d3b6075def6b3",
|
|
||||||
"sha256:765b8b16bc1fd699e183dde642c7f2653b8f3c9c1a50051139908e9683f97732",
|
|
||||||
"sha256:7a8b0e526ff239b4f4c61dd6898e2474d609843ffc437267f3a27ddff626e6f6",
|
|
||||||
"sha256:7b3478a187d897f003b2aa1793bcc59463e8d57a42e2aafbcbbe9cd47ec46863",
|
|
||||||
"sha256:857c16bffd938254e3a834cd6b2a755ed24e1a953b1a86e33da136d3e4c16a6f",
|
|
||||||
"sha256:88d6d54e83cf9bbd665ce1e7b9079983ee2d97a05f42e0569ff00a70f1dd8b1e",
|
|
||||||
"sha256:95bacf9ff7d1b90bba537d3f5f6c834efe6bfbb1a0195cb3573f29e6716ef08d",
|
|
||||||
"sha256:9c8e0e6c5e982699801b20fa74f43c19aa080d2b53a39f3c132d35958e153bd4",
|
|
||||||
"sha256:9ea70f6c3f6566159e3798e4593a4a8016994a0080ac29a45200615b45091a1b",
|
|
||||||
"sha256:b3af53dddf848afb38b3ac2bae7159ddad1feb9bac14aa3acec6ef1797b82f8d",
|
|
||||||
"sha256:ca6db61335d07220de0b665bfee7b8e9615b2dfc67a54016db4826dac34c2dd2",
|
|
||||||
"sha256:cb9453c981554984c6f5c5ce7682d7286e65e2173d7416114c3593a977a01bf5",
|
|
||||||
"sha256:d92a5eddffb0ad39f582f07c1de26e9daf6880e3e782a94bb7ebaf939567f8bf",
|
|
||||||
"sha256:deede160bdf87ddb71f0a1314ad5a267b1a960be314ea7dc6b7ad86da6da89a3",
|
|
||||||
"sha256:e3affa03c49cce7b0a9501cc7f608d4f8e61fb2522b276d599ac049b5955576d",
|
|
||||||
"sha256:e420cdfca73f80fe15f79bb34756959945231a052440813e5fce531e6e96331a",
|
|
||||||
"sha256:e468724173df02f9d83f3fea830bf0d04aa291b5add22b4a78e01c97aab04873",
|
|
||||||
"sha256:e5d72be02b17e6bd7919555811264403468d1d052fa67c946e402257c3c29a27",
|
|
||||||
"sha256:eec02d9199af4b1ccfe1f9c587691a07a1fa39d949d2c1dc69d079ab9af8212f",
|
|
||||||
"sha256:f5457e44d3f26d9946091e92b28f3e970a56538b96c87b4b155a84e32a40b7b5",
|
|
||||||
"sha256:f7aad304575d075faf2806977b726b67da7ba294adc97d878f92a062e357a56a"
|
|
||||||
],
|
|
||||||
"index": "pypi",
|
|
||||||
"version": "==3.13.0"
|
|
||||||
},
|
|
||||||
"pycryptodomex": {
|
"pycryptodomex": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:00e37d478c0f040639ab41a9d5280291ad2b3b5f25b9aad5baa1d5ecb578a3f6",
|
"sha256:00eb17ee2b8eb9d84df37d54bc7070ff45903b90535558c2e0ddb5e6957521d3",
|
||||||
"sha256:04a38a7dc484f5e3152a69e4eab89d9340c2ad3b7c4a27d2ee256e5fb878c469",
|
"sha256:05b36726ce5521ce0feb25ea11e866261089edd7fad44df4ced9f7f45a9d4c3b",
|
||||||
"sha256:05e0e3b78b7ccc0b7c5f88596d51fdc8533adb91070b93e18cec12ca3b43deb3",
|
"sha256:110b319189915a66d14df13d233a2dbb54f00df21f3167de1cad340bf4dd88bd",
|
||||||
"sha256:0ec86fca2114e8c58fe6bfc7e04ee91568a813139dcf4334819aa44876764bcf",
|
"sha256:15e6f5b4a81109eb8e9a02c954fe119f6c57836fd55a9891ba703ddfbd690587",
|
||||||
"sha256:182962b3612c0d12748fa770f1ef0556ba8ba2c442834450e08acb31d9e6d2ed",
|
"sha256:1b07a13ed73d00a97af7c3733b807007d2249cd236a33955a7dec1939c232b28",
|
||||||
"sha256:2f2bcee2ef59597bfcb755eef2c98294094c1c9b64e9b9195cc9e71be83adb92",
|
"sha256:2040a22a30780da743835c7c71307558688065d6c22e18ac3e44082dc3323d8f",
|
||||||
"sha256:2f7db8d85294c1123e700097af407425fd4c9e6c58b688f391de7053c6a60317",
|
"sha256:264a701bb6e8aedf4b71bcb9eb83b93020041e96112ccfe873a16964d41ade74",
|
||||||
"sha256:3b7656189c259bb2b838559f0a11b533d4d18409ab6d9119c00bae436c3d3e34",
|
"sha256:2d8bda8f949b79b78b293706aa7fc1e5c171c62661252bfdd5d12c70acd03282",
|
||||||
"sha256:5a2014598ceb19c34f14815a26536e5cc24167ea4d402f0aec2a52b18960c668",
|
"sha256:2e2da1eabb426cbeb4922c981bb843f36427f8365ef7e46bc581a55d7ea67643",
|
||||||
"sha256:63443230247837dd03c5d4028cae5cb2e6793a9ae110e321798bee48a04ff3e9",
|
"sha256:3ad75e24a0e25396901273a9a2aaba0286fa74703e5b61731942f6914a1e1cbe",
|
||||||
"sha256:68fb861b41a889c2efdf2795b0d46aa05d4748543bc4e0bca5886c929c7cbdef",
|
"sha256:3c06abf17c68cf87c4e81e1745f0afbe4427413684a122a9d044a8a1d3c6d959",
|
||||||
"sha256:6b3c06e6d235f475395a7e150f2e562a3e9d749fb40c6d81240596f73809346c",
|
"sha256:3c195eecd43e48d0a06267df6945958f5f566eef160a5b01c519434cfa6d368a",
|
||||||
"sha256:6d50723984ba802904618ef5bfe257a0f9644e76821d323f79f27be5adb9ece7",
|
"sha256:3c9ee5e77dd9cb19fe09765b6c02e3784cdbd2e5ecfbc67c8e9628073f79b981",
|
||||||
"sha256:7fb188c9a0f69d4f7b607780641ef7aec7f02a8dad689512b17bdf04c96ce6e3",
|
"sha256:484ad0f50fd49bec4d2b8c0e5a3ad70e278ed3390bfd5c4515dc896f31b45d6c",
|
||||||
"sha256:7fb9d1ab6a10cfc8c8c7e11f004e01c8a1beff5fd4118370d95110735cc23117",
|
"sha256:4b046c3d50fe4bb57386567ff47a588b1bbe1ddf3d9e2b23aede09fa97511f5f",
|
||||||
"sha256:80eedc23c4c4d3655c6a7d315a01f0e9d460c7070c5c3af4952937b4f2c0da6f",
|
"sha256:50684f16b12f1dcca8018d2711fb87044c74038ce9322d36f6ee9d09fcda7e6f",
|
||||||
"sha256:9fa76261100b450e5aca2990ba982e5294ba383f653da041a71b4ac1cbaed1ff",
|
"sha256:6940b6730bab7128c993b562abf018560aa5b861da92854cf050b5f96d4713df",
|
||||||
"sha256:b11331510cfd08ec4416f37dc8f072541d7b7240ba924c71288f7218aad36bdf",
|
"sha256:76fe9ad943480507952cd7c96c20f6c8af78145f944cb66bbba63f2872d9988e",
|
||||||
"sha256:b4240991748ae0f57a0120b8d905b2d9f835fee02968fc11faec929ef6915ee6",
|
"sha256:7bcc5d3904abe5cfac5acc67679e330b0402473e839f94b59e13efdc2c2945d5",
|
||||||
"sha256:b7b059517d84c57f25c6fd3b2e03a1b2945df2e585b96109bcd11e56f6c9e610",
|
"sha256:8310782ac84fa1df93703081af6791549451a380ad88670c2484f75e26c6485f",
|
||||||
"sha256:b975ce778ea2c65f399ab889a661e118bb68b85db47d93e0442eb1ba1f554794",
|
"sha256:88eb239d6af71ba2098a4cfea516add37881d55b76b38d9e297f77a65bb9a8cf",
|
||||||
"sha256:c87f62de9e167031ad4179efb1fda4012bb6f7363472a61254e4426bda6bcb64",
|
"sha256:9afea78c31f3714b06673d2c5b8874f31c19c03258645733546a320da2e6df23",
|
||||||
"sha256:ccd301d2e71d243b0fad8c4642116c538d7d405d35b6026cf4dcee463a667a2e",
|
"sha256:a11884621c2a5fe241ccf2adf34e4fdde162e91fbc3207f0a0db122ad2b7a061",
|
||||||
"sha256:dce2bfd0f285c3fcff89e4239c55f5fbe664ff435ee45abfc154aac0f222ab14",
|
"sha256:b0277a201196b7825b21a405e0a70167f277b8d5666031e65c9af7a715cb0833",
|
||||||
"sha256:dfb8bcd45e504e1c26f0bfc404f3edd08f8c8057dfe04fbf6159adc8694ff97a",
|
"sha256:b5ff95687c4008f76091849e5333692e6a54a93399cd8fda7e1ba523734136f4",
|
||||||
"sha256:e1900d7f16a03b869be3572e7664757c14316329a4d79ecee5a0083fad8c81b0",
|
"sha256:c565b89fb91ecb60273b2dcedb5149b48a1ec4227cef8c63fd77ec0f33eaf75a",
|
||||||
"sha256:e2ddfbcb2c4c7cb8f79db49e284280be468699c701b92d30fd1e46a786b39f5b",
|
"sha256:d689b368ca8b3ec1e60cc609eae14d4e352d10fe807ca9906f77f0712ab05a37",
|
||||||
"sha256:eb4eea028a7ad28458abf8b98ae14af2fd9baeb327a0adb6af05a488e4d9e9a1",
|
"sha256:f3bb1e722ad57de1999c8db54b58507b47771de4a294115c00f785f1d5913ec1",
|
||||||
"sha256:f3a29bb51e5f9b46004b5be16bcbe4e1b2d2754cbe201e1a0b142c307bdf4c73",
|
"sha256:fbff384c2080106b3f5f7cfa96728f02e627be7f7cd1657d9cf63300a16d0864",
|
||||||
"sha256:f553abcb3572242fed87e308a6b91a9bc5a74b801b5d093969391b0500be718b"
|
"sha256:fd2657134b633523db551b96b095387083a459d77e93b9cc888c9f13edb7a6f6"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
|
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
|
||||||
"version": "==3.13.0"
|
"version": "==3.14.0"
|
||||||
},
|
},
|
||||||
"pyinstaller": {
|
"pyinstaller": {
|
||||||
"git": "git://github.com/guardicore/pyinstaller",
|
"hashes": [
|
||||||
"ref": "913259a5cd2baece06b0eed3618eb75b1bc7fad6"
|
"sha256:f5c0eeb2aa663cce9a5404292c0195011fa500a6501c873a466b2e8cad3c950c"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==4.2"
|
||||||
},
|
},
|
||||||
"pyinstaller-hooks-contrib": {
|
"pyinstaller-hooks-contrib": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:27558072021857d89524c42136feaa2ffe4f003f1bdf0278f9b24f6902c1759c",
|
"sha256:29f0bd8fbb2ff6f2df60a0c147e5b5ad65ae5c1a982d90641a5f712de03fa161",
|
||||||
"sha256:892310e6363655838485ee748bf1c5e5cade7963686d9af8650ee218a3e0b031"
|
"sha256:61b667f51b2525377fae30793f38fd9752a08032c72b209effabf707c840cc38"
|
||||||
],
|
],
|
||||||
"index": "pypi",
|
"version": "==2022.0"
|
||||||
"version": "==2021.1"
|
|
||||||
},
|
},
|
||||||
"pymssql": {
|
"pymssql": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -875,11 +832,11 @@
|
||||||
},
|
},
|
||||||
"pypsrp": {
|
"pypsrp": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:c0912096858ff8c53a3cf22cc46c3ce20e6ec5e2deade342088e87a81dbadac8",
|
"sha256:50d0dce9bf2cb852e3395029e40501ca1f5466ccc5c683c960ce527117676c20",
|
||||||
"sha256:d7144ad7c798a4dcded20a71c712d63eb4bfb32debe62f3a98f01481384a5558"
|
"sha256:84e8ee098c87858b0a8ba84deec674ebf3f286d3159cf3da9d6a4bfdd06bf3af"
|
||||||
],
|
],
|
||||||
"index": "pypi",
|
"index": "pypi",
|
||||||
"version": "==0.7.0"
|
"version": "==0.8.0"
|
||||||
},
|
},
|
||||||
"pypykatz": {
|
"pypykatz": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -889,15 +846,6 @@
|
||||||
"index": "pypi",
|
"index": "pypi",
|
||||||
"version": "==0.3.12"
|
"version": "==0.3.12"
|
||||||
},
|
},
|
||||||
"pyreadline": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:4530592fc2e85b25b1a9f79664433da09237c1a270e4d78ea5aa3a2c7229e2d1",
|
|
||||||
"sha256:65540c21bfe14405a3a77e4c085ecfce88724743a4ead47c66b84defcf82c32e",
|
|
||||||
"sha256:9ce5fa65b8992dfa373bddc5b6e0864ead8f291c94fbfec05fbd5c836162e67b"
|
|
||||||
],
|
|
||||||
"markers": "python_version < '3.8' and sys_platform == 'win32'",
|
|
||||||
"version": "==2.1"
|
|
||||||
},
|
|
||||||
"pysmb": {
|
"pysmb": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:298605b8f467ce15b412caaf9af331c135e88fa2172333af14b1b2916361cb6b"
|
"sha256:298605b8f467ce15b412caaf9af331c135e88fa2172333af14b1b2916361cb6b"
|
||||||
|
@ -938,24 +886,6 @@
|
||||||
],
|
],
|
||||||
"version": "==2021.3"
|
"version": "==2021.3"
|
||||||
},
|
},
|
||||||
"pywin32": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:2a09632916b6bb231ba49983fe989f2f625cea237219530e81a69239cd0c4559",
|
|
||||||
"sha256:51cb52c5ec6709f96c3f26e7795b0bf169ee0d8395b2c1d7eb2c029a5008ed51",
|
|
||||||
"sha256:5f9ec054f5a46a0f4dfd72af2ce1372f3d5a6e4052af20b858aa7df2df7d355b",
|
|
||||||
"sha256:6fed4af057039f309263fd3285d7b8042d41507343cd5fa781d98fcc5b90e8bb",
|
|
||||||
"sha256:793bf74fce164bcffd9d57bb13c2c15d56e43c9542a7b9687b4fccf8f8a41aba",
|
|
||||||
"sha256:79cbb862c11b9af19bcb682891c1b91942ec2ff7de8151e2aea2e175899cda34",
|
|
||||||
"sha256:7d3271c98434617a11921c5ccf74615794d97b079e22ed7773790822735cc352",
|
|
||||||
"sha256:aad484d52ec58008ca36bd4ad14a71d7dd0a99db1a4ca71072213f63bf49c7d9",
|
|
||||||
"sha256:b1675d82bcf6dbc96363fca747bac8bff6f6e4a447a4287ac652aa4b9adc796e",
|
|
||||||
"sha256:c268040769b48a13367221fced6d4232ed52f044ffafeda247bd9d2c6bdc29ca",
|
|
||||||
"sha256:d9b5d87ca944eb3aa4cd45516203ead4b37ab06b8b777c54aedc35975dec0dee",
|
|
||||||
"sha256:fcf44032f5b14fcda86028cdf49b6ebdaea091230eb0a757282aa656e4732439"
|
|
||||||
],
|
|
||||||
"markers": "python_version < '3.10' and sys_platform == 'win32' and implementation_name == 'cpython'",
|
|
||||||
"version": "==303"
|
|
||||||
},
|
|
||||||
"requests": {
|
"requests": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61",
|
"sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61",
|
||||||
|
@ -966,11 +896,11 @@
|
||||||
},
|
},
|
||||||
"s3transfer": {
|
"s3transfer": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:50ed823e1dc5868ad40c8dc92072f757aa0e653a192845c94a3b676f4a62da4c",
|
"sha256:25c140f5c66aa79e1ac60be50dcd45ddc59e83895f062a3aab263b870102911f",
|
||||||
"sha256:9c1dc369814391a6bda20ebbf4b70a0f34630592c9aa520856bf384916af2803"
|
"sha256:69d264d3e760e569b78aaa0f22c97e955891cd22e32b10c51f784eeda4d9d10a"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.6'",
|
"markers": "python_version >= '3.6'",
|
||||||
"version": "==0.5.0"
|
"version": "==0.5.1"
|
||||||
},
|
},
|
||||||
"scoutsuite": {
|
"scoutsuite": {
|
||||||
"git": "git://github.com/guardicode/ScoutSuite",
|
"git": "git://github.com/guardicode/ScoutSuite",
|
||||||
|
@ -983,6 +913,14 @@
|
||||||
],
|
],
|
||||||
"version": "==21.1.0"
|
"version": "==21.1.0"
|
||||||
},
|
},
|
||||||
|
"setuptools": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:c99207037c38984eae838c2fd986f39a9ddf4fabfe0fddd957e622d1d1dcdd05",
|
||||||
|
"sha256:eb83b1012ae6bf436901c2a2cee35d45b7260f31fd4b65fd1e50a9f99c11d7f8"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"version": "==60.6.0"
|
||||||
|
},
|
||||||
"six": {
|
"six": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
|
"sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
|
||||||
|
@ -999,11 +937,11 @@
|
||||||
},
|
},
|
||||||
"tempora": {
|
"tempora": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:8d743059a4ea496d925f35480c6d206a7160cacebcd6a31e147fb495dcb732af",
|
"sha256:cba0f197a64883bf3e73657efbc0324d5bf17179e7769b1385b4d75d26cd9127",
|
||||||
"sha256:aa21dd1956e29559ecb2f2f2e14fcdb950085222fbbf86e6c946b5e1a8c36b26"
|
"sha256:fbca6a229af666ea4ea8b2f9f80ac9a074f7cf53a97987855b1d15b6e93fd63b"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.7'",
|
"markers": "python_version >= '3.7'",
|
||||||
"version": "==5.0.0"
|
"version": "==5.0.1"
|
||||||
},
|
},
|
||||||
"tqdm": {
|
"tqdm": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
@ -1024,24 +962,6 @@
|
||||||
"markers": "python_full_version >= '3.6.7'",
|
"markers": "python_full_version >= '3.6.7'",
|
||||||
"version": "==21.7.0"
|
"version": "==21.7.0"
|
||||||
},
|
},
|
||||||
"twisted-iocpsupport": {
|
|
||||||
"hashes": [
|
|
||||||
"sha256:306becd6e22ab6e8e4f36b6bdafd9c92e867c98a5ce517b27fdd27760ee7ae41",
|
|
||||||
"sha256:3c61742cb0bc6c1ac117a7e5f422c129832f0c295af49e01d8a6066df8cfc04d",
|
|
||||||
"sha256:72068b206ee809c9c596b57b5287259ea41ddb4774d86725b19f35bf56aa32a9",
|
|
||||||
"sha256:7d972cfa8439bdcb35a7be78b7ef86d73b34b808c74be56dfa785c8a93b851bf",
|
|
||||||
"sha256:81b3abe3527b367da0220482820cb12a16c661672b7bcfcde328902890d63323",
|
|
||||||
"sha256:851b3735ca7e8102e661872390e3bce88f8901bece95c25a0c8bb9ecb8a23d32",
|
|
||||||
"sha256:985c06a33f5c0dae92c71a036d1ea63872ee86a21dd9b01e1f287486f15524b4",
|
|
||||||
"sha256:9dbb8823b49f06d4de52721b47de4d3b3026064ef4788ce62b1a21c57c3fff6f",
|
|
||||||
"sha256:b435857b9efcbfc12f8c326ef0383f26416272260455bbca2cd8d8eca470c546",
|
|
||||||
"sha256:b76b4eed9b27fd63ddb0877efdd2d15835fdcb6baa745cb85b66e5d016ac2878",
|
|
||||||
"sha256:b9fed67cf0f951573f06d560ac2f10f2a4bbdc6697770113a2fc396ea2cb2565",
|
|
||||||
"sha256:bf4133139d77fc706d8f572e6b7d82871d82ec7ef25d685c2351bdacfb701415"
|
|
||||||
],
|
|
||||||
"markers": "platform_system == 'Windows'",
|
|
||||||
"version": "==1.0.2"
|
|
||||||
},
|
|
||||||
"typing-extensions": {
|
"typing-extensions": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:4ca091dea149f945ec56afb48dae714f21e8692ef22a395223bcd328961b6a0e",
|
"sha256:4ca091dea149f945ec56afb48dae714f21e8692ef22a395223bcd328961b6a0e",
|
||||||
|
@ -1086,7 +1006,7 @@
|
||||||
"sha256:a2ad9c0f6d70f6e0e0d1f54b8582054c62d8a09f346b5ccaf55da68628ca10e1",
|
"sha256:a2ad9c0f6d70f6e0e0d1f54b8582054c62d8a09f346b5ccaf55da68628ca10e1",
|
||||||
"sha256:a64624a25fc2d3663a2c5376c5291f3c7531e9c8051571de9ca9db8bf25746c2"
|
"sha256:a64624a25fc2d3663a2c5376c5291f3c7531e9c8051571de9ca9db8bf25746c2"
|
||||||
],
|
],
|
||||||
"markers": "platform_system == 'Windows'",
|
"markers": "python_version >= '3.6'",
|
||||||
"version": "==0.0.9"
|
"version": "==0.0.9"
|
||||||
},
|
},
|
||||||
"winsys-3.x": {
|
"winsys-3.x": {
|
||||||
|
@ -1101,7 +1021,6 @@
|
||||||
"sha256:1d6b085e5c445141c475476000b661f60fff1aaa19f76bf82b7abb92e0ff4942",
|
"sha256:1d6b085e5c445141c475476000b661f60fff1aaa19f76bf82b7abb92e0ff4942",
|
||||||
"sha256:b6a6be5711b1b6c8d55bda7a8befd75c48c12b770b9d227d31c1737dbf0d40a6"
|
"sha256:b6a6be5711b1b6c8d55bda7a8befd75c48c12b770b9d227d31c1737dbf0d40a6"
|
||||||
],
|
],
|
||||||
"index": "pypi",
|
|
||||||
"markers": "sys_platform == 'win32'",
|
"markers": "sys_platform == 'win32'",
|
||||||
"version": "==1.5.1"
|
"version": "==1.5.1"
|
||||||
},
|
},
|
||||||
|
@ -1117,7 +1036,7 @@
|
||||||
"sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d",
|
"sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d",
|
||||||
"sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"
|
"sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375"
|
||||||
],
|
],
|
||||||
"markers": "python_version < '3.10'",
|
"markers": "python_version >= '3.7'",
|
||||||
"version": "==3.7.0"
|
"version": "==3.7.0"
|
||||||
},
|
},
|
||||||
"zope.interface": {
|
"zope.interface": {
|
||||||
|
|
|
@ -74,6 +74,7 @@ def get_hidden_imports():
|
||||||
imports = ['_cffi_backend', '_mssql']
|
imports = ['_cffi_backend', '_mssql']
|
||||||
if is_windows():
|
if is_windows():
|
||||||
imports.append('queue')
|
imports.append('queue')
|
||||||
|
imports.append('pkg_resources.py2_warn')
|
||||||
return imports
|
return imports
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -7,11 +7,7 @@ import urllib
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
from urllib.parse import urlsplit
|
from urllib.parse import urlsplit
|
||||||
|
|
||||||
import requests
|
|
||||||
|
|
||||||
import infection_monkey.control
|
|
||||||
import infection_monkey.monkeyfs as monkeyfs
|
import infection_monkey.monkeyfs as monkeyfs
|
||||||
from common.common_consts.timeouts import SHORT_REQUEST_TIMEOUT
|
|
||||||
from infection_monkey.network.tools import get_interface_to_target
|
from infection_monkey.network.tools import get_interface_to_target
|
||||||
from infection_monkey.transport.base import TransportProxyBase, update_last_serve_time
|
from infection_monkey.transport.base import TransportProxyBase, update_last_serve_time
|
||||||
|
|
||||||
|
@ -114,32 +110,6 @@ class FileServHTTPRequestHandler(http.server.BaseHTTPRequestHandler):
|
||||||
class HTTPConnectProxyHandler(http.server.BaseHTTPRequestHandler):
|
class HTTPConnectProxyHandler(http.server.BaseHTTPRequestHandler):
|
||||||
timeout = 30 # timeout with clients, set to None not to make persistent connection
|
timeout = 30 # timeout with clients, set to None not to make persistent connection
|
||||||
|
|
||||||
def do_POST(self):
|
|
||||||
try:
|
|
||||||
content_length = int(self.headers["Content-Length"])
|
|
||||||
post_data = self.rfile.read(content_length).decode()
|
|
||||||
logger.info("Received bootloader's request: {}".format(post_data))
|
|
||||||
try:
|
|
||||||
dest_path = self.path
|
|
||||||
r = requests.post( # noqa: DUO123
|
|
||||||
url=dest_path,
|
|
||||||
data=post_data,
|
|
||||||
verify=False,
|
|
||||||
proxies=infection_monkey.control.ControlClient.proxies,
|
|
||||||
timeout=SHORT_REQUEST_TIMEOUT,
|
|
||||||
)
|
|
||||||
self.send_response(r.status_code)
|
|
||||||
except requests.exceptions.ConnectionError as e:
|
|
||||||
logger.error("Couldn't forward request to the island: {}".format(e))
|
|
||||||
self.send_response(404)
|
|
||||||
except Exception as e:
|
|
||||||
logger.error("Failed to forward bootloader request: {}".format(e))
|
|
||||||
finally:
|
|
||||||
self.end_headers()
|
|
||||||
self.wfile.write(r.content)
|
|
||||||
except Exception as e:
|
|
||||||
logger.error("Failed receiving bootloader telemetry: {}".format(e))
|
|
||||||
|
|
||||||
def version_string(self):
|
def version_string(self):
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,6 @@ from monkey_island.cc.resources.blackbox.monkey_blackbox_endpoint import MonkeyB
|
||||||
from monkey_island.cc.resources.blackbox.telemetry_blackbox_endpoint import (
|
from monkey_island.cc.resources.blackbox.telemetry_blackbox_endpoint import (
|
||||||
TelemetryBlackboxEndpoint,
|
TelemetryBlackboxEndpoint,
|
||||||
)
|
)
|
||||||
from monkey_island.cc.resources.bootloader import Bootloader
|
|
||||||
from monkey_island.cc.resources.client_run import ClientRun
|
from monkey_island.cc.resources.client_run import ClientRun
|
||||||
from monkey_island.cc.resources.configuration_export import ConfigurationExport
|
from monkey_island.cc.resources.configuration_export import ConfigurationExport
|
||||||
from monkey_island.cc.resources.configuration_import import ConfigurationImport
|
from monkey_island.cc.resources.configuration_import import ConfigurationImport
|
||||||
|
@ -127,7 +126,6 @@ def init_api_resources(api):
|
||||||
"/api/monkey/<string:guid>",
|
"/api/monkey/<string:guid>",
|
||||||
"/api/monkey/<string:guid>/<string:config_format>",
|
"/api/monkey/<string:guid>/<string:config_format>",
|
||||||
)
|
)
|
||||||
api.add_resource(Bootloader, "/api/bootloader/<string:os>")
|
|
||||||
api.add_resource(LocalRun, "/api/local-monkey")
|
api.add_resource(LocalRun, "/api/local-monkey")
|
||||||
api.add_resource(ClientRun, "/api/client-monkey")
|
api.add_resource(ClientRun, "/api/client-monkey")
|
||||||
api.add_resource(Telemetry, "/api/telemetry", "/api/telemetry/<string:monkey_guid>")
|
api.add_resource(Telemetry, "/api/telemetry", "/api/telemetry/<string:monkey_guid>")
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
from mongoengine import EmbeddedDocument, BooleanField
|
from mongoengine import BooleanField, EmbeddedDocument
|
||||||
|
|
||||||
|
|
||||||
class Config(EmbeddedDocument):
|
class Config(EmbeddedDocument):
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
import json
|
|
||||||
from typing import Dict
|
|
||||||
|
|
||||||
import flask_restful
|
|
||||||
from flask import make_response, request
|
|
||||||
|
|
||||||
from monkey_island.cc.services.bootloader import BootloaderService
|
|
||||||
|
|
||||||
|
|
||||||
class Bootloader(flask_restful.Resource):
|
|
||||||
|
|
||||||
# Used by monkey. can't secure.
|
|
||||||
def post(self, os):
|
|
||||||
if os == "linux":
|
|
||||||
data = Bootloader._get_request_contents_linux(request.data)
|
|
||||||
elif os == "windows":
|
|
||||||
data = Bootloader._get_request_contents_windows(request.data)
|
|
||||||
else:
|
|
||||||
return make_response({"status": "OS_NOT_FOUND"}, 404)
|
|
||||||
|
|
||||||
result = BootloaderService.parse_bootloader_telem(data)
|
|
||||||
|
|
||||||
if result:
|
|
||||||
return make_response({"status": "RUN"}, 200)
|
|
||||||
else:
|
|
||||||
return make_response({"status": "ABORT"}, 200)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _get_request_contents_linux(request_data: bytes) -> Dict[str, str]:
|
|
||||||
parsed_data = json.loads(
|
|
||||||
request_data.decode()
|
|
||||||
.replace('"\n', "")
|
|
||||||
.replace("\n", "")
|
|
||||||
.replace('NAME="', "")
|
|
||||||
.replace('":",', '":"",')
|
|
||||||
)
|
|
||||||
return parsed_data
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _get_request_contents_windows(request_data: bytes) -> Dict[str, str]:
|
|
||||||
return json.loads(request_data.decode("utf-16", "ignore"))
|
|
|
@ -3,7 +3,6 @@ import json
|
||||||
import logging
|
import logging
|
||||||
import sys
|
import sys
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from threading import Thread
|
|
||||||
|
|
||||||
import gevent.hub
|
import gevent.hub
|
||||||
from gevent.pywsgi import WSGIServer
|
from gevent.pywsgi import WSGIServer
|
||||||
|
@ -22,7 +21,6 @@ from monkey_island.cc.app import init_app # noqa: E402
|
||||||
from monkey_island.cc.arg_parser import IslandCmdArgs # noqa: E402
|
from monkey_island.cc.arg_parser import IslandCmdArgs # noqa: E402
|
||||||
from monkey_island.cc.arg_parser import parse_cli_args # noqa: E402
|
from monkey_island.cc.arg_parser import parse_cli_args # noqa: E402
|
||||||
from monkey_island.cc.resources.monkey_download import MonkeyDownload # noqa: E402
|
from monkey_island.cc.resources.monkey_download import MonkeyDownload # noqa: E402
|
||||||
from monkey_island.cc.server_utils.bootloader_server import BootloaderHttpServer # noqa: E402
|
|
||||||
from monkey_island.cc.server_utils.consts import ( # noqa: E402
|
from monkey_island.cc.server_utils.consts import ( # noqa: E402
|
||||||
GEVENT_EXCEPTION_LOG,
|
GEVENT_EXCEPTION_LOG,
|
||||||
MONGO_CONNECTION_TIMEOUT,
|
MONGO_CONNECTION_TIMEOUT,
|
||||||
|
@ -137,8 +135,6 @@ def _start_island_server(should_setup_only, config_options: IslandConfigOptions)
|
||||||
logger.warning("Setup only flag passed. Exiting.")
|
logger.warning("Setup only flag passed. Exiting.")
|
||||||
return
|
return
|
||||||
|
|
||||||
bootloader_server_thread = _start_bootloader_server()
|
|
||||||
|
|
||||||
logger.info(
|
logger.info(
|
||||||
f"Using certificate path: {config_options.crt_path}, and key path: "
|
f"Using certificate path: {config_options.crt_path}, and key path: "
|
||||||
f"{config_options.key_path}."
|
f"{config_options.key_path}."
|
||||||
|
@ -155,16 +151,6 @@ def _start_island_server(should_setup_only, config_options: IslandConfigOptions)
|
||||||
_log_init_info()
|
_log_init_info()
|
||||||
http_server.serve_forever()
|
http_server.serve_forever()
|
||||||
|
|
||||||
bootloader_server_thread.join()
|
|
||||||
|
|
||||||
|
|
||||||
def _start_bootloader_server() -> Thread:
|
|
||||||
bootloader_server_thread = Thread(target=BootloaderHttpServer().serve_forever, daemon=True)
|
|
||||||
|
|
||||||
bootloader_server_thread.start()
|
|
||||||
|
|
||||||
return bootloader_server_thread
|
|
||||||
|
|
||||||
|
|
||||||
def _log_init_info():
|
def _log_init_info():
|
||||||
MonkeyDownload.log_executable_hashes()
|
MonkeyDownload.log_executable_hashes()
|
||||||
|
|
|
@ -1,52 +0,0 @@
|
||||||
import logging
|
|
||||||
from http.server import BaseHTTPRequestHandler, HTTPServer
|
|
||||||
from socketserver import ThreadingMixIn
|
|
||||||
from urllib import parse
|
|
||||||
|
|
||||||
import requests
|
|
||||||
import urllib3
|
|
||||||
|
|
||||||
from common.common_consts.timeouts import SHORT_REQUEST_TIMEOUT
|
|
||||||
from monkey_island.cc.server_utils.consts import ISLAND_PORT
|
|
||||||
|
|
||||||
# Disable "unverified certificate" warnings when sending requests to island
|
|
||||||
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # noqa: DUO131
|
|
||||||
logger = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class BootloaderHttpServer(ThreadingMixIn, HTTPServer):
|
|
||||||
def __init__(self):
|
|
||||||
server_address = ("", 5001)
|
|
||||||
super().__init__(server_address, BootloaderHTTPRequestHandler)
|
|
||||||
|
|
||||||
|
|
||||||
class BootloaderHTTPRequestHandler(BaseHTTPRequestHandler):
|
|
||||||
def do_POST(self):
|
|
||||||
content_length = int(self.headers["Content-Length"])
|
|
||||||
post_data = self.rfile.read(content_length).decode()
|
|
||||||
island_server_path = BootloaderHTTPRequestHandler.get_bootloader_resource_url(
|
|
||||||
self.request.getsockname()[0]
|
|
||||||
)
|
|
||||||
island_server_path = parse.urljoin(island_server_path, self.path[1:])
|
|
||||||
# The island server doesn't always have a correct SSL cert installed
|
|
||||||
# (By default it comes with a self signed one),
|
|
||||||
# that's why we're not verifying the cert in this request.
|
|
||||||
r = requests.post( # noqa: DUO123
|
|
||||||
url=island_server_path, data=post_data, verify=False, timeout=SHORT_REQUEST_TIMEOUT
|
|
||||||
)
|
|
||||||
|
|
||||||
try:
|
|
||||||
if r.status_code != 200:
|
|
||||||
self.send_response(404)
|
|
||||||
else:
|
|
||||||
self.send_response(200)
|
|
||||||
self.end_headers()
|
|
||||||
self.wfile.write(r.content)
|
|
||||||
except Exception as e:
|
|
||||||
logger.error("Failed to respond to bootloader: {}".format(e))
|
|
||||||
finally:
|
|
||||||
self.connection.close()
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_bootloader_resource_url(server_ip):
|
|
||||||
return "https://" + server_ip + ":" + str(ISLAND_PORT) + "/api/bootloader/"
|
|
|
@ -1,71 +0,0 @@
|
||||||
from typing import Dict, List
|
|
||||||
|
|
||||||
from bson import ObjectId
|
|
||||||
|
|
||||||
from monkey_island.cc.database import mongo
|
|
||||||
from monkey_island.cc.services.node import NodeCreationException, NodeService
|
|
||||||
from monkey_island.cc.services.utils.bootloader_config import (
|
|
||||||
MIN_GLIBC_VERSION,
|
|
||||||
SUPPORTED_WINDOWS_VERSIONS,
|
|
||||||
)
|
|
||||||
from monkey_island.cc.services.utils.node_states import NodeStates
|
|
||||||
|
|
||||||
|
|
||||||
class BootloaderService:
|
|
||||||
@staticmethod
|
|
||||||
def parse_bootloader_telem(telem: Dict) -> bool:
|
|
||||||
telem["ips"] = BootloaderService.remove_local_ips(telem["ips"])
|
|
||||||
if telem["os_version"] == "":
|
|
||||||
telem["os_version"] = "Unknown OS"
|
|
||||||
|
|
||||||
telem_id = BootloaderService.get_mongo_id_for_bootloader_telem(telem)
|
|
||||||
mongo.db.bootloader_telems.update({"_id": telem_id}, {"$setOnInsert": telem}, upsert=True)
|
|
||||||
|
|
||||||
will_monkey_run = BootloaderService.is_os_compatible(telem)
|
|
||||||
try:
|
|
||||||
node = NodeService.get_or_create_node_from_bootloader_telem(telem, will_monkey_run)
|
|
||||||
except NodeCreationException:
|
|
||||||
# Didn't find the node, but allow monkey to run anyways
|
|
||||||
return True
|
|
||||||
|
|
||||||
node_group = BootloaderService.get_next_node_state(node, telem["system"], will_monkey_run)
|
|
||||||
if "group" not in node or node["group"] != node_group.value:
|
|
||||||
NodeService.set_node_group(node["_id"], node_group)
|
|
||||||
return will_monkey_run
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_next_node_state(node: Dict, system: str, will_monkey_run: bool) -> NodeStates:
|
|
||||||
group_keywords = [system, "monkey"]
|
|
||||||
if "group" in node and node["group"] == "island":
|
|
||||||
group_keywords.extend(["island", "starting"])
|
|
||||||
else:
|
|
||||||
group_keywords.append("starting") if will_monkey_run else group_keywords.append("old")
|
|
||||||
node_group = NodeStates.get_by_keywords(group_keywords)
|
|
||||||
return node_group
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_mongo_id_for_bootloader_telem(bootloader_telem) -> ObjectId:
|
|
||||||
ip_hash = hex(hash(str(bootloader_telem["ips"])))[3:15]
|
|
||||||
hostname_hash = hex(hash(bootloader_telem["hostname"]))[3:15]
|
|
||||||
return ObjectId(ip_hash + hostname_hash)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def is_os_compatible(bootloader_data) -> bool:
|
|
||||||
if bootloader_data["system"] == "windows":
|
|
||||||
return BootloaderService.is_windows_version_supported(bootloader_data["os_version"])
|
|
||||||
elif bootloader_data["system"] == "linux":
|
|
||||||
return BootloaderService.is_glibc_supported(bootloader_data["glibc_version"])
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def is_windows_version_supported(windows_version) -> bool:
|
|
||||||
return SUPPORTED_WINDOWS_VERSIONS.get(windows_version, True)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def is_glibc_supported(glibc_version_string) -> bool:
|
|
||||||
glibc_version_string = glibc_version_string.lower()
|
|
||||||
glibc_version = glibc_version_string.split(" ")[-1]
|
|
||||||
return glibc_version >= str(MIN_GLIBC_VERSION) and "eglibc" not in glibc_version_string
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def remove_local_ips(ip_list) -> List[str]:
|
|
||||||
return [i for i in ip_list if not i.startswith("127")]
|
|
|
@ -1,6 +1,5 @@
|
||||||
import socket
|
import socket
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from typing import Dict
|
|
||||||
|
|
||||||
from bson import ObjectId
|
from bson import ObjectId
|
||||||
|
|
||||||
|
@ -10,7 +9,7 @@ from monkey_island.cc.database import mongo
|
||||||
from monkey_island.cc.models import Monkey
|
from monkey_island.cc.models import Monkey
|
||||||
from monkey_island.cc.services.edge.displayed_edge import DisplayedEdgeService
|
from monkey_island.cc.services.edge.displayed_edge import DisplayedEdgeService
|
||||||
from monkey_island.cc.services.edge.edge import EdgeService
|
from monkey_island.cc.services.edge.edge import EdgeService
|
||||||
from monkey_island.cc.services.utils.network_utils import is_local_ips, local_ip_addresses
|
from monkey_island.cc.services.utils.network_utils import local_ip_addresses
|
||||||
from monkey_island.cc.services.utils.node_states import NodeStates
|
from monkey_island.cc.services.utils.node_states import NodeStates
|
||||||
|
|
||||||
|
|
||||||
|
@ -209,59 +208,6 @@ class NodeService:
|
||||||
)
|
)
|
||||||
return mongo.db.node.find_one({"_id": new_node_insert_result.inserted_id})
|
return mongo.db.node.find_one({"_id": new_node_insert_result.inserted_id})
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def create_node_from_bootloader_telem(bootloader_telem: Dict, will_monkey_run: bool):
|
|
||||||
new_node_insert_result = mongo.db.node.insert_one(
|
|
||||||
{
|
|
||||||
"ip_addresses": bootloader_telem["ips"],
|
|
||||||
"domain_name": bootloader_telem["hostname"],
|
|
||||||
"will_monkey_run": will_monkey_run,
|
|
||||||
"exploited": False,
|
|
||||||
"creds": [],
|
|
||||||
"os": {
|
|
||||||
"type": bootloader_telem["system"],
|
|
||||||
"version": bootloader_telem["os_version"],
|
|
||||||
},
|
|
||||||
}
|
|
||||||
)
|
|
||||||
return mongo.db.node.find_one({"_id": new_node_insert_result.inserted_id})
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_or_create_node_from_bootloader_telem(
|
|
||||||
bootloader_telem: Dict, will_monkey_run: bool
|
|
||||||
) -> Dict:
|
|
||||||
if is_local_ips(bootloader_telem["ips"]):
|
|
||||||
raise NodeCreationException("Bootloader ran on island, no need to create new node.")
|
|
||||||
|
|
||||||
new_node = mongo.db.node.find_one({"ip_addresses": {"$in": bootloader_telem["ips"]}})
|
|
||||||
# Temporary workaround to not create a node after monkey finishes
|
|
||||||
monkey_node = mongo.db.monkey.find_one({"ip_addresses": {"$in": bootloader_telem["ips"]}})
|
|
||||||
if monkey_node:
|
|
||||||
# Don't create new node, monkey node is already present
|
|
||||||
return monkey_node
|
|
||||||
|
|
||||||
if new_node is None:
|
|
||||||
new_node = NodeService.create_node_from_bootloader_telem(
|
|
||||||
bootloader_telem, will_monkey_run
|
|
||||||
)
|
|
||||||
if bootloader_telem["tunnel"]:
|
|
||||||
dst_node = NodeService.get_node_or_monkey_by_ip(bootloader_telem["tunnel"])
|
|
||||||
else:
|
|
||||||
dst_node = NodeService.get_monkey_island_node()
|
|
||||||
src_label = NodeService.get_label_for_endpoint(new_node["_id"])
|
|
||||||
dst_label = NodeService.get_label_for_endpoint(dst_node["id"])
|
|
||||||
edge = EdgeService.get_or_create_edge(
|
|
||||||
src_node_id=new_node["_id"],
|
|
||||||
dst_node_id=dst_node["id"],
|
|
||||||
src_label=src_label,
|
|
||||||
dst_label=dst_label,
|
|
||||||
)
|
|
||||||
edge.tunnel = bool(bootloader_telem["tunnel"])
|
|
||||||
edge.ip_address = bootloader_telem["ips"][0]
|
|
||||||
edge.group = NodeStates.get_by_keywords(["island"]).value
|
|
||||||
edge.save()
|
|
||||||
return new_node
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_or_create_node(ip_address, domain_name=""):
|
def get_or_create_node(ip_address, domain_name=""):
|
||||||
new_node = mongo.db.node.find_one({"ip_addresses": ip_address})
|
new_node = mongo.db.node.find_one({"ip_addresses": ip_address})
|
||||||
|
|
|
@ -1,11 +0,0 @@
|
||||||
MIN_GLIBC_VERSION = 2.14
|
|
||||||
|
|
||||||
SUPPORTED_WINDOWS_VERSIONS = {
|
|
||||||
"xp_or_lower": False,
|
|
||||||
"vista": False,
|
|
||||||
"vista_sp1": False,
|
|
||||||
"vista_sp2": True,
|
|
||||||
"windows7": True,
|
|
||||||
"windows7_sp1": True,
|
|
||||||
"windows8_or_greater": True,
|
|
||||||
}
|
|
|
@ -1,10 +1,8 @@
|
||||||
import array
|
import array
|
||||||
import collections
|
|
||||||
import ipaddress
|
import ipaddress
|
||||||
import socket
|
import socket
|
||||||
import struct
|
import struct
|
||||||
import sys
|
import sys
|
||||||
from typing import List
|
|
||||||
|
|
||||||
from netifaces import AF_INET, ifaddresses, interfaces
|
from netifaces import AF_INET, ifaddresses, interfaces
|
||||||
from ring import lru
|
from ring import lru
|
||||||
|
@ -53,11 +51,6 @@ else:
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def is_local_ips(ips: List) -> bool:
|
|
||||||
filtered_local_ips = [ip for ip in local_ip_addresses() if not ip.startswith("169.254")]
|
|
||||||
return collections.Counter(ips) == collections.Counter(filtered_local_ips)
|
|
||||||
|
|
||||||
|
|
||||||
# The local IP addresses list should not change often. Therefore, we can cache the result and
|
# The local IP addresses list should not change often. Therefore, we can cache the result and
|
||||||
# never call this function
|
# never call this function
|
||||||
# more than once. This stopgap measure is here since this function is called a lot of times
|
# more than once. This stopgap measure is here since this function is called a lot of times
|
||||||
|
|
|
@ -14,10 +14,8 @@ class NodeStates(Enum):
|
||||||
ISLAND = "island"
|
ISLAND = "island"
|
||||||
ISLAND_MONKEY_LINUX = "island_monkey_linux"
|
ISLAND_MONKEY_LINUX = "island_monkey_linux"
|
||||||
ISLAND_MONKEY_LINUX_RUNNING = "island_monkey_linux_running"
|
ISLAND_MONKEY_LINUX_RUNNING = "island_monkey_linux_running"
|
||||||
ISLAND_MONKEY_LINUX_STARTING = "island_monkey_linux_starting"
|
|
||||||
ISLAND_MONKEY_WINDOWS = "island_monkey_windows"
|
ISLAND_MONKEY_WINDOWS = "island_monkey_windows"
|
||||||
ISLAND_MONKEY_WINDOWS_RUNNING = "island_monkey_windows_running"
|
ISLAND_MONKEY_WINDOWS_RUNNING = "island_monkey_windows_running"
|
||||||
ISLAND_MONKEY_WINDOWS_STARTING = "island_monkey_windows_starting"
|
|
||||||
MANUAL_LINUX = "manual_linux"
|
MANUAL_LINUX = "manual_linux"
|
||||||
MANUAL_LINUX_RUNNING = "manual_linux_running"
|
MANUAL_LINUX_RUNNING = "manual_linux_running"
|
||||||
MANUAL_WINDOWS = "manual_windows"
|
MANUAL_WINDOWS = "manual_windows"
|
||||||
|
@ -26,10 +24,6 @@ class NodeStates(Enum):
|
||||||
MONKEY_LINUX_RUNNING = "monkey_linux_running"
|
MONKEY_LINUX_RUNNING = "monkey_linux_running"
|
||||||
MONKEY_WINDOWS = "monkey_windows"
|
MONKEY_WINDOWS = "monkey_windows"
|
||||||
MONKEY_WINDOWS_RUNNING = "monkey_windows_running"
|
MONKEY_WINDOWS_RUNNING = "monkey_windows_running"
|
||||||
MONKEY_WINDOWS_STARTING = "monkey_windows_starting"
|
|
||||||
MONKEY_LINUX_STARTING = "monkey_linux_starting"
|
|
||||||
MONKEY_WINDOWS_OLD = "monkey_windows_old"
|
|
||||||
MONKEY_LINUX_OLD = "monkey_linux_old"
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_by_keywords(keywords: List) -> NodeStates:
|
def get_by_keywords(keywords: List) -> NodeStates:
|
||||||
|
|
|
@ -228,7 +228,7 @@ class PreviewPaneComponent extends AuthComponent {
|
||||||
info = this.scanInfo(this.props.item);
|
info = this.scanInfo(this.props.item);
|
||||||
break;
|
break;
|
||||||
case 'node':
|
case 'node':
|
||||||
if (this.props.item.group.includes('monkey') && this.props.item.group.includes('starting')) {
|
if (this.props.item.group.includes('monkey')) {
|
||||||
info = this.assetInfo(this.props.item);
|
info = this.assetInfo(this.props.item);
|
||||||
} else if (this.props.item.group.includes('monkey', 'manual')) {
|
} else if (this.props.item.group.includes('monkey', 'manual')) {
|
||||||
info = this.infectedAssetInfo(this.props.item)
|
info = this.infectedAssetInfo(this.props.item)
|
||||||
|
|
Before Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 3.1 KiB |
|
@ -1,66 +0,0 @@
|
||||||
from unittest import TestCase
|
|
||||||
|
|
||||||
from monkey_island.cc.resources.bootloader import Bootloader
|
|
||||||
|
|
||||||
|
|
||||||
class TestBootloader(TestCase):
|
|
||||||
def test_get_request_contents_linux(self):
|
|
||||||
data_without_tunnel = (
|
|
||||||
b'{"system":"linux", '
|
|
||||||
b'"os_version":"NAME="Ubuntu"\n", '
|
|
||||||
b'"glibc_version":"ldd (Ubuntu GLIBC 2.23-0ubuntu11) 2.23\n", '
|
|
||||||
b'"hostname":"test-TEST", '
|
|
||||||
b'"tunnel":false, '
|
|
||||||
b'"ips": ["127.0.0.1", "10.0.2.15", "192.168.56.5"]}'
|
|
||||||
)
|
|
||||||
data_with_tunnel = (
|
|
||||||
b'{"system":"linux", '
|
|
||||||
b'"os_version":"NAME="Ubuntu"\n", '
|
|
||||||
b'"glibc_version":"ldd (Ubuntu GLIBC 2.23-0ubuntu11) 2.23\n", '
|
|
||||||
b'"hostname":"test-TEST", '
|
|
||||||
b'"tunnel":"192.168.56.1:5002", '
|
|
||||||
b'"ips": ["127.0.0.1", "10.0.2.15", "192.168.56.5"]}'
|
|
||||||
)
|
|
||||||
|
|
||||||
result1 = Bootloader._get_request_contents_linux(data_without_tunnel)
|
|
||||||
self.assertTrue(result1["system"] == "linux")
|
|
||||||
self.assertTrue(result1["os_version"] == "Ubuntu")
|
|
||||||
self.assertTrue(result1["glibc_version"] == "ldd (Ubuntu GLIBC 2.23-0ubuntu11) 2.23")
|
|
||||||
self.assertTrue(result1["hostname"] == "test-TEST")
|
|
||||||
self.assertFalse(result1["tunnel"])
|
|
||||||
self.assertTrue(result1["ips"] == ["127.0.0.1", "10.0.2.15", "192.168.56.5"])
|
|
||||||
|
|
||||||
result2 = Bootloader._get_request_contents_linux(data_with_tunnel)
|
|
||||||
self.assertTrue(result2["system"] == "linux")
|
|
||||||
self.assertTrue(result2["os_version"] == "Ubuntu")
|
|
||||||
self.assertTrue(result2["glibc_version"] == "ldd (Ubuntu GLIBC 2.23-0ubuntu11) 2.23")
|
|
||||||
self.assertTrue(result2["hostname"] == "test-TEST")
|
|
||||||
self.assertTrue(result2["tunnel"] == "192.168.56.1:5002")
|
|
||||||
self.assertTrue(result2["ips"] == ["127.0.0.1", "10.0.2.15", "192.168.56.5"])
|
|
||||||
|
|
||||||
def test_get_request_contents_windows(self):
|
|
||||||
windows_data = (
|
|
||||||
b'{\x00"\x00s\x00y\x00s\x00t\x00e\x00m\x00"\x00:\x00"\x00w\x00i\x00n\x00d\x00o'
|
|
||||||
b'\x00w\x00s\x00"\x00,\x00 \x00"\x00o\x00s\x00_\x00v\x00e\x00r\x00s\x00i\x00o\x00n'
|
|
||||||
b'\x00"\x00:\x00"\x00w\x00i\x00n\x00d\x00o\x00w\x00s\x008\x00_\x00o\x00r\x00_\x00g\x00r'
|
|
||||||
b'\x00e\x00a\x00t\x00e\x00r\x00"\x00,\x00 '
|
|
||||||
b'\x00"\x00h\x00o\x00s\x00t\x00n\x00a\x00m\x00e\x00"'
|
|
||||||
b'\x00:\x00"\x00D\x00E\x00S\x00K\x00T\x00O\x00P\x00-\x00P\x00J\x00H\x00U\x003\x006'
|
|
||||||
b'\x00B\x00"'
|
|
||||||
b'\x00,\x00 \x00"\x00t\x00u\x00n\x00n\x00e\x00l\x00"\x00:\x00f\x00a\x00l\x00s\x00e'
|
|
||||||
b"\x00,\x00 "
|
|
||||||
b'\x00"\x00i\x00p\x00s\x00"\x00:\x00 \x00['
|
|
||||||
b'\x00"\x001\x009\x002\x00.\x001\x006\x008\x00.\x005'
|
|
||||||
b'\x006\x00.\x001\x00"\x00,\x00 '
|
|
||||||
b'\x00"\x001\x009\x002\x00.\x001\x006\x008\x00.\x002\x004\x009'
|
|
||||||
b'\x00.\x001\x00"\x00,\x00 '
|
|
||||||
b'\x00"\x001\x009\x002\x00.\x001\x006\x008\x00.\x002\x001\x007\x00.'
|
|
||||||
b'\x001\x00"\x00]\x00}\x00'
|
|
||||||
)
|
|
||||||
|
|
||||||
result = Bootloader._get_request_contents_windows(windows_data)
|
|
||||||
self.assertTrue(result["system"] == "windows")
|
|
||||||
self.assertTrue(result["os_version"] == "windows8_or_greater")
|
|
||||||
self.assertTrue(result["hostname"] == "DESKTOP-PJHU36B")
|
|
||||||
self.assertFalse(result["tunnel"])
|
|
||||||
self.assertTrue(result["ips"] == ["192.168.56.1", "192.168.249.1", "192.168.217.1"])
|
|
|
@ -1,24 +0,0 @@
|
||||||
from unittest import TestCase
|
|
||||||
|
|
||||||
from monkey_island.cc.services.bootloader import BootloaderService
|
|
||||||
|
|
||||||
MIN_GLIBC_VERSION = 2.14
|
|
||||||
|
|
||||||
|
|
||||||
class TestBootloaderService(TestCase):
|
|
||||||
def test_is_glibc_supported(self):
|
|
||||||
str1 = "ldd (Ubuntu EGLIBC 2.15-0ubuntu10) 2.15"
|
|
||||||
str2 = "ldd (GNU libc) 2.12"
|
|
||||||
str3 = "ldd (GNU libc) 2.28"
|
|
||||||
str4 = "ldd (Ubuntu GLIBC 2.23-0ubuntu11) 2.23"
|
|
||||||
self.assertTrue(
|
|
||||||
not BootloaderService.is_glibc_supported(str1)
|
|
||||||
and not BootloaderService.is_glibc_supported(str2)
|
|
||||||
and BootloaderService.is_glibc_supported(str3)
|
|
||||||
and BootloaderService.is_glibc_supported(str4)
|
|
||||||
)
|
|
||||||
|
|
||||||
def test_remove_local_ips(self):
|
|
||||||
ips = ["127.1.1.1", "127.0.0.1", "192.168.56.1"]
|
|
||||||
ips = BootloaderService.remove_local_ips(ips)
|
|
||||||
self.assertEqual(["192.168.56.1"], ips)
|
|
|
@ -48,8 +48,6 @@ MONKEY_WINDOWS # unused variable (monkey/monkey_island/cc/services/utils/node_s
|
||||||
MONKEY_WINDOWS_RUNNING # unused variable (monkey/monkey_island/cc/services/utils/node_states.py:28)
|
MONKEY_WINDOWS_RUNNING # unused variable (monkey/monkey_island/cc/services/utils/node_states.py:28)
|
||||||
MONKEY_WINDOWS_STARTING # unused variable (monkey/monkey_island/cc/services/utils/node_states.py:29)
|
MONKEY_WINDOWS_STARTING # unused variable (monkey/monkey_island/cc/services/utils/node_states.py:29)
|
||||||
MONKEY_LINUX_STARTING # unused variable (monkey/monkey_island/cc/services/utils/node_states.py:30)
|
MONKEY_LINUX_STARTING # unused variable (monkey/monkey_island/cc/services/utils/node_states.py:30)
|
||||||
MONKEY_WINDOWS_OLD # unused variable (monkey/monkey_island/cc/services/utils/node_states.py:31)
|
|
||||||
MONKEY_LINUX_OLD # unused variable (monkey/monkey_island/cc/services/utils/node_states.py:32)
|
|
||||||
_.credential_type # unused attribute (monkey/monkey_island/cc/services/reporting/issue_processing/exploit_processing/processors/cred_exploit.py:19)
|
_.credential_type # unused attribute (monkey/monkey_island/cc/services/reporting/issue_processing/exploit_processing/processors/cred_exploit.py:19)
|
||||||
_.credential_type # unused attribute (monkey/monkey_island/cc/services/reporting/issue_processing/exploit_processing/processors/cred_exploit.py:22)
|
_.credential_type # unused attribute (monkey/monkey_island/cc/services/reporting/issue_processing/exploit_processing/processors/cred_exploit.py:22)
|
||||||
_.credential_type # unused attribute (monkey/monkey_island/cc/services/reporting/issue_processing/exploit_processing/processors/cred_exploit.py:25)
|
_.credential_type # unused attribute (monkey/monkey_island/cc/services/reporting/issue_processing/exploit_processing/processors/cred_exploit.py:25)
|
||||||
|
@ -68,7 +66,6 @@ VSFTPD # unused variable (monkey/monkey_island/cc/services/reporting/issue_proc
|
||||||
DRUPAL # unused variable (monkey/monkey_island/cc/services/reporting/issue_processing/exploit_processing/exploiter_descriptor_enum.py:48)
|
DRUPAL # unused variable (monkey/monkey_island/cc/services/reporting/issue_processing/exploit_processing/exploiter_descriptor_enum.py:48)
|
||||||
POWERSHELL # (\monkey\monkey_island\cc\services\reporting\issue_processing\exploit_processing\exploiter_descriptor_enum.py:52)
|
POWERSHELL # (\monkey\monkey_island\cc\services\reporting\issue_processing\exploit_processing\exploiter_descriptor_enum.py:52)
|
||||||
ExploiterDescriptorEnum.LOG4SHELL
|
ExploiterDescriptorEnum.LOG4SHELL
|
||||||
_.do_POST # unused method (monkey/monkey_island/cc/server_utils/bootloader_server.py:26)
|
|
||||||
PbaResults # unused class (monkey/monkey_island/cc/models/pba_results.py:4)
|
PbaResults # unused class (monkey/monkey_island/cc/models/pba_results.py:4)
|
||||||
internet_access # unused variable (monkey/monkey_island/cc/models/monkey.py:43)
|
internet_access # unused variable (monkey/monkey_island/cc/models/monkey.py:43)
|
||||||
config_error # unused variable (monkey/monkey_island/cc/models/monkey.py:53)
|
config_error # unused variable (monkey/monkey_island/cc/models/monkey.py:53)
|
||||||
|
|