tryhackme

[tryhackme] Publisher

부산영롱 2024. 7. 19. 15:12


정말 오랜만에 tryhackme(THM) 문제를 풀어보았다. 난이도 Easy에 시간제한이 60분이지만 나에게는 너무나도 어려웠고 Write-up을 보면서해도 이해가 안가서 장장 2일간 문제를 습득했다.

 

자, 일단 가상머신을 키고 생성된 IP로 접속해보니 위와 같은 페이지가 보였다.

위키로 검색해보니 SPIP라는 CMS였다. 예전에 푼 문제들도 전부 취약한 버전을 사용하는 CMS를 통해 문제를 풀었기에 이번 문제도 같은 유형이겠구나 싶었다.

 

nmap을 이용한 포트 스캔 결과, 22번과 80번 port가 열려있다는 것 말고는 특이점은 없었다.

gobuster를 이용한 디렉토리 스캔을 해보니 /spip 라는 페이지가 보였고 거기서 아래와 같은 로그인 페이지를 확인 할 수 있었다.

 로그인 페이지 소스를 보면 SPIP 버전이 메타 태그에 명시되어 있었다.

해당 버전으로 searchsploit을 해보니 RCE 취약점이 있는 버전이라는 것을 확인할 수 있었다.

내장되어 있는 exploit 을 가져오고 사용법도 확인했다. -u 옵션을 사용해서 타겟 URL을 지정하고 실행시킬 코드를 -c 옵션 뒤에 적으면 된다.

 

여기까지는 무척이나 쉬운데 이 다음부터 어떻게 해야할지 몰랐다. write-up에 여러가지 풀이법이 있었는데 내가 해본 2가지 방법을 작성해보려고 한다.

 

1. 웹쉘 업로드

웹 서버에서 쉘 명령어를 실행할 수 있는 웹쉘을 업로드한 뒤 해당 웹쉘에 접근하여 cmd=id 명령이 제대로 실행되는 것을 확인했다.


2. 리버스쉘

bash 리버스쉘 코드를 base64 인코딩 한뒤 -c 옵션 뒤에 인코딩 문자열을 다시 디코딩하여 bash 쉘로 실행시키는 명령을 전송했다. 결과는 성공적.

 

base64로 인코딩했다가 디코딩하는 과정을 왜 하나 검색해봤더니 문자열 필터링 우회 등을 하기 위해서라고 한다.

실제로 인코딩을 하지 않고 bash 리버스쉘 코드를 그대로 옵션 뒤에 넣으면 웹서버에서 리버스쉘이 제대로 작동하지 않는다.

 

둘다 가능하다면 리버스쉘이 훨씬 편하다. 첫번째 방법은 매번 웹쉘을 실행시켜야하고 웹쉘 파일의 흔적도 남게되니 뭐하나 나은 점이 없어보인다.

 

상위 디렉토리로 올라가보면 /home/think 폴더에 첫번째 flag인 user.txt 파일을 찾을 수 있다.

 

user.txt 파일과 함께있는 .ssh 폴더도 확인해보면 아래와 같이 think 사용자의 private key도 확인할 수 있다.

private key를 복사하여 가져와서 ssh로 접속해보면!

아하.. 권한이 너무 오픈되어 있단다.

600으로 권한을 변경하니 제대로 접속을 할 수 있었다.

이제 최종 목표인 root 권한으로 상승하는 일만 남았다.

find 명령어를 사용하여 setuid 바이너리를 검색해봤다.

검색결과 중 평범하지 않은 파일인 run_container를 확인할 수 있다. 나는 뭐가 평범한건지 몰라서 kali에서 똑같이 setuid 바이너리를 검색해서 kali에는 검색되지 않는 파일을 확인해보았다.

run_container 바이너리를 실행해보면 중간에 /opt/run_container.sh 라는 쉘스크립트 파일이 실행되는 것을 알 수 있다.

/opt/run_container.sh 쉘스크립트 파일을 수정하여 bash쉘을 실행하려 했지만 권한이 없다고 한다.

/opt/run_container.sh 파일 권한은 777로 개방되어 있는데 뭔가에 막혀서 write 할수가 없다.

힌트를 보면 App Armor 라는 것을 확인해보라고 한다.

 

이게 뭔가 싶어서 검색을 해보니 리눅스 커널에서 제공하는 보안 모듈이라고 한다.

 /etc/apparmor.d/ 에서 프로파일 생성 및 수정이 가능하다고하니 확인해보자

해당 폴더에는 /usr/sbin/ash 라는 프로파일이 있었고 think 계정은 ash 쉘을 사용하고 있었다.

프로파일 내용을 자세히 들여다보니 deny /opt/** w 때문에 수정이 되지 않았다. 

먼저 bash 쉘로 바꿔야한다. /dev/shm 폴더는 write 권한이 없지만 하위 폴더나 파일에 대한 deny 설정은 없다.

 

참고로 /dev/shm은 임시 파일 시스템으로 사용되는 디렉토리이며 RAM(주기억장치)을 사용하여 구현되어 데이터 접근속도가 매우 빠르며 휘발성이라 재부팅 시 데이터가 사라지는 특성을 가지고 있다.

 

해커 입장에서 매우 유용하게 사용할 것 같다.

쓰기가 가능한 /dev/shm 폴더에 bash쉘을 실행하는 pwn.sh 파일을 만들고 실행했다.

이제 /opt 폴더에 대한 권한이 생겼으니 run_container.sh 파일을 수정해보자

run_container.sh 파일을 수정하여 bash 쉘을 실행하게 했고 setuid 설정이 돼있는 run_container를 실행하면 root 권한으로 bash쉘을 실행하게 된다.

 

이제 /root 폴더 안에 있는 root.txt 내용을 제출하면 미션 클리어!

'tryhackme' 카테고리의 다른 글

[tryhackme] Basic Pentesting  (0) 2023.12.21
[tryhackme] RootMe  (0) 2023.12.20
[tryhackme] LazyAdmin  (0) 2023.12.17
[tryhackme] Ignite  (0) 2023.12.17