Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
mxrch
GitHub Repository: mxrch/GHunt
Path: blob/master/ghunt/cli.py
252 views
1
from rich_argparse import RichHelpFormatter
2
3
import argparse
4
from typing import *
5
import sys
6
from pathlib import Path
7
8
9
def parse_and_run():
10
RichHelpFormatter.styles["argparse.groups"] = "misty_rose1"
11
RichHelpFormatter.styles["argparse.metavar"] = "light_cyan1"
12
RichHelpFormatter.styles["argparse.args"] = "light_steel_blue1"
13
RichHelpFormatter.styles["argparse.prog"] = "light_pink1 bold italic"
14
15
16
parser = argparse.ArgumentParser(formatter_class=RichHelpFormatter)
17
subparsers = parser.add_subparsers(dest="module")
18
19
### Login module
20
parser_login = subparsers.add_parser('login', help="Authenticate GHunt to Google.", formatter_class=RichHelpFormatter)
21
parser_login.add_argument('--clean', action='store_true', help="Clear credentials local file.")
22
23
### Email module
24
parser_email = subparsers.add_parser('email', help="Get information on an email address.", formatter_class=RichHelpFormatter)
25
parser_email.add_argument("email_address")
26
parser_email.add_argument('--json', type=Path, help="File to write the JSON output to.")
27
28
### Gaia module
29
parser_gaia = subparsers.add_parser('gaia', help="Get information on a Gaia ID.", formatter_class=RichHelpFormatter)
30
parser_gaia.add_argument("gaia_id")
31
parser_gaia.add_argument('--json', type=Path, help="File to write the JSON output to.")
32
33
### Drive module
34
parser_drive = subparsers.add_parser('drive', help="Get information on a Drive file or folder.", formatter_class=RichHelpFormatter)
35
parser_drive.add_argument("file_id", help="Example: 1N__vVu4c9fCt4EHxfthUNzVOs_tp8l6tHcMBnpOZv_M")
36
parser_drive.add_argument('--json', type=Path, help="File to write the JSON output to.")
37
38
### Geolocate module
39
parser_geolocate = subparsers.add_parser('geolocate', help="Geolocate a BSSID.", formatter_class=RichHelpFormatter)
40
geolocate_group = parser_geolocate.add_mutually_exclusive_group(required=True)
41
geolocate_group.add_argument("-b", "--bssid", help="Example: 30:86:2d:c4:29:d0")
42
geolocate_group.add_argument("-f", "--file", type=Path, help="File containing a raw request body, useful to put many BSSIDs. ([italic light_steel_blue1][link=https://developers.google.com/maps/documentation/geolocation/requests-geolocation?#sample-requests]Reference format[/link][/italic light_steel_blue1])")
43
parser_geolocate.add_argument('--json', type=Path, help="File to write the JSON output to.")
44
45
### Spiderdal module
46
parser_spiderdal = subparsers.add_parser('spiderdal', help="Find assets using Digital Assets Links.", formatter_class=RichHelpFormatter)
47
parser_spiderdal.add_argument("-p", "--package", help="Example: com.squareup.cash")
48
parser_spiderdal.add_argument("-f", "--fingerprint", help="Example: 21:A7:46:75:96:C1:68:65:0F:D7:B6:31:B6:54:22:EB:56:3E:1D:21:AF:F2:2D:DE:73:89:BA:0D:5D:73:87:48")
49
parser_spiderdal.add_argument("-u", "--url", help="Example: https://cash.app. If a domain is given, it will convert it to a URL, and also try the \"www\" subdomain.")
50
parser_spiderdal.add_argument("-s", "--strict", action='store_true', help="Don't attempt to convert the domain to a URL, and don't try the \"www\" subdomain.")
51
parser_spiderdal.add_argument('--json', type=Path, help="File to write the JSON output to.")
52
53
### Parsing
54
args = None
55
if not sys.argv[1:]:
56
parser.parse_args(["--help"])
57
else:
58
for mod in ["email", "gaia", "drive", "geolocate", "spiderdal"]:
59
if sys.argv[1] == mod and not sys.argv[2:]:
60
parser.parse_args([mod, "--help"])
61
62
args = parser.parse_args(args)
63
process_args(args)
64
65
def process_args(args: argparse.Namespace):
66
import asyncio
67
match args.module:
68
case "login":
69
from ghunt.modules import login
70
asyncio.run(login.check_and_login(None, args.clean))
71
case "email":
72
from ghunt.modules import email
73
asyncio.run(email.hunt(None, args.email_address, args.json))
74
case "gaia":
75
from ghunt.modules import gaia
76
asyncio.run(gaia.hunt(None, args.gaia_id, args.json))
77
case "drive":
78
from ghunt.modules import drive
79
asyncio.run(drive.hunt(None, args.file_id, args.json))
80
case "geolocate":
81
from ghunt.modules import geolocate
82
asyncio.run(geolocate.main(None, args.bssid, args.file, args.json))
83
case "spiderdal":
84
if any([args.package, args.fingerprint]) and not all([args.package, args.fingerprint]):
85
exit("[!] You must provide both a package name and a certificate fingerprint.")
86
from ghunt.modules import spiderdal
87
asyncio.run(spiderdal.main(args.url, args.package, args.fingerprint, args.strict, args.json))
88