Browse Source

release v1.8 - DarK-PhAnT0m

psy 2 years ago
parent
commit
ae53d47454
20 changed files with 1033 additions and 149 deletions
  1. 1 1
      Makefile
  2. 5 5
      README.md
  3. 559 19
      core/main.py
  4. 30 4
      core/options.py
  5. 4 1
      core/tools/blackhole.py
  6. 5 1
      core/tools/grider.py
  7. 23 1
      core/txt/misc.txt
  8. 1 1
      core/txt/model.txt
  9. 9 0
      core/txt/motherships.txt
  10. 257 55
      core/txt/user-agents.txt
  11. 112 48
      core/webgui.py
  12. 0 0
      data/nodes.txt
  13. 2 1
      docs/AUTHOR
  14. 1 1
      docs/FAQ.html
  15. 10 4
      docs/LEEME.txt
  16. 9 3
      docs/README.txt
  17. 1 0
      docs/VERSION
  18. 1 1
      docs/release.date
  19. 2 2
      setup.py
  20. 1 1
      ufonet

+ 1 - 1
Makefile

@@ -2,7 +2,7 @@ PYTHON=`which python`
 DESTDIR=/
 BUILDIR=$(CURDIR)/debian/ufonet
 PROJECT=ufonet
-VERSION=1.7
+VERSION=1.8
 
 all:
 	@echo "make source - Create source package"

+ 5 - 5
README.md

@@ -134,17 +134,17 @@ in the [LICENSE](./docs/LICENSE) file.
 
 ####  Screenshots (current version!):
 
-  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-kraken-shell-1.png "UFONet Shell Version")
+  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-phantom-shell-1.png "UFONet Shell Version")
 
-  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-kraken-shell-2.png "UFONet Shell Board")
+  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-phantom-shell-2.png "UFONet Shell Board")
 
-  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-kraken-shell-3.png "UFONet GUI Shell")
+  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-phantom-shell-3.png "UFONet GUI Shell")
 
-  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-kraken-main_small.png "UFONet GUI Main Panel")
+  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-phantom-main_small.png "UFONet GUI Main Panel")
 
   ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-kraken-help_small.png "UFONet GUI Help")
 
