본문 바로가기
Security/DreamHack

[DreamHack] Path Finder #702

by 고간디 2024. 3. 30.

처음으로 써보는 워게임 풀이이다.

시작한지 얼마 안 됐는데 시스템 해킹 너무 어렵다ㅜㅜ

이것저것 찾아보면서 하고 있긴 한데 이번 문제는 자료 찾아가면서 혼자서 풀어내서 그냥 기록용이나 공부용으로 풀이를 남겨보기로 했다.

물론 질문글들의 도움을 받긴 했다..

아직 힌트 없이 혼자 뚫어내기에는 지식도 없고 쉽지 않다.

 


int __fastcall main(int argc, const char **argv, const char **envp)
{
  setresgid(0x3E9u, 0x3E9u, 0x3E9u);
  system("clear");
  puts("Tada~!");
  return 0;
}

문제에서 준 chal 파일을 IDA에 돌려봤다.

setresgid() 함수에 관한 정보를 좀 찾아봤는데 생각한 만큼 그리 많이 나오지는 않는다.

unistd.h 헤더파일에 포함돼있는 함수인데 세 인자 순서대로 RUID, EUID, SUID 또는 그룹 아이디를 변경하는 함수이다.

 

저 0x3E9u가 무엇을 나타내는지는 잘 모르겠다.

아마 UID를 변경해서 루트 권한을 얻어내서 flag 파일을 읽어내야 하는 것 같긴 하다.

 


사실 드림핵 ssh 연결도 처음 해봐서 좀 애를 먹었다

맨날 nc 로만 들어갔는데..

아무튼 ls로 어떤 파일들이 있나 보니까 아까 IDA에 돌렸던 chal 파일과 flag 파일이 있다.

당연히 cat flag는 안 된다.

chal을 실행해서 id가 바뀌어서 권한이 생기면 cat flag로 플래그를 읽어야 하는 것 같은데..

 


whoami로 확인하면 나는 pwn 인데 pwned 권한을 얻어야 flag 를 읽을 수 있다..

 

처음에는 0x3E9u 주소에 적힌 메모리 값을 바꿔서 권한을 얻어내야 하는 건 줄 알았다.

그래서 포인터 쓰면서 열심히 C 코드를 짰더니 gcc를 사용할 수 없었다ㅠㅠ

 


결국 질문글들을 읽어보며 힌트를 좀 얻었다.

환경 변수를 이용한 취약점을 이용해서 권한을 얻어내야 한다.

$ export

export 명령어를 통해 환경 변수 리스트를 쭉 뽑을 수 있다.

말 그대로 환경 변수이기에 별다른 권한 없이도 변수를 추가하거나 수정할 수 있었다.

 


int __fastcall main(int argc, const char **argv, const char **envp)
{
  setresgid(0x3E9u, 0x3E9u, 0x3E9u);
  system("clear");
  puts("Tada~!");
  return 0;
}

일단 권한을 획득하고 플래그를 읽으려면 setresgid를 통해서 권한을 얻어야 한다.

프로그램이 종료되면 권한이 다시 사라지는 것 같다. (아마도..??)

 

setresgid 함수가 있어야 권한을 얻을 수 있기에 건들지 않는 게 좋을 것 같다.

딱히 건드려도 상관 없을 것 같은 system 함수를 건드려보자

 

system 함수가 clear 명령을 내리면 터미널에 적힌 글자들을 전부 지운다.

이때 환경 변수 PATH에 적혀 있는 경로를 탐색해서 그 안에 clear 명령어가 있으면 그 명령어를 호출하게 되는데 그 경로를 변경하면 의도하지 않은 동작을 수행하도록 할 수 있다.

 


$ export PATH="./"

이런 식으로 환경 변수를 조작할 수 있다.

 


$ /bin/cp /bin/sh ./clear
$ export PATH="./"

clear 명령어를 호출할 때 쉘 코드가 실행되도록 하고 환경변수 PATH 경로를 바꿔준다.

 


그 후 chal 파일을 실행해주면 system("clear"); 함수에서 clear 명령어를 호출하게 된다.

그러면 아까 설정한 환경 변수 PATH의 경로에서 clear를 탐색하다가 clear를 발견해 호출하면 쉘 코드가 실행된다.

 

후에 다시 환경 변수 PATH를 원래대로 돌려놓는다.

id 명령어를 사용했을 때 gid가 1001 (pwned)로 바뀌어서 flag를 읽을 수 있는 권한이 생긴 것을 확인할 수 있다.

cat flag로 플래그를 성공적으로 출력해낼 수 있다.

 


이렇게 시스템 해킹 문제 풀이를 해봤는데 생각보다 재밌다.

공부하면서 예제 문제 풀어보면 머리 아파서 어렵기만 했는데 막상 이렇게 풀고 보니 좀 재밌는 것 같다.

아무튼 워게임 풀이는 귀찮기도 하고 어려워서 안 썼는데 이제 천천히 쓰면서 복습도 하면서 공부해야겠다.

728x90
반응형

댓글