engine.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. """
  4. @Author: hywell
  5. @Email: hywell.28@gmail.com
  6. @Blog: iassas.com
  7. @Date: 2019/10/16 23:38
  8. """
  9. import asyncio
  10. import aiodns
  11. # import multiprocessing as mp
  12. import traceback
  13. import sys
  14. from lib.controller.aiodirscan import dirBrute
  15. from lib.controller.aioportscan import portScan
  16. from lib.controller.aiosubdomainscan import subDomainBrute
  17. from lib.core.data import logger
  18. from lib.core.options import TargetRegister
  19. from lib.core.setting import CONF, DIR_FILE, DNS_SERVERS, DNS_SUB_FILE, DNS_SUB_FULL_FILE, TARGETS
  20. from lib.parse.result import resultParse, save
  21. async def scan(task_queue):
  22. while True:
  23. target = await task_queue.get()
  24. flag = target[0]
  25. current_target = target[1]
  26. results = []
  27. try:
  28. if flag == 1:
  29. results = await portScan(current_target)
  30. elif flag == 2 and CONF.dns_servers:
  31. results = await subDomainBrute(current_target)
  32. elif flag == 3:
  33. results = await dirBrute(current_target)
  34. except Exception as e:
  35. errmsg = traceback.format_exc()
  36. if "NmapError" in errmsg:
  37. TARGETS.ERROR.ip.append(current_target)
  38. else:
  39. logger.error("[AWIscan] It's errmsg:%s" % errmsg)
  40. logger.warning("[AWIScan] %s look like failed " % current_target)
  41. finally:
  42. logger.info('[AWIScan] Async working IP: %d/%d Domain: %d/%d URL: %d/%d' % (
  43. len(TARGETS.END.ip), len(TARGETS.IP), len(TARGETS.END.domain), len(TARGETS.DOMAIN),
  44. len(TARGETS.END.url), len(TARGETS.URL)))
  45. if results:
  46. # Parse the result, put it into the work queue.
  47. resultParse(task_queue, target, results)
  48. task_queue.task_done()
  49. async def control(base_targets):
  50. targets_queue = asyncio.Queue()
  51. # ip:[1, ip] domain:[2, domain] subDomain: [2, subDomain, domain] url_dir: [3, url_dir, url]
  52. for target in TargetRegister(base_targets):
  53. targets_queue.put_nowait(target)
  54. if targets_queue.qsize() == 0:
  55. logger.warning("[AWIScan] No targets found. Please load targets with [-i|-f] or verify target num")
  56. sys.exit()
  57. else:
  58. logger.info("[AWIScan] Target loading completed. Total %d targets" % (
  59. len(TARGETS.IP) + len(TARGETS.DOMAIN) + len(TARGETS.URL)))
  60. CONF.base_nums = targets_queue.qsize()
  61. logger.info("[AWIScan] Set the tasks of async_nums: %d" % CONF.async_num)
  62. tasks = []
  63. for i in range(0, CONF.async_num):
  64. tasks.append(
  65. asyncio.create_task(scan(targets_queue))
  66. )
  67. await targets_queue.join()
  68. save()
  69. def webEngine():
  70. for dir in open(DIR_FILE).readlines():
  71. dir = dir.strip()
  72. CONF.dir.append(dir)
  73. logger.info("[AWIScan] Dir loading completed. Total %d dir" % len(CONF.dir))
  74. async def test_server(server):
  75. resolver = aiodns.DNSResolver(nameservers=[server])
  76. try:
  77. answers = await resolver.query('public-dns-a.baidu.com', "A")
  78. if answers[0].host != '180.76.76.76':
  79. raise Exception('[AWIScan] %s return incorrect DNS response' % server)
  80. else:
  81. try:
  82. await resolver.query('test.bad.dns.iassas.com', "A")
  83. with open('output/AWIScan/bad_dns_servers.txt', 'a') as f:
  84. f.write(server + '\n')
  85. logger.warning("[AWIScan] Bad DNS Server found %s" % server)
  86. except aiodns.error.DNSError as e:
  87. if b"DNS server returned answer with no data" == e.args[1]:
  88. CONF.dns_servers.append(server)
  89. elif b"Timeout while contacting DNS servers" == e.args[1]:
  90. logger.warning("[AWIScan] %s DNS Server test error. Please verify." % server)
  91. logger.info('[AWIScan] DNS Server %s < OK > Found %s' % (server.ljust(16), len(CONF.dns_servers)))
  92. except Exception as e:
  93. logger.warning("[AWIScan] DNS Server %s <Fail> Found %s" % (server.ljust(16), len(CONF.dns_servers)))
  94. async def dnsEngine():
  95. tasks = []
  96. for server in open(DNS_SERVERS).readlines():
  97. server = server.strip()
  98. if server and not server.startswith('#'):
  99. tasks.append(
  100. asyncio.create_task(test_server(server))
  101. )
  102. await asyncio.gather(*tasks)
  103. if CONF.dns_servers and (CONF.level == 1 or CONF.level == 2):
  104. with open(DNS_SUB_FILE) as f:
  105. for sub in f.readlines():
  106. CONF.dns_sub.append(sub.strip())
  107. logger.info(
  108. "[AWIScan] DNS loading completed. Total %d DNS Server and %d sub" % (len(CONF.dns_servers),
  109. len(CONF.dns_sub)))
  110. elif CONF.dns_servers and CONF.level == 3:
  111. with open(DNS_SUB_FULL_FILE) as f:
  112. for sub in f.readlines():
  113. CONF.dns_sub.append(sub.strip())
  114. logger.info(
  115. "[AWIScan] DNS loading completed. Total %d DNS Server and %d sub" % (len(CONF.dns_servers),
  116. len(CONF.dns_sub)))
  117. def initEngine():
  118. asyncio.run(dnsEngine())
  119. webEngine()
  120. def run(base_targets):
  121. initEngine()
  122. asyncio.run(control(base_targets))