[HTB] Previous (Medium_Linux)
🔐 보호된 게시글
이 게시글을 보려면 비밀번호를 입력해주세요
시작에 앞서
다시 돌아온 Linux! 하지만 이번엔 Medium 난이도 도전!
정찰 및 정보 수집 (Reconnaissance & Enumeration)
결과를 보아하니 언제나처럼 ssh 80포트와 nginx 80번 포트가 열려있다.
http://previous.htb/라고 하니 /etc/hosts 파일에 등록해주자.
이거 설마 Next.js 본따서 만든 페이지인가? 이름부터가 Previous.js인데 ㅋㅋㅋ
내일의 기술이 아니라 어제의 기술 이란다 ㅋㅋㅋ
SSR 이 아니라 NSR
Lightweight 가 아니라 Heavyweight
Opt-in 이 아니라 Opt-out
Get Started나 Docs를 눌러도 로그인 페이지로 들어간다.
dirsearch를 진행했고, 보아하니 수 많은 api와 /signin 등등이 있는데 사실상 하나만 200이고 다들 307, 308인데?
Wappalyzer로 확인을 해보니 Next.js, Nginx, React를 확인했음을 확인할 수 있다.
초기 침투 (Initial Foothold / Exploitation)
보아하니 꽤 많은 것들이 보이는데, 일단 RCE에다가 bypass까지 꽤 쏠쏠해 보이는데?
일단 인증 우회는 exploit 코드도 있다고 하고
이것도 있네?
그럼 둘 다 해보지 뭐
CVE-2025-29927 (Next.js에서 권한 우회)
Next.js 미들웨어 인증 우회 취약점 (CVE-2025-29927) / 꼰머의 보안공부
내용이 좀 많이 어렵긴 한데 간단히 설명하자면
Next.js에서 작업을 처리한 후에 결과를 보여주기 위해 Redirect를 할 때에 Host 헤더의 주소표를 보고 이동할 곳을 정하게 된다.
근데 이 Host 헤더의 x-middleware-subrequest라는 친구가 원래는 무한 루프 방지를 위해 존재하는 녀석인데 이걸 여러번 주입해서 내가 원하는 곳으로 우회가 가능하다는 취약점이다.
websecnl/CVE-2025-29927-PoC-Exploit을 이용했고 그 결과?
1
2
3
┌──(kali㉿kali)-[~/CVE-2025-29927-PoC-Exploit]
└─$ python3 CVE-2025-29927-check.py
Domain (or full URL): http://previous.htb
다 실패?
1
2
3
4
5
┌──(kali㉿kali)-[~/CVE-2025-29927-PoC-Exploit]
└─$ python3 CVE-2025-29927-check.py
Domain (or full URL): http://previous.htb/docs
[+] Full path provided. Testing only endpoint: /docs
[*] Connecting to base URL: http://previous.htb
그럴리가! 보아하니 이 poc를 이용할 때에는 도메인을 잘 넣어줘야겠다.
일단 우리가 원래는 접근 못해야 하는 부분의 내용이 보이게 되긴 했는데…
확실히 이쪽으로 보는게 더 편하죠?
보아하니 Logged in as ???인게 우리가 인증우회를 진행해서 들어왔기에 이리 뜨게 된다.
근데 이것도 지금 문제가 curl 결과를 내가 html로 옮겨서 연건데 그럼 페이지를 돌아다니기 불편하잖아?
burpsuite를 이용하자.
burp suite 이용하기
일단 Proxy 탭으로 이동하여 Proxy settings를 들어간다.
쭉 내려가다보면 이미지처럼 HTTP match and replace rules가 보인다.
여기서 Add를 눌러주자.
이렇게 뜰텐데 다른거 건들이지 말고 Replace에 x-middleware-subrequest: middleware:middleware:middleware:middleware:middleware를 넣어주고
Comment에는 아무렇게 써주자.
이렇게 넣었다면 준비 끝!
burpsuite의 Open browser를 이용해 http://previous.htb/docs로 들어가주면?
짜잔! 이렇게 ???로 로그인 하여 페이지를 볼 수 있다!
CVE-2025-29927로 다시 돌아와
Getting Started 페이지에는 뭐 딱히 없고
Examples에서는 뭔가 다운받는게 있네?
하지만 별거 없죠?
뭔가 걸리는게 있어서 Intercept 기능을 켜고 보니 /api/download?example=를 통해 파일을 다운받는 것을 확인했다.
그렇지! 다운로드 경로를 ../../../etc/passwd로 하니 파일을 다운로드 할 수 있었다.
그렇다는건 다른 것들도?
이번엔 ../../../app/.env에 있던 파일인데 뭔가의 시크릿 키가 있네?
.env 찾는다고 하루를 썼다는건 안 비밀.
제미나이의 추천으로 찾아보고 있는 것들
- app/package.json (설치된 패키지들)
- app/.next/routes-manifest.json (Next.js 프레임워크 전용 빌드 파일)
아니 근데 무슨 파일 이름이 []가 들어간담?
심지어 이거 [] 때문에 \를 넣어줘야한다.
오! 이게 우리가 가장 찾고 있는 부분일게 분명하다!
나는야 Jeremy!
그리고 ssh로 로그인도 성공했다!
으윽… docker… ptsd가…
넌 진짜 Medium이다.. 이게 생각보다 next.js의 구조를 모르면 거의 노가다 식으로 문제를 풀게될테니까 어느정도의 사전 지식을 요하는? 그런 문제이기에 Medium! 난이도에 딱 맞게.
CVE-2025-66478 (react2shell)
아니 지금 보니까 이거 React2shell 이잖아?
하지만 이건 실패 라고 한다. 요건 또 좀 알아봐야하려나? 아니면 진짜 너무 유명한거라 안되는 걸지도?
일단 오늘은 여기까지!