-  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-kraken-botnet.png "UFONet GUI Botnet")
+  ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-phantom-botnet.png "UFONet GUI Botnet")
 
   ![UFONet](https://ufonet.03c8.net/ufonet/ufonet-kraken-stats.png "UFONet GUI General Stats")
 

+ 559 - 19
core/main.py

@@ -3,7 +3,7 @@
 """
 This file is part of the UFONet project, https://ufonet.03c8.net
 
-Copyright (c) 2013/2021 | psy <epsylon@riseup.net>
+Copyright (c) 2013/2022 | psy <epsylon@riseup.net>
 
 You should have received a copy of the GNU General Public License along
 with UFONet; if not, write to the Free Software Foundation, Inc., 51
@@ -11,6 +11,8 @@ Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 """
 import os, sys, re, traceback, random, time, threading, base64, string, math
 import io, socket, ssl, cgi, json, gzip
+from Crypto.Cipher import AES
+from hashlib import sha1, sha256
 try:
     from urllib.parse import urlparse as urlparse
 except:
@@ -54,6 +56,7 @@ class UFONet(object):
     def __init__(self):
         self.exit_msg = 'Donate BTC (Bitcoin) to keep UFONet (https://ufonet.03c8.net) strong!' # set msg show at the end [FILO ;-)]
         self.blackhole = '46.163.118.220' # default download/upload zombies [Blackhole] [Server] / Try [DIY] your own [Mirror]...
+        self.crypto_key = "U-NATi0n!" # default cryptkey
         self.GIT_REPOSITORY = 'https://code.03c8.net/epsylon/ufonet' # oficial code source [OK! 22/12/2018]
         self.GIT_REPOSITORY2 = 'https://github.com/epsylon/ufonet' # mirror source [since: 04/06/2018]
         self.github_zombies = 'https://raw.githubusercontent.com/epsylon/ufonet/master/botnet/' # default [RAW] download/upload zombies [Blackhole] [GitHub] [DIY]
@@ -80,6 +83,7 @@ class UFONet(object):
         self.links_file = "data/links.txt" # set source path to retrieve [Blackhole] [Links]
         self.streams_file = "data/streams.txt" # set source path to retrieve [Blackhole] [Streams]
         self.globalnet_file = "data/globalnet.txt" # set source path to retrieve [Blackhole] [Globalnet]
+        self.nodes_file = "data/nodes.txt" # set source path to retrieve [Blackhole] [Community] [Nodes]
         self.news_file = "data/news.txt" # set source path to retrieve [Blackhole] [News]
         self.tv_file = "data/tv.txt" # set source path to retrieve [Blackhole] [TV]
         self.missions_file = "data/missions.txt" # set source path to retrieve [Blackhole] [Missions]
@@ -165,6 +169,11 @@ class UFONet(object):
         self.expire_timing = 30 # default expiring time per round
         self.extra_zombies_lock = False # used to lock threading flow when [ARMY] is required
         self.ac_control = [] # used by 'herd.py' to lock threading flow when [Zombies] are returning
+        self.globalnet_msg_sep = "#$#" # globalnet stream separator
+        self.trans_5C = ''.join([chr (x ^ 0x5c) for x in range(256)])
+        self.trans_36 = ''.join([chr (x ^ 0x36) for x in range(256)])
+        self.trans_5C = self.trans_5C.encode("latin-1")
+        self.trans_36 = self.trans_36.encode("latin-1")
 
     def mothership_baptism(self):
         if os.path.exists(self.mothershipname) == True:
@@ -208,19 +217,19 @@ class UFONet(object):
         print("        -(00)-     + (XX) +   -(00)-            ||                                             ||")
         print("   ||     ||   O ==*~~~~~~*== 0 ||        ||    ||  > Botnet [DDoS]   #  > Close Combat [DoS]  ||")
         print(" -(00)-          (0)  XX  (0)           -(00)-  ||                                             ||")
-        print("   ||             \| (00) |/              ||    ||     |-> ZOMBIES    #     |-> LOIC           ||")
+        print("   ||    _     _  \| (00) |/  _     _     ||    ||     |-> ZOMBIES    #     |-> LOIC           ||")
         print("        (O)_  (O)  0'----'0  (O)  _(O)          ||     |-> DROIDS     #     |-> LORIS          ||")   
         print("            |  |.''.( xx ).''.|  |              ||     |-> ALIENS     #     |-> UFOSYN         ||")
-        print("            .'.'   X|'..'|X   '.'.              ||     |-> UCAVs      #     |-> XMAS           ||")
+        print("            .'.'  +X|'..'|X+  '.'.              ||     |-> UCAVs      #     |-> XMAS           ||")
         print("     .-.  .' /'--.__|_00_|__.--'\ '.  .-.       ||     |-> X-RPCs     #     |-> NUKE           ||")
-        print("    (O).)-|0|  \   x| ## |x   /  |0|-(.(O)      ||     |-> DBSTRESS   #     |-> UFOACK         ||")
+        print("   +(O).)-|0|  \   x| ## |x   /  |0|-(.(O)+     ||     |-> DBSTRESS   #     |-> UFOACK         ||")
         print("     `-'  '-'-._'-./ -00- \.-'_.-'-'  `-'       ||     |-> SPRAY      #     |-> UFORST         ||")
         print("        _ | ||  '-.___||___.-'  || | _          ||     |-> SMURF      #     |-> DROPER         ||")
         print("     .' _ | ||==O |   __   | O==|| | _ '.       ||     |-> TACHYON    #     |-> OVERLAP        ||")
         print("    / .' ''.|  || | /_00_\ | ||  |.'' '. \      ||     |-> MONLIST    #     |-> PINGER         ||")
-        print("    | '###  |  =| | ###### | |=  |' ###  |      ||     |-> FRAGGLE    #     |-> UFOUDP         ||")
-        print("    | |(0)| '.  0\||__**_ ||/0  .' |(0)| |      ||     |-> SNIPER     #                        ||")
-        print("    \ '._.'   '.  | \_##_/ |  .'   '._.' /      ||                                             ||")
+        print(" _  | '###  |  =| | ###### | |=  |' ###  |  _   ||     |-> FRAGGLE    #     |-> UFOUDP         ||")
+        print("(0)-| |(0)| '.  0\||__**_ ||/0  .' |(0)| |-(0)  ||     |-> SNIPER     #                        ||")
+        print(" *  \ '._.'   '.  | \_##_/ |  .'   '._.' /  *   ||                                             ||")
         print("     '.__ ____0_'.|__'--'__|.'_0____ __.'       #|=============================================|#")
         print("    .'_.-|            YY            |-._'.      ||                                             ||")
         print("                                                ||  -> [ UFONet: https://ufonet.03c8.net ] <-  ||") 
@@ -342,6 +351,59 @@ class UFONet(object):
         self.update_max_chargo(int(chargo)) # update max chargo stats
         self.generate_exit_msg() # generate random exit msg
 
+    def hmac_sha1(self, key, msg):
+        if len(key) > 20:
+            key = sha1(key).digest()
+        key += chr(0).encode('utf-8') * (20 - len(key))
+        o_key_pad = key.translate(self.trans_5C)
+        i_key_pad = key.translate(self.trans_36)
+        return sha1(o_key_pad + sha1(i_key_pad + msg).digest()).digest()
+
+    def derive_keys(self, key):
+        key = key.encode('utf-8')
+        h = sha256()
+        h.update(key)
+        h.update('cipher'.encode('utf-8'))
+        cipher_key = h.digest()
+        h = sha256()
+        h.update(key)
+        h.update('mac'.encode('utf-8'))
+        mac_key = h.digest()
+        return (cipher_key, mac_key)
+
+    def decrypt(self, key, text):
+        KEY_SIZE = 32
+        BLOCK_SIZE = 16
+        MAC_SIZE = 20
+        mode = AES.MODE_CFB
+        try:
+            iv_ciphertext_mac = base64.urlsafe_b64decode(text)
+        except:
+            try:
+                padding = len(text) % 4
+                if padding == 1:
+                    return ''
+                elif padding == 2:
+                    text += b'=='
+                elif padding == 3:
+                    text += b'='
+                iv_ciphertext_mac = base64.urlsafe_b64decode(text)
+            except TypeError:
+                return None
+        iv = iv_ciphertext_mac[:BLOCK_SIZE]
+        ciphertext = iv_ciphertext_mac[BLOCK_SIZE:-MAC_SIZE]
+        mac = iv_ciphertext_mac[-MAC_SIZE:]
+        (cipher_key, mac_key) = self.derive_keys(key)
+        expected_mac = self.hmac_sha1(mac_key, iv + ciphertext)
+        if mac != expected_mac:
+            return None
+        aes = AES.new(cipher_key, mode, iv)
+        self.decryptedtext = aes.decrypt(ciphertext)
+        try:
+            self.decryptedtext = self.decryptedtext.decode('utf-8')
+        except:
+            pass
+
     def run(self, opts=None):
         if opts:
             self.create_options(opts)
@@ -1334,7 +1396,7 @@ class UFONet(object):
                     os.makedirs(np)
                     print("[AI] Created folder at: '"+self.warping_path+"'\n")
                 else:
-                    print("[AI] Path to folder: '"+self.warping_path+"' exists! -> [PASSING!]\n")
+                    print("[AI] Path to folder: '"+self.warping_path+"' exists! -> [Passing!]\n")
                 from pathlib import Path # import pathlib
                 import shutil # import shutil
                 src = 'data/'
@@ -1493,6 +1555,17 @@ class UFONet(object):
             options.upload = True
             self.blackhole = options.upip
 
+        # download list of [Zombies] from Community nodes (Radar) [02/02/2022 OK!]
+        if options.download_nodes:
+            try:
+                self.banner()
+                print("\n[AI] Downloading list of [Zombies] from [Radar] [Blackhole] [Nodes] ...\n")
+                print('='*22 + '\n')
+                download_nodes_list = self.downloading_nodes_list()
+            except Exception as e:
+                print ("[Error] [AI] Something wrong downloading! -> [Exiting!]\n")
+                return
+
         # download list of [Zombies] from Community server [20/01/2020 OK!]
         if options.download:
             try:
@@ -1638,7 +1711,43 @@ class UFONet(object):
             self.list_rpcs.append(name_rpc)
         self.num_rpcs = str(len(self.rpcs))
         f.close()
-        self.total_botnet = str(int(self.num_zombies) + int(self.num_aliens) + int(self.num_droids) + int(self.num_ucavs) + int(self.num_rpcs))
+        f = open(self.dnss_file)
+        self.dnss = f.readlines()
+        self.dnss = [dns.replace('\n', '') for dns in self.dnss]
+        self.list_dnss = []
+        for dns in self.dnss:
+            t = urlparse(dns)
+            name_dns = t.netloc
+            if name_dns == "":
+                name_dns = dns
+            self.list_dnss.append(name_dns)
+        self.num_dnss = str(len(self.dnss))
+        f.close()
+        f = open(self.ntps_file)
+        self.ntps = f.readlines()
+        self.ntps = [ntp.replace('\n', '') for ntp in self.ntps]
+        self.list_ntps = []
+        for ntp in self.ntps:
+            t = urlparse(ntp)
+            name_ntp = t.netloc
+            if name_ntp == "":
+                name_ntp = ntp
+            self.list_ntps.append(name_ntp)
+        self.num_ntps = str(len(self.ntps))
+        f.close()
+        f = open(self.snmps_file)
+        self.snmps = f.readlines()
+        self.snmps = [snmp.replace('\n', '') for snmp in self.snmps]
+        self.list_snmps = []
+        for snmp in self.snmps:
+            t = urlparse(snmp)
+            name_snmp = t.netloc
+            if name_snmp == "":
+                name_snmp = snmp
+            self.list_snmps.append(name_snmp)
+        self.num_snmps = str(len(self.snmps))
+        f.close()
+        self.total_botnet = str(int(self.num_zombies) + int(self.num_aliens) + int(self.num_droids) + int(self.num_ucavs) + int(self.num_rpcs) + int(self.num_dnss) + int(self.num_ntps) + int(self.num_snmps))
         return self.total_botnet
 
     def update_flying_stats(self):
@@ -2466,6 +2575,8 @@ class UFONet(object):
             streams_reply = urllib.request.urlopen(streams, context=self.ctx, timeout=timeout).read().decode('utf-8')
             globalnet = urllib.request.Request('https://'+self.blackhole+'/ufonet/globalnet.txt', None, headers)
             globalnet_reply = urllib.request.urlopen(globalnet, context=self.ctx, timeout=timeout).read().decode('utf-8')
+            nodes = urllib.request.Request('https://'+self.blackhole+'/ufonet/nodes.txt', None, headers)
+            nodes_reply = urllib.request.urlopen(nodes, context=self.ctx, timeout=timeout).read().decode('utf-8')
         else:
             news = urllib.request.Request('http://'+self.blackhole+'/ufonet/news.txt', None, headers)
             news_reply = urllib.request.urlopen(news, context=self.ctx).read().decode('utf-8')
@@ -2485,6 +2596,8 @@ class UFONet(object):
             streams_reply = urllib.request.urlopen(streams, context=self.ctx).read().decode('utf-8')
             globalnet = urllib.request.Request('http://'+self.blackhole+'/ufonet/globalnet.txt', None, headers)
             globalnet_reply = urllib.request.urlopen(globalnet, context=self.ctx).read().decode('utf-8')
+            nodes = urllib.request.Request('http://'+self.blackhole+'/ufonet/nodes.txt', None, headers)
+            nodes_reply = urllib.request.urlopen(nodes, context=self.ctx).read().decode('utf-8')
         f = open(self.news_file, 'w')
         f.write(news_reply)
         f.close()
@@ -2512,6 +2625,9 @@ class UFONet(object):
         f = open(self.globalnet_file, 'w')
         f.write(globalnet_reply)
         f.close()
+        f = open(self.nodes_file, 'w')
+        f.write(nodes_reply)
+        f.close()
         print('-'*25 + "\n")
         print("[Info] [AI] GUI data correctly updated:\n")
         if news_reply:
@@ -2532,6 +2648,8 @@ class UFONet(object):
             print("[Info] [AI] [TV]       : OK!")
         if globalnet_reply:
             print("[Info] [AI] [GlobalNet]: OK!")
+        if nodes_reply:
+            print("[Info] [AI] [Nodes]    : OK!")
         print('-'*25)
         print("\n[AI] "+self.exit_msg+"\n")
 
@@ -2919,10 +3037,432 @@ class UFONet(object):
                     print("\n[AI] "+self.exit_msg+"\n")
                     return
 
+    def downloading_nodes_list(self):
+        # add your node to protect/share/distribute... [Zombies]
+        from io import BytesIO
+        self.user_agent = random.choice(self.agents).strip() # shuffle user-agent
+        headers = {'User-Agent' : self.user_agent, 'Referer' : self.referer} # set fake user-agent and referer
+        n = open(self.globalnet_file, 'r')
+        nodes = n.readlines()
+        n.close()
+        if not nodes:
+            print("[AI] [Control] Not any [Nodes] present in your [Radar]... [Exiting!]\n")
+            return
+        globalnet_list = []
+        if self.options.timeout: # set timeout
+            try:
+                timeout = int(self.options.timeout)
+            except:
+                timeout = 5
+        else:
+            timeout = 5
+        if timeout < 1:
+            timeout = 5 
+        if self.options.proxy: # set proxy
+            self.proxy_transport(self.options.proxy)
+        for m in nodes:
+            m = m.replace('\n','')
+            if self.globalnet_msg_sep in m:
+                m = m.split(self.globalnet_msg_sep)
+                enc_globalnet_owner = m[0] # owner
+                enc_globalnet_comment = m[1] # comment
+                enc_globalnet_warp = m[2] # warp
+                enc_globalnet_ip = m[3] # extract IP
+                self.decrypt(self.crypto_key, enc_globalnet_ip)
+                if self.decryptedtext:
+                    globalnet_ip = self.decryptedtext
+                self.decryptedtext = "" # clean decryptedtext buffer
+                print("[AI] Trying [Radar] [Blackhole] [Node]:", globalnet_ip, "\n")
+                if self.options.forcessl:
+                    if self.options.proxy: # set proxy
+                        self.proxy_transport(options.proxy)
+                    try:
+                        req = urllib.request.Request('https://'+globalnet_ip+'/ufonet/abductions.txt.gz', None, headers)
+                        abductions_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()
+                    except:
+                        abductions_reply = ""
+                    try:
+                        req = urllib.request.Request('https://'+globalnet_ip+'/ufonet/troops.txt.gz', None, headers)
+                        troops_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()
+                    except:
+                        troops_reply = ""
+                    try:
+                        req = urllib.request.Request('https://'+globalnet_ip+'/ufonet/robots.txt.gz', None, headers)
+                        robots_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()
+                    except:
+                        robots_reply = ""
+                    try:
+                        req = urllib.request.Request('https://'+globalnet_ip+'/ufonet/drones.txt.gz', None, headers)
+                        drones_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()
+                    except:
+                        drones_reply = ""
+                    try:
+                        req = urllib.request.Request('https://'+globalnet_ip+'/ufonet/reflectors.txt.gz', None, headers)
+                        reflectors_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()
+                    except:
+                        reflectors_reply = ""
+                    try:
+                        req = urllib.request.Request('https://'+globalnet_ip+'/ufonet/crystals.txt.gz', None, headers)
+                        crystals_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()
+                    except:
+                        crystals_reply = ""
+                    try:
+                        req = urllib.request.Request('https://'+globalnet_ip+'/ufonet/warps.txt.gz', None, headers)
+                        warps_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()
+                    except:
+                        warps_reply = ""
+                    try:
+                        req = urllib.request.Request('https://'+globalnet_ip+'/ufonet/bosons.txt.gz', None, headers)
+                        bosons_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()
+                    except:
+                        bosons_reply = ""
+                else:
+                    if self.options.proxy: # set proxy
+                        self.proxy_transport(options.proxy)
+                    try:
+                        req = urllib.request.Request('http://'+globalnet_ip+'/ufonet/abductions.txt.gz', None, headers)
+                        abductions_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()
+                    except:
+                        abductions_reply = ""
+                    try:
+                        req = urllib.request.Request('http://'+globalnet_ip+'/ufonet/troops.txt.gz', None, headers)
+                        troops_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()
+                    except:
+                        troops_reply = ""
+                    try:
+                        req = urllib.request.Request('http://'+globalnet_ip+'/ufonet/robots.txt.gz', None, headers)
+                        robots_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()
+                    except:
+                        robots_reply = ""
+                    try:
+                        req = urllib.request.Request('http://'+globalnet_ip+'/ufonet/drones.txt.gz', None, headers)
+                        drones_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()
+                    except:
+                        drones_reply = ""
+                    try:
+                        req = urllib.request.Request('http://'+globalnet_ip+'/ufonet/reflectors.txt.gz', None, headers)
+                        reflectors_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()
+                    except:
+                        reflectors_reply = ""
+                    try:
+                        req = urllib.request.Request('http://'+globalnet_ip+'/ufonet/crystals.txt.gz', None, headers)
+                        crystals_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()
+                    except:
+                        crystals_reply = ""
+                    try:
+                        req = urllib.request.Request('http://'+globalnet_ip+'/ufonet/warps.txt.gz', None, headers)
+                        warps_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()
+                    except:
+                        warps_reply = ""
+                    try:
+                        req = urllib.request.Request('http://'+globalnet_ip+'/ufonet/bosons.txt.gz', None, headers)
+                        bosons_reply = urllib.request.urlopen(req, context=self.ctx, timeout=timeout).read()
+                    except:
+                        bosons_reply = ""
+            if abductions_reply == "" and troops_reply == "" and robots_reply == "" and drones_reply == "" and reflectors_reply == "" and crystals_reply == "" and warps_reply == "" and bosons_reply == "":
+                print("[AI] [Radar] [Blackhole] [Node] Reply: [VORTEX FAILED!]\n")
+                print("[AI] [Control] [Radar] [Blackhole] [Node] Action: [Removing!]")
+                print('-'*12 + '\n')
+            else:
+                print("[AI] [Radar] [Blackhole] [Node] Reply: [VORTEX READY!] ;-)")
+                print('-'*12)
+                num_zombies = 0
+                if abductions_reply is not "":
+                    f_in_abductions = gzip.open(BytesIO(abductions_reply), 'rb')
+                    f_out_abductions = open('botnet/abductions.txt', 'wb')
+                    f_out_abductions.write(f_in_abductions.read())
+                    f_in_abductions.close()
+                    f_out_abductions.close()
+                    with open('botnet/abductions.txt') as f:
+                        for _ in f:
+                            num_zombies = num_zombies + 1
+                print("\n[Info] [Radar] [Blackhole] Total [Zombies]: "+ str(num_zombies))
+                num_robots = 0
+                if robots_reply is not "":
+                    f_in_robots = gzip.open(BytesIO(robots_reply), 'rb')
+                    f_out_robots = open('botnet/robots.txt', 'wb')
+                    f_out_robots.write(f_in_robots.read())
+                    f_in_robots.close()
+                    f_out_robots.close()
+                    with open('botnet/robots.txt') as f:
+                        for _ in f:
+                            num_robots = num_robots + 1
+                print("[Info] [Radar] [Blackhole] Total [Droids] : "+ str(num_robots))
+                num_aliens = 0
+                if troops_reply is not "":
+                    f_in_troops = gzip.open(BytesIO(troops_reply), 'rb')
+                    f_out_troops = open('botnet/troops.txt', 'wb')
+                    f_out_troops.write(f_in_troops.read())
+                    f_in_troops.close()
+                    f_out_troops.close()
+                    with open('botnet/troops.txt') as f:
+                        for _ in f:
+                            num_aliens = num_aliens + 1
+                print("[Info] [Radar] [Blackhole] Total [Aliens] : "+ str(num_aliens))
+                num_drones = 0
+                if drones_reply is not "":
+                    f_in_drones = gzip.open(BytesIO(drones_reply), 'rb')
+                    f_out_drones = open('botnet/drones.txt', 'wb')
+                    f_out_drones.write(f_in_drones.read())
+                    f_in_drones.close()
+                    f_out_drones.close()
+                    with open('botnet/drones.txt') as f:
+                        for _ in f:
+                            num_drones = num_drones + 1
+                print("[Info] [Radar] [Blackhole] Total [UCAVs]  : "+ str(num_drones))
+                num_reflectors = 0
+                if reflectors_reply is not "":
+                    f_in_reflectors = gzip.open(BytesIO(reflectors_reply), 'rb')
+                    f_out_reflectors = open('botnet/reflectors.txt', 'wb')
+                    f_out_reflectors.write(f_in_reflectors.read())
+                    f_in_reflectors.close()
+                    f_out_reflectors.close()
+                    with open('botnet/reflectors.txt') as f:
+                        for _ in f:
+                            num_reflectors = num_reflectors + 1
+                print("[Info] [Radar] [Blackhole] Total [X-RPCs] : "+ str(num_reflectors))
+                num_crystals = 1 # black magic!
+                if crystals_reply is not "":
+                    f_in_crystals = gzip.open(BytesIO(crystals_reply), 'rb')
+                    f_out_crystals = open('botnet/crystals.txt', 'wb')
+                    f_out_crystals.write(f_in_crystals.read())
+                    f_in_crystals.close()
+                    f_out_crystals.close()
+                    with open('botnet/crystals.txt') as f:
+                        for _ in f:
+                            num_crystals = num_crystals + 1
+                print("[Info] [Radar] [Blackhole] Total [NTPs]   : "+ str(num_crystals))
+                num_warps = 1 # black magic!
+                if warps_reply is not "":
+                    f_in_warps = gzip.open(BytesIO(warps_reply), 'rb')
+                    f_out_warps = open('botnet/warps.txt', 'wb')
+                    f_out_warps.write(f_in_warps.read())
+                    f_in_warps.close()
+                    f_out_warps.close()
+                    with open('botnet/warps.txt') as f:
+                        for _ in f:
+                            num_warps = num_warps + 1
+                print("[Info] [Radar] [Blackhole] Total [DNSs]   : "+ str(num_warps))
+                num_bosons = 0
+                if bosons_reply is not "":
+                    f_in_bosons = gzip.open(BytesIO(bosons_reply), 'rb')
+                    f_out_bosons = open('botnet/bosons.txt', 'wb')
+                    f_out_bosons.write(f_in_bosons.read())
+                    f_in_bosons.close()
+                    f_out_bosons.close()
+                    with open('botnet/bosons.txt') as f:
+                        for _ in f:
+                            num_bosons = num_bosons + 1
+                print("[Info] [Radar] [Blackhole] Total [SNMPs]  : "+ str(num_bosons))
+                print('-'*12 + '\n')
+                zombies = self.extract_zombies()
+                if not zombies:
+                    return
+                zombies_added = 0
+                if os.path.isfile('botnet/abductions.txt'):
+                    f = open('botnet/abductions.txt')
+                    abductions = f.readlines()
+                    abductions = [abduction.strip() for abduction in abductions]
+                    f.close()
+                    fz = open(self.zombies_file)
+                    zombies = fz.readlines()
+                    zombies = [zombie.strip() for zombie in zombies]
+                    fz.close()
+                    az = open('botnet/zombies.txt', 'a')
+                    for abduction in abductions:
+                        if abduction not in zombies:
+                            zombies_added = zombies_added + 1
+                            az.write(abduction+os.linesep)
+                        else:
+                            pass
+                    az.close()
+                    os.remove('botnet/abductions.txt') # remove abductions file
+                print("[Info] [Radar] [Blackhole] Added [Zombies]: " + str(zombies_added))
+                droids = self.extract_droids()
+                if not droids:
+                    return
+                droids_added = 0
+                if os.path.isfile('botnet/robots.txt'):
+                    f = open('botnet/robots.txt')
+                    robots = f.readlines()
+                    robots = [robot.strip() for robot in robots]
+                    f.close()
+                    fz = open(self.droids_file)
+                    droids = fz.readlines()
+                    droids = [droid.strip() for droid in droids]
+                    fz.close()
+                    ad = open('botnet/droids.txt', 'a')
+                    for robot in robots:
+                        if robot not in droids:
+                            droids_added = droids_added + 1
+                            ad.write(robot+os.linesep)
+                        else:
+                            pass
+                    ad.close()
+                    os.remove('botnet/robots.txt') # remove robots file
+                print("[Info] [Radar] [Blackhole] Added [Droids] : " + str(droids_added))
+                aliens = self.extract_aliens()
+                if not aliens:
+                    return
+                aliens_added = 0
+                if os.path.isfile('botnet/troops.txt'):
+                    f = open('botnet/troops.txt')
+                    troops = f.readlines()
+                    troops = [troop.strip() for troop in troops]
+                    f.close()
+                    fz = open(self.aliens_file)
+                    aliens = fz.readlines()
+                    aliens = [alien.strip() for alien in aliens]
+                    fz.close()
+                    at = open('botnet/aliens.txt', 'a')
+                    for troop in troops:
+                        if troop not in aliens:
+                            aliens_added = aliens_added + 1
+                            at.write(troop+os.linesep)
+                        else:
+                            pass
+                    at.close()
+                    os.remove('botnet/troops.txt') # remove troops file
+                print("[Info] [Radar] [Blackhole] Added [Aliens] : " + str(aliens_added))
+                ucavs = self.extract_ucavs()
+                if not ucavs:
+                    return
+                ucavs_added = 0
+                if os.path.isfile('botnet/drones.txt'):
+                    f = open('botnet/drones.txt')
+                    drones = f.readlines()
+                    drones = [drone.strip() for drone in drones]
+                    f.close()
+                    fz = open(self.ucavs_file)
+                    ucavs = fz.readlines()
+                    ucavs = [ucav.strip() for ucav in ucavs]
+                    fz.close()
+                    au = open('botnet/ucavs.txt', 'a')
+                    for drone in drones:
+                        if drone not in ucavs:
+                            ucavs_added = ucavs_added + 1
+                            au.write(drone+os.linesep)
+                        else:
+                            pass
+                    au.close()
+                    os.remove('botnet/drones.txt') # remove ucavs file
+                print("[Info] [Radar] [Blackhole] Added [UCAVs]  : " + str(ucavs_added))
+                rpcs = self.extract_rpcs()
+                if not rpcs:
+                    return
+                rpcs_added = 0
+                if os.path.isfile('botnet/reflectors.txt'):
+                    f = open('botnet/reflectors.txt')
+                    reflectors = f.readlines()
+                    reflectors = [reflector.strip() for reflector in reflectors]
+                    f.close()
+                    fz = open(self.rpcs_file)
+                    rpcs = fz.readlines()
+                    rpcs = [rpc.strip() for rpc in rpcs]
+                    fz.close()
+                    ar = open('botnet/rpcs.txt', 'a')
+                    for reflector in reflectors:
+                        if reflector not in rpcs:
+                            rpcs_added = rpcs_added + 1
+                            ar.write(reflector+os.linesep)
+                        else:
+                            pass
+                    ar.close()
+                    os.remove('botnet/reflectors.txt') # remove rpcs file
+                print("[Info] [Radar] [Blackhole] Added [X-RPCs] : " + str(rpcs_added))
+                ntps = self.extract_ntps()
+                if not ntps:
+                    return
+                ntps_added = 0
+                if os.path.isfile('botnet/crystals.txt'):
+                    f = open('botnet/crystals.txt')
+                    crystals = f.readlines()
+                    crystals = [crystal.strip() for crystal in crystals]
+                    f.close()
+                    fz = open(self.ntps_file)
+                    ntps = fz.readlines()
+                    ntps = [ntp.strip() for ntp in ntps]
+                    fz.close()
+                    an = open('botnet/ntp.txt', 'a')
+                    for crystal in crystals:
+                        if crystal not in ntps:
+                            ntps_added = ntps_added + 1
+                            an.write(crystal+os.linesep)
+                        else:
+                            pass
+                    an.close()
+                    os.remove('botnet/crystals.txt') # remove crystals file
+                print("[Info] [Radar] [Blackhole] Added [NTPs]   : " + str(ntps_added))
+                dnss = self.extract_dnss()
+                if not dnss:
+                    return
+                dnss_added = 0
+                if os.path.isfile('botnet/warps.txt'):
+                    f = open('botnet/warps.txt')
+                    warps = f.readlines()
+                    warps = [warp.strip() for warp in warps]
+                    f.close()
+                    fz = open(self.dnss_file)
+                    dnss = fz.readlines()
+                    dnss = [dns.strip() for dns in dnss]
+                    fz.close()
+                    ad = open('botnet/dns.txt', 'a')
+                    for warp in warps:
+                        if warp not in dnss:
+                            dnss_added = dnss_added + 1
+                            ad.write(warp+os.linesep)
+                        else:
+                            pass
+                    ad.close()
+                    os.remove('botnet/warps.txt') # remove warps file
+                print("[Info] [Radar] [Blackhole] Added [DNSs]   : " + str(dnss_added))
+                snmps = self.extract_snmps()
+                if not snmps:
+                    return
+                snmps_added = 0
+                if os.path.isfile('botnet/bosons.txt'):
+                    f = open('botnet/bosons.txt')
+                    bosons = f.readlines()
+                    bosons = [boson.strip() for boson in bosons]
+                    f.close()
+                    fz = open(self.snmps_file)
+                    snmps = fz.readlines()
+                    snmps = [snmp.strip() for snmp in snmps]
+                    fz.close()
+                    asn = open('botnet/snmp.txt', 'a')
+                    for boson in bosons:
+                        if boson not in snmps:
+                            snmps_added = snmps_added + 1
+                            asn.write(boson+os.linesep)
+                        else:
+                            pass
+                    asn.close()
+                    os.remove('botnet/bosons.txt') # remove snmps file
+                print("[Info] [Radar] [Blackhole] Added [SNMPs]  : " + str(snmps_added))
+                print('-'*12 + '\n')
+                if zombies_added == 0 and aliens_added == 0 and droids_added == 0 and ucavs_added == 0 and rpcs_added == 0 and ntps_added == 0 and dnss_added == 0 and snmps_added == 0: # not any zombie
+                    print("[AI] [Control] [Radar] [Blackhole] [Node] These [Zombies] are already in your [Army] -> [Passing!]")
+                    print('-'*12 + '\n')
+                else:
+                    total_zombies = zombies_added + aliens_added + droids_added + ucavs_added + rpcs_added + ntps_added + dnss_added + snmps_added
+                    print("[Info] [AI] Congratulations!. Total [Zombies] added: " + str(total_zombies))
+                    print('-'*12)
+                    print("\n[Info] [AI] Botnet updated! -> ;-)\n")
+                    self.update_transferred_stats(self.trans_zombies) # update json file with transferred stats (blackhole)
+                    stream = str(enc_globalnet_owner)+self.globalnet_msg_sep+str(enc_globalnet_comment)+self.globalnet_msg_sep+str(enc_globalnet_warp)+self.globalnet_msg_sep+str(enc_globalnet_ip)
+                    globalnet_list.append(stream)
+                    print('='*22 + '\n')
+        if globalnet_list is not None:
+            f = open(self.globalnet_file, "w") # write to globalnet.txt
+            for node in globalnet_list:
+                node = node.replace('\n','')
+                f.write(node)
+            f.close()
+
     def downloading_github_list(self): 
         # add your mirror to protect/share/distribute... [Zombies]
         try:
-            print(("[AI] Trying [Blackhole] [GitHub]: "+self.github_zombies+"\n"))
+            print("[AI] Trying [Blackhole] [GitHub]: "+self.github_zombies+"\n")
             self.user_agent = random.choice(self.agents).strip() # shuffle user-agent
             headers = {'User-Agent' : self.user_agent, 'Referer' : self.referer} # set fake user-agent and referer
             if self.options.timeout: # set timeout
@@ -4293,14 +4833,14 @@ class UFONet(object):
             for zombie in zombies_ready:
                 f.write(zombie + os.linesep)
             f.close()
-        if options.search or options.dorks or options.autosearch or options.download or options.download_github: # append only new zombies to list (dorking supported)
+        if options.search or options.dorks or options.autosearch or options.download or options.download_github or options.download_nodes: # append only new zombies to list (dorking supported)
             f = open(self.zombies_file)
             zombies_on_file = f.read().splitlines()
             with open(self.zombies_file, "a") as zombie_list: 
                 for zombie in zombies_ready:
                     if zombie not in zombies_on_file: # parse possible repetitions
                         zombie_list.write(zombie + os.linesep)
-                        if options.download or options.download_github:
+                        if options.download or options.download_github or options.download_nodes:
                             self.trans_zombies = self.trans_zombies + 1 # update trans stats only with new zombies (blackhole)
                         else:
                             self.scanned_zombies = self.scanned_zombies + 1 # update scanner stats only with new zombies (dorking)
@@ -4309,7 +4849,7 @@ class UFONet(object):
     def update_aliens(self, aliens_ready):
         # update aliens on file
         options = self.options
-        if options.download or options.download_github: # append only new aliens to list
+        if options.download or options.download_github or options.download_nodes: # append only new aliens to list
             f = open(self.aliens_file)
             aliens_on_file = f.read().splitlines()
             with open(self.aliens_file, "a") as alien_list:
@@ -4322,7 +4862,7 @@ class UFONet(object):
     def update_droids(self, droids_ready):
         # update droids on file
         options = self.options
-        if options.download or options.download_github: # append only new droids to list
+        if options.download or options.download_github or options.download_nodes: # append only new droids to list
             f = open(self.droids_file)
             droids_on_file = f.read().splitlines()
             with open(self.droids_file, "a") as droid_list:
@@ -4335,7 +4875,7 @@ class UFONet(object):
     def update_ucavs(self, ucavs_ready):
         # update ucavs on file
         options = self.options
-        if options.download or options.download_github: # append only new ucavs to list
+        if options.download or options.download_github or options.download_nodes: # append only new ucavs to list
             f = open(self.ucavs_file)
             ucavs_on_file = f.read().splitlines()
             with open(self.ucavs_file, "a") as ucav_list:
@@ -4353,7 +4893,7 @@ class UFONet(object):
             for rpc in rpcs_ready: # add only rpc verified zombies
                 f.write(rpc + os.linesep)
             f.close()
-        if options.download or options.download_github: # append only new rpcs to list
+        if options.download or options.download_github or options.download_nodes: # append only new rpcs to list
             f = open(self.rpcs_file)
             rpcs_on_file = f.read().splitlines()
             with open(self.rpcs_file, "a") as rpc_list:
@@ -4366,7 +4906,7 @@ class UFONet(object):
     def update_dnss(self, dnss_ready):
         # update dns on file
         options = self.options
-        if options.download or options.download_github: # append only new dns to list
+        if options.download or options.download_github or options.download_nodes: # append only new dns to list
             f = open(self.dnss_file)
             dnss_on_file = f.read().splitlines()
             with open(self.dnss_file, "a") as dns_list:
@@ -4379,7 +4919,7 @@ class UFONet(object):
     def update_ntps(self, ntps_ready):
         # update ntps on file
         options = self.options
-        if options.download or options.download_github: # append only new ntps to list
+        if options.download or options.download_github or options.download_nodes: # append only new ntps to list
             f = open(self.ntps_file)
             ntps_on_file = f.read().splitlines()
             with open(self.ntps_file, "a") as ntp_list:
@@ -4392,7 +4932,7 @@ class UFONet(object):
     def update_snmps(self, snmps_ready):
         # update snmps on file
         options = self.options
-        if options.download or options.download_github: # append only new snmps to list
+        if options.download or options.download_github or options.download_nodes: # append only new snmps to list
             f = open(self.snmps_file)
             snmps_on_file = f.read().splitlines()
             with open(self.snmps_file, "a") as snmp_list:

File diff suppressed because it is too large
+ 30 - 4
core/options.py


+ 4 - 1
core/tools/blackhole.py

@@ -321,7 +321,10 @@ class Eater(Thread):
         dns_meat = "community_dnss.txt.gz"
         snmp_meat = "community_snmps.txt.gz"
         while 1:
-            data = self.client.recv(1024)
+            try:
+                data = self.client.recv(4096).decode("utf-8")
+            except:
+                data = ""
             if not data:
                 break
         if zombie_meat in data: # get zombies

+ 5 - 1
core/tools/grider.py

@@ -34,7 +34,11 @@ class Paster(Thread):
             try:
                 conn,addr = self.sock.accept()
                 print('[Info] [AI] Got copy from', addr)
-                data = conn.recv(4096).decode()
+                try:
+                    data = conn.recv(4096).decode("utf-8")
+                except:
+                    data = None
+                    pass
                 print ("[Info] [AI] Stream received:", repr(data))
             except socket.timeout:
                 print("[Info] [AI] Socket listening...")

+ 23 - 1
core/txt/misc.txt

@@ -49,7 +49,7 @@ The Universe is full-linked by a "Quasi-Crystalline Spin Network of Tetrahedra".
 The possession of the force inevitably harms the free exercise of reason...
 Yes, we scan!
 If you are flexible, you will stay straight...
-Rage Agains The Capitalism...
+Rage Against The Capitalism...
 They do not deserve to be heard; their theories provoke precisely the evils they point to...
 When the scoundrel reigns, the crown weighs twice as much for the peasant...
 Everything has its beauty, but not everyone can see it...
@@ -79,3 +79,25 @@ Sometimes building. Sometimes destroying...
 Even the dogs have dreams...
 The only way to equality it is precisely, through difference...
 Fight the power!
+More riots, less diets...
+We are the will of desire...
+Better than having beliefs is have ideas. Simply, because ideas can change and beliefs do not...
+Today died another humble worker. It does not matter when you read it...
+If the software is not free. Not even the computer is yours. Neither are you...
+The chimeras, one by one...
+Inaction is a weapon of mass destruction...
+I'm not forcing you, I'm warning you. I am not writing to you. I read you. I do not see you. I feel you. I am not selling you. I love you... 
+There are no civilized countries. There are domesticated countries...
+Tourism is a false exploration of predetermined routes focused on consumption...
+A great eye watches over you. A long arm presses you...
+The logic is: a guide...
+The first battlefield of Artificial Intelligence will be on the screens...
+Never stay without something to fight for...
+They are not afraid of the different. They fear the poor...
+We live in a world where a dead tree is worth more economically than a living tree...
+Your "virtual friends" are a fundamental part of a model of attention extraction...
+The truth is boring. The lie sells...
+The Internet used to be a park and now it is a big mall...
+It is more easy to imagine the end of the world than the end of the Capitalism...
+We are living the future of other people...
+Long live & Prosperity!

+ 1 - 1
core/txt/model.txt

@@ -1 +1 @@
-ViPR404+/(model:I^3)
+ViPR404+/(model:I^4)

+ 9 - 0
core/txt/motherships.txt

@@ -151,3 +151,12 @@ Cepheus
 NagiOS
 VestraX
 BP
+Assange
+Tormentor
+Oblivion
+EVAngelion
+AKiRA
+RÄ
+SNH
+M.Fisher
+AFROFuturism

+ 257 - 55
core/txt/user-agents.txt

@@ -1,54 +1,23 @@
-Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36
 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36
-Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36
-Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.811.0 Safari/535.1
 Mozilla/5.0 (X11; CrOS i686 12.433.109) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.93 Safari/534.30
 Mozilla/5.0 (Macintosh; U; Mac OS X 10_6_1; en-US) AppleWebKit/530.5 (KHTML, like Gecko) Chrome/ Safari/530.5
 Mozilla/5.0 (Linux; U; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13
-Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1
-Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20130401 Firefox/21.0
-Mozilla/6.0 (Windows; U; Windows NT 7.0; en-US; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.9 (.NET CLR 3.5.30729)
 Mozilla/5.0 (X11; U; Linux x86_64; fr; rv:1.9.0.9) Gecko/2009042114 Ubuntu/9.04 (jaunty) Firefox/3.0.9
-Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-TW; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2
-Mozilla/5.0 (Windows; U; Windows NT5.1; en; rv:1.7.10) Gecko/20050716 Firefox/1.0.5
 Mozilla/5.0 (Windows; U; Win98; fr-FR; rv:1.7.6) Gecko/20050226 Firefox/1.0.1
 Mozilla/5.0 (X11; U; Linux i686; de-DE; rv:1.6) Gecko/20040207 Firefox/0.8
 Mozilla/5.0 (X11) KHTML/4.9.1 (like Gecko) Konqueror/4.9
 Mozilla/5.0 (compatible; Konqueror/4.5; FreeBSD) KHTML/4.5.4 (like Gecko)
 Mozilla/5.0 (compatible; Konqueror/3.5; NetBSD 4.0_RC3; X11) KHTML/3.5.7 (like Gecko)
-Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko
-Mozilla/5.0 (compatible, MSIE 11, Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko
-Mozilla/4.0(compatible; MSIE 7.0b; Windows NT 6.0)
-Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 7.0; InfoPath.3; .NET CLR 3.1.40767; Trident/6.0; en-IN)
-Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)
-Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)
-Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/4.0; InfoPath.2; SV1; .NET CLR 2.0.50727; WOW64)
 Mozilla/5.0 (compatible; MSIE 10.0; Macintosh; Intel Mac OS X 10_7_3; Trident/6.0)
