From bc0c975d69bff1860fb8a04cd77fed84f174d410 Mon Sep 17 00:00:00 2001 From: epi052 Date: Sun, 19 Jan 2020 13:51:24 -0600 Subject: [PATCH] added outdir option; install/scan colors match --- Pipfile.lock | 6 ++--- README.md | 6 ++++- recon-pipeline.py | 12 +++++----- recon/__init__.py | 5 ++++ recon/amass.py | 24 +++++++++++++------ recon/config.py | 17 ++++++++------ recon/masscan.py | 22 ++++++++++-------- recon/nmap.py | 11 ++++++--- recon/targets.py | 20 +++++++++++++--- recon/web/aquatone.py | 4 +++- recon/web/corscanner.py | 4 +++- recon/web/gobuster.py | 4 +++- recon/web/subdomain_takeover.py | 8 +++++-- recon/web/targets.py | 10 +++++--- recon/web/webanalyze.py | 4 +++- recon/wrappers.py | 41 +++++++++++++++++++++++++++++++++ 16 files changed, 150 insertions(+), 48 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 90b4d46..91a7a78 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -81,10 +81,10 @@ }, "six": { "hashes": [ - "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd", - "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66" + "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a", + "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c" ], - "version": "==1.13.0" + "version": "==1.14.0" }, "tornado": { "hashes": [ diff --git a/README.md b/README.md index 09bd8cf..4a00f9f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,10 @@ # Automated Reconnaissance Pipeline -![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg) +![version](https://img.shields.io/badge/version-0.7.0-informational?style=for-the-badge) +![python](https://img.shields.io/badge/python-3.7-informational?style=for-the-badge) +![luigi](https://img.shields.io/badge/luigi-2.8.11-yellowgreen?style=for-the-badge) +![cmd2](https://img.shields.io/badge/cmd2-0.9.23-yellowgreen?style=for-the-badge) +![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge) There are an [accompanying set of blog posts](https://epi052.gitlab.io/notes-to-self/blog/2019-09-01-how-to-build-an-automated-recon-pipeline-with-python-and-luigi/) detailing the development process and underpinnings of the pipeline. Feel free to check them out if you're so inclined, but they're in no way required reading to use the tool. diff --git a/recon-pipeline.py b/recon-pipeline.py index 2290610..e657823 100755 --- a/recon-pipeline.py +++ b/recon-pipeline.py @@ -108,7 +108,7 @@ class ReconShell(cmd2.Cmd): if self.sentry: # only set once the Luigi Execution Summary is seen - self.async_alert(cmd2.utils.align_center(style(output.strip(), fg="bright_blue"))) + self.async_alert(style(output.strip(), fg="bright_blue")) elif output.startswith("INFO: Informed") and output.strip().endswith("PENDING"): # luigi Task has been queued for execution @@ -140,7 +140,7 @@ class ReconShell(cmd2.Cmd): Possible scans include AmassScan CORScannerScan GobusterScan SearchsploitScan ThreadedNmapScan WebanalyzeScan AquatoneScan FullScan - MasscanScan SubjackScan TKOSubsScan + MasscanScan SubjackScan TKOSubsScan HTBScan """ self.async_alert( style( @@ -158,7 +158,7 @@ class ReconShell(cmd2.Cmd): # luigi --module recon.web.webanalyze WebanalyzeScan --target-file tesla --top-ports 1000 --interface eth0 command = ["luigi", "--module", scans.get(args.scantype)[0]] command.extend(args.__statement__.arg_list) - + self.async_alert(" ".join(command)) if args.verbose: # verbose is not a luigi option, need to remove it command.pop(command.index("--verbose")) @@ -227,13 +227,13 @@ class ReconShell(cmd2.Cmd): # used to determine whether the tool installed correctly or not retvals = list() - self.async_alert(style(f"[*] Installing {args.tool}...", fg="blue", bold=True)) + self.async_alert(style(f"[*] Installing {args.tool}...", fg="bright_yellow")) for command in tools.get(args.tool).get("commands"): # run all commands required to install the tool # print each command being run - self.async_alert(style(f"[-] {command}", fg="cyan")) + self.async_alert(style(f"[=] {command}", fg="cyan")) if tools.get(args.tool).get("shell"): @@ -260,7 +260,7 @@ class ReconShell(cmd2.Cmd): if all(x == 0 for x in retvals): # all return values in retvals are 0, i.e. all exec'd successfully; tool has been installed - self.async_alert(style(f"[+] {args.tool} installed!", fg="bright_green", bold=True)) + self.async_alert(style(f"[+] {args.tool} installed!", fg="bright_green")) tools[args.tool]["installed"] = True else: diff --git a/recon/__init__.py b/recon/__init__.py index 8e1b05e..c32d9f1 100644 --- a/recon/__init__.py +++ b/recon/__init__.py @@ -159,6 +159,11 @@ scan_parser.add_argument( scan_parser.add_argument( "--exempt-list", completer_method=cmd2.Cmd.path_complete, help="list of blacklisted ips/domains" ) +scan_parser.add_argument( + "--results-dir", + completer_method=cmd2.Cmd.path_complete, + help="directory in which to save scan results", +) scan_parser.add_argument( "--wordlist", completer_method=cmd2.Cmd.path_complete, help="path to wordlist used by gobuster" ) diff --git a/recon/amass.py b/recon/amass.py index 37e7c76..aecc983 100644 --- a/recon/amass.py +++ b/recon/amass.py @@ -21,6 +21,7 @@ class AmassScan(ExternalProgramTask): Args: exempt_list: Path to a file providing blacklisted subdomains, one per line. target_file: specifies the file on disk containing a list of ips or domains *--* Required by upstream Task + results_dir: specifes the directory on disk to which all Task results are written *--* Required by upstream Task """ exempt_list = luigi.Parameter(default="") @@ -33,7 +34,8 @@ class AmassScan(ExternalProgramTask): Returns: luigi.ExternalTask - TargetList """ - return TargetList(self.target_file) + args = {"target_file": self.target_file, "results_dir": self.results_dir} + return TargetList(**args) def output(self): """ Returns the target output for this task. @@ -43,7 +45,7 @@ class AmassScan(ExternalProgramTask): Returns: luigi.local_target.LocalTarget """ - return luigi.LocalTarget(f"amass.{self.target_file}.json") + return luigi.LocalTarget(f"{self.results_dir}/amass.{self.target_file}.json") def program_args(self): """ Defines the options/arguments sent to amass after processing. @@ -51,6 +53,7 @@ class AmassScan(ExternalProgramTask): Returns: list: list of options/arguments, beginning with the name of the executable to run """ + print(f"debug-epi: amass {self.results_dir}") if not self.input().path.endswith("domains"): return f"touch {self.output().path}".split() @@ -65,7 +68,7 @@ class AmassScan(ExternalProgramTask): "-df", self.input().path, "-json", - f"amass.{self.target_file}.json", + self.output().path, ] if self.exempt_list: @@ -82,6 +85,7 @@ class ParseAmassOutput(luigi.Task): Args: target_file: specifies the file on disk containing a list of ips or domains *--* Required by upstream Task exempt_list: Path to a file providing blacklisted subdomains, one per line. *--* Optional for upstream Task + results_dir: specifes the directory on disk to which all Task results are written *--* Required by upstream Task """ def requires(self): @@ -94,7 +98,11 @@ class ParseAmassOutput(luigi.Task): luigi.ExternalTask - TargetList """ - args = {"target_file": self.target_file, "exempt_list": self.exempt_list} + args = { + "target_file": self.target_file, + "exempt_list": self.exempt_list, + "results_dir": self.results_dir, + } return AmassScan(**args) def output(self): @@ -109,9 +117,11 @@ class ParseAmassOutput(luigi.Task): dict(str: luigi.local_target.LocalTarget) """ return { - "target-ips": luigi.LocalTarget(f"{self.target_file}.ips"), - "target-ip6s": luigi.LocalTarget(f"{self.target_file}.ip6s"), - "target-subdomains": luigi.LocalTarget(f"{self.target_file}.subdomains"), + "target-ips": luigi.LocalTarget(f"{self.results_dir}/{self.target_file}.ips"), + "target-ip6s": luigi.LocalTarget(f"{self.results_dir}/{self.target_file}.ip6s"), + "target-subdomains": luigi.LocalTarget( + f"{self.results_dir}/{self.target_file}.subdomains" + ), } def run(self): diff --git a/recon/config.py b/recon/config.py index 4e0e28c..722e8be 100644 --- a/recon/config.py +++ b/recon/config.py @@ -1,11 +1,14 @@ +from pathlib import Path + top_tcp_ports = [80,23,443,21,22,25,3389,110,445,139,143,53,135,3306,8080,1723,111,995,993,5900,1025,587,8888,199,1720,465,548,113,81,6001,10000,514,5060,179,1026,2000,8443,8000,32768,554,26,1433,49152,2001,515,8008,49154,1027,5666,646,5000,5631,631,49153,8081,2049,88,79,5800,106,2121,1110,49155,6000,513,990,5357,427,49156,543,544,5101,144,7,389,8009,3128,444,9999,5009,7070,5190,3000,5432,1900,3986,13,1029,9,6646,5051,49157,1028,873,1755,2717,4899,9100,119,37,1000,3001,5001,82,10010,1030,9090,2107,1024,2103,6004,1801,5050,19,8031,1041,255,1056,1049,1065,2967,1053,1048,1064,1054,3703,17,808,3689,1031,1044,1071,5901,100,9102,8010,1039,4001,2869,9000,5120,2105,636,1038,2601,1,7000,1066,1069,625,311,280,254,4000,1761,5003,2002,1998,2005,1032,1050,6112,3690,1521,2161,6002,1080,2401,4045,902,787,7937,1058,2383,32771,1059,1040,1033,50000,5555,10001,1494,593,3,2301,7938,3268,1234,1022,1074,9001,8002,1036,1035,1037,464,1935,497,6666,2003,6543,24,1352,3269,1111,407,500,20,2006,1034,3260,15000,1218,4444,264,2004,33,42510,1042,3052,999,1023,222,1068,7100,888,563,1717,992,32770,2008,32772,7001,2007,8082,5550,5801,2009,512,1043,163,50001,2701,1700,7019,4662,2065,2010,42,161,2602,9535,3333,5100,5002,2604,4002,6059,1062,9415,8701,8652,8651,8089,65389,65000,64680,64623,55600,55555,52869,35500,33354,23502,20828,8194,8193,8192,2702,1311,1060,4443,9595,1051,3283,1047,9594,6789,5226,5225,32769,1052,9593,1055,16993,16992,730,731,709,13782,1067,5902,366,9050,1002,85,5500,8085,51103,49999,45100,10243,5431,1864,1863,49,6667,90,1503,27000,6881,1500,340,8021,164,5566,9071,8088,8899,2222,6005,32773,32774,9876,1501,9101,5102,163,5679,648,1666,146,901,83,9207,8001,8083,8084,5214,14238,3476,5004,30,12345,912,2030,2605,6,541,4,1248,3005,8007,880,306,2500,4242,8291,52822,1097,9009,2525,1086,1088,900,6101,7200,2809,987,32775,800,12000,1083,211,705,711,20005,13783,6969,1104,5269,5222,1046,1085,5987,5989,5988,9968,9503,9502,9485,9290,9220,9011,8994,8649,8222,7911,7625,7106,65129,63331,6156,6129,60020,5962,5961,5960,5959,5925,5877,5825,5810,58080,57294,50800,50006,50003,49160,49159,49158,48080,40193,34573,34572,34571,3404,33899,3301,32782,32781,31038,30718,28201,27715,25734,24800,22939,21571,20221,20031,19842,19801,19101,17988,1783,16018,16016,15003,14442,13456,10629,10628,10626,10621,10617,10616,10566,10025,10024,10012,1169,2190,11967,5030,5414,1057,7627,6788,3766,8087,11110,1947,9010,7741,14000,3367,1094,1099,1098,1075,1108,4003,1081,1093,4449,2718,6580,15002,4129,1687,1840,3827,30000,3580,1100,2144,1063,1061,6901,9900,1107,1106,9500,20222,7778,8181,1077,3801,1310,1718,2119,2811,2492,2135,1070,9080,1045,16001,2399,3017,3031,1148,9002,8873,2875,8086,5718,10002,3998,20000,4126,8400,1272,3071,5911,2607,9618,2381,1096,5910,6389,3300,7777,1072,3351,1073,8333,3784,15660,5633,6123,3211,1078,8600,1079,3659,3551,2260,2160,1082,2100,3325,3323,8402,89,691,2020,1001,1999,32776,212,6003,2998,50002,7002,32,898,5510,3372,2033,5903,99,749,425,43,5405,6502,13722,6106,458,7007,9666,8100,3737,5280,9091,4111,1334,3261,1152,2522,5859,2179,1247,9944,9943,9877,9110,8654,8254,8180,8011,7512,7435,7103,61900,61532,5922,5915,5904,5822,56738,55055,51493,50636,50389,49175,49165,49163,3546,32784,27355,27353,27352,24444,19780,18988,16012,15742,10778,2191,3011,1580,5200,3851,3371,3370,3369,7402,5054,4006,5298,3918,2126,3077,7443,8090,3493,3828,4446,1186,1183,19283,19315,3995,62078,5963,3880,1124,1782,8500,1089,10004,1296,9998,2251,1087,3871,3030,9040,32779,32777,1021,32778,2021,616,700,666,5802,4321,1112,38292,2040,1524,545,84,49400,32780,2111,1600,2048,3006,1084,2638,6547,16080,6699,9111,6007,1533,720,2034,5560,1443,2106,555,667,801,3221,6025,3826,9200,2608,4279,7025,11111,4445,9917,9575,9099,9003,8290,8099,8093,8045,7921,7920,7496,6839,6792,6779,6692,6565,60443,5952,5950,5907,5906,5862,5850,5815,5811,57797,56737,5544,55056,5440,54328,54045,52848,52673,50500,50300,49176,49167,49161,44501,44176,41511,40911,32785,32783,30951,27356,26214,25735,19350,18101,18040,17877,16113,15004,14441,12265,12174,10215,10180,1151,5730,6689,8200,4567,8300,6100,10009,8800,5061,6566,5678,4004,4005,3800,3168,3869,5080,8022,1201,3814,1862,3905,2725,2394,2393,9898,1114,6510,8383,3914,3971,9878,5033,7999,7676,4900,9418,4550,2909,8042,3878,16000,1091,1090,1271,3920,6567,1138,3945,3390,1175,10003,1199,3889,9081,3003,1131,1119,8292,5087,3527,1122,7800,1117,4848,3809,3324,3322,3517,5221,2323,4224,981,722,1009,617,417,777,4998,714,70,6346,2022,765,301,1076,524,5999,668,2041,10082,6009,1007,4343,1417,416,2038,1434,259,44443,1984,2068,7004,911,6006,726,1010,2046,4125,109,9103,2035,1461,7201,687,1011,2013,125,903,2043,6669,6668,1455,481,2047,683,843,783,9929,5998,2042,406,256,31337,44442,2045,4040,1145,6060,6051,3916,9444,1875,7272,4147,4252,4200,13724,7024,1556,9941,9914,9815,9673,9643,9621,9501,9409,9198,9197,9098,8996,8987,8877,8676,8648,8540,8481,8385,8189,8098,8095,8050,8016,8015,7929,7770,7749,7438,7241,7123,7051,7050,6896,6732,6711,65310,6520,6504,6247,6203,61613,60642,60146,60123,5981,5940,59202,59201,59200,5918,5914,59110,5909,5905,5899,58838,5869,58632,58630,5823,5818,5812,5807,58002,58001,57665,55576,55020,53535,5339,53314,53313,53211,52853,52851,52850,52849,52847,5279,52735,52710,52660,5242,5212,51413,51191,5040,50050,49401,49236,49195,49186,49171,49168,49164,4875,47544,46996,46200,44709,41523,41064,40811,3994,39659,39376,39136,38188,38185,37839,35513,33554,33453,32835,32822,32816,32803,32792,32791,30704,30005,29831,29672,28211,27357,26470,23796,23052,2196,21792,19900,18264,18018,17595,16851,16800,16705,15402,15001,12452,12380,12262,12215,12059,12021,10873,10058,10034,10022,10011,1233,8765,9443,1137,3963,5938,2910,9191,8686,3808,3981,2710,3852,3853,3849,3944,3929,3731,1594,1658,3792,1583,4164,3162,6481,5081,1163,3820,40000,8097,4430,4555,1287,2920,1121,1154,7744,1812,26000,1166,1164,1165,7913,2366,10160,8019,4658,4600,7878,3870,3304,3307,1259,7278,4143,3872,10008,1092,3697,1688,9988,1322,7725,2557,1095,3410,1971,1839,2288,3859,1141,3514,1123,4949,3931,2382,8675,6600,3957,5968,1213,1277,9600,7900,5353,1113,3700,3007,4080,3969,1132,1309,3848,7281,1244,1641,1972,3907,3972,2200,3968,1126,5223,1217,3941,8293,1300,1719,2099,6068,3013,3050,1105,1174,6550,5501,3684,2170,1328,1216,5151,2968,1805,7080,1914,22222,1974,5868,31727,8889,12006,3119,5063,3400,20002,3888,1301,4009,10023,3376,1185,1130,1147,1198,1192,1721,1149,3990,1236,3993,4096,6500,8294,3863,3846,8766,1187,5074,1102,3824,2800,1103,780,930,803,725,2012,10005,2501,6222,1220,623,639,502,701,1109,2232,2241,4559,710,5680,1347,913,540,931,874,856,250,5010,475,1270,953,2044,8118,123,27,1222,86,1158,9992,102,441,447,442,18000,419,210,6008,5803,980,251,1013,1008,3025,5520,3299,6103,556,87,57,829,9152,1212,55,713,709,2628,2433,223,10083,7003,1550,1516,7010,943,904,840,825,792,732,1020,1006,333,657,748,2011,77,1526,557,610,1241,4333,127,1547,157,220,523,1351,1350,2067,684,674,996,602,3456,971,969,905,846,839,823,822,795,790,778,757,659,225,1015,1014,1012,862,655,3399,1522,1353,6662,1357,731,730,729,660,600,782,257,2903,2025,3632,786,998,2201,6050,2600,6017,1337,690,606,928,924,922,921,918,878,864,859,806,805,728,252,1005,1004,388,44334,5011,1127,411,641,3999,59,1525,758,740,12346,669,802,98,38037,754,2112,715,6670,1413,1414,621,2104,1229,7628,5021,5020,3220,9667,1558,1924,6115,3940,6063,6062,6055,6052,6030,6021,6015,6010,3806,5986,5985,2340,8006,2371,4545,3810,2991,3414,6065,1290,1565,3511,1559,2723,9202,4036,4035,2312,3652,5070,3280,1317,4298,4297,4294,4262,4243,4234,4220,4206,9300,4433,22555,9979,5423,7121,1927,2148,1707,1168,7998,4414,5055,9975,9971,9919,9915,9912,9910,9908,9901,9844,9830,9826,9825,9823,9814,9812,9777,9745,9683,9680,9679,9674,9665,9661,9654,9648,9620,9619,9613,9583,9527,9513,9493,9478,9464,9454,9364,9351,9183,9170,9133,9130,9128,9125,9065,9061,9044,9037,9013,9004,8925,8898,8887,8882,8879,8878,8865,8843,8801,8798,8790,8772,8756,8752,8736,8680,8673,8658,8655,8644,8640,8621,8601,8562,8539,8531,8530,8515,8484,8479,8477,8455,8454,8453,8452,8451,8409,8339,8308,8295,8273,8268,8255,8248,8245,8144,8133,8110,8092,8064,8037,8029,8023,8018,8014,7975,7895,7854,7853,7852,7830,7813,7788,7780,7772,7771,7688,7685,7654,7637,7600,7555,7553,7456,7451,7231,7218,7184,7119,7104,7102,7092,7072,7068,7067,7043,7033,6973,6972,6956,6942,6922,6920,6897,6877,6780,6734,6725,6710,6709,6650,6647,6644,6606,65514,65488,6535,65311,65048,64890,64727,64726,64551,64507,64438,64320,6412,64127,64080,63803,63675,6349,63423,6323,63156,6310,63105,6309,62866,6274,6273,62674,6259,62570,62519,6250,62312,62188,62080,62042,62006,61942,61851,61827,61734,61722,61669,61617,61616,61516,61473,61402,6126,6120,61170,61169,61159,60989,6091,6090,60794,60789,60783,60782,60753,60743,60728,60713,6067,60628,60621,60612,60579,60544,60504,60492,60485,60403,60401,60377,60279,60243,60227,60177,60111,60086,60055,60003,60002,60000,59987,59841,59829,59810,59778,5975,5974,5971,59684,5966,5958,59565,5954,5953,59525,59510,59509,59504,5949,59499,5948,5945,5939,5936,5934,59340,5931,5927,5926,5924,5923,59239,5921,5920,59191,5917,59160,59149,59122,59107,5908,59087,58991,58970,58908,5888,5887,5881,5878,5875,5874,58721,5871,58699,58634,58622,58610,5860,5858,58570,58562,5854,5853,5852,5849,58498,5848,58468,5845,58456,58446,58430,5840,5839,5838,58374,5836,5834,5831,58310,58305,5827,5826,58252,5824,5821,5820,5817,58164,58109,58107,5808,58072,5806,5804,57999,57988,57928,57923,57896,57891,57733,57730,57702,57681,57678,57576,57479,57398,57387,5737,57352,57350,5734,57347,57335,5732,57325,57123,5711,57103,57020,56975,56973,56827,56822,56810,56725,56723,56681,5667,56668,5665,56591,56535,56507,56293,56259,5622,5621,5620,5612,5611,56055,56016,55948,55910,55907,55901,55781,55773,55758,55721,55684,55652,55635,55579,55569,55568,55556,5552,55527,55479,55426,55400,55382,55350,55312,55227,55187,55183,55000,54991,54987,54907,54873,54741,54722,54688,54658,54605,5458,5457,54551,54514,5444,5442,5441,54323,54321,54276,54263,54235,54127,54101,54075,53958,53910,53852,53827,53782,5377,53742,5370,53690,53656,53639,53633,53491,5347,53469,53460,53370,53361,53319,53240,53212,53189,53178,53085,52948,5291,52893,52675,52665,5261,5259,52573,52506,52477,52391,52262,52237,52230,52226,52225,5219,52173,52071,52046,52025,52003,52002,52001,52000,51965,51961,51909,51906,51809,51800,51772,51771,51658,51582,51515,51488,51485,51484,5147,51460,51423,51366,51351,51343,51300,5125,51240,51235,51234,51233,5122,5121,51139,51118,51067,51037,51020,51011,50997,5098,5096,5095,50945,5090,50903,5088,50887,50854,50849,50836,50835,50834,50833,50831,50815,50809,50787,50733,50692,50585,50577,50576,50545,50529,50513,50356,50277,50258,50246,50224,50205,50202,50198,50189,5017,5016,50101,50040,50019,50016,49927,49803,49765,49762,49751,49678,49603,49597,49522,49521,49520,49519,49500,49498,49452,49398,49372,49352,4931,49302,49275,49241,49235,49232,49228,49216,49213,49211,49204,49203,49202,49201,49197,49196,49191,49190,49189,49179,49173,49172,49170,49169,49166,49132,49048,4903,49002,48973,48967,48966,48925,48813,48783,48682,48648,48631,4860,4859,48434,48356,4819,48167,48153,48127,48083,48067,48009,47969,47966,4793,47860,47858,47850,4778,47777,4771,4770,47700,4767,47634,4760,47595,47581,47567,47448,47372,47348,47267,47197,4712,47119,47029,47012,46992,46813,46593,4649,4644,46436,46418,46372,46310,46182,46171,46115,4609,4606,46069,46034,45960,45864,45777,45697,45624,45602,45463,45438,45413,4530,45226,45220,4517,4516,45164,45136,45050,45038,44981,44965,4476,4471,44711,44704,4464,44628,44616,44541,44505,44479,44431,44410,44380,44200,44119,44101,44004,4388,43868,4384,43823,43734,43690,43654,43425,43242,43231,43212,43143,43139,43103,43027,43018,43002,42990,42906,42735,42685,42679,42675,42632,42590,42575,42560,42559,42452,42449,42322,42276,42251,42158,42127,42035,42001,41808,41773,41632,41551,41442,41398,41348,41345,41342,41318,41281,41250,41142,41123,40951,40834,40812,40754,40732,40712,40628,40614,40513,40489,40457,40400,40393,40306,40011,40005,40003,40002,40001,39917,39895,39883,39869,39795,39774,39763,39732,39630,39489,39482,39433,39380,39293,39265,39117,39067,38936,38805,38780,38764,38761,38570,38561,38546,38481,38446,38358,38331,38313,38270,38224,38205,38194,38029,37855,37789,37777,37674,37647,37614,37607,37522,37393,37218,37185,37174,37151,37121,36983,36962,36950,36914,36824,36823,36748,36710,36694,36677,36659,36552,36530,36508,36436,36368,36275,36256,36105,36104,36046,35986,35929,35906,35901,35900,35879,35731,35593,35553,35506,35401,35393,35392,35349,35272,35217,35131,35116,35050,35033,34875,34833,34783,34765,34728,34683,34510,34507,34401,34381,34341,34317,34189,34096,34036,34021,33895,33889,33882,33879,33841,33605,33604,33550,33523,33522,33444,33395,33367,33337,33335,33327,33277,33203,33200,33192,33175,33124,33087,33070,33017,33011,33000,32976,32961,32960,32944,32932,32911,32910,32908,32905,32904,32898,32897,32888,32871,32869,32868,32858,32842,32837,32820,32815,32814,32807,32799,32798,32797,32790,32789,32788,32765,32764,32261,32260,32219,32200,32102,32088,32031,32022,32006,31728,31657,31522,31438,31386,31339,31072,31058,31033,30896,30705,30659,30644,30599,30519,30299,30195,30087,29810,29507,29243,29152,29045,28967,28924,28851,28850,28717,28567,28374,28142,28114,27770,27537,27521,27372,27351,27350,27316,27204,27087,27075,27074,27055,27016,27015,26972,26669,26417,26340,26007,26001,25847,25717,25703,25486,25473,25445,25327,25288,25262,25260,25174,24999,24616,24552,24416,24392,24218,23953,23887,23723,23451,23430,23382,23342,23296,23270,23228,23219,23040,23017,22969,22959,22882,22769,22727,22719,22711,22563,22341,22290,22223,22200,22177,22100,22063,22022,21915,21891,21728,21634,21631,21473,21078,21011,20990,20940,20934,20883,20734,20473,20280,20228,20227,20226,20225,20224,20223,20180,20179,20147,20127,20125,20118,20111,20106,20102,20089,20085,20080,20076,20052,20039,20032,20021,20017,20011,19996,19995,19852,19715,19634,19612,19501,19464,19403,19353,19201,19200,19130,19010,18962,18910,18887,18874,18669,18569,18517,18505,18439,18380,18337,18336,18231,18148,18080,18015,18012,17997,17985,17969,17867,17860,17802,17801,17715,17702,17701,17700,17413,17409,17255,17251,17129,17089,17070,17017,17016,16901,16845,16797,16725,16724,16723,16464,16372,16349,16297,16286,16283,16273,16270,16048,15915,15758,15730,15722,15677,15670,15646,15645,15631,15550,15448,15344,15317,15275,15191,15190,15145,15050,15005,14916,14891,14827,14733,14693,14545,14534,14444,14443,14418,14254,14237,14218,14147,13899,13846,13784,13766,13730,13723,13695,13580,13502,13359,13340,13318,13306,13265,13264,13261,13250,13229,13194,13193,13192,13188,13167,13149,13142,13140,13132,13130,13093,13017,12962,12955,12892,12891,12766,12702,12699,12414,12340,12296,12275,12271,12251,12243,12240,12225,12192,12171,12156,12146,12137,12132,12097,12096,12090,12080,12077,12034,12031,12019,11940,11863,11862,11813,11735,11697,11552,11401,11296,11288,11250,11224,11200,11180,11100,11089,11033,11032,11031,11026,11019,11007,11003,10900,10878,10852,10842,10754,10699,10602,10601,10567,10565,10556,10555,10554,10553,10552,10551,10550,10535,10529,10509,10494,10443,10414,10387,10357,10347,10338,10280,10255,10246,10245,10238,10093,10064,10045,10042,10035,10019,10018,1823,1327,3479,3653,2330,8201,4876,3240,2580,2644,3600,4020,2700,2436,3906,4375,1584,4024,5581,5580,6251,3943,3200,1223,2142,1976,1975,5202,5201,3817,9020,4016,5111,3281,9911,3923,2439,3930,7345,7325,7320,7300,1250,1221,2973,3909,16161,14001,1607,1736,1330,3080,4158,2270,3526,5066,1204,2711,2187,1750,3430,2728,3796,5814,2888,3922,3803,3419,4881,5250,3979,3670,4174,3102,1605,3483,2631,7500,1645,4190,5553,5554,1303,3636,1251,1243,3712,8052,8883,9400,1291,1208,3319,1297,3935,3897,5152,3637,1200,1811,1215,3962,3368,3860,3964,4442,9875,1128,4010,3291,1118,8401,3765,7400,2101,1699,2889,1195,1694,1730,5053,1912,1745,2250,1712,6379,43000,1306,2997,3532,2449,3813,2083,3799,3790,3599,3850,4355,4358,4357,4356,1262,5433,4007,4713,3089,1101,4374,3658,1268,3961,3911,1735,1858,3396,1753,1264,1711,3967,2505,3118,4601,1321,8471,1598,1305,1314,3121,2558,6161,4025,9022,9021,1632,9995,30001,1307,1981,2532,3443,7501,8472,9990,1808,1159,2435,1194,1622,5014,4161,1135,3904,5723,4090,9211,9210,4141,7789,1308,6619,9628,3519,12121,4687,4454,5012,3680,3167,8474,8980,1239,3901,3902,3842,16900,4700,4118,1799,12865,3812,2606,1196,10115,3928,1615,2902,10006,2882,3890,1683,2706,3063,3062,2095,2096,5133,3363,4407,1340,4447,3795,8005,10007,3515,1806,6888,4602,1911,4558,2438,3847,3882,5722,1883,1261,5969,9343,5252,28017,27019,27018,27017,2583,2031,2197,2271,3837,4120,3798,25565,2269,20001,2292,2622,11001,1207,2850,1249,21201,8003,3311,1180,2908,3936,3023,4912,3503,2463,1752,2280,4056,2623,4877,1184,9333,19333,3913,3672,4342,8282,1861,9592,7099,2372,1701,1318,6085,2081,1339,4058,2115,8900,2958,2957,4328,7071,1276,3899,2531,2691,5052,3788,1638,2551,1336,11000,48619,4029,3497,1209,3603,1331,1240,2082,3856,3602,1176,1143,4800,4100,3486,2987,2326,6077,25001,25000,2062,1792,1156,1157,2313,3952,3919,5023,3439,6324,1188,1125,1299,3908,2984,1715,8232,1722,2988,10500,1136,4999,1162,1703,3956,22128,1677,1211,1191,9005,3057,2086,12009,3530,4325,1708,3520,5235,1144,5015,5013,4745,1228,3210,2425,1901,5912,3787,32767,1807,3825,3622,5502,4039,1620,5557,10101,3002,1316,3728,5114,2069,1569,9616,3621,4369,1210,12001,12002,5233,3586,1691,1282,1315,2087,7101,2124,3983,3982,2224,5234,1635,3263,4121,2291,1791,2150,3310,1958,2804,3937,3831,2253,5721,3663,4401,3949,9909,2376,2375,4022,1973,3876,3362,3334,47624,1825,3868,4570,1324,1279,9131,4302,3793,1173,22125,17500,12005,6113,2584,2300,8954,9287,5137,3190,3742,2806,41795,41794,8116,1566,4300,8445,3365,4665,3577,1713,2261,2262,1592,1190,22350,3374,2567,9694,4135,2598,1167,8470,3749,1302,3830,1709,3485,8880,2734,3505,3388,3669,2418,1871,1918,8025,2472,1153,3991,3989,3992,3681,3014,4101,4415,6503,9700,3683,1150,18333,4376,24554,2302,3146,8999,3415,3946,2203,1179,4192,4418,5005,2134,4065,2080,3103,9084,2304,2812,4119,1560,4534,1835,1116,3513,2265,5473,5475,3879,4087,2898,4112,1134,3948,9950,3506,9161,9160,47806,2712,1800,2325,2930,3839,1319,5672,3811,4689,2456,2901,3975,4113,2847,2070,3425,3997,3915,6579,6628,8202,8060,2550,8403,6350,3823,3980,2335,1182,1954,3996,10020,3656,4599,2391,400,22273,769,983,979,973,967,965,961,942,935,926,925,914,863,858,844,834,817,815,811,809,789,779,743,1019,1989,11,1507,1492,66,32787,32786,509,706,635,762,5632,47,830,4008,5977,1444,3985,6105,578,591,678,27001,642,446,1495,5308,1441,31416,54320,7005,52,1652,682,577,985,984,974,958,952,949,946,923,916,899,897,894,889,835,824,814,807,804,798,733,727,237,12,10,219,525,1420,665,501,6110,122,3045,440,664,620,615,3398,771,653,75,158,716,861,1366,1663,833,1364,603,91,750,828,9991,860,695,101,634,538,1359,989,27010,810,510,4199,3064,847,68,76,1358,3049,1139,1680,649,707,449,104,629,2024,1517,2430,1370,988,962,948,945,941,938,936,929,927,919,906,883,881,875,872,870,866,855,851,850,841,836,826,820,819,816,813,791,745,736,735,724,719,343,334,300,28,249,230,16,1018,1016,3900,450,1988,2014,492,2018,658,1474,268,27374,1991,605,8076,1178,3086,1651,5232,1349,696,5145,50,630,7597,663,1445,1402,1465,2307,1552,5400,627,1384,7273,950,1388,92,609,741,831,353,5978,45,4660,638,112,456,760,761,2120,9104,702,6665,1404,651,1389,1551,661,5300,491,6347,221,4557,1214,640,647,448,1356,6401,507,1484,673,1523,1400,1399,632,1385,5191,1346,6143,676,214,3141,670,970,968,964,963,960,959,951,947,944,939,933,909,895,891,879,869,868,867,837,821,812,797,796,794,788,756,734,721,718,708,703,60,40,253,231,14,1017,1003,1996,27665,1527,69,1475,97,656,633,8892,975,5530,2026,3397,4500,560,180,1354,1497,628,4480,1403,35,8123,11371,553,1995,511,18182,18184,723,1466,611,1486,689,1650,1668,1664,15,832,137,13720,991,561,3292,685,997,505,1496,637,1762,51,751,9107,9106,9105,994,194,213,1539,1412,1515,886,1405,1435,692,694,1369,103,1401,402,1997,1372,681,680,704,644,2064,854,675,1379,47557,2015,1467,624,799,454,622,1476,1373,3264,6701,1387,770,14141,1348,182,201,262,1381,654,6588,1535,7009,58,2023,177,776,26208,4144,2627,1498,1519,672,677,1545,1398,2431,3457,697,401,982,978,972,966,957,956,934,920,915,908,907,892,890,885,884,882,877,876,865,857,852,849,842,838,827,818,793,785,784,755,746,738,737,717,34,336,325,303,276,273,236,235,233,181,604,9051,1362,493,712,1437,601,412,1529,871,95,1994,1992,1990,133,6145,486,362,193,200,118,6111,608,1549,2027,115,1537,1368,1436,1426,774,688,1531,38,129,645,136,3531,1827,65301,16444,1446,18183,18181,260,536,764,698,94,4132,261,607,308,1667,1662,1661,74,73,71,1493,138,13713,404,5997,6544,1510,568,29,31,397,44,6147,1528,350,224,6146,1986,1763,2053,399,1355,1454,1390,1393,1394,887,1376,418,1424,1410,1409,7634,686,5301,5302,176,848,1513,747,1499,1439,1438,315,853,196,466,410,403,93,1456,1479,355,462,763,1472,6400,453,759,437,619,2432,1386,120,6700,1442,415,1432,1548,1422,114,1397,206,202,204,6142,1544,422,8770,626,7008,7006,1483,1365,699,1511,1538,346,173,54,56,1462,2019,1518,516,1457,117,986,977,976,955,954,937,932,8,896,893,845,768,766,739,337,329,326,305,295,294,293,289,288,277,238,234,229,228,226,571,522,1470,1987,1430,1419,1418,526,267,209,65,391,392,2028,773,614,150,1408,572,162,1993,108,413,596,420,460,1543,358,1502,451,452,361,470,598,360,457,582,643,487,322,168,753,369,1509,2108,4672,185,43188,1541,1540,752,189,7464,271,191,5714,5717,5713,1459,408,6548,485,496,767,583,662,1449,1480,192,18187,1473,423,184,428,1448,4133,518,1458,1416,1429,533,1672,1671,1670,72,742,13721,13718,13715,13714,13701,1363,569,1464,1374,435,434,1427,1482,1532,1360,570,6141,4987,265,351,3984,174,480,472,2766,1361,373,17300,910,17007,380,414,1451,535,1395,1391,7326,432,479,473,781,383,2564,613,612,151,652,5303,1383,128,1542,19150,270,1453,190,258,1505,27009,744,27007,27005,27003,27002,1371,1423,775,141,1440,1396,352,438,1488,96,1508,67,552,618,316,1367,1407,217,439,528,148,530,284,5490,2,542,370,132,130,2016,15151,3421,142,248,364,48,216,205,5193,1491,124,116,1411,149,599,1469,564,2133,44123,41230,4123,7173,3925,7088,1425,17756,17755,4072,3774,3841,2102,17754,2989,317,10051,10050,31029,9978,9925,3832,36462,508,3424,3423,5793,6116,4095,3721,3646,3510,1619,6936,3722,3651,5634,14500,3865,15345,3763,11876,16619,165,2157,38422,1716,2279,7430,3877,5270,9092,3953,3412,4788,1933,5344,2341,2327,3088,6558,2130,7629,3074,2165,3639,4389,1934,5757,11877,6061,6058,6057,6056,6054,6053,6049,6048,6047,6046,6045,6044,6043,6042,6041,6040,6039,6038,6037,6036,6035,6034,6033,6032,6031,6029,6028,6027,6026,6024,6023,6022,6020,6019,6018,6016,6014,6013,6012,6011,3741,4368,1760,2784,5413,3717,3716,3590,2396,2923,2805,3111,6602,4537,4431,5007,5006,3378,4879,3702,5358,6114,2596,2595,4417,3466,22321,22305,22289,3219,4883,1338,36411,2504,2720,4871,3861,1512,47001,7395,3926,5166,3674,1785,1727,1326,2980,2231,2518,1890,11208,4390,22347,2781,565,3233,3359,4057,4847,4177,4984,3342,3427,21845,2907,1963,2054,2851,3748,1739,11095,48050,4845,4185,8912,5990,1269,3563,5743,5744,12321,12322,9203,9201,9206,9204,9205,2949,2948,6626,2455,4049,3633,5787,2547,2548,2546,4790,4789,3207,8199,4145,13882,3482,2216,3509,5780,3122,16666,7779,2695,3375,312,2996,7566,2539,2893,9598,1880,2387,3317,1885,14149,2410,4032,2821,2255,2074,1956,4991,3883,4299,4296,4295,4293,4292,4291,4290,4289,4288,4287,4286,4285,4284,4283,4282,4281,4280,4278,4277,4276,4275,4274,4273,4272,4271,4270,4269,4268,4267,4266,4265,4264,4263,4261,4260,4259,4258,4257,4256,4255,4254,4253,4251,4250,4249,4248,4247,4246,4245,4244,4241,4240,4239,4238,4237,4236,4235,4233,4232,4231,4230,4229,4228,4227,4226,4225,4223,4222,4221,4219,4218,4217,4216,4215,4214,4213,4212,4211,4210,4209,4208,4207,4205,4204,4203,4202,4201,2530,1589,2649,1224,5046,1345,5164,8473,28200,3845,3625,3541,21590,25793,1796,8699,2538,7802,3321,8182,175,1868,2474,24249,1631,6672,6673,3601,4307,9284,1852,2386,3752,12013,12012,4344,3245,1853,3231,3058,63,3802,5646,6678,78,17184,2610,3738,2770,2994,2993,2802,3270,2771,4621,575,18668,1775,14150,3073,2554,2426,1771,4188,4839,4838,4837,3654,3676,8034,14154,671,5675,15118,2529,430,431,519,1506,3272,3534,2745,3786,2648,3664,3356,2537,3313,3314,1957,2820,4184,3217,126,37654,1979,1978,9629,2927,4127,2357,4867,2696,1889,2499,2437,2655,1189,5281,2138,2110,2248,3098,1797,1910,1737,483,372,390,6306,3720,8778,1382,1867,2542,1624,1833,3584,8070,13894,2879,4034,7887,8953,19194,2767,2768,145,3012,8937,3428,27999,21800,3791,2670,3492,34249,39681,1846,5197,9762,5747,5748,3474,2943,5462,5463,2862,2484,3468,2977,2978,2675,2483,3579,1568,2077,2489,4422,1237,2741,2742,12753,2573,8804,4725,2156,3346,9555,10200,1588,4070,6069,21212,4711,4323,4322,7727,3608,3959,17224,17225,2405,4678,3858,3857,5282,1869,9277,2642,3462,20670,33434,1906,594,2078,2158,5153,3885,2885,24465,3040,20167,8066,2669,474,476,2739,3308,590,3309,8320,8321,7901,7903,7902,3686,377,20046,5583,2798,4176,3083,6252,3082,3081,2361,2915,1965,6118,3160,5104,3754,3243,10261,4124,5450,7548,1832,4139,4423,2296,6201,4146,3713,1758,5048,31457,7631,3544,41121,359,11600,7491,3696,3549,1728,1380,2060,5428,1946,559,9668,9222,1814,3805,1977,2576,2729,24680,1610,25900,2403,2402,2470,3552,6442,5203,3144,2306,1922,2726,6149,7015,7012,7011,1838,517,22763,2493,4019,4018,4017,4015,4014,3573,5073,2392,11173,7932,7933,3175,32249,1274,1627,2609,5406,3251,4094,3241,6514,6418,3734,45045,2679,2647,4106,6102,4548,7707,5008,8243,8280,2880,3547,5629,3723,4950,3895,3894,19540,3273,4538,5043,7359,7358,7357,7356,7355,7354,7353,7352,7351,7350,7349,7348,7347,7346,7344,7343,7342,7341,7340,7339,7338,7337,7336,7335,7334,7333,7332,7331,7330,7329,7328,7327,7324,7323,7322,7321,7319,7318,7317,7316,7315,7314,7313,7312,7311,7310,7309,7308,7307,7306,7305,7304,7303,7302,7301,9282,9281,3491,1866,17777,6965,6966,6964,6963,1751] top_udp_ports = [631,161,137,123,138,1434,445,135,67,53,139,500,68,520,1900,4500,514,49152,162,69,5353,111,49154,1701,998,996,997,999,3283,49153,1812,136,2222,2049,32768,5060,1025,1433,3456,80,20031,1026,7,1646,1645,593,518,2048,626,1027,177,1719,427,497,4444,1023,65024,19,9,49193,1029,49,88,1028,17185,1718,49186,2000,31337,49201,49192,515,2223,443,49181,1813,120,158,49200,3703,32815,17,5000,32771,33281,1030,1022,623,32769,5632,10000,49194,49191,49182,49156,9200,30718,49211,49190,49188,49185,5001,5355,32770,37444,34861,34555,1032,3130,4045,1031,49196,49158,37,2967,4000,989,3659,4672,34862,23,49195,49189,49187,49162,2148,41524,10080,32772,407,42,33354,1034,49199,49180,1001,3389,6346,21,13,517,1068,6001,1782,990,1045,1041,19283,49210,49209,49208,49205,49202,49184,49179,49171,9876,39213,800,389,464,1039,1036,1038,1419,192,199,44968,1008,49166,49159,1024,1033,22986,19682,22,2002,11487,664,1021,58002,49172,49168,49165,49163,1043,6000,1885,7938,1019,1049,5093,5351,1044,683,3052,5500,27892,16680,32773,41058,35777,113,52225,49174,49169,49160,6004,1056,8193,1047,685,1886,686,38293,782,786,38037,32774,780,1080,32775,682,983,6971,6970,1014,1066,2051,1054,9950,5050,781,31891,31681,31073,30365,30303,29823,28547,27195,25375,22996,22846,21383,20389,20126,20019,19616,19503,19120,18449,16947,16832,42172,33355,32779,53571,52503,49215,49213,49212,49204,49198,49175,49167,5002,27015,5003,7000,513,1485,1065,1048,1090,684,1761,9103,1037,32777,539,767,434,54321,3401,112,1000,6347,512,363,45441,41370,41081,40915,40732,40708,40441,40116,39888,36206,35438,34892,34125,33744,32931,32818,47624,42508,776,38,32776,64513,63555,62287,61370,58640,58631,56141,54281,51717,50612,49503,49207,49197,49176,49173,49170,49161,49157,1012,217,775,3702,8001,959,9199,8181,9020,643,688,829,1040,1035,1064,902,1901,1069,687,2160,1042,32528,32385,32345,31731,31625,31365,31195,31189,31109,31059,30975,30704,30697,30656,30544,30263,29977,29810,29256,29243,29078,28973,28840,28641,28543,28493,28465,28369,28122,27899,27707,27482,27473,26966,26872,26720,26415,26407,25931,25709,25546,25541,25462,25337,25280,25240,25157,24910,24854,24644,24606,24594,24511,24279,24007,23980,23965,23781,23679,23608,23557,23531,23354,23176,23040,22914,22799,22739,22695,22692,22341,22055,21902,21803,21621,21354,21298,21261,21212,21131,20359,20004,19933,19687,19600,19489,19332,19322,19294,19197,19165,19130,19039,19017,18980,18835,18582,18360,18331,18234,18004,17989,17939,17888,17616,17615,17573,17459,17455,17091,16918,16430,16402,25003,1346,20,2,32780,1214,772,1993,402,773,31335,774,6050,6002,1046,3664,9877,965,838,814,8010,1007,1057,1234,1053,1081,1060,2343,1100,8000,903,1124,1105,9001,1804,9000,1050,1055,1059,1524,5555,5010,32778,48761,48489,48455,48255,48189,48078,47981,47915,47772,47765,46836,46532,46093,45928,45818,45722,45685,45380,45247,44946,44923,44508,44334,44253,44190,44185,44179,44160,44101,43967,43824,43686,43514,43370,43195,43094,42639,42627,42577,42557,42434,42431,42313,42056,41971,41967,41896,41774,41702,41638,41446,41308,40866,40847,40805,40724,40711,40622,40539,40019,39723,39714,39683,39632,39217,38615,38498,38412,38063,37843,37813,37783,37761,37602,37393,37212,37144,36945,36893,36778,36669,36489,36458,36384,36108,35794,35702,34855,34796,34758,34580,34579,34578,34577,34570,34433,34422,34358,34079,34038,33872,33866,33717,33459,33249,33030,32798,27444,47808,1484,3,1067,64727,64590,64481,64080,63420,62958,62699,62677,62575,62154,61961,61685,61550,61481,61412,61322,61319,61142,61024,60423,60381,60172,59846,59765,59207,59193,58797,58419,58178,58075,57977,57958,57843,57813,57410,57409,57172,55587,55544,55043,54925,54807,54711,54114,54094,53838,53589,53037,53006,52144,51972,51905,51690,51586,51554,51456,51255,50919,50708,50497,50164,50099,49968,49640,49396,49393,49360,49350,49306,49262,49259,49226,49222,49220,49216,49214,49178,49177,49155,1058,4666,3457,559,1455,4008,764,207,1457,944,9370,826,789,16086,1020,1013,1200,657,3296,1101,1051,689,639,3343,8900,1070,2362,2345,1087,1088,1072,2161,502,17754,32760,32750,32727,32611,32607,32546,32506,32499,32495,32479,32469,32446,32430,32425,32422,32415,32404,32382,32368,32359,32352,32326,32273,32262,32219,32216,32185,32132,32129,32124,32066,32053,32044,31999,31963,31918,31887,31882,31852,31803,31794,31792,31783,31750,31743,31735,31732,31720,31692,31673,31609,31602,31599,31584,31569,31560,31521,31520,31481,31428,31412,31404,31361,31352,31350,31343,31334,31284,31267,31266,31261,31202,31199,31180,31162,31155,31137,31134,31133,31115,31112,31084,31082,31051,31049,31036,31034,30996,30943,30932,30930,30909,30880,30875,30869,30856,30824,30803,30789,30785,30757,30698,30669,30661,30622,30612,30583,30578,30533,30526,30512,30477,30474,30473,30465,30461,30348,30299,30256,30214,30209,30154,30134,30093,30085,30067,30055,30034,29981,29964,29961,29894,29886,29843,29834,29794,29709,29613,29595,29581,29564,29554,29541,29534,29522,29503,29461,29453,29449,29444,29426,29410,29401,29400,29357,29333,29319,29276,29230,29200,29180,29168,29162,29153,29150,29142,29135,29129,29082,29054,29048,29030,28995,28965,28944,28933,28931,28892,28815,28808,28803,28746,28745,28725,28719,28707,28706,28692,28674,28664,28663,28645,28640,28630,28609,28584,28525,28485,28476,28445,28440,28438,28387,28349,28344,28295,28263,28247,28222,28220,28211,28190,28172,28129,28107,28105,28098,28091,28080,28071,28070,28034,28011,27973,27969,27949,27919,27895,27861,27853,27750,27722,27718,27711,27708,27696,27682,27678,27673,27666,27606,27600,27579,27573,27561,27547,27538,27487,27466,27437,27416,27414,27287,27272,27271,27263,27209,27200,27182,27180,27179,27150,27133,27110,27095,27085,27079,27078,27072,27064,27058,27027,27025,27017,27010,26998,26996,26994,26982,26973,26949,26888,26878,26868,26866,26845,26843,26823,26819,26796,26795,26771,26765,26742,26705,26698,26645,26549,26531,26512,26507,26493,26452,26434,26431,26423,26420,26401,26388,26381,26340,26337,26289,26286,26284,26254,26243,26239,26219,26204,26196,26191,26171,26123,26103,26079,26052,26031,26026,25992,25956,25925,25913,25909,25875,25868,25851,25826,25778,25756,25733,25715,25670,25652,25628,25627,25624,25600,25586,25579,25560,25544,25538,25521,25514,25498,25488,25466,25402,25385,25366,25332,25331,25290,25271,25266,25249,25248,25212,25170,25169,25135,25040,25036,24950,24945,24941,24916,24911,24875,24837,24818,24800,24756,24741,24731,24725,24706,24693,24689,24665,24658,24655,24639,24539,24528,24496,24444,24419,24418,24388,24306,24271,24265,24212,24172,24158,24155,24113,24107,24104,24098,24093,24063,24032,24021,24013,24008,23951,23946,23940,23865,23758,23755,23745,23714,23704,23698,23638,23633,23586,23585,23547,23522,23504,23495,23430,23428,23426,23421,23399,23374,23363,23341,23337,23327,23322,23256,23230,23202,23184,23170,23162,23161,23152,23108,23073,23059,23027,22991,22945,22902,22862,22853,22852,22843,22776,22762,22736,22732,22677,22626,22611,22597,22593,22585,22571,22547,22526,22522,22505,22495,22494,22481,22438,22417,22381,22377,22376,22356,22324,22292,22288,22252,22215,22146,22124,22123,22109,22105,22053,22045,22043,22029,21967,21948,21923,21898,21868,21842,21834,21784,21780,21742,21710,21702,21698,21674,21663,21655,21649,21644,21625,21609,21576,21568,21566,21556,21525,21524,21514,21476,21468,21454,21405,21366,21364,21360,21358,21344,21333,21320,21318,21303,21282,21247,21207,21206,21186,21167,21111,21104,21083,21060,21016,20919,20884,20876,20872,20865,20851,20848,20842,20817,20791,20762,20752,20742,20717,20710,20679,20678,20665,20560,20540,20525,20522,20518,20465,20464,20449,20445,20425,20424,20423,20411,20409,20380,20366,20360,20326,20313,20309,20288,20279,20262,20249,20217,20206,20164,20154,20146,20129,20120,20117,20082,19998,19995,19956,19936,19935,19792,19789,19728,19722,19719,19718,19717,19707,19695,19683,19663,19662,19660,19650,19647,19639,19632,19625,19624,19605,19504,19500,19482,19415,19374,19273,19227,19222,19193,19181,19161,19154,19141,19140,19096,19075,19047,19022,18996,18994,18991,18987,18985,18958,18883,18869,18832,18830,18821,18818,18807,18683,18676,18669,18666,18617,18605,18543,18485,18373,18319,18258,18255,18250,18228,18156,18134,18113,18081,17946,17845,17836,17824,17823,17814,17787,17762,17726,17683,17674,17673,17663,17638,17629,17605,17592,17585,17580,17549,17533,17505,17494,17490,17487,17468,17424,17423,17417,17359,17338,17332,17331,17321,17302,17282,17237,17236,17207,17205,17184,17146,17101,17077,17018,17006,16974,16972,16970,16948,16939,16938,16919,16912,16896,16862,16839,16838,16829,16816,16786,16779,16766,16739,16711,16708,16700,16697,16674,16573,16548,16545,16503,16498,16449,16433,16420,21800,21847,30260,19315,19541,21000,27007,27002,24242,20003,17219,18888,617,393,56,25,387,750,770,769,198,1,1083,771,1400,6111,83,134,32786,2001,501,1666,484,550,7100,26900,47557,145,496,760,5011,748,376,1514,426,110,6969,170,47,6146,370,49136,49127,49114,49052,49042,48954,48906,48901,48898,48887,48860,48854,48790,48780,48733,48712,48631,48626,48605,48558,48555,48548,48496,48411,48342,48329,48324,48321,48315,48314,48282,48263,48222,48156,48126,48105,47971,47936,47926,47917,47851,47847,47842,47821,47817,47802,47751,47706,47656,47586,47577,47572,47457,47432,47406,47371,47337,47279,47270,47198,47185,47169,47160,47134,47132,47083,47030,46837,46808,46793,46758,46698,46652,46643,46641,46630,46603,46594,46584,46483,46464,46462,46457,46440,46387,46294,46270,46265,46249,46207,46201,46195,46114,46066,46055,46040,45971,45906,45891,45883,45769,45719,45596,45538,45503,45449,45345,45338,45193,45148,45061,45037,45006,44943,44917,44856,44819,44748,44733,44661,44611,44598,44577,44539,44518,44503,44454,44420,44408,44371,44364,44312,44310,44275,44135,44117,44116,44100,44099,44093,44079,44054,44037,44034,44026,44009,43983,43942,43941,43842,43802,43740,43715,43640,43525,43510,43455,43423,43361,43336,43334,43288,43284,43268,43260,43248,43175,43173,43170,43092,43080,43072,43039,42941,42916,42882,42868,42857,42827,42825,42812,42807,42803,42773,42716,42708,42702,42648,42638,42612,42585,42558,42533,42498,42373,42341,42340,42294,42285,42284,42279,42251,42220,42215,42148,42139,42051,42005,41875,41851,41837,41816,41779,41771,41731,41717,41619,41499,41496,41406,41380,41360,41348,41343,41335,41334,41327,41265,41161,41156,41149,41148,41139,41073,41014,41011,40993,40982,40972,40958,40940,40914,40904,40893,40882,40877,40830,40736,40722,40667,40653,40642,40625,40591,40580,40551,40512,40491,40487,40480,40453,40436,40423,40399,40351,40322,40303,40266,40111,40102,40101,40074,40071,40043,39982,39919,39863,39812,39811,39753,39745,39743,39733,39709,39697,39659,39649,39641,39630,39600,39596,39590,39548,39507,39457,39453,39440,39430,39401,39383,39377,39332,39313,39297,39243,39220,39163,39146,39135,39116,39086,39056,39042,39035,39028,38972,38864,38812,38742,38734,38732,38727,38714,38648,38644,38609,38608,38571,38526,38510,38499,38370,38325,38312,38304,38294,38274,38218,38190,38183,38172,38153,38142,38125,38064,38053,38041,38014,37964,37933,37922,37823,37686,37682,37670,37664,37663,37592,37589,37574,37563,37561,37478,37464,37456,37441,37423,37401,37400,37385,37377,37348,37343,37327,37316,37255,37221,37216,37198,37182,37163,37156,37152,37139,37136,37093,37046,37025,37018,36990,36931,36910,36887,36862,36854,36817,36719,36695,36694,36666,36641,36576,36522,36519,36500,36471,36462,36380,36293,36237,36214,36178,36136,36126,36099,36096,36065,36041,36019,35991,35985,35948,35940,35904,35896,35810,35776,35775,35773,35746,35656,35636,35516,35493,35490,35474,35390,35283,35280,35240,35222,35188,35176,35108,35051,35044,35026,34979,34893,34847,34822,34780,34771,34770,34757,34705,34692,34653,34586,34425,34421,34417,34374,34253,34250,34243,34231,34227,34214,34157,34153,34133,34119,34082,34075,33986,33975,33882,33878,33873,33858,33849,33826,33795,33724,33710,33700,33693,33687,33652,33591,33584,33575,33556,33465,33448,33422,33414,33394,33377,33302,33290,33285,33264,33208,33207,33162,33156,33149,33144,33080,33043,33028,32955,32897,32847,32843,32820,32812,37654,48556,4321,403,5308,7009,584,81,2067,7001,65520,65460,65420,65396,65380,65347,65286,65232,65105,64944,64890,64884,64874,64829,64798,64795,64772,64693,64682,64640,64630,64616,64615,64589,64566,64544,64492,64469,64456,64406,64365,64345,64340,64313,64312,64284,64259,64258,64202,63962,63917,63820,63786,63710,63700,63673,63534,63508,63499,63447,63346,63344,63337,63331,63281,63247,63173,63146,63136,63129,63106,63101,63079,63006,62975,62955,62880,62866,62845,62827,62778,62701,62697,62690,62562,62522,62493,62458,62449,62436,62420,62412,62404,62325,62281,62216,62188,62164,62133,62114,62101,62100,62038,61983,61973,61967,61937,61921,61902,61867,61828,61781,61709,61678,61653,61587,61539,61532,61523,61512,61485,61480,61438,61431,61422,61400,61395,61381,61226,61193,61192,61167,61127,61095,61081,61055,61050,61047,61046,61027,60988,60966,60950,60707,60705,60701,60679,60650,60438,60435,60431,60430,60384,60363,60347,60341,60255,60227,60145,60097,60069,60035,60028,59998,59971,59943,59860,59805,59791,59758,59669,59632,59603,59593,59581,59577,59555,59506,59483,59434,59415,59388,59327,59301,59296,59254,59216,59214,59189,59186,59132,59093,59037,59035,59002,58975,58938,58929,58914,58893,58817,58782,58777,58747,58705,58700,58674,58646,58455,58432,58369,58308,58205,58141,58114,58102,58091,58089,58026,57946,57942,57868,57858,57848,57836,57827,57756,57679,57662,57629,57461,57421,57386,57156,57133,57114,57063,57005,56980,56954,56929,56897,56895,56892,56876,56869,56848,56825,56765,56668,56637,56622,56555,56554,56491,56468,56366,56359,56337,56326,56288,56284,56273,56225,56209,56168,56153,56105,56103,55954,55941,55870,55795,55784,55766,55745,55650,55618,55593,55581,55579,55553,55541,55488,55352,55316,55267,55205,55156,55124,55034,54993,54952,54946,54939,54848,54812,54758,54747,54722,54676,54653,54627,54607,54531,54521,54513,54398,54375,54349,54324,54298,54296,54267,54264,54259,54126,54055,54045,54040,54027,54023,53996,53987,53940,53880,53830,53651,53554,53460,53433,53403,53396,53367,53286,53279,53249,53228,53212,53182,53161,53126,53084,53023,52945,52861,52813,52792,52772,52762,52713,52706,52674,52649,52582,52571,52516,52412,52364,52333,52254,52227,52224,52220,52155,52138,52130,52089,52006,51903,51894,51847,51843,51781,51710,51649,51589,51581,51544,51477,51471,51427,51407,51400,51383,51323,51280,51267,51225,51211,51193,51172,51167,51143,51120,51020,51014,51013,50990,50913,50904,50900,50896,50756,50722,50649,50622,50620,50579,50574,50573,50523,50474,50447,50427,50420,50409,50376,50349,50345,50300,50296,50273,50239,50163,50149,50143,50127,50122,50085,50049,50041,50024,50009,49998,49990,49986,49984,49945,49939,49926,49839,49801,49754,49746,49669,49639,49620,49600,49589,49579,49562,49557,49525,49513,49506,49478,49443,49440,49384,49375,49348,49337,49334,49324,49319,49317,49295,49273,49268,49266,49264,49255,49252,49249,49237,49236,49231,49227,49223,49219,49218,49217,49206,49203,49183,49164,1334,672,1345,1062,9890,984,982,979,977,9740,973,961,953,949,947,940,934,931,917,9053,898,893,889,876,8435,841,819,818,812,7516,745,734,732,727,720,6905,6784,6430,5347,5018,4778,3403,3301,304,3001,15138,15053,14499,14181,13557,13429,12208,11618,11287,11271,10825,10583,10484,10302,1018,1015,1237,2973,7677,2863,1163,620,2101,1287,1098,995,9595,1622,1286,1862,4691,3569,1113,2053,8207,1061,603,887,4039,10081,681,12003,644,3574,1052,2164,4047,619,6503,3527,7846,391,1414,2004,7651,152,1348,201,27500,577,2018,99,2106,759,1491,7005,32787,761,742,79,666,206,1483,1110,1664,31,749,96,801,573,1999,6144,4827,1366,751,1389,510,704,7648,132,888,1422,525,3531,640,1155,146,1412,3333,205,594,444,1349,2012,740,1521,524,1467,530,1469,1531,191,729,3246,2045,1441,2431,1507,150,314,259,546,552,163,1432,2032,45000,6110,160,2026,1672,1364,568,86,1359,531,516,541,6145,440,1537,1662,505,1600,1513,547,1512,2948,540,118,747,2019,1398,451,222,57,417,537,1650,6147,1435,93,355,551,442,130,548,27910,2103,1498,1518,1527,133,586,607,730,532,569,3985,472,1515,1438,455,504,1481,1420,65,77,1465,1388,610,731,6502,45,600,709,763,437,386,27960,16444,22370,1370,377,1501,369,752,485,2040,1393,1440,438,458,521,1353,35,1357,758,1482,1532,503,1372,347,1548,48,7008,2627,571,450,587,469,256,1445,4132,4133,385,5304,634,1453,1371,140,1476,1347,5190,1987,563,416,753,1530,2006,1670,1503,1395,479,1551,1505,121,76,447,542,3049,449,6033,5357,3233,1085,2054,1074,12321,9206,4049,2387,2821,4262,4232,9921,9897,988,986,9869,985,981,9716,966,9638,9620,960,9589,952,951,950,946,941,9416,937,9310,927,922,9229,921,9170,9156,9154,9110,908,9079,8998,897,8979,8934,8924,8820,881,8793,8742,8719,869,8684,8661,8591,857,8556,845,839,8343,8336,8284,823,821,815,809,805,7963,7946,7867,784,7804,7613,7536,7524,7298,728,7267,722,719,7074,7051,6984,6976,6972,6925,6811,6625,659,6520,6468,6463,6451,6395,6372,6353,6250,6237,6212,6119,5873,5817,5749,5704,5648,5589,5552,5509,5444,5439,5366,5320,5318,5279,5210,5139,5119,5110,5077,5048,5034,4934,4836,4695,4565,4408,4362,4198,4175,1753,16334,16312,16263,16226,16159,16155,16108,16066,15969,15966,15831,15814,15803,15754,15733,15648,15621,15514,15449,15381,15361,15360,15290,15267,15186,15149,15124,15123,15086,15067,15055,15041,14991,14946,14922,14889,14808,14771,14679,14487,14388,14356,14341,14290,14286,14281,14241,14220,14202,14195,14169,13925,13914,13905,13876,13865,13856,13799,13747,13701,13699,13686,13663,13627,13571,13570,13552,13543,13539,13476,13474,13419,13402,13378,13312,13299,13291,13266,13164,13155,13002,12991,12986,12933,12873,12854,12650,12602,12578,12525,12472,12469,12447,12306,12304,12268,12195,12173,12034,11970,11878,11872,11785,11723,11567,11449,11425,11364,11182,11157,11156,11138,11137,11063,10862,10845,10827,10666,10653,10628,10525,10517,10490,10445,10409,10369,10343,10268,1011,10076,10066,1004,1003,10011,8201,2078,2158,3372,3544,2060,7012,5629,7354,7303,1010,1203,605,1257,3162,1251,3978,3495,5168,2121,5435,1215,873,1695,9599,1099,5900,653,641,3094,2083,628,5082,3453,3910,3396,6105,3048,2398,3304,2368,900,7274,1921,1095,6627,2058,2061,833,831,2528,4361,1685,4447,10007,777,1755,2382,1337,5354,3235,2908,1861,636,1063,6961,1106,4593,2215,2055,1585,1143,1077,993,1884,2062,4061,1792,2140,1803,14937,694,11720,2123,1191,1909,1738,3519,1089,810,2819,1620,3002,1139,621,680,12000,12001,12004,12002,1148,4536,3477,2168,9002,4401,4404,1175,2496,1256,1076,3631,2129,3364,4378,4692,1302,3947,9695,3505,2517,9750,632,2302,3784,1078,1122,1079,3451,1834,1116,1206,3054,8040,705,1103,1102,4046,674,8402,54,82,765,2013,1402,2307,261,1671,155,44,1427,398,2241,1428,143,1391,1392,1383,744,197,1415,17756,17755,22347,25793,32748,32744,32743,32742,32736,32734,32731,32723,32714,32706,32693,32687,32685,32682,32676,32675,32674,32669,32664,32656,32652,32644,32642,32641,32639,32637,32634,32632,32631,32629,32618,32617,32612,32598,32597,32595,32592,32583,32578,32577,32576,32575,32574,32571,32566,32564,32560,32558,32553,32550,32532,32524,32523,32518,32512,32511,32508,32503,32496,32488,32487,32484,32482,32478,32474,32473,32468,32466,32465,32454,32449,32447,32444,32440,32439,32436,32435,32433,32429,32428,32426,32423,32412,32409,32406,32398,32391,32389,32379,32378,32377,32369,32364,32360,32355,32349,32342,32339,32338,32329,32323,32319,32317,32316,32313,32309,32306,32305,32297,32295,32291,32289,32282,32281,32277,32276,32274,32272,32270,32268,32264,32259,32251,32248,32245,32231,32228,32225,32223,32222,32221,32217,32210,32204,32202,32201,32198,32195,32190,32188,32187,32186,32180,32178,32176,32174,32172,32167,32163,32162,32161,32127,32117,32109,32107,32106,32105,32094,32092,32091,32090,32084,32081,32079,32072,32068,32065,32064,32059,32048,32046,32040,32039,32035,32033,32025,32024,32018,32011,32010,32007,32006,32005,31997,31992,31981,31979,31974,31972,31968,31967,31966,31950,31940,31939,31934,31929,31928,31922,31921,31920,31906,31901,31899,31898,31894,31892,31878,31877,31872,31870,31869,31861,31854,31853,31847,31844,31842,31834,31833,31827,31825,31822,31821,31819,31818,31817,31813,31798,31782,31779,31778,31776,31763,31759,31757,31752,31749,31739,31737,31736,31733,31729,31727,31723,31712,31709,31705,31703,31683,31679,31678,31671,31670,31669,31668,31663,31660,31657,31655,31653,31651,31648,31643,31626,31624,31617,31615,31606,31601,31600,31598,31597,31596,31595,31594,31593,31579,31577,31566,31565,31564,31563,31558,31557,31548,31545,31544,31543,31532,31527,31518,31510,31509,31506,31495,31493,31487,31470,31460,31459,31454,31453,31451,31439,31432,31429,31424,31423,31422,31421,31415,31414,31398,31392,31391,31386,31371,31366,31362,31358,31354,31347,31340,31336,31333,31326,31325,31324,31318,31314,31309,31301,31299,31293,31292,31288,31279,31275,31273,31271,31268,31258,31257,31254,31252,31249,31248,31247,31242,31240,31238,31237,31234,31230,31218,31217,31215,31212,31211,31209,31204,31198,31192,31187,31176,31150,31146,31141,31129,31127,31119,31105,31100,31089,31088,31085,31083,31080,31078,31076,31072,31069,31068,31058,31054,31052,31048,31030,31028,31022,31020,31015,31005,31001,30990,30986,30984,30982,30972,30967,30965,30959,30958,30955,30951,30945,30942,30931,30926,30924,30919,30918,30912,30910,30908,30906,30897,30894,30893,30892,30886,30881,30876,30867,30851,30849,30841,30838,30837,30833,30828,30827,30826,30825,30823,30820,30819,30808,30805,30796,30795,30784,30783,30782,30780,30772,30765,30762,30755,30754,30746,30741,30738,30737,30734,30729,30725,30723,30719,30713,30712,30710,30702,30701,30689,30688,30687,30682,30672,30670,30665,30664,30662,30660,30658,30657,30651,30650,30648,30646,30644,30637,30627,30624,30623,30619,30609,30601,30592,30588,30587,30575,30568,30566,30564,30555,30550,30539,30536,30529,30522,30521,30518,30516,30514,30511,30501,30500,30496,30495,30493,30492,30491,30483,30481,30478,30475,30472,30470,30468,30467,30464,30463,30462,30457,30454,30453,30434,30433,30430,30428,30424,30423,30420,30419,30418,30416,30411,30400,30398,30394,30383,30381,30378,30359,30350,30341,30338,30335,30331,30330,30318,30310,30309,30306,30305,30300,30298,30295,30293,30286,30267,30258,30254,30252,30246,30245,30244,30241,30239,30236,30235,30234,30230,30212,30211,30194,30193,30188,30184,30182,30181,30179,30175,30172,30170,30168,30150,30148,30144,30139,30135,30132,30131,30130,30126,30123,30113,30108,30086,30066,30063,30059,30048,30046,30041,30036,30031,30027,30020,30018,30015,30008,30006,30000,29988,29987,29980,29978,29970,29967,29956,29949,29932,29930,29927,29926,29915,29914,29911,29907,29905,29903,29901,29883,29878,29876,29869,29867,29864,29863,29860,29858,29854,29852,29846,29842,29840,29833,29829,29816,29812,29811,29809,29802,29796,29788,29787,29785,29782,29780,29773,29771,29761,29759,29756,29754,29753,29752,29749,29747,29742,29737,29733,29731,29729,29715,29712,29701,29700,29694,29682,29681,29680,29677,29673,29667,29665,29659,29652,29647,29642,29639,29632,29630,29618,29616,29615,29607,29604,29600,29589,29588,29587,29585,29583,29582,29577,29572,29570,29562,29559,29533,29525,29523,29520,29518,29514,29512,29508,29506,29499,29494,29488,29486,29480,29476,29474,29471,29467,29465,29457,29448,29447,29442,29435,29432,29427,29420,29415,29414,29408,29407,29406,29403,29398,29397,29396,29393,29390,29380,29376,29375,29368,29366,29364,29355,29352,29342,29335,29331,29329,29327,29324,29323,29317,29315,29312,29308,29305,29298,29286,29284,29283,29281,29280,29278,29277,29273,29272,29268,29259,29257,29249,29248,29239,29238,29224,29220,29218,29211,29207,29203,29201,29199,29196,29195,29186,29185,29183,29177,29172,29163,29149,29137,29134,29126,29121,29115,29114,29112,29105,29095,29087,29084,29070,29069,29061,29058,29056,29053,29052,29046,29045,29039,29036,29032,29026,29022,29014,29013,29010,29008,29007,29000,28997,28992,28979,28976,28969,28967,28966,28958,28954,28953,28952,28946,28945,28943,28940,28938,28934,28932,28927,28924,28920,28919,28917,28906,28905,28902,28900,28898,28896,28895,28893,28888,28887,28885,28883,28880,28879,28877,28876,28875,28865,28858,28856,28855,28854,28851,28847,28845,28839,28837,28836,28830,28827,28826,28822,28816,28813,28811,28810,28800,28797,28785,28780,28779,28778,28776,28775,28772,28769,28765,28755,28754,28752,28750,28748,28744,28741,28737,28736,28734,28730,28729,28728,28723,28708,28705,28700,28697,28696,28689,28685,28682,28675,28673,28661,28660,28654,28649,28644,28643,28642,28638,28633,28625,28620,28618,28617,28610,28607,28597,28587,28586,28575,28561,28556,28545,28544,28537,28534,28530,28529,28521,28513,28506,28488,28484,28483,28477,28472,28471,28469,28466,28464,28455,28441,28437,28434,28433,28428,28427,28425,28422,28421,28419,28417,28411,28401,28396,28393,28392,28391,28386,28380,28378,28377,28367,28366,28356,28353,28348,28345,28335,28334,28327,28322,28317,28315,28311,28309,28307,28303,28301,28298,28292,28283,28271,28265,28257,28251,28248,28246,28243,28242,28239,28237,28230,28221,28219,28218,28215,28213,28212,28203,28200,28197,28195,28183,28182,28178,28155,28154,28148,28145,28144,28142,28141,28124,28121,28120,28116,28112,28109,28108,28097,28096,28094,28089,28078,28077,28074,28072,28064,28059,28058,28054,28051,28045,28043,28036,28029,28028,28021,28020,28019,28005,27996,27994,27992,27984,27983,27979,27974,27972,27970,27967,27959,27958,27954,27952,27951,27944,27940,27939,27931,27918,27916,27912,27905,27902,27900,27887,27884,27876,27872,27869,27867,27863,27860,27859,27856,27850,27849,27838,27836,27833,27832,27830,27829,27828,27826,27822,27818,27817,27815,27803,27801,27792,27788,27786,27785,27783,27781,27775,27769,27767,27760,27756,27755,27745,27742,27741,27735,27733,27729,27721,27720,27715,27714,27713,27712,27705,27703,27702,27700,27698,27694,27693,27690,27689,27688,27687,27680,27677,27672,27669,27663,27662,27637,27636,27631,27630,27626,27624,27622,27621,27617,27608,27602,27599,27597,27593,27588,27587,27586,27584,27581,27575,27566,27564,27563,27556,27548,27537,27533,27532,27525,27512,27510,27507,27501,27493,27476,27475,27471,27470,27465,27464,27455,27454,27449,27445,27438,27436,27433,27424,27410,27408,27398,27397,27395,27391,27381,27373,27368,27366,27364,27358,27355,27340,27331,27330,27323,27313,27310,27300,27298,27291,27290,27289,27286,27285,27280,27274,27270,27268,27259,27258,27249,27237,27232,27230,27228,27227,27223,27221,27212,27202,27196,27192,27175,27174,27172,27169,27157,27148,27147,27144,27139,27118,27104,27101,27100,27098,27094,27089,27088,27087,27076,27075,27062,27061,27057,27049,27048,27046,27042,27038,27036,27032,27029,27020,27018,27014,26988,26983,26979,26977,26970,26963,26960,26958,26955,26953,26951,26944,26941,26937,26934,26932,26926,26919,26916,26914,26906,26903,26899,26896,26891,26884,26882,26881,26876,26875,26861,26860,26859,26857,26847,26842,26841,26839,26830,26829,26814,26810,26806,26805,26803,26801,26794,26792,26786,26776,26775,26761,26760,26754,26753,26747,26746,26725,26724,26718,26714,26708,26706,26702,26699,26695,26692,26691,26690,26689,26685,26683,26681,26679,26678,26674,26673,26668,26666,26665,26664,26655,26654,26651,26649,26641,26639,26631,26628,26622,26621,26618,26596,26594,26587,26585,26579,26578,26575,26573,26563,26556,26541,26538,26536,26532,26529,26523,26522,26509,26508,26497,26491,26484,26482,26481,26477,26473,26466,26451,26448,26442,26439,26436,26432,26418,26417,26416,26413,26411,26409,26397,26395,26384,26376,26372,26369,26367,26364,26362,26356,26339,26338,26325,26318,26311,26304,26299,26296,26291,26283,26279,26275,26273,26270,26225,26211,26207,26205,26203,26201,26198,26189,26187,26183,26181,26179,26175,26172,26164,26163,26158,26157,26147,26141,26137,26134,26131,26130,26127,26121,26119,26116,26110,26107,26100,26095,26090,26089,26080,26078,26073,26067,26066,26062,26058,26057,26055,26050,26048,26040,26039,26036,26035,26033,26030,26021,26020,26013,26005,26002,25993,25989,25988,25987,25985,25980,25975,25969,25968,25958,25951,25950,25949,25944,25940,25929,25928,25921,25910,25896,25894,25887,25881,25879,25857,25853,25849,25841,25833,25832,25827,25823,25815,25799,25798,25794,25790,25768,25767,25763,25751,25744,25735,25731,25730,25724,25723,25716,25712,25710,25706,25687,25677,25667,25666,25659,25658,25644,25643,25642,25641,25636,25630,25618,25617,25611,25603,25594,25592,25591,25590,25588,25574,25573,25572,25569,25568,25567,25564,25542,25540,25537,25534,25533,25524,25523,25522,25515,25509,25502,25499,25493,25492,25483,25480,25474,25460,25455,25453,25451,25446,25443,25442,25439,25432,25428,25421,25418,25416,25399,25398,25397,25396,25395,25394,25390,25378,25374,25369,25364,25353,25348,25343,25338,25321,25314,25309,25304,25302,25301,25288,25286,25274,25268,25267,25258,25251,25244,25243,25241,25237,25235,25230,25228,25217,25215,25214,25211,25205,25204,25202,25197,25192,25191,25185,25184,25183,25180,25173,25168,25163,25160,25159,25158,25155,25153,25150,25147,25137,25129,25127,25115,25107,25104,25103,25102,25093,25091,25086,25082,25081,25080,25078,25074,25069,25067,25052,25043,25030,25029,25028,25025,25020,25019,25018,25017,25011,24995,24993,24983,24982,24980,24973,24963,24958,24957,24956,24946,24943,24939,24936,24932,24926,24905,24899,24893] defaults = { 'proxy': '', 'threads': '10', - 'masscan-iface': 'tun0', 'masscan-rate': '1000', + 'masscan-iface': 'tun0', + 'results-dir': 'recon-results', 'aquatone-scan-timeout': '900', 'gobuster-extensions': "", 'gobuster-wordlist': '/usr/share/seclists/Discovery/Web-Content/common.txt', @@ -15,13 +18,13 @@ web_ports = {'80', '443', '8080', '8000', '8443'} tool_paths = { 'aquatone': '/usr/local/bin/aquatone', - 'tko-subs': '~/go/bin/tko-subs', - 'tko-subs-dir': '~/go/src/github.com/anshumanbh/tko-subs', - 'subjack': '~/go/bin/subjack', - 'subjack-fingerprints': '~/go/src/github.com/haccer/subjack/fingerprints.json', + 'tko-subs': f'{Path.home()}/go/bin/tko-subs', + 'tko-subs-dir': f'{Path.home()}/go/src/github.com/anshumanbh/tko-subs', + 'subjack': f'{Path.home()}/go/bin/subjack', + 'subjack-fingerprints': f'{Path.home()}/go/src/github.com/haccer/subjack/fingerprints.json', 'CORScanner': '/opt/CORScanner/cors_scan.py', - 'gobuster': '~/go/bin/gobuster', + 'gobuster': f'{Path.home()}/go/bin/gobuster', 'recursive-gobuster': '/usr/local/bin/recursive-gobuster.pyz', - 'webanalyze': '~/go/bin/webanalyze', + 'webanalyze': f'{Path.home()}/go/bin/webanalyze', 'masscan': '/usr/local/bin/masscan', } diff --git a/recon/masscan.py b/recon/masscan.py index 4a4ba6f..e179313 100644 --- a/recon/masscan.py +++ b/recon/masscan.py @@ -32,6 +32,7 @@ class MasscanScan(luigi.Task): ports: specifies the port(s) to be scanned target_file: specifies the file on disk containing a list of ips or domains *--* Required by upstream Task exempt_list: Path to a file providing blacklisted subdomains, one per line. *--* Optional for upstream Task + results_dir: specifies the directory on disk to which all Task results are written *--* Optional for upstream Task """ rate = luigi.Parameter(default=defaults.get("masscan-rate", "")) @@ -39,10 +40,6 @@ class MasscanScan(luigi.Task): top_ports = luigi.IntParameter(default=0) # IntParameter -> top_ports expected as int ports = luigi.Parameter(default="") - def __init__(self, *args, **kwargs): - super(MasscanScan, self).__init__(*args, **kwargs) - self.masscan_output = f"masscan.{self.target_file}.json" - def output(self): """ Returns the target output for this task. @@ -51,7 +48,7 @@ class MasscanScan(luigi.Task): Returns: luigi.local_target.LocalTarget """ - return luigi.LocalTarget(self.masscan_output) + return luigi.LocalTarget(f"{self.results_dir}/masscan.{self.target_file}.json") def run(self): """ Defines the options/arguments sent to masscan after processing. @@ -59,6 +56,7 @@ class MasscanScan(luigi.Task): Returns: list: list of options/arguments, beginning with the name of the executable to run """ + print(f"debug-epi: masscan {self.results_dir}") if self.ports and self.top_ports: # can't have both logging.error("Only --ports or --top-ports is permitted, not both.") @@ -82,10 +80,14 @@ class MasscanScan(luigi.Task): self.ports = f"{top_tcp_ports_str},U:{top_udp_ports_str}" self.top_ports = 0 - target_list = yield TargetList(target_file=self.target_file) + target_list = yield TargetList(target_file=self.target_file, results_dir=self.results_dir) if target_list.path.endswith("domains"): - yield ParseAmassOutput(target_file=self.target_file, exempt_list=self.exempt_list) + yield ParseAmassOutput( + target_file=self.target_file, + exempt_list=self.exempt_list, + results_dir=self.results_dir, + ) command = [ "masscan", @@ -97,7 +99,7 @@ class MasscanScan(luigi.Task): "-e", self.interface, "-oJ", - self.masscan_output, + self.output().path, "--ports", self.ports, "-iL", @@ -117,6 +119,7 @@ class ParseMasscanOutput(luigi.Task): interface: use the named raw network interface, such as "eth0" *--* Required by upstream Task rate: desired rate for transmitting packets (packets per second) *--* Required by upstream Task target_file: specifies the file on disk containing a list of ips or domains *--* Required by upstream Task + results_dir: specifes the directory on disk to which all Task results are written *--* Required by upstream Task """ def requires(self): @@ -128,6 +131,7 @@ class ParseMasscanOutput(luigi.Task): luigi.Task - Masscan """ args = { + "results_dir": self.results_dir, "rate": self.rate, "target_file": self.target_file, "top_ports": self.top_ports, @@ -144,7 +148,7 @@ class ParseMasscanOutput(luigi.Task): Returns: luigi.local_target.LocalTarget """ - return luigi.LocalTarget(f"masscan.{self.target_file}.parsed.pickle") + return luigi.LocalTarget(f"{self.results_dir}/masscan.{self.target_file}.parsed.pickle") def run(self): """ Reads masscan JSON results and creates a pickled dictionary of pertinent information for processing. """ diff --git a/recon/nmap.py b/recon/nmap.py index 6f9477e..45a097c 100644 --- a/recon/nmap.py +++ b/recon/nmap.py @@ -30,6 +30,7 @@ class ThreadedNmapScan(luigi.Task): top_ports: Scan top N most popular ports *--* Required by upstream Task ports: specifies the port(s) to be scanned *--* Required by upstream Task target_file: specifies the file on disk containing a list of ips or domains *--* Required by upstream Task + results_dir: specifes the directory on disk to which all Task results are written *--* Required by upstream Task """ threads = luigi.Parameter(default=defaults.get("threads", "")) @@ -44,6 +45,7 @@ class ThreadedNmapScan(luigi.Task): luigi.Task - ParseMasscanOutput """ args = { + "results_dir": self.results_dir, "rate": self.rate, "target_file": self.target_file, "top_ports": self.top_ports, @@ -64,7 +66,7 @@ class ThreadedNmapScan(luigi.Task): Returns: luigi.local_target.LocalTarget """ - return luigi.LocalTarget(f"nmap-{self.target_file}-results") + return luigi.LocalTarget(f"{self.results_dir}/nmap-{self.target_file}-results") def run(self): """ Parses pickled target info dictionary and runs targeted nmap scans against only open ports. """ @@ -78,7 +80,8 @@ class ThreadedNmapScan(luigi.Task): nmap_command = [ # placeholders will be overwritten with appropriate info in loop below "nmap", "--open", - "PLACEHOLDER-IDX-2" "-n", + "PLACEHOLDER-IDX-2", + "-n", "-sC", "-T", "4", @@ -140,6 +143,7 @@ class SearchsploitScan(luigi.Task): top_ports: Scan top N most popular ports *--* Required by upstream Task ports: specifies the port(s) to be scanned *--* Required by upstream Task target_file: specifies the file on disk containing a list of ips or domains *--* Required by upstream Task + results_dir: specifies the directory on disk to which all Task results are written *--* Required by upstream Task """ def requires(self): @@ -159,6 +163,7 @@ class SearchsploitScan(luigi.Task): "top_ports": self.top_ports, "interface": self.interface, "target_file": self.target_file, + "results_dir": self.results_dir, } return ThreadedNmapScan(**args) @@ -173,7 +178,7 @@ class SearchsploitScan(luigi.Task): Returns: luigi.local_target.LocalTarget """ - return luigi.LocalTarget(f"searchsploit-{self.target_file}-results") + return luigi.LocalTarget(f"{self.results_dir}/searchsploit-{self.target_file}-results") def run(self): """ Grabs the xml files created by ThreadedNmap and runs searchsploit --nmap on each one, saving the output. """ diff --git a/recon/targets.py b/recon/targets.py index 90deeb3..19b8a65 100644 --- a/recon/targets.py +++ b/recon/targets.py @@ -1,14 +1,22 @@ import shutil import logging import ipaddress +from pathlib import Path import luigi +from recon.config import defaults + class TargetList(luigi.ExternalTask): - """ External task. `TARGET_FILE` is generated manually by the user from target's scope. """ + """ External task. `TARGET_FILE` is generated manually by the user from target's scope. + + Args: + results_dir: specifies the directory on disk to which all Task results are written + """ target_file = luigi.Parameter() + results_dir = luigi.Parameter(default=defaults.get("results-dir", "")) def output(self): """ Returns the target output for this task. target_file.ips || target_file.domains @@ -24,8 +32,9 @@ class TargetList(luigi.ExternalTask): Returns: luigi.local_target.LocalTarget """ + print(f"debug-epi: targets {self.results_dir}") try: - with open(self.target_file) as f: + with open(str(self.target_file)) as f: first_line = f.readline() ipaddress.ip_interface(first_line.strip()) # is it a valid ip/network? except OSError as e: @@ -39,5 +48,10 @@ class TargetList(luigi.ExternalTask): # no exception thrown; ip address found with_suffix = f"{self.target_file}.ips" - shutil.copy(self.target_file, with_suffix) # copy file with new extension + Path(str(self.results_dir)).mkdir(parents=True, exist_ok=True) + + with_suffix = f"{self.results_dir}/{with_suffix}" + + # copy file with new extension + shutil.copy(str(self.target_file), with_suffix) return luigi.LocalTarget(with_suffix) diff --git a/recon/web/aquatone.py b/recon/web/aquatone.py index 7e78dc2..708c412 100644 --- a/recon/web/aquatone.py +++ b/recon/web/aquatone.py @@ -29,6 +29,7 @@ class AquatoneScan(luigi.Task): interface: use the named raw network interface, such as "eth0" *--* Required by upstream Task rate: desired rate for transmitting packets (packets per second) *--* Required by upstream Task target_file: specifies the file on disk containing a list of ips or domains *--* Required by upstream Task + results_dir: specifes the directory on disk to which all Task results are written *--* Required by upstream Task """ threads = luigi.Parameter(default=defaults.get("threads", "")) @@ -44,6 +45,7 @@ class AquatoneScan(luigi.Task): luigi.Task - GatherWebTargets """ args = { + "results_dir": self.results_dir, "rate": self.rate, "target_file": self.target_file, "top_ports": self.top_ports, @@ -61,7 +63,7 @@ class AquatoneScan(luigi.Task): Returns: luigi.local_target.LocalTarget """ - return luigi.LocalTarget(f"aquatone-{self.target_file}-results") + return luigi.LocalTarget(f"{self.results_dir}/aquatone-{self.target_file}-results") def run(self): """ Defines the options/arguments sent to aquatone after processing. diff --git a/recon/web/corscanner.py b/recon/web/corscanner.py index ef97e5d..1969460 100644 --- a/recon/web/corscanner.py +++ b/recon/web/corscanner.py @@ -32,6 +32,7 @@ class CORScannerScan(ExternalProgramTask): interface: use the named raw network interface, such as "eth0" *--* Required by upstream Task rate: desired rate for transmitting packets (packets per second) *--* Required by upstream Task target_file: specifies the file on disk containing a list of ips or domains *--* Required by upstream Task + results_dir: specifes the directory on disk to which all Task results are written *--* Required by upstream Task """ threads = luigi.Parameter(default=defaults.get("threads", "")) @@ -46,6 +47,7 @@ class CORScannerScan(ExternalProgramTask): luigi.Task - GatherWebTargets """ args = { + "results_dir": self.results_dir, "rate": self.rate, "target_file": self.target_file, "top_ports": self.top_ports, @@ -63,7 +65,7 @@ class CORScannerScan(ExternalProgramTask): Returns: luigi.local_target.LocalTarget """ - return luigi.LocalTarget(f"corscanner.{self.target_file}.json") + return luigi.LocalTarget(f"{self.results_dir}/corscanner.{self.target_file}.json") def program_args(self): """ Defines the options/arguments sent to tko-subs after processing. diff --git a/recon/web/gobuster.py b/recon/web/gobuster.py index d7c5b49..9a2f7f4 100644 --- a/recon/web/gobuster.py +++ b/recon/web/gobuster.py @@ -41,6 +41,7 @@ class GobusterScan(luigi.Task): interface: use the named raw network interface, such as "eth0" *--* Required by upstream Task rate: desired rate for transmitting packets (packets per second) *--* Required by upstream Task target_file: specifies the file on disk containing a list of ips or domains *--* Required by upstream Task + results_dir: specifes the directory on disk to which all Task results are written *--* Required by upstream Task """ proxy = luigi.Parameter(default=defaults.get("proxy", "")) @@ -59,6 +60,7 @@ class GobusterScan(luigi.Task): luigi.Task - GatherWebTargets """ args = { + "results_dir": self.results_dir, "rate": self.rate, "target_file": self.target_file, "top_ports": self.top_ports, @@ -79,7 +81,7 @@ class GobusterScan(luigi.Task): Returns: luigi.local_target.LocalTarget """ - return luigi.LocalTarget(f"gobuster-{self.target_file}-results") + return luigi.LocalTarget(f"{self.results_dir}/gobuster-{self.target_file}-results") def run(self): """ Defines the options/arguments sent to gobuster after processing. diff --git a/recon/web/subdomain_takeover.py b/recon/web/subdomain_takeover.py index f8d8765..18f1e20 100644 --- a/recon/web/subdomain_takeover.py +++ b/recon/web/subdomain_takeover.py @@ -25,6 +25,7 @@ class TKOSubsScan(ExternalProgramTask): interface: use the named raw network interface, such as "eth0" *--* Required by upstream Task rate: desired rate for transmitting packets (packets per second) *--* Required by upstream Task target_file: specifies the file on disk containing a list of ips or domains *--* Required by upstream Task + results_dir: specifes the directory on disk to which all Task results are written *--* Required by upstream Task """ def requires(self): @@ -37,6 +38,7 @@ class TKOSubsScan(ExternalProgramTask): luigi.Task - GatherWebTargets """ args = { + "results_dir": self.results_dir, "rate": self.rate, "target_file": self.target_file, "top_ports": self.top_ports, @@ -54,7 +56,7 @@ class TKOSubsScan(ExternalProgramTask): Returns: luigi.local_target.LocalTarget """ - return luigi.LocalTarget(f"tkosubs.{self.target_file}.csv") + return luigi.LocalTarget(f"{self.results_dir}/tkosubs.{self.target_file}.csv") def program_args(self): """ Defines the options/arguments sent to tko-subs after processing. @@ -93,6 +95,7 @@ class SubjackScan(ExternalProgramTask): interface: use the named raw network interface, such as "eth0" *--* Required by upstream Task rate: desired rate for transmitting packets (packets per second) *--* Required by upstream Task target_file: specifies the file on disk containing a list of ips or domains *--* Required by upstream Task + results_dir: specifes the directory on disk to which all Task results are written *--* Required by upstream Task """ threads = luigi.Parameter(default=defaults.get("threads", "")) @@ -107,6 +110,7 @@ class SubjackScan(ExternalProgramTask): luigi.Task - GatherWebTargets """ args = { + "results_dir": self.results_dir, "rate": self.rate, "target_file": self.target_file, "top_ports": self.top_ports, @@ -124,7 +128,7 @@ class SubjackScan(ExternalProgramTask): Returns: luigi.local_target.LocalTarget """ - return luigi.LocalTarget(f"subjack.{self.target_file}.txt") + return luigi.LocalTarget(f"{self.results_dir}/subjack.{self.target_file}.txt") def program_args(self): """ Defines the options/arguments sent to subjack after processing. diff --git a/recon/web/targets.py b/recon/web/targets.py index 8c6fd72..fa3732e 100644 --- a/recon/web/targets.py +++ b/recon/web/targets.py @@ -3,9 +3,9 @@ import pickle import luigi from luigi.util import inherits -from recon.config import web_ports from recon.amass import ParseAmassOutput from recon.masscan import ParseMasscanOutput +from recon.config import web_ports @inherits(ParseMasscanOutput, ParseAmassOutput) @@ -19,6 +19,7 @@ class GatherWebTargets(luigi.Task): interface: use the named raw network interface, such as "eth0" *--* Required by upstream Task rate: desired rate for transmitting packets (packets per second) *--* Required by upstream Task target_file: specifies the file on disk containing a list of ips or domains *--* Required by upstream Task + results_dir: specifes the directory on disk to which all Task results are written *--* Required by upstream Task """ def requires(self): @@ -31,6 +32,7 @@ class GatherWebTargets(luigi.Task): dict(str: ParseMasscanOutput, str: ParseAmassOutput) """ args = { + "results_dir": self.results_dir, "rate": self.rate, "target_file": self.target_file, "top_ports": self.top_ports, @@ -40,7 +42,9 @@ class GatherWebTargets(luigi.Task): return { "masscan-output": ParseMasscanOutput(**args), "amass-output": ParseAmassOutput( - exempt_list=self.exempt_list, target_file=self.target_file + exempt_list=self.exempt_list, + target_file=self.target_file, + results_dir=self.results_dir, ), } @@ -52,7 +56,7 @@ class GatherWebTargets(luigi.Task): Returns: luigi.local_target.LocalTarget """ - return luigi.LocalTarget(f"webtargets.{self.target_file}.txt") + return luigi.LocalTarget(f"{self.results_dir}/webtargets.{self.target_file}.txt") def run(self): """ Gather all potential web targets into a single file to pass farther down the pipeline. """ diff --git a/recon/web/webanalyze.py b/recon/web/webanalyze.py index b953ee6..592c010 100644 --- a/recon/web/webanalyze.py +++ b/recon/web/webanalyze.py @@ -39,6 +39,7 @@ class WebanalyzeScan(luigi.Task): interface: use the named raw network interface, such as "eth0" *--* Required by upstream Task rate: desired rate for transmitting packets (packets per second) *--* Required by upstream Task target_file: specifies the file on disk containing a list of ips or domains *--* Required by upstream Task + results_dir: specifes the directory on disk to which all Task results are written *--* Required by upstream Task """ threads = luigi.Parameter(default=defaults.get("threads", "")) @@ -53,6 +54,7 @@ class WebanalyzeScan(luigi.Task): luigi.Task - GatherWebTargets """ args = { + "results_dir": self.results_dir, "rate": self.rate, "target_file": self.target_file, "top_ports": self.top_ports, @@ -72,7 +74,7 @@ class WebanalyzeScan(luigi.Task): Returns: luigi.local_target.LocalTarget """ - return luigi.LocalTarget(f"webanalyze-{self.target_file}-results") + return luigi.LocalTarget(f"{self.results_dir}/webanalyze-{self.target_file}-results") def _wrapped_subprocess(self, cmd): with open(f"webanalyze.{cmd[2].replace('//', '_').replace(':', '')}.txt", "wb") as f: diff --git a/recon/wrappers.py b/recon/wrappers.py index 92608ee..5cd7fa0 100644 --- a/recon/wrappers.py +++ b/recon/wrappers.py @@ -24,6 +24,7 @@ class FullScan(luigi.WrapperTask): def requires(self): """ FullScan is a wrapper, as such it requires any Tasks that it wraps. """ args = { + "results_dir": self.results_dir, "rate": self.rate, "target_file": self.target_file, "top_ports": self.top_ports, @@ -39,9 +40,11 @@ class FullScan(luigi.WrapperTask): yield GobusterScan(**args) + # remove options that are gobuster specific; if left dictionary unpacking to other scans throws an exception for gobuster_opt in ("proxy", "wordlist", "extensions", "recursive"): del args[gobuster_opt] + # add aquatone scan specific option args.update({"scan_timeout": self.scan_timeout}) yield AquatoneScan(**args) @@ -56,3 +59,41 @@ class FullScan(luigi.WrapperTask): del args["threads"] yield TKOSubsScan(**args) + + +@inherits(SearchsploitScan, AquatoneScan, GobusterScan, WebanalyzeScan) +class HTBScan(luigi.WrapperTask): + """ Wraps multiple scan types in order to run tasks on the same hierarchical level at the same time. """ + + def requires(self): + """ HTBScan is a wrapper, as such it requires any Tasks that it wraps. """ + args = { + "results_dir": self.results_dir, + "rate": self.rate, + "target_file": self.target_file, + "top_ports": self.top_ports, + "interface": self.interface, + "ports": self.ports, + "exempt_list": self.exempt_list, + "threads": self.threads, + "proxy": self.proxy, + "wordlist": self.wordlist, + "extensions": self.extensions, + "recursive": self.recursive, + } + + yield GobusterScan(**args) + + # remove options that are gobuster specific; if left dictionary unpacking to other scans throws an exception + for gobuster_opt in ("proxy", "wordlist", "extensions", "recursive"): + del args[gobuster_opt] + + # add aquatone scan specific option + args.update({"scan_timeout": self.scan_timeout}) + + yield AquatoneScan(**args) + + del args["scan_timeout"] + + yield SearchsploitScan(**args) + yield WebanalyzeScan(**args)