Hack The Box - Planning

Hack the box planning machine

By Hong

시작 크레덴셜

이번 머신은 처음에 크레덴셜이 주어진다.

admin / 0D5oT70Fq13EvB5r

로그인에 사용되겠다는 것을 인지.

nmap

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 9.6p1 Ubuntu 3ubuntu13.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 62:ff:f6:d4:57:88:05:ad:f4:d3:de:5b:9b:f8:50:f1 (ECDSA)
|_  256 4c:ce:7d:5c:fb:2d:a0:9e:9f:bd:f5:5c:5e:61:50:8a (ED25519)
80/tcp open  http    nginx 1.24.0 (Ubuntu)
|_http-title: Edukate - Online Education Website
|_http-server-header: nginx/1.24.0 (Ubuntu)

ssh와 웹서버가 열려있다.

웹서버에 로그인 페이지가 있는지 디렉토리를 찾아봤다.

Web enum

directory fuzzing

gobuster dir -u http://planning.htb -w /usr/share/wordlists/seclists/Discovery/Web-Content/raft-medium-directories.txt -x php -t 40

===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/js                   (Status: 301) [Size: 178] [--> http://planning.htb/js/]
/css                  (Status: 301) [Size: 178] [--> http://planning.htb/css/]
/contact.php          (Status: 200) [Size: 10632]
/img                  (Status: 301) [Size: 178] [--> http://planning.htb/img/]
/lib                  (Status: 301) [Size: 178] [--> http://planning.htb/lib/]
/about.php            (Status: 200) [Size: 12727]
/index.php            (Status: 200) [Size: 23914]
/detail.php           (Status: 200) [Size: 13006]
/course.php           (Status: 200) [Size: 10229]
/enroll.php           (Status: 200) [Size: 7053]

결과들을 하나하나 살펴봐도 로그인 화면은 없었다.

subdomain fuzzing

ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt -u http://planning.htb -fs 178 -H "Host: FUZZ.planning.htb"

gobuster dns -d planning.htb -w /usr/share/wordlists/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt -t 40

서브도메인은 딱히 없다.

vhost

ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt -u http://10.10.11.68 -H "Host: FUZZ.planning.htb" -fs 178

________________________________________________

 :: Method           : GET
 :: URL              : http://10.10.11.68
 :: Wordlist         : FUZZ: /usr/share/wordlists/seclists/Discovery/DNS/bitquark-subdomains-top100000.txt
 :: Header           : Host: FUZZ.planning.htb
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
 :: Filter           : Response size: 178
________________________________________________

grafana                 [Status: 302, Size: 29, Words: 2, Lines: 3, Duration: 204ms]

vhost를 퍼징하니 하나가 검색되었다. 서브도메인과는 다르게 타겟을 IP주소로 설정해야 vhost 모드가 된다.

grafana.planning.htb/etc/hosts 파일에 추가 후 사이트를 살펴본다.

login

드디어 로그인 페이지가 나왔다.

처음에 주어진 크레덴셜로 로그인한다.

로그인에는 성공했지만 딱히 취약점을 찾지는 못했다.

버전을 확인.

whatweb http://grafana.planning.htb

http://grafana.planning.htb/login [200 OK] Country[RESERVED][ZZ], Grafana[11.0.0], HTML5, HTTPServer[Ubuntu Linux][nginx/1.24.0 (Ubuntu)], IP[10.10.11.68], Script[text/javascript], Title[Grafana], UncommonHeaders[x-content-type-options], X-Frame-Options[deny], X-UA-Compatible[IE=edge], X-XSS-Protection[1; mode=block], nginx[1.24.0]

버전이 11.0.0이다. 찾아보니 관련 CVE가 있었다.

poc를 사용하면 리모트 명령어가 실행 가능한데 직접 리버스쉘을 연결하는 것은 불가능했다.

무슨 환경인지 파악하기 위해 env 명령어를 입력.

GF_PATHS_LOGS=/var/log/grafana
GF_PATHS_PROVISIONING=/etc/grafana/provisioning
GF_PATHS_PLUGINS=/var/lib/grafana/plugins
PATH=/usr/local/bin:/usr/share/grafana/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
AWS_AUTH_AllowedAuthProviders=default,keys,credentials
GF_SECURITY_ADMIN_PASSWORD=RioTecRANDEntANT!
AWS_AUTH_SESSION_DURATION=15m
GF_SECURITY_ADMIN_USER=enzo
GF_PATHS_DATA=/var/lib/grafana
GF_PATHS_CONFIG=/etc/grafana/grafana.ini
AWS_CW_LIST_METRICS_PAGE_LIMIT=500

그랬더니 enzo라는 유저와 패스워드가 적혀있다. ssh로 로그인 해보니 성공.

권한상승

여기저기 파일들을 살펴보다가 /opt/crontabs에서 비밀번호가 적혀있는 파일을 발견했다.

cat crontab.db 
{"name":"Grafana backup","command":"/usr/bin/docker save root_grafana -o /var/backups/grafana.tar && /usr/bin/gzip /var/backups/grafana.tar && zip -P P4ssw0rdS0pRi0T3c /var/backups/grafana.tar.gz.zip /var/backups/grafana.tar.gz && rm /var/backups/grafana.tar.gz","schedule":"@daily","stopped":false,"timestamp":"Fri Feb 28 2025 20:36:23 GMT+0000 (Coordinated Universal Time)","logging":"false","mailing":{},"created":1740774983276,"saved":false,"_id":"GTI22PpoJNtRKg0W"}
{"name":"Cleanup","command":"/root/scripts/cleanup.sh","schedule":"* * * * *","stopped":false,"timestamp":"Sat Mar 01 2025 17:15:09 GMT+0000 (Coordinated Universal Time)","logging":"false","mailing":{},"created":1740849309992,"saved":false,"_id":"gNIRXh1WIc9K7BYX"}

어디에 쓰는 비밀번호인지 아직은 모르겠다.

로컬에서 실행중인 다른 서비스를 보기 위해 netstat -lntpu를 입력.

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:3000          0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:8000          0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:35379         0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:33060         0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.54:53           0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -                   
tcp6       0      0 :::22                   :::*                    LISTEN      -                   
udp        0      0 127.0.0.54:53           0.0.0.0:*                           -                   
udp        0      0 127.0.0.53:53           0.0.0.0:*                           -

3000번과 8000번이 신경쓰인다.

ssh로 포트포워딩 한 후 접속해본다.

ssh -N -L localhost:8000:localhost:8000 enzo@10.10.11.68

3000번은 아까 봤던 grafana의 로그인 화면.

8000번을 접속해보면 로그인 페이지가 나온다.

위에서 찾은 비밀번호를 이용하는 것 같은데 아이디가 모르겠다.

파일안에 root_grafana 부분이 있었기 때문에 root / P4ssw0rdS0pRi0T3c를 넣어봤더니 로그인 성공했다.

cron

아까 파일에서 봤던 크론잡이 등록되어 있다.

root로 실행되기 때문에 리버스쉘 페이로드를 등록했더니 루트로 쉘이 연결됐다!

Share: X (Twitter) Facebook LinkedIn