From e74b3e04a9baf674a07694731886218bb6098c0a Mon Sep 17 00:00:00 2001 From: Krypton Date: Sun, 21 Jul 2024 13:16:44 +0200 Subject: [PATCH] feat: Generate JSON file with the wordlists --- .github/workflows/update-json-file.yml | 32 +++++++++++ tools/make_json.py | 80 ++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 .github/workflows/update-json-file.yml create mode 100644 tools/make_json.py diff --git a/.github/workflows/update-json-file.yml b/.github/workflows/update-json-file.yml new file mode 100644 index 0000000..78ae001 --- /dev/null +++ b/.github/workflows/update-json-file.yml @@ -0,0 +1,32 @@ +name: Update JSON file + +on: + push: + branches: + - main + workflow_dispatch: + +jobs: + update_readme_file: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + token: ${{ secrets.PAT }} + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: "3.11" + - name: Make JSON file + run: python tools/make_json.py + - name: Check if there are any changes + id: verify_diff + run: | + git diff --quiet . || echo "changed=true" >> $GITHUB_OUTPUT + - name: Update README file + if: steps.verify_diff.outputs.changed == 'true' + run: | + git config --global user.name 'Krypton' + git config --global user.email 'root@krypton.ninja' + git commit -am "chore: Automatic wordlists.json file update with accurate wordlists [skip ci]" + git push diff --git a/tools/make_json.py b/tools/make_json.py new file mode 100644 index 0000000..0bb711f --- /dev/null +++ b/tools/make_json.py @@ -0,0 +1,80 @@ +# This code is bad, I even lost myself in it - but it works 😎 🤓 + +import glob +import json +import os +import re + + +keywords = { + "Sql": "SQL", + "Jsp": "JSP", + "Lfi": "LFI", + "Tlds": "TLDs", + "Wp": "WP", + "Vpn": "VPN", + "Wpa": "WPA", + "Us": "US", + "Uri": "URI", + "Http": "HTTP", + "Os": "OS", + "Beos": "BeOS", + "Chromeos": "ChromeOS", + "Ios": "iOS", + "Hp": "HP", + "Openbsd": "OpenBSD", + "Sunos": "SunOS", + "Webos": "webOS", + "Itunes": "iTunes", + "Xml": "XML", + "Xss": "XSS", +} + + +class Wordlist: + def __init__(self, name: str, href: str, lines: int, tags: list[type[str]]): + self.name = name + self.href = href + self.lines = lines + self.tags = tags + + +wordlists: list[type[Wordlist]] = [] + +for filename in glob.iglob("./wordlists/**/*", recursive=True): + if os.path.isdir(filename): + continue + + rel_path = os.path.relpath(filename) + levels = rel_path.split(os.sep) + folders = levels[1 : len(levels) - 1] + name = levels[len(levels) - 1] + name = name[: len(name) - 4].replace("_", " ").title() + + for keyword in keywords: + name = re.sub(rf"\b{keyword}\b", keywords[keyword], name) + + href = "/".join(levels) + + lines = 0 + if name == "Rockyou": # Can't count correctly for that one as it's a ZIP file + lines = 14344392 + else: + with open(rel_path, "rb") as f: + lines = sum(1 for _ in f) + + tags: list[type[str]] = [] + for folder in folders: + tags.append(folder.replace("_", "-")) + + wordlist = Wordlist(name, href, lines, tags) + wordlists.append(wordlist) + +with open("wordlists.json", "w", encoding="utf-8") as f: + f.write( + json.dumps( + [wordlist.__dict__ for wordlist in sorted(wordlists, key=lambda w: w.name)], + sort_keys=True, + indent=4, + ) + )