Mimir - OSINT Threat Intel Interface. (Active Dev - Assistance Requested)
#1
###---UPDATE---###

I have a functional beta on my GitHub and below. please see this post for details.

###---ORIGINAL---###
Original post deprecated beyond this point

So i had the idea to write an OSINT Threat Intel tool that functions as a CLI to HoneyDB if you don't know what HoneyDB is. It's a sort of aggregative open source intelligence platform. More info here basically it collects a bunch of info from people that have set up HoneyPy Honeypot software in order to learn about malicious hosts, top attacked services and more.

The idea of my tool is to make it easier for the pentester/researcher/InfoSec pro to access this information and do something meaningful with it. To that end i have included in script WHOIS lookup and the ability to invoke an Nmap scan on a provided host.

With the API you are able to retrieve the threat feed and bad host list as well. My program would allow you to retrieve this data easily and save it for further processing and/or investigation. But herein lies the problem. The project is written in Python 2.7, the built in SSL lib in Python 2.7 does not support the SSL version HoneyDB runs. And as far as i can see there isn't a particularly viable work-around. I have the full source posted below and commented out the monkey patch i have tried, it tries to overwrite some functionality of the SSL lib but sadly i have been unable to get it to work properly and i would appreciate any help the GS Devs or anyone that's interested for that matter can provide.

Since i am using a lot of external modules using tools like 2to3 seems inviable, especially because there is no equivalent for Mechanize in Python 3.

For clarity here are the dependencies.
  • Blessings
  • ipwhois
  • Mechanize
  • Selenium (For data visualization in a browser environment)
  • pprint
Any help would e greatly appreciated. If there is demand, i can put this source code on Github as is, so that you may submit a proper pull request should you desire. Thanks in advance.

P.S. If you're wondering about the name, Mimir was the name of the old Norse God of knowledge. I thought it fitting for an OSINT tool Smile



Code:
#!/usr/bin/env python2.7

import mechanize
import pickle
import os.path, os, sys

from selenium import webdriver
from blessings import Terminal
from ipwhois import IPWhois
from pprint import pprint

t = Terminal()


                  ###---ATTEMPTED MONKEY PATCH---####
##############################################################################
#import socket                                                                                                        
#import httplib
#import ssl
#
#def connect(self):                                                               
#    sock = socket.create_connection((self.host, self.port), self.timeout, self.source_address)                   
#    if self._tunnel_host:                                                                                                                         
#       self.sock = sock                                                                                                                            
#        self._tunnel()                                                                                                                               
#                                                                                                                                                           
#   self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file, ssl_version=ssl.PROTOCOL_TLSv1)
#                                                                                                                                                            
#httplib.HTTPSConnection.connect = connect                                                                                       
#################################################################################

print t.cyan("""

oooo     oooo ooooo oooo     oooo ooooo oooooooooo  
 8888o   888   888   8888o   888   888   888    888
 88 888o8 88   888   88 888o8 88   888   888oooo88  
 88  888  88   888   88  888  88   888   888  88o   
o88o  8  o88o o888o o88o  8  o88o o888o o888o  88o8


                Threat Intel Interface
                           \n""")


if not os.path.isfile("HDB-api-ID.p"):
    
    print "[" + t.green("+") + "]Please provide your HoneyDB API ID\n"
    DB_API_ID = raw_input("API ID: ")
    
    pickle.dump(DB_API_ID, open( "HDB-api-ID.p", "wb" ))
    
    print "[" + t.green("+") + "]Please provide your HoneyDB API key\n"
    DB_API_KEY = raw_input("API key: ")
    
    pickle.dump(DB_API_ID, open( "HDB-api-key.p", "wb" ))
    
    print "[" + t.green("+") + "]Your API data has been saved to 'HDB-api-ID.p' and 'HDB-api-key.p' in the current directory.\n"
    
else:
    
    try:
        DB_API_ID = pickle.load(open( "HDB-api-ID.p", "rb" ))
        DB_API_KEY = pickle.load(open( "HDB-api-key.p", "rb" ))
    except IOError as e:
        print "[" + t.red("!") + "]Critical. An IO error was raised while attempting to read API data.\n"
        print e
        
        sys.exit(1)
    
    ID_path = os.path.abspath("HDB-api-ID.p")
    KEY_path = os.path.abspath("HDB-api-key")
    
    print "\n[" + t.green("+") + "]Your API ID was succesfully loaded from " + ID_path
    print "[" + t.green("+") + "]Your API key was succesfully loaded from " + KEY_path
    

