Compare commits
4 Commits
11465748dc
...
1.1.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9afdbdd871 | ||
|
|
6f99d09d45 | ||
|
|
44c38958aa | ||
|
|
4e9b07fad2 |
16
CHANGELOG
16
CHANGELOG
@@ -1,10 +1,20 @@
|
||||
Version 1.0.0
|
||||
Version 1.1.x
|
||||
=============
|
||||
|
||||
Internal modifications
|
||||
Improvements and fixes
|
||||
----------------------
|
||||
|
||||
- First release.
|
||||
- Performance improvements.
|
||||
- Many fixes and wild exceptions
|
||||
- Improved documentation
|
||||
|
||||
New features
|
||||
------------
|
||||
|
||||
- Added new module for authentication bruteforcer
|
||||
|
||||
Version 1.0.0
|
||||
=============
|
||||
|
||||
Improvements and fixes
|
||||
----------------------
|
||||
|
||||
@@ -13,5 +13,6 @@ global-exclude *.pyc
|
||||
global-exclude .git*
|
||||
global-exclude .DS_Store
|
||||
global-exclude .mailmap
|
||||
prune enteletaor_lib/doc*
|
||||
prune doc*
|
||||
|
||||
graft enteletaor_lib/resources/*
|
||||
15
README.rst
15
README.rst
@@ -26,6 +26,7 @@ Some of the actions you can do:
|
||||
- Disconnect remote clients from Redis server (even the admin!)
|
||||
- Inject tasks into remote processes.
|
||||
- Make a scan to discover open brokers.
|
||||
- Try to discover user/passwords in auth protected brokers
|
||||
|
||||
Currently supported brokers are:
|
||||
|
||||
@@ -40,9 +41,17 @@ What's new?
|
||||
|
||||
This Enteletaor version, add a lot of new features and fixes, like:
|
||||
|
||||
.. note::
|
||||
|
||||
You can read entire list in CHANGELOG file.
|
||||
|
||||
Version 1.1.x
|
||||
+++++++++++++
|
||||
|
||||
- Many improvements and fixes
|
||||
- Added new module: **password bruteforcer**.
|
||||
|
||||
Version 1.0.0
|
||||
+++++++++++++
|
||||
|
||||
- First version released
|
||||
|
||||
You can read entire list in CHANGELOG file.
|
||||
- First version released
|
||||
@@ -659,3 +659,85 @@ Finally, we can replace entire content of cache key using option ``--replace-htm
|
||||
[ * ] - Poisoning enabled
|
||||
[ * ] - Poisoned cache key 'flask_cache_view//' at server '10.10.0.10'
|
||||
[ * ] Done!
|
||||
|
||||
|
||||
Password brute forcer
|
||||
---------------------
|
||||
|
||||
Listing wordlist
|
||||
++++++++++++++++
|
||||
|
||||
Enteleteaor has some wordlist embedded. If you want to show them, you must write:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# enteleteaor brute wordlist
|
||||
[ * ] Starting Enteletaor execution
|
||||
[ * ] - Available wordlists:
|
||||
[ * ] > 10_million_password_list_top_100
|
||||
[ * ] > 10_million_password_list_top_1000
|
||||
[ * ] > 10_million_password_list_top_10000
|
||||
[ * ] > 10_million_password_list_top_100000
|
||||
[ * ] Done!
|
||||
|
||||
The wordlist names could be used as input for the password module.
|
||||
|
||||
Discovering passwords
|
||||
+++++++++++++++++++++
|
||||
|
||||
We can try to discover remote passwords using enteleteaor. To do this, we need a wordlist with passwords that we want to test. If we don't have any wordlist we can use one of embedded.
|
||||
|
||||
Basic usage
|
||||
___________
|
||||
|
||||
Using default options, enteleteaor se the wordlist ``10_million_password_list_top_1000``.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# enteleteaor brute password -t 10.10.0.10
|
||||
[ * ] Starting Enteletaor execution
|
||||
[ * ] - Detected 'Redis' server with 'auth'.
|
||||
[ * ] - Starting bruteforcer using wordlist : '/Users/Dani/Documents/Projects/enteletaor/enteletaor_lib/resources/wordlist/10_million_password_list_top_1000.txt'
|
||||
[ * ] Done!
|
||||
|
||||
.. note::
|
||||
|
||||
We also can set remote server port using option ``-p``.
|
||||
|
||||
Specifying wordlist
|
||||
___________________
|
||||
|
||||
We can set an external wordlist, with the option ``-w``.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# enteleteaor brute password -t 10.10.0.10 -w /home/user/my_wordlist.txt
|
||||
|
||||
Or use a different embedded:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# enteleteaor brute password -t 10.10.0.10 -w 10_million_password_list_top_100000
|
||||
|
||||
Setting concurrency
|
||||
___________________
|
||||
|
||||
We also can specify the number os concurrent test we want to do, using option ``-c``.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# enteleteaor brute password -t 10.10.0.10 -w 10_million_password_list_top_100000 -c 20
|
||||
|
||||
Setting remote user
|
||||
___________________
|
||||
|
||||
Currently enteleteaor doesn't support brute forcer for users, so for servers that need user/password we must set the **user**, using option ``-u``:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# enteleteaor brute password -t 10.10.0.10 -p 5672 -u admin
|
||||
[ * ] Starting Enteletaor execution
|
||||
[ * ] - Detected 'RabbitMQ' server with 'auth'.
|
||||
[ * ] - Set user to 'admin'
|
||||
[ * ] - Starting bruteforcer using wordlist : '/Users/Dani/Documents/Projects/enteletaor/enteletaor_lib/resources/wordlist/10_million_password_list_top_1000.txt'
|
||||
[ * ] Done!
|
||||
|
||||
@@ -202,4 +202,18 @@ We can also list all connected users to Redis server. A user could be a web appl
|
||||
[ * ] - 10.10.0.2:53095 (DB: 0)
|
||||
[ * ] Done!
|
||||
|
||||
Localhost addresses usually is a local monitoring system or admin.
|
||||
Localhost addresses usually is a local monitoring system or admin.
|
||||
|
||||
Brute forcer
|
||||
------------
|
||||
|
||||
Enteletaor has a module to help us to recover passwords for remote servers. Usage is so simple:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
# enteleteaor brute password -t 10.10.0.10
|
||||
[ * ] Starting Enteletaor execution
|
||||
[ * ] - Detected 'Redis' server with 'auth'.
|
||||
[ * ] - Starting bruteforcer using wordlist : '/Users/Dani/Documents/Projects/enteletaor/enteletaor_lib/resources/wordlist/10_million_password_list_top_1000.txt'
|
||||
[ * ] Done!
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
__tool_name__ = "enteletaor"
|
||||
__author__ = "Daniel Garcia (cr0hn) - @ggdaniel"
|
||||
__site__ = "https://github.com/cr0hn/enteletaor"
|
||||
__version__ = "1.1.0"
|
||||
__version__ = "1.1.1"
|
||||
__banner__ = """
|
||||
``
|
||||
`````..``
|
||||
|
||||
@@ -80,87 +80,93 @@ def _decode_object(val, ident=5):
|
||||
"""
|
||||
_new_ident = ident + 1
|
||||
|
||||
for k, v in six.iteritems(val):
|
||||
# convert value to original type -> JSON
|
||||
try:
|
||||
_transformed_info = json.loads(v.decode("utf-8"))
|
||||
except (binascii.Error, AttributeError, ValueError):
|
||||
_transformed_info = v
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# Try to display in "human" format
|
||||
# --------------------------------------------------------------------------
|
||||
if isinstance(_transformed_info, list):
|
||||
|
||||
log.error('%s"%s":' % (" " * ident, k))
|
||||
|
||||
for x in _transformed_info:
|
||||
if isinstance(x, dict):
|
||||
# Open data
|
||||
log.error("%s{" % (" " * _new_ident))
|
||||
|
||||
_decode_object(x, _new_ident + 2)
|
||||
|
||||
log.error("%s}" % (" " * _new_ident))
|
||||
|
||||
else:
|
||||
log.error('%s"%s"' % ((" " * ident), x))
|
||||
|
||||
# Dict handler
|
||||
elif isinstance(_transformed_info, dict):
|
||||
log.error('%s"%s":' % ((" " * ident), k))
|
||||
|
||||
log.error("%s{" % (" " * _new_ident))
|
||||
|
||||
_decode_object(v, _new_ident + 2)
|
||||
|
||||
log.error("%s}" % (" " * _new_ident))
|
||||
|
||||
# Basic type as value
|
||||
else:
|
||||
|
||||
try:
|
||||
for k, v in six.iteritems(val):
|
||||
# convert value to original type -> JSON
|
||||
try:
|
||||
use_obj = _transformed_info.encode()
|
||||
except (TypeError, AttributeError, binascii.Error):
|
||||
use_obj = _transformed_info
|
||||
_transformed_info = json.loads(v.decode("utf-8"))
|
||||
except (binascii.Error, AttributeError, ValueError):
|
||||
_transformed_info = v
|
||||
|
||||
# Is Pickle encoded?
|
||||
try:
|
||||
_pickle_decoded = loads(use_obj)
|
||||
# --------------------------------------------------------------------------
|
||||
# Try to display in "human" format
|
||||
# --------------------------------------------------------------------------
|
||||
if isinstance(_transformed_info, list):
|
||||
|
||||
# Is pickled
|
||||
log.error('%s"%s":' % (" " * ident, k))
|
||||
|
||||
for x in _transformed_info:
|
||||
if isinstance(x, dict):
|
||||
# Open data
|
||||
log.error("%s{" % (" " * _new_ident))
|
||||
|
||||
_decode_object(x, _new_ident + 2)
|
||||
|
||||
log.error("%s}" % (" " * _new_ident))
|
||||
|
||||
else:
|
||||
log.error('%s"%s"' % ((" " * ident), x))
|
||||
|
||||
# Dict handler
|
||||
elif isinstance(_transformed_info, dict):
|
||||
log.error('%s"%s":' % ((" " * ident), k))
|
||||
|
||||
log.error("%s{" % (" " * _new_ident))
|
||||
|
||||
_decode_object(_pickle_decoded, _new_ident + 2)
|
||||
_decode_object(v, _new_ident + 2)
|
||||
|
||||
log.error("%s}" % (" " * _new_ident))
|
||||
|
||||
except Exception as e:
|
||||
# Basic type as value
|
||||
else:
|
||||
|
||||
if "BadPickleGet" == e.__class__.__name__:
|
||||
log.info(
|
||||
" <!!> Can't decode value for key '%s' because Pickle protocol 3 o 4 used, and it's "
|
||||
"incompatible with Python 2" % k)
|
||||
|
||||
# Try again decoding in base64
|
||||
try:
|
||||
_b64_decoded = base64.decodebytes(use_obj)
|
||||
use_obj = _transformed_info.encode()
|
||||
except (TypeError, AttributeError, binascii.Error):
|
||||
use_obj = _transformed_info
|
||||
|
||||
# Is Pickle encoded?
|
||||
try:
|
||||
_pickle_decoded = loads(use_obj)
|
||||
|
||||
# Is pickled
|
||||
log.error('%s"%s":' % ((" " * ident), k))
|
||||
|
||||
log.error("%s{" % (" " * _new_ident))
|
||||
|
||||
_decode_object(loads(_b64_decoded), _new_ident + 2)
|
||||
_decode_object(_pickle_decoded, _new_ident + 2)
|
||||
|
||||
log.error("%s}" % (" " * _new_ident))
|
||||
|
||||
except Exception:
|
||||
except Exception as e:
|
||||
|
||||
# Transform is not possible -> plain string
|
||||
log.error('%s"%s": "%s"' % ((" " * ident), k, use_obj))
|
||||
if "BadPickleGet" == e.__class__.__name__:
|
||||
log.info(
|
||||
" <!!> Can't decode value for key '%s' because Pickle protocol 3 o 4 used, and it's "
|
||||
"incompatible with Python 2" % k)
|
||||
|
||||
# Try again decoding in base64
|
||||
try:
|
||||
_b64_decoded = base64.decodebytes(use_obj)
|
||||
|
||||
# Is pickled
|
||||
log.error('%s"%s":' % ((" " * ident), k))
|
||||
|
||||
log.error("%s{" % (" " * _new_ident))
|
||||
|
||||
_decode_object(loads(_b64_decoded), _new_ident + 2)
|
||||
|
||||
log.error("%s}" % (" " * _new_ident))
|
||||
|
||||
except Exception:
|
||||
|
||||
# Transform is not possible -> plain string
|
||||
log.error('%s"%s": "%s"' % ((" " * ident), k, use_obj))
|
||||
|
||||
except AttributeError:
|
||||
|
||||
# Transform is not possible -> plain string
|
||||
log.error('%s"%s": "%s"' % ((" " * ident), k, use_obj))
|
||||
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user