Hack The Box/Lab

Bike - SSTI

YujinSec 2026. 5. 2. 06:45

1. 기본 개념
0) nmap 
-v: 상세 출력
 
1) Node.js
: 백엔트 자바스크립트 런타임 환경. 자바스크립트를 브라우저 밖(=서버)에서 실행하게 해주는 환경을 뜻함. 
- 오픈소스
- 크로스 플랫폼 지원
 
*크로스 플랫폼: 하나의 프로그램, 앱, 게임, 코드가 여러 os에서 동시 실행/개발 가능한 것
 
Node.js의 전역변수)
https://nodejs.org/api/globals.html

Global objects | Node.js v25.9.0 Documentation

Global objects#These objects are available in all modules.The following variables may appear to be global but are not. They exist only in the scope of CommonJS modules:The objects listed here are specific to Node.js. There are built-in objects that are par

nodejs.org

 
*전역변수 = Global
 
내장 객체)
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects

Standard built-in objects - JavaScript | MDN

developer.mozilla.org

 
*내장 객체 = built-in objects
 
=> require은 global scope에 포함되지 않음!! => 고로 특정 환경에서는 접근 불가 할 수 있음,,
=> 대신 process 객체는 가능할지도~ => procwaa: 현재 실행 중인 Node 프로세스의 정보를 가진 객채. 
=> process.mainModule: 메인 프로그램 모듈 객체. = 템플릿 샌드박스 밖에서 실행된 진짜 Node 앱의 본체에 가까움.
즉 메인 앱 객체엔 여전히 require이 남아있을 수도 있다~는 걸 활용하는 것임. 
 
 
2) Express
: Node.js 위에서 웹 서버를 쉽게 만들어주는 웹 애플리케이션 프레임워크. 
- express를 통해 기존 Node.js 단독보다 더 쉽고, 확장된 기능을 볼 수 있다!
 
*프레임워크: 개발을 위해 준비된 틀 
 
3) Template Engine
: 웹 페이지에서 동적으로 생성된 콘텐츠를 표시해줌. 템플릿 파일 내부 변수들을 실제 값으로 치환해서, 그 결과를 클라이언트에게 보여줌. 
 
취약점: SSTI = server side template injection)
: 공격자가 템플릿 내부에 악성 입력값 삽입 -> 서버에서 명령 실행하게 하는 취약점. 
> ssti 취약점 존재 여부 확인은? 핵트릭스로!!
https://hacktricks.wiki/en/pentesting-web/ssti-server-side-template-injection/index.html

SSTI (Server Side Template Injection) - HackTricks

Learn & practice AWS Hacking: HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)...

hacktricks.wiki

익스플로잇) 

{{this.push "return require('child_process').exec('whoami');"}}

- {{ }}: template 문법. 안의 내용 해석/실행 함. 
- this: 현재 template 실행 context 객체. 
- push: 템플릿 내부 엔진 동작에, 실행될 문자열 넣기
- require: 다른 코드를 불러오는 함수
- child_process: os 명령어 실행 기능이 있는 모듈
- exec: 명령어를 실행.
 
4) url encoding = url 인코딩
: 문자 -> 아스키로 인코딩하는 과정
- 표준 128자인 아스키 문자 집합에 속하지 않는 예약 문자들(=reserved characters)이 나올 경우 인코딩이 필요.
- 인코딩/디코딩은 Burp Suite로 가능함!!
- url에서 인자로 사용되기 때문에 url인코딩이라 부름. %사용. 
 
*예약 문자: 특정 의미를 가지는 특수 문자들. 
 
 
2. 문제 풀이
일단 nmap. 

ssh는 지금 당장 가진 인증 정보가 없다면 패스해주자. 
웹 사이트먼저 접속 ㄱ. 
 
이메일 입력란이 보인다. 입력하면 바로 아래 문자로 뜸. 

 
여기에 대한 취약점을 찾아야 할 것 같다,, 그럼 우선 사용 서비스부터 알자. 요 아이콘 클릭. 

당장은 하나만 뜸. 

여기서 막 입력값 주고 하니 다른 것도 뜬다. 

이제 Node.js를 쓰는 건 앎. 
우린 SSTI 취약점을 활용할 것이니, 그 취약점이 있는지부터 알아보자. 핵트릭스에 확인 방법이 보임. 
 
우선 첫 입력값. 이 경우는 실패. 

다음은 성공임. 보면 입력을 받긴 함 에러는 나도. 
여기서 주위깊게 봐야하는 POINT는?
> 서버 실행 경로: /root/Backend
> 사용 템플릿 엔진: Handlebars

 
이제 난 이 사이트가 핸들바 템플릿을 사용해 입력을 처리함을 알았으니, 그에 대한 익스플로잇을 진행하고 싶음. 
이때도 역시나 핵트릭스 사이트를 활용할 거임. 
SSTI 페이지 들어가서 옆 카테고리 중 핸들바를 클릭 ㄱ. 

여기 나오는 익스플로잇 코드를 그대로 쓰자. 

위 코드를 그대로 복사해, Burp Suite를 키고 디코더를 통해 인코딩 해줌. 형식은 url로. 

 
그리고 Proxy에서 open browser해서, 입력 줘 봄. 

그럼 post로 하나 보이는데, 여기서 우클릭 후 리피터로 보내줌. (=ctrl + R)

그리고 email 파라미터 값을 이전 건 지우고(내가 입력한 부분만) 인코딩 한 내용 그대~로 복붙해줌. 

그리고 send 클릭해서, response 확인. 

에러가 뜸! 왜일까? 보통 Node.js에서 require은 잘 됨. But, 이 환경이 (이 샌드박스에서는) 템플릿 엔진 내부 제한된 실행 공간으로, require변수 자체가 아예 존재하지 않아 보임. 
즉 require을 직접적으로 쓰진 못하고, 다른 방법이 필요. 
여기서 나오는 해결책이 process를 쓰는 것이다. Node.js에는 대표적으로 전역에서 접근 가능한 게 있는데, 그중 process는 거의~ 항상 존재한다고 함. 
고로 얘를 일단 넣어보자. 

결과가 잘 뜸! 얘를 활용하면 될 듯. 

한 단계씩 되나 안 되나 점검해줌. 

걍 다 잘 되는 거 같아 바로 명령어 넣기 ㄱ. 

root라 뜬다. ㅇㅋ. 이제 그냥 바로 shell 처럼 쓰면 될 듯. 

flag를 획득했다~

 
 

'Hack The Box > Lab' 카테고리의 다른 글

Ignition - curl  (0) 2026.05.02
Environment  (0) 2026.05.02
Funnel - 터널링 & PostgreSQL & ss  (0) 2026.05.02
Three - awscli & reverse shell & subdomains  (0) 2026.04.30
Responder - NTLM & winRM & LFI & RFI  (0) 2026.04.30