def whois():
    print "[" + t.green("+") + "]Please provide an IP for WHOIS lookup."
    TARGET = raw_input("\n<" + t.cyan("WHOIS") + ">$ ")
    
    obj = IPWhois(TARGET)
    results = obj.lookup_rdap(depth=1)
    pprint(results)
    
    print "[" + t.magenta("?") + "]Would you like to append the WHOIS record to a text file?\n"
    logs = raw_input("[Y]es/[N]o: ")
    
    if logs == "y":
        with open( "whois.log", "ab" ) as outfile:
            outfile.write("Host: " + TARGET + "\n")
            outfile.write(pprint(results))
            outfile.close()
            
        print "[" + t.green("+") + "]Results saved to whois.log in the current directory.\n"
            
    elif logs == "n":
        print "[" + t.green("+") + "]Returning to main menu.\n"
        
    else:
        print "[" + t.red("!") + "]Unhandled Option.\n"


def mech_ops(mode_f):
    br = mechanize.Browser()
    br.set_handle_robots(False)
    br.addheaders = [('user-agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'),
    ('X-HoneyDb-ApiId', DB_API_ID), ('X-HoneyDb-ApiKey', DB_API_KEY), ('accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')]

    if mode_f == 1:
        try:
            response = br.open("https://riskdiscovery.com/honeydb/api/twitter-threat-feed")
        except Exception as e:
            print "\n[" + t.red("!") + "]Critical, could not open HoneyDB"
            print "\n[" + t.green("+") + "]The following status code was recieved: "
            print e
    else:
        try:
            response = br.open("https://riskdiscovery.com/honeydb/api/bad-hosts")
        except Exception as e:
            print "\n[" + t.red("!") + "]Critical, could not open HoneyDB"
            print "\n[" + t.green("+") + "]The following status code was recieved: "
            print e
                    
    result = response.read()
    return result



try:
    while True:

                            
        print "\n\n[" + t.green("+") + "]Welcome to Mimir. Please select an action."
        print """
1. Fetch Threat Feed            5. Visualize Top Malicious Hosts in Browser
2. Fetch Bad Host List            6. Visualize Top Targeted Services in Browser
3. Perform WHOIS Lookup            7. Visualize Results for Single Host in Browser
4. Invoke Nmap Scan                8. Quit
        
        """        
        option = raw_input("\n<" + t.cyan("MIMIR") + ">$ ")
        
        if option == '1':
            option = 1
            feed = mech_ops(option)
            
            with open( "feed.log", "ab" ) as outfile:
                for line in feed:
                    print line
                    outfile.write(line)
            
            outfile.close()    
            
            print "Results saved to 'feed.log' in the current directory"
            
        elif option =='2':
            feed = mech_ops()
            
            with open( "hosts.log", "ab" ):
                for line in hosts:
                    print line
                    outfile.write(line)
                    
                outfile.close()
                    
            print "Results saved to 'hosts.log' in the current directory"
            
        elif option == '3':
            whois()
        
        elif option == '4':
            host = raw_input("\n[" + t.green("+") + "]Please enter a target to scan: ")
            try:
                os.system("nmap -T4 -Pn --reason " + host)
            except Exception as e:
                print "/n[" + t.red("!") + "]Critical. An error was raised with the following message "
                print e
                
        elif option == '5':
            try:
                driver = webdriver.Firefox()
                driver.get("https://riskdiscovery.com/honeydb/#hosts")
            except:
                pass
                
        elif option == '6':
            try:
                driver = webdriver.Firefox()
                driver.get("https://riskdiscovery.com/honeydb/#services")
            except:
                pass
                
        elif option == '7':
            host = raw_input("\n[" + t.green("+") + "]Please enter a host: ")
            try:
                driver = webdriver.Firefox()
                driver.get("https://riskdiscovery.com/honeydb/#host/" + host )
            except:
                pass
                
        elif option == '8':
            break
            
        else:
            print "[" + t.red("!") + "]Unhandled Option."

