Compare commits

...

4 Commits

Author SHA1 Message Date
cr0hn
9afdbdd871 fix: added embedded dicts into sdist 2016-03-22 11:13:42 +01:00
cr0hn
6f99d09d45 Update: add new documentation for new module 2016-03-18 14:12:10 +01:00
cr0hn
44c38958aa fix: modification to fix #1 issue 2016-03-18 14:10:21 +01:00
cr0hn
4e9b07fad2 add: New release info 2016-03-18 14:09:32 +01:00
8 changed files with 191 additions and 69 deletions

View File

@@ -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
----------------------

View File

@@ -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/*

View File

@@ -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

View File

@@ -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!

View File

@@ -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!

View File

@@ -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__ = """
``
`````..``

View File

@@ -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))
# ----------------------------------------------------------------------

View File

@@ -39,7 +39,7 @@ else:
setup(
name='enteletaor',
version="1.1.0",
version="1.1.1",
install_requires=required,
url='https://github.com/cr0hn/enteletaor',
license='BSD',