Projects STRLCPY golddigger Commits cd323f4b
🤬
  • ■ ■ ■ ■ ■ ■
    .gitignore
     1 +# Byte-compiled / optimized / DLL files
     2 +__pycache__/
     3 +*.py[cod]
     4 +*$py.class
     5 + 
     6 +bin/
     7 + 
     8 +# C extensions
     9 +*.so
     10 + 
     11 +# Distribution / packaging
     12 +.Python
     13 +build/
     14 +develop-eggs/
     15 +dist/
     16 +downloads/
     17 +eggs/
     18 +.eggs/
     19 +lib/
     20 +lib64/
     21 +parts/
     22 +sdist/
     23 +var/
     24 +wheels/
     25 +share/python-wheels/
     26 +*.egg-info/
     27 +.installed.cfg
     28 +*.egg
     29 +MANIFEST
     30 + 
     31 +# PyInstaller
     32 +# Usually these files are written by a python script from a template
     33 +# before PyInstaller builds the exe, so as to inject date/other infos into it.
     34 +*.manifest
     35 +*.spec
     36 + 
     37 +# Installer logs
     38 +pip-log.txt
     39 +pip-delete-this-directory.txt
     40 + 
     41 +# Unit test / coverage reports
     42 +htmlcov/
     43 +.tox/
     44 +.nox/
     45 +.coverage
     46 +.coverage.*
     47 +.cache
     48 +nosetests.xml
     49 +coverage.xml
     50 +*.cover
     51 +*.py,cover
     52 +.hypothesis/
     53 +.pytest_cache/
     54 +cover/
     55 + 
     56 +# Translations
     57 +*.mo
     58 +*.pot
     59 + 
     60 +# Django stuff:
     61 +*.log
     62 +local_settings.py
     63 +db.sqlite3
     64 +db.sqlite3-journal
     65 + 
     66 +# Flask stuff:
     67 +instance/
     68 +.webassets-cache
     69 + 
     70 +# Scrapy stuff:
     71 +.scrapy
     72 + 
     73 +# Sphinx documentation
     74 +docs/_build/
     75 + 
     76 +# PyBuilder
     77 +.pybuilder/
     78 +target/
     79 + 
     80 +# Jupyter Notebook
     81 +.ipynb_checkpoints
     82 + 
     83 +# IPython
     84 +profile_default/
     85 +ipython_config.py
     86 + 
     87 +# pyenv
     88 +# For a library or package, you might want to ignore these files since the code is
     89 +# intended to run in multiple environments; otherwise, check them in:
     90 +# .python-version
     91 + 
     92 +# pipenv
     93 +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
     94 +# However, in case of collaboration, if having platform-specific dependencies or dependencies
     95 +# having no cross-platform support, pipenv may install dependencies that don't work, or not
     96 +# install all needed dependencies.
     97 +#Pipfile.lock
     98 + 
     99 +# poetry
     100 +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
     101 +# This is especially recommended for binary packages to ensure reproducibility, and is more
     102 +# commonly ignored for libraries.
     103 +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
     104 +#poetry.lock
     105 + 
     106 +# pdm
     107 +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
     108 +#pdm.lock
     109 +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
     110 +# in version control.
     111 +# https://pdm.fming.dev/#use-with-ide
     112 +.pdm.toml
     113 + 
     114 +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
     115 +__pypackages__/
     116 + 
     117 +# Celery stuff
     118 +celerybeat-schedule
     119 +celerybeat.pid
     120 + 
     121 +# SageMath parsed files
     122 +*.sage.py
     123 + 
     124 +# Environments
     125 +.env
     126 +.venv
     127 +env/
     128 +venv/
     129 +ENV/
     130 +env.bak/
     131 +venv.bak/
     132 + 
     133 +# Spyder project settings
     134 +.spyderproject
     135 +.spyproject
     136 + 
     137 +# Rope project settings
     138 +.ropeproject
     139 + 
     140 +# mkdocs documentation
     141 +/site
     142 + 
     143 +# mypy
     144 +.mypy_cache/
     145 +.dmypy.json
     146 +dmypy.json
     147 + 
     148 +# Pyre type checker
     149 +.pyre/
     150 + 
     151 +# pytype static type analyzer
     152 +.pytype/
     153 + 
     154 +# Cython debug symbols
     155 +cython_debug/
     156 + 
     157 +# PyCharm
     158 +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
     159 +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
     160 +# and can be added to the global gitignore or merged into this file. For a more nuclear
     161 +# option (not recommended) you can uncomment the following to ignore the entire idea folder.
     162 +#.idea/
     163 +pyvenv.cfg
     164 + 
  • ■ ■ ■ ■ ■ ■
    dig.py
     1 +import pathlib
     2 +import json
     3 +import re
     4 +import os
     5 +import argparse
     6 +import logging
     7 +import sys
     8 +from datetime import datetime
     9 + 
     10 +parser = argparse.ArgumentParser()
     11 +parser.add_argument('-e','--exclude', help='JSON file containing extension exclusions', default='binary.json')
     12 +parser.add_argument('-g','--gold', help='JSON file containing the gold to search for', default='gold.json')
     13 +parser.add_argument('-d','--directory', help='Directory to search for gold', required=True)
     14 +parser.add_argument('-r','--recursive', help='Search directory recursively?', default=True)
     15 +parser.add_argument('-l','--log', help='Log file to save output', default=None)
     16 +args = parser.parse_args()
     17 + 
     18 +version = '0.1'
     19 +now = datetime.now()
     20 +now_dt = now.strftime('%m%d%Y%H%M%S')
     21 +log_file = f'gold_{now_dt}.log'
     22 + 
     23 +if not args.log is None:
     24 + log_file = args.log
     25 + 
     26 +logging.basicConfig(
     27 + format = '%(asctime)s - %(message)s',
     28 + datefmt='%Y-%m-%d %H:%M:%S',
     29 + level = logging.INFO,
     30 + handlers=[
     31 + logging.FileHandler(log_file),
     32 + logging.StreamHandler()
     33 + ]
     34 +)
     35 + 
     36 +log = logging.getLogger()
     37 +log.setLevel(logging.INFO)
     38 +log.info(f'Gold Digger v{version}')
     39 +log.info(f'Saving results to: {log_file}')
     40 + 
     41 +def main(args):
     42 + log.info(f'Searching: {args.directory}')
     43 + 
     44 + gold = load_gold(args.gold)
     45 + log.info(f'Searching for {len(gold)} nuggets...')
     46 + 
     47 + exclusions = load_exclusions(args.exclude)
     48 + log.info(f'Loaded {len(exclusions)} exclusions...')
     49 + 
     50 + mine = load_files(args.directory, args.recursive, exclusions)
     51 + log.info(f'Found {len(mine)} files...')
     52 + 
     53 + nuggets = mine_gold(mine, gold)
     54 +
     55 +def mine_gold(mine, gold):
     56 + for check_file in mine:
     57 + if os.path.isfile(check_file):
     58 + file_data = load_file(check_file)
     59 + for nugget in gold:
     60 + matches = re.findall(gold[nugget], file_data)
     61 + if matches:
     62 + log.info(f'Struck gold! {nugget} -> {check_file}')
     63 + 
     64 +def load_gold(gold):
     65 + with open(gold, 'r') as fh:
     66 + return json.load(fh)
     67 + 
     68 +def load_exclusions(exclusions):
     69 + with open(exclusions, 'r') as fh:
     70 + return [x.lower() for x in json.load(fh)]
     71 + 
     72 +def load_file(check_file):
     73 + try:
     74 + with open(check_file, 'r') as fh:
     75 + return fh.read()
     76 + except:
     77 + return ''
     78 + 
     79 +def load_files(gold_mine, recursive, exclusions):
     80 + good_files = []
     81 + nuggets = [x for x in pathlib.Path(gold_mine).rglob('*')]
     82 + for nugget in nuggets:
     83 + if not any(
     84 + exclude in os.path.basename(nugget)
     85 + for exclude in exclusions
     86 + ):
     87 + good_files.append(nugget)
     88 + return good_files
     89 + 
     90 +if __name__ == '__main__':
     91 + main(args)
     92 + 
  • ■ ■ ■ ■ ■ ■
    exclusions.json
     1 +[
     2 + ".js",
     3 + ".3dm",
     4 + ".3ds",
     5 + ".3g2",
     6 + ".3gp",
     7 + ".7z",
     8 + ".a",
     9 + ".aac",
     10 + ".adp",
     11 + ".ai",
     12 + ".aif",
     13 + ".aiff",
     14 + ".alz",
     15 + ".ape",
     16 + ".apk",
     17 + ".appimage",
     18 + ".ar",
     19 + ".arj",
     20 + ".asf",
     21 + ".au",
     22 + ".avi",
     23 + ".bak",
     24 + ".baml",
     25 + ".bh",
     26 + ".bin",
     27 + ".bk",
     28 + ".bmp",
     29 + ".btif",
     30 + ".bz2",
     31 + ".bzip2",
     32 + ".cab",
     33 + ".caf",
     34 + ".cgm",
     35 + ".class",
     36 + ".cmx",
     37 + ".cpio",
     38 + ".cr2",
     39 + ".cur",
     40 + ".dat",
     41 + ".dcm",
     42 + ".deb",
     43 + ".dex",
     44 + ".djvu",
     45 + ".dll",
     46 + ".dmg",
     47 + ".dng",
     48 + ".doc",
     49 + ".docm",
     50 + ".docx",
     51 + ".dot",
     52 + ".dotm",
     53 + ".dra",
     54 + ".DS_Store",
     55 + ".dsk",
     56 + ".dts",
     57 + ".dtshd",
     58 + ".dvb",
     59 + ".dwg",
     60 + ".dxf",
     61 + ".ecelp4800",
     62 + ".ecelp7470",
     63 + ".ecelp9600",
     64 + ".egg",
     65 + ".eol",
     66 + ".eot",
     67 + ".epub",
     68 + ".exe",
     69 + ".f4v",
     70 + ".fbs",
     71 + ".fh",
     72 + ".fla",
     73 + ".flac",
     74 + ".flatpak",
     75 + ".fli",
     76 + ".flv",
     77 + ".fpx",
     78 + ".fst",
     79 + ".fvt",
     80 + ".g3",
     81 + ".gh",
     82 + ".gif",
     83 + ".graffle",
     84 + ".gz",
     85 + ".gzip",
     86 + ".h261",
     87 + ".h263",
     88 + ".h264",
     89 + ".icns",
     90 + ".ico",
     91 + ".ief",
     92 + ".img",
     93 + ".ipa",
     94 + ".iso",
     95 + ".jar",
     96 + ".jpeg",
     97 + ".jpg",
     98 + ".jpgv",
     99 + ".jpm",
     100 + ".jxr",
     101 + ".key",
     102 + ".ktx",
     103 + ".lha",
     104 + ".lib",
     105 + ".lvp",
     106 + ".lz",
     107 + ".lzh",
     108 + ".lzma",
     109 + ".lzo",
     110 + ".m3u",
     111 + ".m4a",
     112 + ".m4v",
     113 + ".mar",
     114 + ".mdi",
     115 + ".mht",
     116 + ".mid",
     117 + ".midi",
     118 + ".mj2",
     119 + ".mka",
     120 + ".mkv",
     121 + ".mmr",
     122 + ".mng",
     123 + ".mobi",
     124 + ".mov",
     125 + ".movie",
     126 + ".mp3",
     127 + ".mp4",
     128 + ".mp4a",
     129 + ".mpeg",
     130 + ".mpg",
     131 + ".mpga",
     132 + ".mxu",
     133 + ".nef",
     134 + ".npx",
     135 + ".numbers",
     136 + ".nupkg",
     137 + ".o",
     138 + ".odp",
     139 + ".ods",
     140 + ".odt",
     141 + ".oga",
     142 + ".ogg",
     143 + ".ogv",
     144 + ".otf",
     145 + ".ott",
     146 + ".pages",
     147 + ".pbm",
     148 + ".pcx",
     149 + ".pdb",
     150 + ".pdf",
     151 + ".pea",
     152 + ".pgm",
     153 + ".pic",
     154 + ".png",
     155 + ".pnm",
     156 + ".pot",
     157 + ".potm",
     158 + ".potx",
     159 + ".ppa",
     160 + ".ppam",
     161 + ".ppm",
     162 + ".pps",
     163 + ".ppsm",
     164 + ".ppsx",
     165 + ".ppt",
     166 + ".pptm",
     167 + ".pptx",
     168 + ".psd",
     169 + ".pya",
     170 + ".pyc",
     171 + ".pyo",
     172 + ".pyv",
     173 + ".qt",
     174 + ".rar",
     175 + ".ras",
     176 + ".raw",
     177 + ".resources",
     178 + ".rgb",
     179 + ".rip",
     180 + ".rlc",
     181 + ".rmf",
     182 + ".rmvb",
     183 + ".rpm",
     184 + ".rtf",
     185 + ".rz",
     186 + ".s3m",
     187 + ".s7z",
     188 + ".scpt",
     189 + ".sgi",
     190 + ".shar",
     191 + ".snap",
     192 + ".sil",
     193 + ".sketch",
     194 + ".slk",
     195 + ".smv",
     196 + ".snk",
     197 + ".so",
     198 + ".stl",
     199 + ".suo",
     200 + ".sub",
     201 + ".swf",
     202 + ".tar",
     203 + ".tbz",
     204 + ".tbz2",
     205 + ".tga",
     206 + ".tgz",
     207 + ".thmx",
     208 + ".tif",
     209 + ".tiff",
     210 + ".tlz",
     211 + ".ttc",
     212 + ".ttf",
     213 + ".txz",
     214 + ".udf",
     215 + ".uvh",
     216 + ".uvi",
     217 + ".uvm",
     218 + ".uvp",
     219 + ".uvs",
     220 + ".uvu",
     221 + ".viv",
     222 + ".vob",
     223 + ".war",
     224 + ".wav",
     225 + ".wax",
     226 + ".wbmp",
     227 + ".wdp",
     228 + ".weba",
     229 + ".webm",
     230 + ".webp",
     231 + ".whl",
     232 + ".wim",
     233 + ".wm",
     234 + ".wma",
     235 + ".wmv",
     236 + ".wmx",
     237 + ".woff",
     238 + ".woff2",
     239 + ".wrm",
     240 + ".wvx",
     241 + ".xbm",
     242 + ".xif",
     243 + ".xla",
     244 + ".xlam",
     245 + ".xls",
     246 + ".xlsb",
     247 + ".xlsm",
     248 + ".xlsx",
     249 + ".xlt",
     250 + ".xltm",
     251 + ".xltx",
     252 + ".xm",
     253 + ".xmind",
     254 + ".xpi",
     255 + ".xpm",
     256 + ".xwd",
     257 + ".xz",
     258 + ".z",
     259 + ".zip",
     260 + ".zipx"
     261 +]
     262 + 
  • ■ ■ ■ ■ ■ ■
    gold.json
     1 +{
     2 + "Slack Token": "(xox[p|b|o|a]-[0-9]{12}-[0-9]{12}-[0-9]{12}-[a-z0-9]{32})",
     3 + "RSA private key": "-----BEGIN RSA PRIVATE KEY-----",
     4 + "SSH (DSA) private key": "-----BEGIN DSA PRIVATE KEY-----",
     5 + "SSH (EC) private key": "-----BEGIN EC PRIVATE KEY-----",
     6 + "PGP private key block": "-----BEGIN PGP PRIVATE KEY BLOCK-----",
     7 + "Authorization Header": "authorization: (bearer|basic|digest) .*",
     8 + "Amazon AWS Access Key ID": "AKIA[0-9A-Z]{16}",
     9 + "Amazon Web Services Secret Key": "[0-9a-zA-Z/+]{40}",
     10 + "Amazon MWS Auth Token": "amzn\\.mws\\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}",
     11 + "Dynatrace Cloud API Key": "dt0c01\\..*",
     12 + "Facebook Access Token": "EAACEdEose0cBA[0-9A-Za-z]+",
     13 + "Facebook OAuth": "[f|F][a|A][c|C][e|E][b|B][o|O][o|O][k|K].*['|\"][0-9a-f]{32}['|\"]",
     14 + "Foursquare Secret Key": "R_[0-9a-f]{32}",
     15 + "GitHub": "[g|G][i|I][t|T][h|H][u|U][b|B].*['|\"][0-9a-zA-Z]{35,40}['|\"]",
     16 + "Generic API Key": "[a|A][p|P][i|I][_]?[k|K][e|E][y|Y].*['|\"][0-9a-zA-Z]{32,45}['|\"]",
     17 + "Generic Secret": "[s|S][e|E][c|C][r|R][e|E][t|T].*['|\"][0-9a-zA-Z]{32,45}['|\"]",
     18 + "Google API Key": "AIza[0-9A-Za-z\\-_]{35}",
     19 + "Google OAuth 2.0 Refresh Token": "1/[0-9A-Za-z\\-_]{43}|1/[0-9A-Za-z\\-_]{64}",
     20 + "Google OAuth 2.0 Access Token": "ya29\\.[0-9A-Za-z\\-_]+",
     21 + "GitHub OAuth 2.0 ID": "[A-Za-z0-9_]{255}",
     22 + "Google Cloud Platform API Key": "AIza[0-9A-Za-z\\-_]{35}",
     23 + "Google Cloud Platform OAuth": "[0-9]+-[0-9A-Za-z_]{32}\\.apps\\.googleusercontent\\.com",
     24 + "Google Cloud Platform OAuth 2.0": "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}",
     25 + "Google Cloud Platform API Key": "[A-Za-z0-9_]{21}--[A-Za-z0-9_]{8}",
     26 + "Google Drive API Key": "AIza[0-9A-Za-z\\-_]{35}",
     27 + "Google Drive OAuth": "[0-9]+-[0-9A-Za-z_]{32}\\.apps\\.googleusercontent\\.com",
     28 + "Google (GCP) Service-account": "\"type\": \"service_account\"",
     29 + "Google Gmail API Key": "AIza[0-9A-Za-z\\-_]{35}",
     30 + "Google Gmail OAuth": "[0-9]+-[0-9A-Za-z_]{32}\\.apps\\.googleusercontent\\.com",
     31 + "Google OAuth Access Token": "ya29\\.[0-9A-Za-z\\-_]+",
     32 + "Google YouTube API Key": "AIza[0-9A-Za-z\\-_]{35}",
     33 + "Google YouTube OAuth": "[0-9]+-[0-9A-Za-z_]{32}\\.apps\\.googleusercontent\\.com",
     34 + "Heroku API Key": "[h|H][e|E][r|R][o|O][k|K][u|U].*[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}",
     35 + "Heroku OAuth 2.0": "[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}",
     36 + "Instagram OAuth 2.0": "[0-9a-fA-F]{7}\\.[0-9a-fA-F]{32}",
     37 + "Mapbox Public Key": "([s,p]k.eyJ1Ijoi[\\w\\.-]+)",
     38 + "Mapbox Secret Key": "([s,p]k.eyJ1Ijoi[\\w\\.-]+)",
     39 + "MailChimp API Key": "[0-9a-f]{32}-us[0-9]{1,2}",
     40 + "Mailgun API Key": "key-[0-9a-zA-Z]{32}",
     41 + "Microsoft ServiceBus Authorization Header": "authorization: SharedAccessSignature .*",
     42 + "Password in URL": "[a-zA-Z]{3,10}://[^/\\s:@]{3,20}:[^/\\s:@]{3,20}@.{1,100}[\"'\\s]",
     43 + "PayPal Braintree Access Token": "access_token\\$production\\$[0-9a-z]{16}\\$[0-9a-f]{32}",
     44 + "Picatic API Key": "sk_live_[0-9a-z]{32}",
     45 + "Sharepoint Admin URL": "https:\/\/.*-admin.sharepoint\\.com",
     46 + "SOTI Server": "s\\d{6}\\.mobicontrolcloud\\.com",
     47 + "Slack Webhook": "https://hooks.slack.com/services/T[a-zA-Z0-9_]{8}/B[a-zA-Z0-9_]{8}/[a-zA-Z0-9_]{24}",
     48 + "Slack OAuth v2 Bot Access Token": "xoxb-[0-9]{11}-[0-9]{11}-[0-9a-zA-Z]{24}",
     49 + "Slack OAuth v2 User Access Token": "xoxp-[0-9]{11}-[0-9]{11}-[0-9a-zA-Z]{24}",
     50 + "Slack OAuth v2 Configuration Token": "xoxe.xoxp-1-[0-9a-zA-Z]{166}",
     51 + "Slack OAuth v2 Refresh Token": "xoxe-1-[0-9a-zA-Z]{147}",
     52 + "Splunk Authorization Header": "authorization: Splunk .*",
     53 + "Stripe API Key": "sk_live_[0-9a-zA-Z]{24}",
     54 + "Stripe Restricted API Key": "rk_live_[0-9a-zA-Z]{24}",
     55 + "Square Access Token": "sq0atp-[0-9A-Za-z\\-_]{22}",
     56 + "Square OAuth Secret": "sq0csp-[0-9A-Za-z\\-_]{43}",
     57 + "Twilio API Key": "SK[0-9a-fA-F]{32}",
     58 + "Twitter Access Token": "[t|T][w|W][i|I][t|T][t|T][e|E][r|R].*[1-9][0-9]+-[0-9a-zA-Z]{40}",
     59 + "Twitter OAuth": "[t|T][w|W][i|I][t|T][t|T][e|E][r|R].*['|\"][0-9a-zA-Z]{35,44}['|\"]"
     60 +}
     61 + 
  • ■ ■ ■ ■ ■ ■
    readme.md
     1 +# Gold Digger
     2 +## Search files for gold
     3 + 
     4 +Gold Digger is a simple tool used to help quickly discover sensitive information in files recursively. Originally written to assist in rapidly searching files obtained during a penetration test.
     5 + 
     6 +## Installation
     7 + 
     8 +Gold Digger requires Python3.
     9 + 
     10 +```sh
     11 +virtualenv -p python3 .
     12 +source bin/activate
     13 +python dig.py --help
     14 +```
     15 + 
     16 +## Usage
     17 + 
     18 +```sh
     19 +usage: dig.py [-h] [-e EXCLUDE] [-g GOLD] -d DIRECTORY [-r RECURSIVE] [-l LOG]
     20 + 
     21 +optional arguments:
     22 + -h, --help show this help message and exit
     23 + -e EXCLUDE, --exclude EXCLUDE
     24 + JSON file containing extension exclusions
     25 + -g GOLD, --gold GOLD JSON file containing the gold to search for
     26 + -d DIRECTORY, --directory DIRECTORY
     27 + Directory to search for gold
     28 + -r RECURSIVE, --recursive RECURSIVE
     29 + Search directory recursively?
     30 + -l LOG, --log LOG Log file to save output
     31 +```
     32 + 
     33 +## Example Usage
     34 +Gold Digger will recursively go through all folders and files in search of content matching items listed in the `gold.json` file. Additionally, you can leverage an exclusion file called `exclusions.json` for skipping files matching specific extensions. Provide the root folder as the `--directory` flag.
     35 + 
     36 +An example structure could be:
     37 + 
     38 + 
     39 +```sh
     40 +~/Engagements/CustomerName/data/randomfiles/
     41 +~/Engagements/CustomerName/data/randomfiles2/
     42 +~/Engagements/CustomerName/data/code/
     43 +```
     44 + 
     45 +You would provide the following command to parse all 3 account reports:
     46 + 
     47 +```sh
     48 +python dig.py --gold gold.json --exclude exclusions.json --directory ~/Engagements/CustomerName/data/ --log Customer_2022-123_gold.log
     49 +```
     50 + 
     51 +## Results
     52 +The tool will create a log file containg the scanning results. Due to the nature of using regular expressions, there may be numerous false positives. Despite this, the tool has been proven to increase productivity when processing thousands of files.
     53 + 
     54 +## Shout-outs
     55 +Shout out to @d1vious for releasing git-wild-hunt https://github.com/d1vious/git-wild-hunt! Most of the regex in GoldDigger was used from this amazing project.
     56 + 
Please wait...
Page is in error, reload to recover