[tryhackme] Hijack

김기훈·2024년 9월 19일

tryhackme

목록 보기
8/12

제목에서부터 나 세션하이재킹 문제요~ 라고 광고하는 듯한ㅎㅎ 가보자고~

Q1. What is the user flag?

맨날 있는 ssh, http 외에 ftp와 nfs, rpcbind 포트가 열려있다.

nfs를 통해 어떤 폴더가 공유되고 있는지 알아봤다.

/mnt/share 폴더가 모든 사용자에게 공유되고 있다.

마운트시켜 어떤 파일들이 있는지 살펴보자.

mount -t nfs 10.10.11.137:/mnt/share /mnt/nfs_share

마운트시킨 폴더에 접근을 할 수 없었는데 권한을 보면 test1이라는 사용자에게만 접근을 허용하고 있었다.

useradd test1

test1 계정을 생성한 뒤 test1 계정으로 접근해도 실패했다.
권한을 보면 uid가 '1003' 이어야하는데 생성된 test1 계정은 '1001'이다.

uid를 변경하고 공유폴더에 들어가보면 ftp 계정정보가 담겨있는 텍스트 파일을 확인할 수 있다.

획득한 ftp 계정정보로 접속하면 흥미로운 이름의 파일 두개가 보인다.
ftp에서는 내용을 확인할 수 없으니 다운받아보자.

get .from_admin.txt
get .passwords_list.txt

admin이 남긴 것으로 보이는 텍스트 파일에는 관리자가 직원들에게 안전한 패스워드 리스트를 제공할테니 그걸 사용하라고 한다.
중요한 것은 관리자 자신도 그 패스워드 리스트 중 하나를 사용하고 있다는 사실이다.

그리고 rick에게 남긴 노트에는 브루트포싱을 방지하기 위해 로그인 시도횟수 제한을 설정한 것으로 보인다.

이제 더 이상 얻을 수 있는 정보는 없어보이니 웹페이지를 살펴보자.

아직 개발 중인 페이지로 보인다.

관리자 페이지로 보이는 'Administration' 배너를 클릭하니 접근이 거부됐다는 메시지가 보인다.
오직 admin만 접근이 가능하다고 한다.

burpsuite로 확인해보니 PHPSESSID를 통해 admin인지 확인하는 것 같다.
admin 세션을 탈취해야하는 방법을 찾아야한다.

일단 세션아이디가 어떤 식으로 만들어지는지 확인해보자.

임시로 test 계정을 생성했고 세션아이디를 선택하니 오른쪽의 Inspector에서 자동으로 decode를 해줬고 계정명인 'test'와 ':'이 보이고 그 다음은 알 수 없는 문자열이 붙어있다.

아마도 [계정명]:[패스워드 해시값] 인 것 같다.

문자열의 길이가 32자리인걸 보면 MD5 해시일 것이다.

추정된 내용을 토대로 admin 계정의 세션을 확인해보기로 했다.

burpsuite의 intruder 기능을 활용하여 패스워드 리스트를 payload list로 넣고 먼저 payload를 MD5 해시 처리한 뒤 'admin:'를 앞에 붙이고 base64 인코딩했다.

공격 시작~

응답 길이 순으로 정렬하면 admin의 세션아이디를 확인할 수 있다.

그렇게 얻은 세션아이디로 접근하면 서비스 이름을 입력하면 해당 서비스 상태를 체크하는 기능이 있다.

혹시 Command Injection이 되는지 테스트를 해봤다.

ftp; id

Command Injection이 탐지되었다고 한다. ; 문자를 탐지한 것 같아서 바꿔봤다.

ftp && id

성공이다. && 문자열은 필터링이 안되있나보다.
이 취약점을 통해 bash 리버스쉘을 실행시켰다.

성공적으로 쉘을 얻었고 config.php 파일에서 rick의 패스워드를 확인할 수 있었다.

그렇게 rick 계정으로 접속했고 홈디렉토리에서 user.txt를 찾았다.

Q2. What is the root flag?

sudo로 실행가능한 명령이 있는지 확인해봤다.

env_keep+=LD_LIBRARY_PATH
(root) /usr/sbin/apache2 -f /etc/apache2/apache2.conf -d /etc/apache2

결과 중 두가지 주목할만한 내용이 있었다.

LD_LIBRARY_PATH는 리눅스 및 유닉스 시스템에서 동적 라이브러리의 검색 경로를 지정하는 환경 변수이다.

이전에 Creative 문제에서 env_keep+=LD_PRELOAD 설정을 이용하여 권한상승을 한 적이 있다.

env_keep+=LD_LIBRARY_PATH 역시 권한상승에 이용가능하다.

여기서는 sudo를 통해 /usr/sbin/apache2 명령을 실행할 것이기 때문에 먼저 해당 명령을 실행할 때 어떤 동적 라이브러리를 로드하는지 확인해야한다.

ldd 명령을 통해 apache2 실행시 로드되는 라이브러리 목록을 확인했고 이 라이브러리 중 하나의 파일이름과 똑같이 컴파일 시키면 된다.

exploit 코드는 다음과 같다.

#include <stdio.h>
#include <stdlib.h>

static void hijack() __attribute__((constructor));

void hijack() {
        unsetenv("LD_LIBRARY_PATH");
        setresuid(0,0,0);
        system("/bin/bash -p");
}

위 코드로 exploit을 작성하고 컴파일하여 동적 라이브러리를 생성한 뒤 LD_LIBRARY_PATH를 tmp 폴더로 지정하면 tmp 폴더에서 라이브러리를 검색하고 일치하는 파일을 찾아 로드하게 된다.

libpcre.so.3 을 사용했는데 에러가 발생한다. 아마도 종속성 이슈인 것 같다.
종속성 이슈가 발생하지 않는 파일을 찾아봤고 아래 4개 파일은 정상적으로 권한상승이 가능했다.

  • libcrypt.so.1
  • libexpat.so.1
  • libuuid.so.1
  • libdl.so.2

그리고 root 디렉토리에 있는 root.txt 파일을 제출하면 끝!

0개의 댓글