except KeyboardInterrupt:
    print "[" + t.red("!") + "]Critical. User aborted."            
Reply
#2
I went ahead and posted the source to Github anyway. Please visit the project's official repo by clicking here.
Reply
#3
Ok so i have decided to use PyCurl as well. But my version of PyCurl did not support OpenSSL either. To this end i rebuilt it from source to work with OpenSSL with the help of this script.

Code:
#!/bin/bash

# we will add some colored headers that make it easier to find obstacles
# in the terminal output (which will be > 1000 lines...)
ESC="\x1b["
RESET=$ESC"39;49;00m"
RED=$ESC"31;01m"
GREEN=$ESC"32;01m"
YELLOW=$ESC"33;01m"
BLUE=$ESC"34;01m"

header() {
    echo -e "\n$YELLOW --- $1 --- $RESET\n"
}

echo -e "\n\n$GREEN"
echo -e "\
Build pycurl with openssl support\n\n\
Section numbers refer to\n\
https://gist.github.com/aerickson/f15133a7e56b2d7f27e3
"
echo -e "$RESET\n"



# remove eventually existing pycurl
header "0. remove python-pycurl"
sudo apt-get remove python-pycurl --yes

header "1. install build essentials"
sudo apt-get install build-essential fakeroot dpkg-dev --yes

header "2./3. make build dir"
mkdir ~/python-pycurl-openssl
cd ~/python-pycurl-openssl

if [ ! "$HOME/python-pycurl-openssl" = `pwd` ]; then
    echo -e "\n${RED}Cannot change to working dir. WTF?${RESET}\n"
    exit 1
fi

header "4. get pycurl sources"
sudo apt-get source python-pycurl --yes

header "5. get build dependencies for python-pycurl"
sudo apt-get build-dep python-pycurl --yes

header "6. install libcurl with openssl"
sudo apt-get install libcurl4-openssl-dev --yes

DIR=`find * -name 'pycurl*' -type d -print`
DSC=`find * -name '*.dsc' -type f -print`

echo
echo "DIR = $DIR"
echo "DSC = $DSC"
echo

header "7. unpack source archive"
sudo dpkg-source -x $DSC

header "8. change to package dir"
cd $DIR

header "9. edit debian/control file"
sudo cp debian/control ./control.gnutls
sudo cat ./control.gnutls | sed -e 's|libcurl4-gnutls-dev|libcurl4-openssl-dev|' | sudo tee ./control.openssl >/dev/null
sudo cp ./control.openssl debian/control

header "10. build package"
echo "hold on..."
echo "(crashdump of nosetests is 'normal')"
sudo PYCURL_SSL_LIBRARY=openssl dpkg-buildpackage -rfakeroot -b 2>&1 | sudo tee ../buildlog.txt >/dev/null
echo
echo -e $BLUE
sudo head ../buildlog.txt
echo -e $RESET
echo "   [ ... 1000+ more messages omitted ... ]"
echo -e $BLUE
sudo tail ../buildlog.txt
echo -e $RESET
echo
echo "find more output in ~/python-pycurl-openssl/buildlog.txt:"
wc -l  ../buildlog.txt

header "11. install via package manager"
sudo dpkg -i ../python-pycurl_*.deb

