시작 크레덴셜
이번 머신은 처음에 크레덴셜이 주어진다.
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
파일에 추가 후 사이트를 살펴본다.
드디어 로그인 페이지가 나왔다.
처음에 주어진 크레덴셜로 로그인한다.
로그인에는 성공했지만 딱히 취약점을 찾지는 못했다.
버전을 확인.
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
를 넣어봤더니 로그인 성공했다.
아까 파일에서 봤던 크론잡이 등록되어 있다.
root로 실행되기 때문에 리버스쉘 페이로드를 등록했더니 루트로 쉘이 연결됐다!