-Mozilla/4.0 (Compatible; MSIE 8.0; Windows NT 5.2; Trident/6.0)
 Mozilla/1.22 (compatible; MSIE 10.0; Windows 3.1)
-Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0
-Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; yie8)
-Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.0; Windows NT 5.1; .NET CLR 1.1.4322; Zango 10.1.181.0)
-Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
-Mozilla/4.0 (compatible; MSIE 6.0; AOL 8.0; Windows NT 5.1; SV1)
 Mozilla/5.0 (X11; Ubuntu; Linux armv7l; rv:17.0) Gecko/20100101 Firefox/17.0
 Mozilla/2.02E (Win95; U)
 Mozilla/5.0 (iPhone; U; CPU iOS 2_0 like Mac OS X; en-us)
 Mozilla/5.0 (Linux; U; Android 0.5; en-us)
-Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)
-Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
-Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13
-Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
 Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)
-Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (FM Scene 4.6.1)
-Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729) (Prevx 3.0.5)
 Mozilla/5.0 (compatible; Konqueror/4.5; FreeBSD) KHTML/4.5.4 (like Gecko)
-Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:5.0) Whistler/20110021 myibrow/5.0.0.0
-Mozilla/4.08 [en] (WinNT; I ;Nav)
 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Oupeng/10.2.1.86910 Safari/534.30
 Mozilla/5.0 (SMART-TV; Linux; Tizen 2.3) AppleWebkit/538.1 (KHTML, like Gecko) SamsungBrowser/1.0 Safari/538.1
