mirror of https://github.com/dirtbags/moth.git
117 lines
2.6 KiB
Bash
Executable File
117 lines
2.6 KiB
Bash
Executable File
#! /bin/sh
|
||
|
||
: ${BASE:=/var/lib/ctf/p2}
|
||
|
||
mkdir -p $BASE
|
||
|
||
if ! [ -f $BASE/salt ]; then
|
||
dd if=/dev/urandom count=1 | md5sum - > $BASE/salt
|
||
fi
|
||
clear
|
||
printf '\017'
|
||
read salt < $BASE/salt
|
||
|
||
esc () {
|
||
printf '%s' "$*" | sed 's/[^-0-9A-Za-z ]/_/g; s/ /+/g'
|
||
}
|
||
|
||
newteam () {
|
||
echo '== Team Creation =='
|
||
echo
|
||
echo -n 'What would you like your team to be called (3-12 chars)? '
|
||
read -r name
|
||
echo
|
||
namelen=$(printf "%s" "$name" | wc -c)
|
||
if [ $namelen -lt 3 ] || [ $namelen -gt 12 ]; then
|
||
echo 'Invalid name length'
|
||
return
|
||
fi
|
||
hash=$(printf '%s %s' "$salt" "$name" | md5sum | cut -b 1-8)
|
||
|
||
if [ -d $BASE/$hash ]; then
|
||
echo "That name is already in use. Try another one."
|
||
return
|
||
fi
|
||
|
||
mkdir $BASE/$hash
|
||
|
||
printf '%s' "$name" > $BASE/$hash/.name
|
||
|
||
cat <<EOD
|
||
Your team hash is $hash. Write that down somewhere and don't lose it.
|
||
If you forget your hash, you'll have to start over from the beginning
|
||
with a new team and everybody will laugh at you.
|
||
EOD
|
||
}
|
||
|
||
fini () {
|
||
echo
|
||
echo "Press [Enter] to clear the screen."
|
||
read
|
||
exit 0
|
||
}
|
||
|
||
echo -n 'Team hash ("new" to create a new team): '
|
||
read -r hash
|
||
echo
|
||
if [ -z "$hash" ]; then
|
||
exit 0
|
||
elif [ "$hash" = "new" ]; then
|
||
newteam
|
||
fini
|
||
elif ! [ -d $BASE/$hash ]; then
|
||
echo "No such team, fool."
|
||
echo "Is this when everybody laughs at you for forgetting your hash?"
|
||
fini
|
||
fi
|
||
|
||
clear
|
||
|
||
read -r name < $BASE/$hash/.name
|
||
|
||
printf 'Welcome back, [34m%s[0m.\n' "$name"
|
||
|
||
while true; do
|
||
printf "[32mp2>[0m "
|
||
read -r answer
|
||
|
||
case "$answer" in
|
||
\?|help)
|
||
cat <<EOD
|
||
[32m Help
|
||
----------------------------------------------------------[0m
|
||
|
||
Type "[34mquit[0m" to leave the p2 shell.
|
||
|
||
Any other string is checked as an answer. If the answer
|
||
is correct, you are awarded points and the scoreboard will
|
||
update within 10 seconds. Check the puzzles overview to
|
||
see if your answer unlocked a new puzzle.
|
||
EOD
|
||
continue
|
||
;;
|
||
quit)
|
||
break
|
||
;;
|
||
esac
|
||
|
||
match=$(awk -v ans="$answer" '(substr($0, length($1)+2) == ans) { print substr(FILENAME, 6, length(FILENAME)-17) " " $1; }' /opt/*/answers.txt)
|
||
if [ -z "$match" ]; then
|
||
echo 'That is not a correct answer. Type "[34mhelp[0m" for help.'
|
||
continue
|
||
fi
|
||
|
||
cat=${match% *}
|
||
points=${match#* }
|
||
fn=$BASE/$hash/$cat.$points
|
||
if [ -f $fn ]; then
|
||
echo "You've already received points for this answer."
|
||
else
|
||
> $fn
|
||
echo "You get $points more points in the $cat category."
|
||
# run puzzles.cgi
|
||
# update scoreboard
|
||
fi
|
||
done
|
||
|