[HTB] Conversor (Easy_Linux)
🔐 보호된 게시글
이 게시글을 보려면 비밀번호를 입력해주세요
Congratulations OilLampCat, best of luck in capturing flags ahead!
시작에 앞서
블로그를 작성하는데 자꾸 github에 올렸다가 그거 링크 복사해서 붙여넣기 하고![]()이거 넣고 하는데 시간 소요가 생각보다 더 되는 듯 하여 아예 키세팅을 넣었다.
ctrl + shift + p를 누른 후 Preferences: Open Keyboard Shortcuts (JSON)에 들어가 위 코드를 넣어주면 된다. 심지어 지금 설정을 넣고 나면 마우스 포인터가 []안에 들어갈 수 있게 설정하여 매우매우 편해졌다는 것!
그럼 이제 다시 문제로 돌아가서.
이번엔 다시 돌아온 linux 머신이고 또 한번 active 머신이다. 그리고 평소와 비슷하게 이번에는 계정 정보가 없다.
일단 시작!
정찰 및 정보 수집 (Reconnaissance & Enumeration)
어… 결과가… 보통 있는 ssh/22와 http/80번 포트 밖에 없다.
이렇게 되면 이제 /etc/host파일에 링크를 넣고 직접 들어가 확인해보는 수 밖에.
초기 침투 (Initial Foothold / Exploitation)
어쩨 들어가봤더니 login 페이지만 뜬다. 뭐.. 계정도 없으니 아마 지금 상황이 정상인 것이라.
회원가입의 기능도 있으니 이것을 이용하여 들어가야겠다.
음…
1
우리는 Conversor입니다. Nmap으로 대규모 스캔을 하고 결과를 좀 더 예쁘게 보고 싶었던 적이 있나요? 우리에게 해결책이 있습니다! XML 파일과 XSLT 시트를 업로드하기만 하면 더 미적인(aesthetic) 형식으로 변환해 줍니다. 원하신다면 우리가 개발한 템플릿을 다운로드할 수도 있습니다.
사용자가 XML 파일과 XSLT 파일을 업로드하면, 서버가 이를 처리해 보기 좋은 형태로 바꿔준다는데, 일단 그 전에 XML과 XSLT가 뭘까?
- XML (Extensible Markup Language)
데이터를 구조화해서 저장하는 텍스트 파일로 HTML과 비슷하게 태그(<>)를 사용하지만 디자인이 아닌 데이터를 저장한다.
- XSLT (Extensible Stylesheet Language Transformations)
XML 문서를 다른 형식(HTML, Text, 다른 XML 등)으로 변환하는 언어로 XML 데이터를 가져와서 “이 태그의 데이터는 빨간색 제목으로 보여줘”와 같이 명령을 내리게 된다.
찾아보니 XML로는 뭔가 할 수 있는 것이 딱히 없어보이고 다만 XSLT를 이용한 Server-Side XSLT Injection이 가능하다는 것을 확인했다.
Download Template을 이용해 예제 템플릿을 다운 받아봤다.
그리고 그걸 내 입맛대로 꾸미고 xml 파일은 빈걸 넣어보니.
엑.. 뭔가 안 된다.
내가 뭔가 더 찾아보지 않은 것이 있나 하여 페이지를 더 둘러보다 About 페이지에서 Download Source Code를 찾았다. 이래서 Enumeration을 확실히 해야하나보다..
어… 소스코드가 압축 해제가 안되네? 왜요?
아닛 압축이 안되어있는 파일이네?
명령어에서 z를 빼면 된다.
짜잔 드디어 소스코드를 분석할 수 있게 되었다.
가장 중요해보이는 app.py를 뜯어보니 flask로 만들어졌다.
게다가 convert부분을 들어가보니 위에서 생각한 대로 XML부분은 resolve_entities와 같은 설정이 되어있지만 xslt는 전혀 그런 설정이 없음이 확인되었다.
그리고 어쩌면 이건 나도 확실치 않다만 php가 아니라 python으로 명령을 내려야 할수도?
게다가 install.md를 읽어보니 /var/www/conversor.htb/scripts/에 *.py를 실행시켜주는 cron이 돌고있다고 한다. 이거군!
그럼 이제 다시 정리해서 공격 방식은 다음과 같을거다.
- 스파이 만들기 (내 컴퓨터에서 피해자로 넘어갈 리버스 쉘)
- xslt파일을 업로드해 피해자가 내 컴퓨터에서 리버스 쉘을 가져가도록 유도
- 리버스쉘 접속 성공!
이렇게 진행된다.
리버스 쉘(스파이)를 만들고.
스파이를 가져갈 수 있도록 xslt파일을 만든 후.
파일을 업로드 하면… 이거 실제로 혹시 해서 5분 기다려봤는데 안 된다. 애초에 cron 설정이 1분 단위이기도 해서 당연히 그정도 기다려서 안되면 안 되는거다.
그래서 뭣이 문제일까 찾아보니. 세상에 xslt의 import os와 같은 부분을 보면 앞에 띄어쓰기가 되어있지 않은가? 저걸 없애야 한다. 그 띄어쓰기 덕에 문제가 생기는 상황이라는 것!
리버스 쉘 획득 성공!
인데… 뭔가 더 쉬운 방법이 없을까 해서 찾아보니.
애초에 xslt파일을 통해 base64로 디코딩된 리버스쉘을 넘겨주면 되는거였다.
내가 이걸 왜 생각 못했지? 배고파서 그런가?
보아하니 fismathack이라는 유저를 얻는게 이번 userflag를 위한 길인듯 한데 아까 찾았던 파일 중에 db파일이 있었으니 이걸 찾아가보자.
여기도 여전히 db가 있으니 이제 sql로 연결해보자.
게다가 코드를 보아하니 sqlite3가 설치되어있다는 것을 알 수 있었다.
이거 왜 또 안되나 하고 가만히 있었는데 저번과 동일하게 덤쉘이여서 그런 것 같은디…
정답이었다! 그럼 이제 db를 읽어볼까?
이번엔 또 table이 비어있다고 하기에 왜인가 했더니, gemini왈 내가 지금 있는 위치에는 users.db가 없기에 빈 db를 만든거라고 한다.
이제야 제대로된 db를 찾았다. 보아하니 나인 oillampcat과 다른 유저들이 보이는데 그 중에 아까 찾고자 했던 유저인 fismathack의 계정이 보인다.
이걸 크래킹 할 때에 hashcat이나 john the ripper를 이용해도 되겠지만 난 그냥 인터넷에서 크래킹을 진행하기로 했다. md5였네.
잡았으!
권한 상승 (Privilege Escalation)
권한을 확인하기 위해서 sudo -l 명령어를 사용했고 needrestart라는 친구가 비밀번호가 없다고 한다?
오?검색 하자마자 바로 CVE가 나오기 시작하는데?
더 정확한 확인을 위해 버전을 찍어보니 3.7 버전이란다.
검색 해보았을 때에 pentestfunctions/CVE-2024-48990-PoC-Testing가 바로 뜨기에 바~로 채택.
그리고 비상. gcc가 없어서 진행 불가 ㅋㅋㅋㅋㅋㅋ
이렇게 되면 이제 그냥 내 컴퓨터에서 컴파일 후에 넘겨주는 걸로 해야겠다.
넘겨주는데 성공했다.
하지만? 문제가 있는지 전혀 되지 않음..
CVE-2024-48990-Automatic-Exploit 고로 다른 사람의 poc를 이용해보기로 했다.
자동화 최고! 있다가 지금 이거랑 내가 했던거랑 비교하면서 뭐가 잘못 되었던건지 확인을 좀 해봐야겠다.
찾았다! 하루 안에 문제 풀다니 발전했다 나 자신!
마치며
이젠 확실히 문제를 봤을 때 어떻게 검색할지 어떤 부분을 내가 모르는지에 대해서 좀 더 알게 되었다. 물론 이번 문제 풀 때의 마지막처럼 여전히 이게 왜 안 될까? 하는 그런 부분도 있기는 하다만 꾸준히 해나가고 있으니 언젠간 그것 마져도 풀어낼 수 있게 되지 않을까?
언젠가 내가 CVE를 올리게 되는 그날까지!