echo
echo "some other packages are available also now:"
ls ../*.deb
echo "they can be installed by 'sudo dpkg -i ../py...' from here."

echo "Disable apt-get update for PyCurl from now on?"
read -p 'Continue? Y/n : ' choice
if [[ $choice == 'y' ]]; then
    sudo apt-mark hold python-pycurl
    echo "PyCurl updates put on hold"
else
    echo "PyCurl updates remain enabled"
fi

I am now able to retrieve the data properly, but PyCurl saves data as a NoneType object in Python which makes formatting a major pain in the ass. the source as is now looks like this.

Code:
#!/usr/bin/env python2.7

import pycurl
import pickle
import os.path, os, sys
import time

from selenium import webdriver
from blessings import Terminal
from ipwhois import IPWhois
from pprint import pprint

t = Terminal()
c = pycurl.Curl()


print t.cyan("""

oooo     oooo ooooo oooo     oooo ooooo oooooooooo  
8888o   888   888   8888o   888   888   888    888
88 888o8 88   888   88 888o8 88   888   888oooo88  
88  888  88   888   88  888  88   888   888  88o  
o88o  8  o88o o888o o88o  8  o88o o888o o888o  88o8


                Threat Intel Interface
                           \n""")


if not os.path.isfile("HDB-api-ID.p"):
    
    print "[" + t.green("+") + "]Please provide your HoneyDB API ID\n"
    DB_API_ID = raw_input("API ID: ")
    
    pickle.dump(DB_API_ID, open( "HDB-api-ID.p", "wb" ))
    
    print "[" + t.green("+") + "]Please provide your HoneyDB API key\n"
    DB_API_KEY = raw_input("API key: ")
    
    pickle.dump(DB_API_KEY, open( "HDB-api-key.p", "wb" ))
    
    print "[" + t.green("+") + "]Your API data has been saved to 'HDB-api-ID.p' and 'HDB-api-key.p' in the current directory.\n"
    
else:
    
    try:
        DB_API_ID = pickle.load(open( "HDB-api-ID.p", "rb" ))
        DB_API_KEY = pickle.load(open( "HDB-api-key.p", "rb" ))
    except IOError as e:
        print "[" + t.red("!") + "]Critical. An IO error was raised while attempting to read API data.\n"
        print e
        
        sys.exit(1)
    
    ID_path = os.path.abspath("HDB-api-ID.p")
    KEY_path = os.path.abspath("HDB-api-key")
    
    print "\n[" + t.green("+") + "]Your API ID was succesfully loaded from " + ID_path
    print "[" + t.green("+") + "]Your API key was succesfully loaded from " + KEY_path
    

def whois():
    print "[" + t.green("+") + "]Please provide an IP for WHOIS lookup."
    TARGET = raw_input("\n<" + t.cyan("WHOIS") + ">$ ")
    
    obj = IPWhois(TARGET)
    results = obj.lookup_rdap(depth=1)
    pprint(results)
    
    print "[" + t.magenta("?") + "]Would you like to append the WHOIS record to a text file?\n"
    logs = raw_input("[Y]es/[N]o: ")
    
    if logs == "y":
        with open( "whois.log", "ab" ) as outfile:
            outfile.write("Host: " + TARGET + "\n")
            outfile.write(pprint(results))
            outfile.close()
            
        print "[" + t.green("+") + "]Results saved to whois.log in the current directory.\n"
            
    elif logs == "n":
        print "[" + t.green("+") + "]Returning to main menu.\n"
        
    else:
        print "[" + t.red("!") + "]Unhandled Option.\n"


opts = ['X-HoneyDb-ApiId: ' + DB_API_ID, 'X-HoneyDb-ApiKey: ' + DB_API_KEY]
c.setopt(pycurl.HTTPHEADER, (opts))
c.setopt(pycurl.FOLLOWLOCATION, 1)

try:
    while True:

                            
        print "\n\n[" + t.green("+") + "]Welcome to Mimir. Please select an action."
        print """
1. Fetch Threat Feed            5. Visualize Top Malicious Hosts in Browser
2. Fetch Bad Host List            6. Visualize Top Targeted Services in Browser
3. Perform WHOIS Lookup            7. Visualize Results for Single Host in Browser
4. Invoke Nmap Scan                8. Quit
        
        """        
        option = raw_input("\n<" + t.cyan("MIMIR") + ">$ ")
        
        if option == '1':
            c.setopt(pycurl.URL, "https://riskdiscovery.com/honeydb/api/twitter-threat-feed")
            feed = c.perform()
            
            os.system("clear")
            print "\n\n[" + t.green("+") + "]Retrieved Threat Feed, formatting..."
            time.sleep(1)
            
            outfile_one = open('feed.txt', 'wb')
            c.setopt(c.WRITEDATA, outfile_one)
            c.perform()
            outfile_one.close()
            
            infile = open('feed.txt', 'r')
            #infile.read()
            
            str_obj = []
            
            for item in infile:
                str_obj.append(item)
            
            format = []
            for x in str_obj:
                x.split(',')
                str_obj.append(format)
            
            print format
            
            print "Results saved to 'feed.log' in the current directory"
            
        elif option =='2':
            c.setopt(pycurl.URL, "https://riskdiscovery.com/honeydb/api/bad-hosts")
            hosts = c.perform()
            
            with open( "hosts.log", "ab" ) as outfile:
                outfile.write(hosts)
                    
            outfile.close()
                    
            print "Results saved to 'hosts.log' in the current directory"
            
        elif option == '3':
            whois()
        
        elif option == '4':
            host = raw_input("\n[" + t.green("+") + "]Please enter a target to scan: ")
            try:
                os.system("nmap -T4 -Pn --reason " + host)
            except Exception as e:
                print "/n[" + t.red("!") + "]Critical. An error was raised with the following message "
                print e
                
        elif option == '5':
            try:
                driver = webdriver.Firefox()
                driver.get("https://riskdiscovery.com/honeydb/#hosts")
            except:
                pass
                
        elif option == '6':
            try:
                driver = webdriver.Firefox()
                driver.get("https://riskdiscovery.com/honeydb/#services")
            except:
                pass
                
        elif option == '7':
            host = raw_input("\n[" + t.green("+") + "]Please enter a host: ")
            try:
                driver = webdriver.Firefox()
                driver.get("https://riskdiscovery.com/honeydb/#host/" + host )
            except:
                pass
                
        elif option == '8':
            break
            
        else:
            print "[" + t.red("!") + "]Unhandled Option."

except KeyboardInterrupt:
    print "[" + t.red("!") + "]Critical. User aborted."
Reply
#4
It took a while but everything seems to be in order. Functional BETA release below and on github

Code:
#!/usr/bin/env python2.7

import pycurl
import pickle
import os.path, os, sys
import time
import StringIO
import json

from selenium import webdriver
from blessings import Terminal
from ipwhois import IPWhois
from pprint import pprint

t = Terminal()
c = pycurl.Curl()


print t.cyan("""

oooo     oooo ooooo oooo     oooo ooooo oooooooooo  
8888o   888   888   8888o   888   888   888    888
88 888o8 88   888   88 888o8 88   888   888oooo88  
88  888  88   888   88  888  88   888   888  88o  
o88o  8  o88o o888o o88o  8  o88o o888o o888o  88o8


                Threat Intel Interface
                           \n""")


# Check if we have API ID/key saved
if not os.path.isfile("HDB-api-ID.p"):
    
    print "[" + t.green("+") + "]Please provide your HoneyDB API ID\n"
    DB_API_ID = raw_input("API ID: ")
    
    pickle.dump(DB_API_ID, open( "HDB-api-ID.p", "wb" ))
    
    print "[" + t.green("+") + "]Please provide your HoneyDB API key\n"
    DB_API_KEY = raw_input("API key: ")
    
    pickle.dump(DB_API_KEY, open( "HDB-api-key.p", "wb" ))
    
    print "[" + t.green("+") + "]Your API data has been saved to 'HDB-api-ID.p' and 'HDB-api-key.p' in the current directory.\n"
    
else:
    
    try:
        DB_API_ID = pickle.load(open( "HDB-api-ID.p", "rb" ))
        DB_API_KEY = pickle.load(open( "HDB-api-key.p", "rb" ))
    except IOError as e:
        print "\n[" + t.red("!") + "]Critical. An IO error was raised while attempting to read API data.\n"
        print e
        
        sys.exit(1)
    
    ID_path = os.path.abspath("HDB-api-ID.p")
    KEY_path = os.path.abspath("HDB-api-key.p")
    
    print "\n[" + t.green("+") + "]Your API ID was succesfully loaded from " + ID_path
    print "[" + t.green("+") + "]Your API key was succesfully loaded from " + KEY_path


# WHOIS function
def whois():
    print "[" + t.green("+") + "]Please provide an IP for WHOIS lookup."
    TARGET = raw_input("\n<" + t.cyan("WHOIS") + ">$ ")
    
    obj = IPWhois(TARGET)
    results = obj.lookup_rdap(depth=1)
    pprint(results)
    
    print "\n[" + t.magenta("?") + "]Would you like to append the WHOIS record to a text file?\n"
    logs = raw_input("[Y]es/[N]o: ")
    
    format = json.dumps(results, indent = 2)
    
    if logs == "y":
        with open( "whois.log", "ab" ) as outfile:
            outfile.write("Host: " + TARGET + "\n")
            outfile.write(format)
            outfile.close()
            
        print "[" + t.green("+") + "]Results saved to whois.log in the current directory.\n"
            
    elif logs == "n":
        print "[" + t.green("+") + "]Returning to main menu.\n"
        
    else:
        print "[" + t.red("!") + "]Unhandled Option.\n"

def hosts():
    a = StringIO.StringIO()
    
    # Options for PyCurl
    opts = ['X-HoneyDb-ApiId: ' + DB_API_ID, 'X-HoneyDb-ApiKey: ' + DB_API_KEY]
    c.setopt(pycurl.HTTPHEADER, (opts))
    c.setopt(pycurl.FOLLOWLOCATION, 1)
    
    c.setopt(pycurl.URL, "https://riskdiscovery.com/honeydb/api/bad-hosts")
    c.setopt(c.WRITEDATA, a)
    c.perform()
            
            
    os.system("clear")
    print "\n\n[" + t.green("+") + "]Retrieved Threat Feed, formatting..."
    time.sleep(1)
            
    response_h = json.loads(a. getvalue())
    pprint(response_h)
            
    format = json.dumps(response_h, indent = 2)

    with open('hosts.log', 'ab') as outfile:
        outfile.write(format)
        outfile.close()
                
    print "\n\nResults saved to 'hosts.log' in the current directory"

def feed():
    b = StringIO.StringIO()
    
    # Options for PyCurl
    opts = ['X-HoneyDb-ApiId: ' + DB_API_ID, 'X-HoneyDb-ApiKey: ' + DB_API_KEY]
    c.setopt(pycurl.HTTPHEADER, (opts))
    c.setopt(pycurl.FOLLOWLOCATION, 1)
            
    c.setopt(pycurl.URL, "https://riskdiscovery.com/honeydb/api/twitter-threat-feed")
    c.setopt(c.WRITEDATA, b)
    c.perform()
            
    os.system("clear")
    print "\n\n[" + t.green("+") + "]Retrieved Threat Feed, formatting..."
    time.sleep(1)
            
    response_f = json.loads(b. getvalue())
    pprint(response_f)
            
    format = json.dumps(response_f, indent = 2)

    with open('feed.log', 'ab') as outfile:
        outfile.write(format)
        outfile.close()
        
    
    print "\n\nResults saved to 'feed.log' in the current directory"

try:
    while True:

                            
        print "\n\n[" + t.green("+") + "]Welcome to Mimir. Please select an action."
        print """
1. Fetch Threat Feed            5. Visualize Top Malicious Hosts in Browser
2. Fetch Bad Host List            6. Visualize Top Targeted Services in Browser
3. Perform WHOIS Lookup            7. Visualize Results for Single Host in Browser
4. Invoke Nmap Scan                8. Quit
        
        """        
        option = raw_input("\n<" + t.cyan("MIMIR") + ">$ ")
        
        if option == '1':
            feed()
            
        elif option =='2':
            hosts()
            
        elif option == '3':
            whois()
        
        elif option == '4':
            host = raw_input("\n[" + t.green("+") + "]Please enter a target to scan: ")
            try:
                os.system("nmap -T4 -Pn --reason " + host)
            except Exception as e:
                print "\n[" + t.red("!") + "]Critical. An error was raised with the following message "
                print e
                
        elif option == '5':
            try:
                driver = webdriver.Firefox()
                driver.get("https://riskdiscovery.com/honeydb/#hosts")
            except:
                pass
                
        elif option == '6':
            try:
                driver = webdriver.Firefox()
                driver.get("https://riskdiscovery.com/honeydb/#services")
            except:
                pass
                
        elif option == '7':
            host = raw_input("\n[" + t.green("+") + "]Please enter a host: ")
            try:
                driver = webdriver.Firefox()
                driver.get("https://riskdiscovery.com/honeydb/#host/" + host )
            except:
                pass
                
        elif option == '8':
            break
            
        else:
            print "\n[" + t.red("!") + "]Unhandled Option."

except KeyboardInterrupt:
    print "\n\n[" + t.red("!") + "]Critical. User aborted."
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Welcome to the GS Development section. Apply here to join the Dev Team! Vector 20 30,066 07-16-2020, 08:36 PM
Last Post: Vector
  Active Development: Cypher Ransomware. Vector 31 25,904 05-12-2020, 01:13 AM
Last Post: DeepLogic