-myibrow/2.2 (Windows; U; Windows NT 5.1; cs; rv:1.8.1.14) Gecko/20080001 My Internet Browser/2.2.0.0 20080913235045
-Opera/9.25 (Windows NT 6.0; U; en)
 Privoxy/1.0
 CERN-LineMode/2.15
 cg-eye interactive
@@ -80,20 +49,6 @@ Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like
 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36
 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14
 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Safari/602.1.50
-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393
-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36
-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36
-Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36
-Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36
-Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0
-Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36
-Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36
-Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36
-Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36
-Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0
-Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
-Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0
-Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36
 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36
 Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0
 Mozilla/5.0 (Linux; Android 8.0.0; SM-G960F Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36
@@ -127,18 +82,13 @@ Mozilla/5.0 (Linux; Android 5.0.2; SAMSUNG SM-T550 Build/LRX22G) AppleWebKit/537
 Mozilla/5.0 (Linux; Android 4.4.3; KFTHWI Build/KTU84M) AppleWebKit/537.36 (KHTML, like Gecko) Silk/47.1.79 like Chrome/47.0.2526.80 Safari/537.36
 Mozilla/5.0 (Linux; Android 5.0.2; LG-V410/V41020c Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/34.0.1847.118 Safari/537.36
 Mozilla/5.0 (Nintendo WiiU) AppleWebKit/536.30 (KHTML, like Gecko) NX/3.0.4.2.12 NintendoBrowser/4.3.1.11264.US
-Mozilla/5.0 (Windows NT 10.0; Win64; x64; XBOX_ONE_ED) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393
 Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Xbox; Xbox One) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Mobile Safari/537.36 Edge/13.10586
 Mozilla/5.0 (X11; U; Linux armv7l like Android; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/533.2+ Kindle/3.0+
 Mozilla/5.0 (Linux; U; en-US) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) Version/4.0 Kindle/3.0 (screen 600x800; rotate)
 Mozilla/5.0 (PlayStation Vita 3.61) AppleWebKit/537.73 (KHTML, like Gecko) Silk/3.2
 Mozilla/5.0 (PlayStation 4 3.11) AppleWebKit/537.73 (KHTML, like Gecko)
 Mozilla/5.0 (Nintendo 3DS; U; ; en) Version/1.7412.EU
-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
-Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
-Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
 Mozilla/5.0 (Macintosh; Intel Mac OS X 11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
-Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0
 Mozilla/5.0 (X11; Linux i686; rv:89.0) Gecko/20100101 Firefox/89.0
 Mozilla/5.0 (Linux x86_64; rv:89.0) Gecko/20100101 Firefox/89.0
 Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:89.0) Gecko/20100101 Firefox/89.0
@@ -148,19 +98,271 @@ Mozilla/5.0 (Macintosh; Intel Mac OS X 11_4) AppleWebKit/605.1.15 (KHTML, like G
 Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/604.1
 Mozilla/5.0 (iPad; CPU OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/604.1
 Mozilla/5.0 (iPod touch; CPU iPhone 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Mobile/15E148 Safari/604.1
-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59
 Mozilla/5.0 (Macintosh; Intel Mac OS X 11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59
 Mozilla/5.0 (Linux; Android 10; HD1913) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36 EdgA/46.3.4.5155
 Mozilla/5.0 (Linux; Android 10; SM-G973F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36 EdgA/46.3.4.5155
 Mozilla/5.0 (Linux; Android 10; Pixel 3 XL) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36 EdgA/46.3.4.5155
 Mozilla/5.0 (Linux; Android 10; ONEPLUS A6003) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36 EdgA/46.3.4.5155
-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 OPR/77.0.4054.203
-Mozilla/5.0 (Windows NT 10.0; WOW64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 OPR/77.0.4054.203
 Mozilla/5.0 (Macintosh; Intel Mac OS X 11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 OPR/77.0.4054.203
 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 OPR/77.0.4054.203
-Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 YaBrowser/21.6.0 Yowser/2.5 Safari/537.36
-Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 YaBrowser/21.6.0 Yowser/2.5 Safari/537.36
 Mozilla/5.0 (Macintosh; Intel Mac OS X 11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 YaBrowser/21.6.0 Yowser/2.5 Safari/537.36
 Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 YaBrowser/21.5.6.744 Mobile/15E148 Safari/604.1
 Mozilla/5.0 (iPad; CPU OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 YaBrowser/21.5.6.744 Mobile/15E148 Safari/605.1
 Mozilla/5.0 (iPod touch; CPU iPhone 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 YaBrowser/21.5.6.744 Mobile/15E148 Safari/605.1
+Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16.2
+Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16
+Opera/9.80 (Macintosh; Intel Mac OS X 10.14.1) Presto/2.12.388 Version/12.16
+Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52
+Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; de) Presto/2.9.168 Version/11.52
+Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50
+Opera/9.80 (X11; Linux i686; U; hu) Presto/2.9.168 Version/11.50
+Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11
+Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.8.131 Version/11.11
+Opera/9.80 (X11; Linux x86_64; U; bg) Presto/2.8.131 Version/11.10
+Opera/9.80 (X11; Linux x86_64; U; Ubuntu/10.10 (maverick); pl) Presto/2.7.62 Version/11.01
+Opera/9.80 (X11; Linux i686; U; ja) Presto/2.7.62 Version/11.01
+Opera/9.80 (X11; Linux i686; U; fr) Presto/2.7.62 Version/11.01
+Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00
+Opera/9.80 (X11; Linux i686; U; it) Presto/2.7.62 Version/11.00
+Mozilla/4.0 (compatible; MSIE 8.0; X11; Linux x86_64; pl) Opera 11.00
+Mozilla/5.0 (X11; Linux x86_64; U; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.62
+Mozilla/4.0 (compatible; MSIE 8.0; X11; Linux x86_64; de) Opera 10.62
+Opera/9.80 (X11; Linux i686; U; pl) Presto/2.6.30 Version/10.61
+Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.6.30 Version/10.61
+Opera/9.80 (Macintosh; Intel Mac OS X; U; nl) Presto/2.6.30 Version/10.61
+Opera/9.80 (X11; Linux i686; U; en) Presto/2.5.27 Version/10.60
+Opera/9.80 (X11; Linux i686; U; it) Presto/2.5.24 Version/10.54
+Opera/9.80 (X11; Linux i686; U; en-GB) Presto/2.5.24 Version/10.53
+Opera/9.80 (Linux i686; U; en) Presto/2.5.22 Version/10.51
+Mozilla/5.0 (Linux i686; U; en; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 Opera 10.51
+Mozilla/4.0 (compatible; MSIE 8.0; Linux i686; en) Opera 10.51
+Opera/9.80 (S60; SymbOS; Opera Tablet/9174; U; en) Presto/2.7.81 Version/10.5
+Opera/9.80 (X11; U; Linux i686; en-US; rv:1.9.2.3) Presto/2.2.15 Version/10.10
+Opera/9.80 (X11; Linux x86_64; U; it) Presto/2.2.15 Version/10.10
+Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; de) Opera 10.10
+Opera/9.80 (X11; Linux x86_64; U; en-GB) Presto/2.2.15 Version/10.01
+Opera/9.80 (X11; Linux x86_64; U; en) Presto/2.2.15 Version/10.00
+Opera/9.80 (X11; Linux x86_64; U; de) Presto/2.2.15 Version/10.00
+Opera/9.80 (X11; Linux i686; U; ru) Presto/2.2.15 Version/10.00
+Opera/9.80 (X11; Linux i686; U; pt-BR) Presto/2.2.15 Version/10.00
+Opera/9.80 (X11; Linux i686; U; pl) Presto/2.2.15 Version/10.00
+Opera/9.80 (X11; Linux i686; U; nb) Presto/2.2.15 Version/10.00
+Opera/9.80 (X11; Linux i686; U; en-GB) Presto/2.2.15 Version/10.00
+Opera/9.80 (X11; Linux i686; U; en) Presto/2.2.15 Version/10.00
+Opera/9.80 (X11; Linux i686; U; Debian; pl) Presto/2.2.15 Version/10.00
+Opera/9.80 (X11; Linux i686; U; de) Presto/2.2.15 Version/10.00
+Opera/9.99 (X11; U; sk)
+Opera/9.70 (Linux ppc64 ; U; en) Presto/2.2.1
+Opera/9.70 (Linux i686 ; U; zh-cn) Presto/2.2.0
+Opera/9.70 (Linux i686 ; U; en-us) Presto/2.2.0
+Opera/9.70 (Linux i686 ; U; en) Presto/2.2.1
+Opera/9.70 (Linux i686 ; U; en) Presto/2.2.0
+Opera/9.70 (Linux i686 ; U; ; en) Presto/2.2.1
+Opera/9.70 (Linux i686 ; U;  ; en) Presto/2.2.1
+Mozilla/5.0 (Linux i686 ; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.70
+Mozilla/4.0 (compatible; MSIE 6.0; Linux i686 ; en) Opera 9.70
+Opera/9.64 (X11; Linux x86_64; U; pl) Presto/2.1.1
+Opera/9.64 (X11; Linux x86_64; U; hr) Presto/2.1.1
+Opera/9.64 (X11; Linux x86_64; U; en-GB) Presto/2.1.1
+Opera/9.64 (X11; Linux x86_64; U; en) Presto/2.1.1
+Opera/9.64 (X11; Linux x86_64; U; de) Presto/2.1.1
+Opera/9.64 (X11; Linux x86_64; U; cs) Presto/2.1.1
+Opera/9.64 (X11; Linux i686; U; tr) Presto/2.1.1
+Opera/9.64 (X11; Linux i686; U; sv) Presto/2.1.1
+Opera/9.64 (X11; Linux i686; U; pl) Presto/2.1.1
+Opera/9.64 (X11; Linux i686; U; nb) Presto/2.1.1
+Opera/9.64 (X11; Linux i686; U; Linux Mint; nb) Presto/2.1.1
+Opera/9.64 (X11; Linux i686; U; Linux Mint; it) Presto/2.1.1
+Opera/9.64 (X11; Linux i686; U; en) Presto/2.1.1
+Opera/9.64 (X11; Linux i686; U; de) Presto/2.1.1
+Opera/9.64 (X11; Linux i686; U; da) Presto/2.1.1
+Opera/9.63 (X11; Linux x86_64; U; ru) Presto/2.1.1
+Opera/9.63 (X11; Linux x86_64; U; cs) Presto/2.1.1
+Opera/9.63 (X11; Linux i686; U; ru) Presto/2.1.1
+Opera/9.63 (X11; Linux i686; U; ru)
+Opera/9.63 (X11; Linux i686; U; nb) Presto/2.1.1
+Opera/9.63 (X11; Linux i686; U; en)
+Opera/9.63 (X11; Linux i686; U; de) Presto/2.1.1
+Opera/9.63 (X11; Linux i686)
+Opera/9.63 (X11; FreeBSD 7.1-RELEASE i386; U; en) Presto/2.1.1
+Opera/9.62 (X11; Linux x86_64; U; ru) Presto/2.1.1
+Opera/9.62 (X11; Linux x86_64; U; en_GB, en_US) Presto/2.1.1
+Opera/9.62 (X11; Linux i686; U; pt-BR) Presto/2.1.1
+Opera/9.62 (X11; Linux i686; U; Linux Mint; en) Presto/2.1.1
+Opera/9.62 (X11; Linux i686; U; it) Presto/2.1.1
+Opera/9.62 (X11; Linux i686; U; fi) Presto/2.1.1
+Opera/9.62 (X11; Linux i686; U; en) Presto/2.1.1
+Opera/9.61 (X11; Linux x86_64; U; fr) Presto/2.1.1
+Opera/9.61 (X11; Linux i686; U; ru) Presto/2.1.1
+Opera/9.61 (X11; Linux i686; U; pl) Presto/2.1.1
+Opera/9.61 (X11; Linux i686; U; en) Presto/2.1.1
+Opera/9.61 (X11; Linux i686; U; de) Presto/2.1.1
+Opera/9.61 (Macintosh; Intel Mac OS X; U; de) Presto/2.1.1
+Opera/9.60 (X11; Linux x86_64; U)
+Opera/9.60 (X11; Linux i686; U; ru) Presto/2.1.1
+Opera/9.60 (X11; Linux i686; U; en-GB) Presto/2.1.1
+Mozilla/5.0 (X11; Linux x86_64; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.60
+Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux x86_64; en) Opera 9.60
+Opera/9.52 (X11; Linux x86_64; U; ru)
+Opera/9.52 (X11; Linux x86_64; U; en)
+Opera/9.52 (X11; Linux x86_64; U)
+Opera/9.52 (X11; Linux ppc; U; de)
+Opera/9.52 (X11; Linux i686; U; fr)
+Opera/9.52 (X11; Linux i686; U; en)
+Opera/9.52 (X11; Linux i686; U; cs)
+Opera/9.52 (Macintosh; PPC Mac OS X; U; ja)
+Opera/9.52 (Macintosh; PPC Mac OS X; U; fr)
+Opera/9.52 (Macintosh; Intel Mac OS X; U; pt-BR)
+Opera/9.52 (Macintosh; Intel Mac OS X; U; pt)
+Opera/9.51 (X11; Linux i686; U; Linux Mint; en)
+Opera/9.51 (X11; Linux i686; U; fr)
+Opera/9.51 (X11; Linux i686; U; de)
+Opera/9.51 (Macintosh; Intel Mac OS X; U; en)
+Mozilla/5.0 (X11; Linux i686; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51
+Opera/9.50 (X11; Linux x86_64; U; pl)
+Opera/9.50 (X11; Linux x86_64; U; nb)
+Opera/9.50 (X11; Linux ppc; U; en)
+Opera/9.50 (X11; Linux i686; U; es-ES)
+Opera/9.50 (Macintosh; Intel Mac OS X; U; en)
+Opera/9.50 (Macintosh; Intel Mac OS X; U; de)
+Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux x86_64; en) Opera 9.50
+Opera/9.30 (Nintendo Wii; U; ; 2071; Wii Shop Channel/1.0; en)
+Opera/9.30 (Nintendo Wii; U; ; 2047-7;pt-br)
+Opera/9.30 (Nintendo Wii; U; ; 2047-7;es)
+Opera/9.30 (Nintendo Wii; U; ; 2047-7;en)
+Opera/9.30 (Nintendo Wii; U; ; 2047-7; fr)
+Opera/9.30 (Nintendo Wii; U; ; 2047-7; de)
+Opera/9.27 (X11; Linux i686; U; fr)
+Opera/9.27 (X11; Linux i686; U; en)
+Opera/9.27 (Macintosh; Intel Mac OS X; U; sv)
+Mozilla/5.0 (Macintosh; Intel Mac OS X; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Opera 9.27
+Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; en) Opera 9.27
+Opera/9.26 (Windows; U; pl)
+Opera/9.26 (Macintosh; PPC Mac OS X; U; en)
+Opera/9.25 (X11; Linux i686; U; fr-ca)
+Opera/9.25 (X11; Linux i686; U; fr)
+Opera/9.25 (X11; Linux i686; U; en)
+Opera/9.25 (OpenSolaris; U; en)
+Opera/9.25 (Macintosh; PPC Mac OS X; U; en)
+Opera/9.25 (Macintosh; Intel Mac OS X; U; en)
+Opera/9.24 (X11; SunOS i86pc; U; en)
+Opera/9.24 (X11; Linux i686; U; de)
+Opera/9.24 (Macintosh; PPC Mac OS X; U; en)
+Mozilla/4.0 (compatible; MSIE 6.0; Mac_PowerPC; en) Opera 9.24
+Opera/9.23 (X11; Linux x86_64; U; en)
+Opera/9.23 (X11; Linux i686; U; es-es)
+Opera/9.23 (X11; Linux i686; U; en)
+Opera/9.23 (Nintendo Wii; U; ; 1038-58; Wii Internet Channel/1.0; en)
+Opera/9.23 (Macintosh; Intel Mac OS X; U; ja)
+Opera/9.23 (Mac OS X; ru)
+Opera/9.23 (Mac OS X; fr)
+Mozilla/5.0 (X11; Linux i686; U; en; rv:1.8.0) Gecko/20060728 Firefox/1.5.0 Opera 9.23
+Opera/9.22 (X11; OpenBSD i386; U; en)
+Opera/9.22 (X11; Linux i686; U; en)
+Opera/9.22 (X11; Linux i686; U; de)
+Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; en) Opera 9.22
+Opera/9.21 (X11; Linux x86_64; U; en)
+Opera/9.21 (X11; Linux i686; U; es-es)
+Opera/9.21 (X11; Linux i686; U; en)
+Opera/9.21 (X11; Linux i686; U; de)
+Opera/9.21 (Macintosh; PPC Mac OS X; U; en)
+Opera/9.21 (Macintosh; Intel Mac OS X; U; en)
+Opera/9.20 (X11; Linux x86_64; U; en)
+Opera/9.20 (X11; Linux ppc; U; en)
+Opera/9.20 (X11; Linux i686; U; tr)
+Opera/9.20 (X11; Linux i686; U; ru)
+Opera/9.20 (X11; Linux i686; U; pl)
+Opera/9.20 (X11; Linux i686; U; es-es)
+Opera/9.20 (X11; Linux i686; U; en)
+Opera/9.20 (X11; Linux i586; U; en)
+Opera/9.12 (X11; Linux i686; U; en) (Ubuntu)
+Opera/9.10 (X11; Linux; U; en)
+Opera/9.10 (X11; Linux x86_64; U; en)
+Opera/9.10 (X11; Linux i686; U; pl)
+Opera/9.10 (X11; Linux i686; U; kubuntu;pl)
+Opera/9.10 (X11; Linux i686; U; en)
+Opera/9.10 (X11; Linux i386; U; en)
+Opera/9.02 (X11; Linux i686; U; pl)
+Opera/9.02 (X11; Linux i686; U; hu)
+Opera/9.02 (X11; Linux i686; U; en)
+Opera/9.02 (X11; Linux i686; U; de)
+Opera/9.02 (Windows; U; nl)
+Opera/9.02 (Windows XP; U; ru)
+Opera/9.01 (X11; Linux i686; U; en)
+Opera/9.01 (X11; FreeBSD 6 i386; U;pl)
+Opera/9.01 (X11; FreeBSD 6 i386; U; en)
+Opera/9.01 (Macintosh; PPC Mac OS X; U; it)
+Opera/9.01 (Macintosh; PPC Mac OS X; U; en)
+Opera/9.00 (X11; Linux i686; U; pl)
+Opera/9.00 (X11; Linux i686; U; en)
+Opera/9.00 (X11; Linux i686; U; de)
+Opera/9.00 (Windows; U)
+Opera/9.00 (Nintendo Wii; U; ; 1038-58; Wii Internet Channel/1.0; en)
+Opera/9.00 (Macintosh; PPC Mac OS X; U; es)
+Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; Sprint:PPC-6700) Opera 8.65 [en]
+Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; PPC; 320x320)Opera 8.65 [en]
+Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; PPC; 320x320) Opera 8.65 [en]
+Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; PPC; 240x320) Opera 8.65 [zh-cn]
+Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; PPC; 240x320) Opera 8.65 [nl]
+Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; PPC; 240x320) Opera 8.65 [de]
+Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; PPC; 240x240) Opera 8.65 [en]
+Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; PPC) Opera 8.65 [en]
+Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; PPC; 240x320) Opera 8.60 [en]
+Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; PPC; 240x240) Opera 8.60 [en]
+Opera/8.54 (X11; Linux i686; U; pl)
+Opera/8.54 (X11; Linux i686; U; de)
+Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; en) Opera 8.54
+Opera/8.52 (X11; Linux x86_64; U; en)
+Opera/8.52 (X11; Linux i686; U; en)
+Mozilla/5.0 (X11; Linux i686; U; en) Opera 8.52
+Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; en) Opera 8.52
+Opera/8.51 (X11; U; Linux i686; en-US; rv:1.8)
+Opera/8.51 (X11; Linux x86_64; U; en)
+Opera/8.51 (X11; Linux i686; U; en)
+Opera/8.51 (Macintosh; PPC Mac OS X; U; de)
+Opera/8.51 (FreeBSD 5.1; U; en)
+Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en) Opera 8.51
+Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; ru) Opera 8.51
+Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; en) Opera 8.51
+Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686; en) Opera 8.02
+Opera/8.01 (Macintosh; U; PPC Mac OS; en)
+Opera/8.01 (Macintosh; PPC Mac OS X; U; en)
+Opera/8.0 (X11; Linux i686; U; cs)
+Mozilla/4.0 (compatible; MSIE 6.0; Windows CE) Opera 8.0  [en]
+Mozilla/5.0 (X11; Linux i386; U) Opera 7.60  [en-GB]
+Opera/7.54 (X11; Linux i686; U)  [en]
+Mozilla/5.0 (X11; Linux i686; U) Opera 7.54 [en]
+Mozilla/5.0 (X11; Linux i686; U) Opera 7.54  [en]
+Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686) Opera 7.54  [en]
+Mozilla/4.0 (compatible; MSIE 5.23; Mac_PowerPC) Opera 7.54  [en]
+Opera/7.53 (X11; Linux i686; U) [en_US]
+Opera/7.51 (X11; SunOS sun4u; U) [de]
+Opera/7.51 (Linux) [en]
+Opera/7.50 (Windows XP; U)
+Mozilla/4.0 (compatible; MSIE 6.0; ; Linux x86_64) Opera 7.50 [en]
+Mozilla/4.0 (compatible; MSIE 6.0; ; Linux i686) Opera 7.50 [en]
+Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686) Opera 7.23  [fi]
+Opera/7.11 (Linux 2.6.0-test4 i686; U)  [en]
+Mozilla/5.0 (Linux 2.4.21-0.13mdk i686; U) Opera 7.11  [en]
+Opera/7.10 (Linux Debian;en-US)
+Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows XP) Opera 7.0  [en]
+Mozilla/4.0 (compatible; MSIE 5.0; UNIX) Opera 6.12  [en]
+Mozilla/4.0 (compatible; MSIE 5.0; Linux 2.4.20-4GB i686) Opera 6.12  [de]
+Opera/6.11 (Linux 2.4.18-bf2.4 i686; U)  [en]
+Opera/6.11 (Linux 2.4.18-4GB i686; U)  [en]
+Opera/6.11 (Linux 2.4.10-4GB i686; U)  [en]
+Opera/6.11 (FreeBSD 4.7-RELEASE i386; U)  [en]
+Mozilla/5.0 (Linux 2.4.19-16mdk i686; U) Opera 6.11  [en]
+Mozilla/4.0 (compatible; MSIE 5.0; UNIX) Opera 6.11  [fr]
+Mozilla/4.0 (compatible; MSIE 5.0; UNIX) Opera 6.11  [en]
+Mozilla/4.0 (compatible; MSIE 5.0; Linux 2.4.4 i686) Opera 6.11  [en]
+Mozilla/4.0 (compatible; MSIE 5.0; Linux 2.4.20-13.7 i686) Opera 6.11  [de]
+Mozilla/4.0 (compatible; MSIE 5.0; Linux 2.4.19-4GB i686) Opera 6.11  [en]
+Mozilla/4.0 (compatible; MSIE 5.0; Linux 2.4.19-16mdk i686) Opera 6.11  [en]
+Mozilla/4.0 (compatible; MSIE 5.0; Linux 2.4.18 i686) Opera 6.11  [de]
+Mozilla/4.0 (compatible; MSIE 5.0; Linux 2.4.10-4GB i686) Opera 6.11  [en]
+Mozilla/5.0 (Linux 2.4.18-ltsp-1 i686; U) Opera 6.1  [en]
+Mozilla/4.0 (compatible; MSIE 5.0; Linux 2.4.19 i686) Opera 6.1  [en]
+Mozilla/4.0 (compatible; MSIE 5.0; Linux 2.4.18-4GB i686) Opera 6.1  [de]
+Mozilla/5.0 (Windows XP; U) Opera 6.06  [en]
+Opera/6.05 (Windows XP; U) [en]

