2018-05-04 13:53:29 +02:00
|
|
|
#!/usr/bin/env python3
|
2016-02-05 16:03:37 +01:00
|
|
|
# -*-coding:UTF-8 -*
|
2017-05-09 11:13:16 +02:00
|
|
|
|
2016-02-05 16:03:37 +01:00
|
|
|
"""
|
2017-05-09 11:13:16 +02:00
|
|
|
The Keys Module
|
|
|
|
======================
|
|
|
|
|
|
|
|
This module is consuming the Redis-list created by the Global module.
|
|
|
|
|
2018-04-05 11:40:34 +02:00
|
|
|
It is looking for PGP, private and encrypted private,
|
|
|
|
RSA private key, certificate messages
|
2017-05-09 11:13:16 +02:00
|
|
|
|
2016-02-05 16:03:37 +01:00
|
|
|
"""
|
|
|
|
|
|
|
|
import time
|
|
|
|
from pubsublogger import publisher
|
|
|
|
|
2018-04-16 14:50:04 +02:00
|
|
|
#from bin.packages import Paste
|
|
|
|
#from bin.Helper import Process
|
|
|
|
|
|
|
|
from packages import Paste
|
|
|
|
from Helper import Process
|
2016-02-05 16:03:37 +01:00
|
|
|
|
|
|
|
|
2018-04-11 10:14:33 +02:00
|
|
|
def search_key(paste):
|
2016-02-05 16:03:37 +01:00
|
|
|
content = paste.get_p_content()
|
2018-04-05 11:40:34 +02:00
|
|
|
find = False
|
2019-05-20 11:57:49 +02:00
|
|
|
get_pgp_content = False
|
2018-04-16 14:50:04 +02:00
|
|
|
if '-----BEGIN PGP MESSAGE-----' in content:
|
2016-02-05 16:03:37 +01:00
|
|
|
publisher.warning('{} has a PGP enc message'.format(paste.p_name))
|
2018-05-02 17:07:10 +02:00
|
|
|
|
2018-05-16 14:39:01 +02:00
|
|
|
msg = 'infoleak:automatic-detection="pgp-message";{}'.format(message)
|
|
|
|
p.populate_set_out(msg, 'Tags')
|
2019-05-20 11:57:49 +02:00
|
|
|
get_pgp_content = True
|
2018-04-05 11:40:34 +02:00
|
|
|
find = True
|
|
|
|
|
2019-05-20 11:57:49 +02:00
|
|
|
if '-----BEGIN PGP PUBLIC KEY BLOCK-----' in content:
|
|
|
|
msg = 'infoleak:automatic-detection="pgp-public-key-block";{}'.format(message)
|
|
|
|
p.populate_set_out(msg, 'Tags')
|
|
|
|
get_pgp_content = True
|
|
|
|
|
|
|
|
if '-----BEGIN PGP SIGNATURE-----' in content:
|
|
|
|
msg = 'infoleak:automatic-detection="pgp-signature";{}'.format(message)
|
|
|
|
p.populate_set_out(msg, 'Tags')
|
|
|
|
get_pgp_content = True
|
|
|
|
|
|
|
|
|
2018-04-16 14:50:04 +02:00
|
|
|
if '-----BEGIN CERTIFICATE-----' in content:
|
2018-04-05 11:40:34 +02:00
|
|
|
publisher.warning('{} has a certificate message'.format(paste.p_name))
|
2018-05-16 14:39:01 +02:00
|
|
|
|
|
|
|
msg = 'infoleak:automatic-detection="certificate";{}'.format(message)
|
|
|
|
p.populate_set_out(msg, 'Tags')
|
2018-04-05 11:40:34 +02:00
|
|
|
find = True
|
|
|
|
|
2018-04-16 14:50:04 +02:00
|
|
|
if '-----BEGIN RSA PRIVATE KEY-----' in content:
|
2018-04-11 10:14:33 +02:00
|
|
|
publisher.warning('{} has a RSA private key message'.format(paste.p_name))
|
2018-05-02 17:07:10 +02:00
|
|
|
print('rsa private key message found')
|
2018-05-16 14:39:01 +02:00
|
|
|
|
|
|
|
msg = 'infoleak:automatic-detection="rsa-private-key";{}'.format(message)
|
|
|
|
p.populate_set_out(msg, 'Tags')
|
2018-04-05 11:40:34 +02:00
|
|
|
find = True
|
|
|
|
|
2018-04-16 14:50:04 +02:00
|
|
|
if '-----BEGIN PRIVATE KEY-----' in content:
|
2018-04-11 10:14:33 +02:00
|
|
|
publisher.warning('{} has a private key message'.format(paste.p_name))
|
2018-05-02 17:07:10 +02:00
|
|
|
print('private key message found')
|
2018-05-16 14:39:01 +02:00
|
|
|
|
|
|
|
msg = 'infoleak:automatic-detection="private-key";{}'.format(message)
|
|
|
|
p.populate_set_out(msg, 'Tags')
|
2018-04-05 11:40:34 +02:00
|
|
|
find = True
|
|
|
|
|
2018-04-16 14:50:04 +02:00
|
|
|
if '-----BEGIN ENCRYPTED PRIVATE KEY-----' in content:
|
2018-04-11 10:14:33 +02:00
|
|
|
publisher.warning('{} has an encrypted private key message'.format(paste.p_name))
|
2018-05-02 17:07:10 +02:00
|
|
|
print('encrypted private key message found')
|
2018-05-16 14:39:01 +02:00
|
|
|
|
|
|
|
msg = 'infoleak:automatic-detection="encrypted-private-key";{}'.format(message)
|
|
|
|
p.populate_set_out(msg, 'Tags')
|
2018-04-11 10:14:33 +02:00
|
|
|
find = True
|
|
|
|
|
2018-04-16 14:50:04 +02:00
|
|
|
if '-----BEGIN OPENSSH PRIVATE KEY-----' in content:
|
2018-04-11 10:14:33 +02:00
|
|
|
publisher.warning('{} has an openssh private key message'.format(paste.p_name))
|
2018-05-02 17:07:10 +02:00
|
|
|
print('openssh private key message found')
|
2018-05-16 14:39:01 +02:00
|
|
|
|
|
|
|
msg = 'infoleak:automatic-detection="private-ssh-key";{}'.format(message)
|
|
|
|
p.populate_set_out(msg, 'Tags')
|
2018-05-02 17:07:10 +02:00
|
|
|
find = True
|
|
|
|
|
2018-08-01 16:04:06 +02:00
|
|
|
if '---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----' in content:
|
2018-08-01 16:05:49 +02:00
|
|
|
publisher.warning('{} has an ssh2 private key message'.format(paste.p_name))
|
2018-08-01 16:04:06 +02:00
|
|
|
print('SSH2 private key message found')
|
|
|
|
|
|
|
|
msg = 'infoleak:automatic-detection="private-ssh-key";{}'.format(message)
|
|
|
|
p.populate_set_out(msg, 'Tags')
|
|
|
|
find = True
|
|
|
|
|
2018-05-02 17:07:10 +02:00
|
|
|
if '-----BEGIN OpenVPN Static key V1-----' in content:
|
|
|
|
publisher.warning('{} has an openssh private key message'.format(paste.p_name))
|
|
|
|
print('OpenVPN Static key message found')
|
2018-05-16 14:39:01 +02:00
|
|
|
|
|
|
|
msg = 'infoleak:automatic-detection="vpn-static-key";{}'.format(message)
|
|
|
|
p.populate_set_out(msg, 'Tags')
|
2018-04-11 10:14:33 +02:00
|
|
|
find = True
|
|
|
|
|
2018-04-16 14:50:04 +02:00
|
|
|
if '-----BEGIN DSA PRIVATE KEY-----' in content:
|
2018-04-11 10:14:33 +02:00
|
|
|
publisher.warning('{} has a dsa private key message'.format(paste.p_name))
|
2018-05-16 14:39:01 +02:00
|
|
|
|
|
|
|
msg = 'infoleak:automatic-detection="dsa-private-key";{}'.format(message)
|
|
|
|
p.populate_set_out(msg, 'Tags')
|
2018-04-11 10:14:33 +02:00
|
|
|
find = True
|
|
|
|
|
2018-04-16 14:50:04 +02:00
|
|
|
if '-----BEGIN EC PRIVATE KEY-----' in content:
|
2018-04-11 10:14:33 +02:00
|
|
|
publisher.warning('{} has an ec private key message'.format(paste.p_name))
|
2018-05-16 14:39:01 +02:00
|
|
|
|
|
|
|
msg = 'infoleak:automatic-detection="ec-private-key";{}'.format(message)
|
|
|
|
p.populate_set_out(msg, 'Tags')
|
2018-04-11 10:14:33 +02:00
|
|
|
find = True
|
|
|
|
|
2018-04-16 14:50:04 +02:00
|
|
|
if '-----BEGIN PGP PRIVATE KEY BLOCK-----' in content:
|
2018-04-11 10:14:33 +02:00
|
|
|
publisher.warning('{} has a pgp private key block message'.format(paste.p_name))
|
2018-05-16 14:39:01 +02:00
|
|
|
|
|
|
|
msg = 'infoleak:automatic-detection="pgp-private-key";{}'.format(message)
|
|
|
|
p.populate_set_out(msg, 'Tags')
|
2018-04-05 11:40:34 +02:00
|
|
|
find = True
|
|
|
|
|
2019-05-20 11:57:49 +02:00
|
|
|
# pgp content
|
|
|
|
if get_pgp_content:
|
2019-05-14 17:49:31 +02:00
|
|
|
p.populate_set_out(message, 'PgpDump')
|
|
|
|
|
2018-04-05 11:40:34 +02:00
|
|
|
if find :
|
|
|
|
|
2016-07-18 16:22:33 +02:00
|
|
|
#Send to duplicate
|
2016-08-08 09:17:44 +02:00
|
|
|
p.populate_set_out(message, 'Duplicate')
|
2018-04-16 14:50:04 +02:00
|
|
|
print(message)
|
2016-02-05 16:03:37 +01:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
# If you wish to use an other port of channel, do not forget to run a subscriber accordingly (see launch_logs.sh)
|
|
|
|
# Port of the redis instance used by pubsublogger
|
|
|
|
publisher.port = 6380
|
|
|
|
# Script is the default channel used for the modules.
|
|
|
|
publisher.channel = 'Script'
|
|
|
|
|
|
|
|
# Section name in bin/packages/modules.cfg
|
|
|
|
config_section = 'Keys'
|
|
|
|
|
|
|
|
# Setup the I/O queues
|
|
|
|
p = Process(config_section)
|
|
|
|
|
|
|
|
# Sent to the logging a description of the module
|
|
|
|
publisher.info("Run Keys module ")
|
|
|
|
|
|
|
|
# Endless loop getting messages from the input queue
|
|
|
|
while True:
|
|
|
|
# Get one message from the input queue
|
|
|
|
message = p.get_from_set()
|
|
|
|
if message is None:
|
|
|
|
publisher.debug("{} queue is empty, waiting".format(config_section))
|
|
|
|
time.sleep(1)
|
|
|
|
continue
|
|
|
|
|
|
|
|
# Do something with the message from the queue
|
2018-04-11 10:14:33 +02:00
|
|
|
paste = Paste.Paste(message)
|
|
|
|
search_key(paste)
|
2016-02-05 16:03:37 +01:00
|
|
|
|
|
|
|
# (Optional) Send that thing to the next queue
|