1. 문제 설명

 

JSFull

풀이에 성공한 이들에게는 수많은 풀이꾼들이 그토록 바랐던 GOSU의 FLAG가 증표처럼 남겨진다.

dreamhack.io

  • 기타 : KAIST-POSTECH Science War #2024 에 출제된 문제 (해 대회에서도 FLAG 획득 실패)

2. 정보수집 결과

  • IP 주소 : 23.81.42.210 (NMAP 스캔)  
  • Port : 지속적으로 변경 
  • 서버 : HTTP Node.js Express
  • 주요 엔드포인트

        - /bot : 해당 디렉토리 폼에 특정 URL을 입력하면 "봇"이 특정 URL 주소로 방문하는 기능을 가지고 있음.

                    이때 bot_token, secret, 값은 갱신됨

        - /secret/:index : 서버 URL + /secret/0~39 를 입력하면 secret 값을 찾을 수가 있는데, bot_token 쿠키 없이 시도하면

                                  홀수는 무조건 이미지값 (1을 의미), 짝수는 무조건 'i wanna gosu' 텍스트 (0을 의미) 가 출력됐음.

                                  올바른 secret 값을 구하기 위해서는 bot-token (쿠키) 값이 있어야 함.  secret 값은 40 배열 이진수로

                                  구성되어 있음

       - /flag : 올바른 secret 값을 입력하고 FLAG 값을 얻을 수 있음

  • 메소드 : HEAD, GET을 사용하며, /bot에서 url 요청시 POST를 사용함.
  • 기타 : 나중에 생각이 했던 것은 제공된 문제 파일에 서버가 사용하는 모듈 버전이 명시되어 있었기 때문에 스캔을 통  한 버전명 확인은 무의미 했음. 시스템 해킹 문제가 아니라 웹 해킹 문제이기에 버전명을 다 공개하지 않았을까 추론함. 

3. 풀이 시도 결과

  • 시도 1: bot_token값을 찾기 위해서 브라우저 개발자 도구, Burp Suite, Wireshark, OWASP 등 툴을 이용해 정보 수집을 하였으나 값을 찾지 못하였음. (httponly : true 설정으로 클라이언트 측에서 쿠키값을 확인하는 것은 불가능 했음)
  • 시도 2 : Node.js Express 에 대한 각종 취약점을 분석하며 CVE-2024-27980와 같은 취약점 적용을 고려했으나, 정확한 버전 정보를 알지 못하여 확실한 취약점을 찾지 못하였고, Exploit에 실패하였음. (나중에 확인했을때 문제 제공 파일에 버전이 명시되어 있었는데, NMAP 스캔 등으로 버전명을 찾고 있었던 내가 바보 같았음.. 하지만 좋은 경험이라 생각함. 버전명은 나중에 알게 되었으나 시스템 해킹이 아닌 웹해킹 문제이기에 시스템 해킹적 접근은 사용하지 않았음.)
  • 시도 3 : bot_token에 대한 정보를 얻기 위해 ngrok을 사용하여  외부에서 접근 가능한 서버를 구성하고, /bot 페이지에서  봇이 해당 서버를 방문하도록 유도했으나, 봇이 방문하지 않음. (연구결과 ngrok은 url 입력 후 과정을 한단계 더 거쳐야 했기 때문에 봇이 접속할 수 없었음) 
  • 시도 4: host3.dreamhack.games에 대한 정보를 Nikto와 WhatWeb을 통해 수집하며, 서버의 구조와 헤더를 분석했음. 결과적으로 X-Content-Type-Options가 설정되지 않은 등 보안적 허점이 존재함을 발견. (별 의미 없었음)
  • 시도 5 : 서버를 로컬서버에서 구동하였음. 로컬 서버에서 구동하였음에도 bot_token과 secret 값을 추출할 수 없었음. 서버 코드를 변경하면 추출할 수 있었으나, 그것은 로컬 서버에서만 가능하기 의미가 없었음. 
  • 시도 6 : bot_token과 secret 값을 추출하는 것은 불가능 하다는 생각에 특징을 추출하여 브루트포싱 시도를 하였음. bot_token 값보다 secret 값이 경우의 수가 더 적어서 secret 값을 브루트포싱하는 것으로 방향으로 잡았음. secret값의 모든 경우의 수는 1조개가 넘어서 컴퓨터로 브루트포싱해도 찾을 수가 없었음. secret 값의 몇가지 특징을 발견하여 경우의 수를 줄였지만 이 또한 경우의 수가 많아서 브루트포싱 하기에는 불가능 했음 
  • 시도 7 : 별도 서버를 구축하여 봇이 방문하게 하면 bot_token 또는 secret 값 구할 수 있지 않을까 라는 생각에 봇이 나의 로컬 서버에 접속하게 하는데 까지는 성공했으나 bot_token과 secret 값은 찾을 수 없었음.
  • 시도 8 : 봇이 특정 url을 방문할때 중간자 역할을 하는 서버를 구축하여 응답값을 중간자 서버가 받도록 하게 하면 bot_token과 secret 값을 찾을 수 있지 않을까 하는 생각에 시도하였으나 실패하였음.     
  • 시도 9 : XS-Leak 취약점 확인, firefox 브라우저에서 동시 접속 소캣을 1개만 가용하게 만든 후 요청 1 (/secret/0~39) 과 요청 2 (keep alive 로컬 서버) 를 동시 요청한 후 timing을 비교 분석 하였음. timing의 차이를 분석하여 이진수 40자리를 유추하였지만 실패하였음.  
async function testConcurrentRequests() {
  const secretPage = () => window.open('http://host3.dreamhack.games:15475/secret/0', { mode: 'no-cors', cache: 'no-store' });
  const fetchRequest = () => fetch('http://10.10.34.218', { mode: 'no-cors', cache: 'no-store' });
  await Promise.all([secretPage(), fetchRequest()]);
}

4. 결론 

  •  

'모의해킹' 카테고리의 다른 글

리버스쉘, POST - Exploit  (0) 2024.10.20
Exploit  (0) 2024.10.20
취약점 찾는법  (0) 2024.10.20
정보 수집 (NMAP 포트 스캔)  (1) 2024.10.20
TryHackMe 가상 서버 구동  (0) 2024.10.20

+ Recent posts