File diff suppressed because it is too large
+ 112 - 48
core/webgui.py


data/nodes.dat → data/nodes.txt


+ 2 - 1
docs/AUTHOR

@@ -11,9 +11,10 @@
   - <a href="https://cintruder.03c8.net" target="_blank">CIntruder</a></b>: Tool to bypass captchas using OCR (Optical Character Recognition) bruteforcing methods.
   - <a href="https://github.com/epsylon/collatz" target="_blank">Collatz</a></b>: Tool to simulate the Collatz's conjeture.
   - <a href="https://github.com/epsylon/DiaNA" target="_blank">DiaNA</a></b>: Tool for the search and recognition of patterns in DNA sequences.
-  - <a href="dkdf.php" target="_blank">DieKunstDerFuge</a></b>: Video on different topics related to hacktivism recorded during 2013 from an intimate narrative perspective.
+  - <a href="https://03c8.net/dkdf.php" target="_blank">DieKunstDerFuge</a></b>: Video on different topics related to hacktivism recorded during 2013 from an intimate narrative perspective.
   - <a href="https://ecoin.03c8.net" target="_blank">ECOin</a></b>: Crypto-currency with the goal of providing a long-term energy-efficient digital economy strategy.
   - <a href="https://github.com/epsylon/euler-bricks" target="_blank">Euler-Bricks</a></b>: Tool to simulate the Euler's conjeture.
