Evan Johnson
Python 3 solution scripts for Natas levels.
Python dependencies I used in my solutions are specified in requirements.txt and can
be installed using the command:
pip install -r requirements.txt
The solutions directory contains working solution scripts for the levels in the
Natas "wargame". Other files may be helpful,
but won't give away solutions.
Each solution script has a brief level description in a doc comment. Python's help
function will print these for you if you need a hint. For example, to print generated
documentation for natas2, you could run the command:
python -c "help('solutions.natas02')"
For some levels, this will also reveal documentation for any helper functions in the solution script. If you have already solved the level, the password will be printed, too.
Note: At the moment, this requires a levels.json file with a structure identical to
_levels_init.json. Copy _levels_init.json to levels.json file if needed (or run
solve.py).
The natas_utils module provides some utility functions I find helpful on various levels.
My solution scripts usually import all of its contents with from natas_utils import *.
Utility functions for loading and storing level data depend on a levels.json file in the
working directory. To use those functions starting from Natas0, rename or copy _levels_init.json
to levels.json. solve.py will do this automatically if levels.json does not exist when
it is run.
recon.py is my utility for fetching and printing pages for the various levels from the
command line. It takes a level number and optional relative path as command line arguments.
The main script takes a single integer as a command line argument and attempts to run the
solution script for that level. To re-run solution scripts for levels 1 through N, use the
--deps flag:
python solve.py --deps N
To use this utility with your own solutions, either replace the corresponding script in
solutions with your own or modify solve.py to import solutions from elsewhere.
solve.py expects solutions for each level to be a module or sub-module named "natas{LEVEL}"
(where LEVEL is the 2-digit level number, left-padded with a 0 if needed). It also expects that
the module has a function solve with the signature
solve(url: str, login: LevelLogin) -> Optional[str]
where LevelLogin is an alias for Tuple[str, str] and contains the username and password
for the level.