-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathftp_hub.py
More file actions
executable file
·100 lines (83 loc) · 3.65 KB
/
ftp_hub.py
File metadata and controls
executable file
·100 lines (83 loc) · 3.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import ftp_forest
import ftp_nmap
import ftp_stats
from ftp_forest import *
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)
from ftp_db import *
from ftp_config import CONFIG
conf = CONFIG["ftp_hub"]
def get_args():
parser = argparse.ArgumentParser(usage="Example: save_ranges -> scan_all_ranges -> check_all_ftp_anon")
parser.add_argument("--save_ranges", action="store_true",
help="Saved from ./inpu/ranges.txt with ranges in format <ip_start>\t<ip_stop>...")
parser.add_argument("--scan_all_ranges", action="store_true",
help="--scan_all: Scan all RANGE in the database, rescan older than old_delay_days")
parser.add_argument("--scan_all_versions", action="store_true",
help="Scan version of all with null version")
parser.add_argument("--print_ftp_list", action="store_true",
help="Print ftp list to stdout")
parser.add_argument("--print_pass_stat", action="store_true",
help="Print basic password stats")
args, unknown = parser.parse_known_args()
return parser, args
async def save_range_from_file(path=conf['ranges']):
ranges_to_save = [] #all ranges from file
async with aiofiles.open(conf['input_folder'] + path, 'r') as ip_list:
async for line in ip_list:
ip_a, ip_b = line.strip().split('\t')[:2]
ranges_to_save.append((ip_a.strip(), ip_b.strip()))
# insert all ranges to db (fast)
async with get_session() as session:
query = insert(Range).values([{"ip_a": ip_a, "ip_b": ip_b} for ip_a, ip_b in ranges_to_save])
do_nothing_stmt = query.on_conflict_do_nothing(index_elements=['ip_a', 'ip_b'])
await session.execute(do_nothing_stmt)
await session.commit()
print_ok(f"New ranges were saved to database")
async def scan_all_ranges(port, after_days=conf["old_delay_days"]):
async with get_session() as session:
days_ago = datetime.now() - timedelta(days=after_days)
range_list = (await session.execute(
select(Range).filter(or_(
Range.scan_date < days_ago,
Range.scan_date == None
))
)).scalars().all()
if not range_list:
logging.error("RANGE table is empty\n\tYou can use --save_ranges for load to RANGE")
for range_obj in range_list:
await range_obj.scan(session=session, port=port)
async def print_ftp_list():
async with get_session() as session:
result = await session.execute(select(FTPConn))
[print(ftp) for ftp in result.scalars()]
async def main():
parser, args = get_args()
if '-h' in sys.argv or '--help' in sys.argv:
parser.print_help()
if args.save_ranges:
print(f"save_range_from_file()")
await save_range_from_file()
if args.scan_all_ranges:
print("scan_all_ranges()")
await scan_all_ranges(port=21)
if args.scan_all_versions:
print("scan_all_versions()")
await ftp_nmap.scan_all_versions()
if args.print_ftp_list:
await print_ftp_list()
if args.print_pass_stat:
await ftp_stats.print_pass_stat()
return any((args.save_ranges, args.scan_all_ranges, args.print_ftp_list, args.scan_all_versions))
if __name__ == '__main__':
if asyncio.run(main()):
exit(0)
print(f"Invalid arguments for ftp_hub")
print(f"Try running ftp_forest")
if asyncio.run(ftp_forest.main()):
exit(0)
print(f"Invalid arguments for ftp_forest")
print(f"Try running ftp_nmap")
if asyncio.run(ftp_nmap.main()):
exit(0)
print(f"Invalid argument for all scripts")