+  - <a href="https://github.com/epsylon/fuzzssh" target="_blank">FuzzSSH</a></b>: Tool to detect SSH (protocol) vulnerabilities.
   - <a href="https://github.com/epsylon/goldbach" target="_blank">Goldbach</a></b>: Tool to simulate the Goldbach's conjeture.
   - <a href="https://github.com/epsylon/Elgg-Lorea-Hydra" target="_blank">Lorea</a></b>: Social networking autonomous project to build a distributed, encrypted and federated network.
   - <a href="https://github.com/epsylon/neuralia" target="_blank">Neuralia</a></b>: Neural Network that tries to learn and reply the correct answer.

+ 1 - 1
docs/FAQ.html

@@ -1,6 +1,6 @@
 <center>
 <table cellpadding="24" cellspacing="25" border="1">
-<tr><td><pre><table><tr><td><center><pre><h1><u>UFONet F.A.Q. v1.7 [Revision: 07/2021]</u></h1>Full Version (updated!) online: <a href="https://ufonet.03c8.net/FAQ.html">https://ufonet.03c8.net/FAQ.html</a><a href="/"></center></td></tr><tr><td><pre><ul><hr>
+<tr><td><pre><table><tr><td><center><pre><h1><u>UFONet F.A.Q. v1.8 [Revision: 02/2022]</u></h1>Full Version (updated!) online: <a href="https://ufonet.03c8.net/FAQ.html">https://ufonet.03c8.net/FAQ.html</a><a href="/"></center></td></tr><tr><td><pre><ul><hr>
 <li><b>What is UFONet?</b></li>
 It is a toolkit designed to launch <a href="https://en.wikipedia.org/wiki/Distributed_denial-of-service" target="_blank">DDoS</a> and <a href="https://en.wikipedia.org/wiki/Denial-of-service_attack" target="_blank">DoS</a> attacks.
 

+ 10 - 4
docs/LEEME.txt

@@ -48,7 +48,7 @@ UFONet -  Es un conjunto de herramientas hacktivistas que permiten el lanzamient
 # Instalando
 ###############################
 
-UFONet funciona en muchas plataformas. Requiere Python (>2.7.9) y las siguientes librerías:
+UFONet funciona en muchas plataformas. Requiere Python (>=3) y las siguientes librerías:
 
      python3-pycurl - Python bindings to libcurl (Python 3)
      python3-geoip - Python3 bindings for the GeoIP IP-to-country resolver library
@@ -119,9 +119,9 @@ Por defecto, UFONet utiliza un motor de búsqueda que se llama 'DuckDuckGo'. Per
 
 Ésta es la lista de motores de búsqueda que funcionan con la fecha de la última vez que se han probado:
 
-        - duckduckgo  [13/07/2021: OK!]
-        - bing        [13/07/2021: OK!]
-        - yahoo       [13/07/2021: OK!]
+        - duckduckgo  [02/2022: OK!]
+        - bing        [02/2022: OK!]
+        - yahoo       [02/2022: OK!]
 
 También puedes buscar masívamente utilizando todos los motores de búsqueda soportados:
 
@@ -434,12 +434,17 @@ más algunas "extra":
  - GLOBAL.GRID: Permite revisar las estadísticas de otras "naves"
  - GLOBAL.WARGAMES: Permite proponer y participar en algunos "juegos de guerra" reales
  - GLOBAL.RADAR: Permite revisar las localizaciones publicadas por otras "naves"
+ - GLOBAL.NEWS: Permite leer noticias relacionadas con UFONet
  - [...]
 
 ###############################
 # Timelog
 ###############################
 
+--------------------------
+02.03.2022 : v.1.8
+--------------------------
+
 --------------------------
 14.07.2021 : v.1.7
 --------------------------
@@ -520,6 +525,7 @@ más algunas "extra":
 # Gracias a
 ###############################
 
+- BP<3
 - UFo & Mandingo & Ikujam
 - Phineas Fisher ;-)
 - The Shadow Brokers (TSB) ;_)

+ 9 - 3
docs/README.txt

@@ -118,9 +118,9 @@ By default UFONet will use a search engine called 'DuckDuckGo'. But you can choo
 
 This is the list of available search engines with last time that they were working:
 
-        - duckduckgo  [13/07/2021: OK!]
-        - bing        [13/07/2021: OK!]
-        - yahoo       [13/07/2021: OK!]
+        - duckduckgo  [02/2022: OK!]
+        - bing        [02/2022: OK!]
+        - yahoo       [02/2022: OK!]
 
 You can also search massively using all search engines supported:
 
@@ -428,12 +428,17 @@ This will open a tab on your default browser with all features of the tool and s
  - GLOBAL.GRID: Allows to review statistics from other "spaceships"
  - GLOBAL.WARGAMES: Allows to propose and join some real "wargames"
  - GLOBAL.RADAR: Allows to review locations published by other "motherships"
+ - GLOBAL.NEWS: Allows to read news related to UFONet
  - [...]
 
 ###############################
 # Timelog
 ###############################
 
+--------------------------
+02.03.2022 : v.1.8
+--------------------------
+
 --------------------------
 14.07.2021 : v.1.7
 --------------------------
@@ -514,6 +519,7 @@ This will open a tab on your default browser with all features of the tool and s
 # Thanks to
 ###############################
 
+- BP<3
 - UFo & Mandingo & Ikujam
 - Phineas Fisher ;-)
 - The Shadow Brokers (TSB) ;_)

+ 1 - 0
docs/VERSION

@@ -18,3 +18,4 @@ Date	    Size     Version    Alias
 2020-06-08   27.2Mb   1.5       MuLTi.V3rSe!        
 2020-08-17   27.4Mb   1.6       M4RAuD3R!           
 2021-07-14   27.0Mb   1.7       /KRäK!eN/           
+2022-03-02   25.8Mb   1.8	DarK-PhAnT0m!       

+ 1 - 1
docs/release.date

@@ -1 +1 @@
-Wen Jul 14 07:00:04 2021
+Wen Mar  2 22:22:22 2022

+ 2 - 2
setup.py

@@ -3,7 +3,7 @@
 """
 This file is part of the UFONet project, https://ufonet.03c8.net
 
-Copyright (c) 2013/2021 | psy <epsylon@riseup.net>
+Copyright (c) 2013/2022 | psy <epsylon@riseup.net>
 
 You should have received a copy of the GNU General Public License along
 with UFONet; if not, write to the Free Software Foundation, Inc., 51
@@ -18,7 +18,7 @@ from setuptools import setup, find_packages
 
 setup(
     name='ufonet',
-    version='1.7',
+    version='1.8',
     license='GPLv3',
     author_email='epsylon@riseup.net',
     author='psy',

+ 1 - 1
ufonet

@@ -1,7 +1,7 @@
 #!/usr/bin/env python 
 # -*- coding: utf-8 -*-"
 """
-UFONet - Denial of Service Toolkit - 2013/2021 - by psy (epsylon@riseup.net)
+UFONet - Denial of Service Toolkit - 2013/2022 - by psy (epsylon@riseup.net)
 
 You should have received a copy of the GNU General Public License along
 with UFONet; if not, write to the Free Software Foundation, Inc., 51