본문 바로가기
Hacking/Hacking Beginner Class (normaltic)

[해킹 비기너 클래스] Drill Course 1주차 Practice

by st-og 2023. 9. 19.

정보수집

먼저 머신의 ip를 알아내기 위해 호스트 스캔을 해주었다

호스트 스캔을 하기 위해서는 nmap의 -sn 옵션을 사용하면 된다

nmap -sn [네트워크 대역]

 

해당 명령어를 입력하면 네트워크 대역의 살아있는 host들이 스캔이 된다

여기서 실습 머신의 ip를 찾아내야 하므로 하나씩 다 포트 스캔을 해주었다

 

192.168.206.130이 실습 머신임을 확인할 수 있다.

해당 머신에는 80번과 31337번에서 http서비스가 열려있기에 웹서버에 접속을 해보았다

 

두 페이지 모두 마땅한 정보를 찾을 수는 없었다

디렉터리 스캔을 해보자

gobuster툴을 사용하여 디렉터리 스캔을 진행했다

gobuster [모드 선택] -w [단어 리스트] -u [URL 주소] -t [스레드 갯수]

 

 

 

디렉터리 스캔 결과를 봤을 때 80번 포트의 웹에서는 아무 디렉터리가 없는 것을 확인할 수 있고

31337번 포트에서는 /taxes 디렉터리가 있는 것을 확인할 수 있다

해당 디렉터리에 접근을 해보자

 

flag를 확인할 수 있는데 이번 실습과는 무관하니 넘어가자

디렉터리 스캔에서 쓸모 있는 정보를 찾지 못했기에 다른 wordlist를 사용해서 계속해서 디렉터리 스캔을 진행했다

 

여러 wordlist를 사용하던 도중 /usr/share/wordlists/dirb/big.txt 에서 의미 있는 디렉터리를 스캔할 수 있었다

여기서 중요하게 봐야할 디렉터리는 .ssh디렉터리이다

해당 디레터리에 ssh 공개키와 비밀키가 있을 확률이 높기에 해당 키를 얻을 수 있다면 ssh로 접속이 가능할 것이다

 

Exploit

브라우저에서 .ssh의 경로로 들어가 보자

 

rsa 공개키와 비밀키가 있음을 확인할 수 있다.

개인키 확인을 위해 해당 경로로 들어가 보자

 

개인키를 다운로드할 수 있게 되었다

위와 동일하게 공개키와 개인키를 둘 다 다운로드한 후 확인해 보자

 

공개키를 확인해 보니 simon이라는 유저의 ssh키임을 확인할 수 있다

simon의 계정으로 개인키를 사용해 ssh 접속을 할 수 있을 것 같다

 

해당 캐인키를 사용하기 위해 권한을 600으로 바꾸어 주자

 

개인키를 사용하여 ssh 접속을 하기 위해 -i 옵션을 사용하여 ssh 접속을 해보자

 

ssh 접속을 시도하면 개인키의 비밀번호를 묻는데 이때 john을 사용하여 비밀번호를 크랙 할 수 있다.

john을 사용하기 전 ssh키를 john의 형태로 바꿔줘야 하는데 ssh2john 을 사용하여 바꿀 수 있다

 

준비가 끝나면 john을 사용하여 크랙을 해보자

 

개인키의 비밀번호가 starwars 임을 알 수 있다

이제 ssh로 접속을 다시 해보자

 

simon으로 성공적으로 접속을 하였다

 

Post-Exploit

먼저 홈디렉터리를 확인해 보자

중요한 파일은 보이지 않는다

 

/etc/passwd를 확인해 보자

이동할 다른 유저나 중요하게 봐야 할 것은 보이지 않는다

 

이번엔 setuid가 설정된 파일들을 확인해 보자

 

/usr/local/bin/read_message라는 처음 보는 프로그램을 확인할 수 있다

해당 경로로 들어가 확인해 보자

 

해당 프로그램을 실행시키면 이름을 묻게 되며 simon을 입력하니 Simon이 아니라며 프로그램이 종료가 된다

이번엔 Simon으로 입력을 해보자

 

 

그러니 이러한 문구가 출력이 되는데 root가 자신의 홈 디렉터리에 소스코드를 보내놨다고 알려준다

해당 코드를 보기 위해 root의 홈 디렉터리로 가보자

 

확인을 해보니 read_message.c를 발견할 수 있다

해당 파일은 c언어 파일임을 확장자를 통해 알 수 있다

해당 파일을 열어서 확인해 보자

 

 

해당 파일을 해석해 보자면

program[] : 실행시킬 프로그램의 경로를 저장한 변수

buf[20] : 사용자의 입력을 저장할 20자리 변수

authorized[] : Simon 문자를 저장해 둔 변수

 

사용자의 입력을 받고 해당 문자열의 앞 5자리를 Simon과 비교 후 맞을 경우 program에 저장되어 있는 경로의 프로그램을 실행시키고 틀렸을 경우 틀렸다는 문자열을 출력하며 끝내는 프로그램이다

 

여기서 중요하게 봐야 할 포인트는

1. 해당 프로그램은 root의 권한으로 실행된다

2. 사용자의 입력을 받는 buf 변수는 최대 20자리이다

3. 문자열 앞의 5자리만 비교를 한다

 

만약 buf 변수에 20자리를 넘는 값이 들어가게 된다면 메모리를 초과하게 될 것이고

execve 함수를 실행하기 위해 다음 메모리를 참조했을 때 초과된 메모리를 읽게 되어

초과된 메모리의 값으로 실행을 하게 될 것이다

 

그럼 우리는 초과된 메모리의 값에 실행될 명령어를 입력하게 되면 해당 명령어가 실행될 것이다

현재 프로그램은 root의 권한으로 실행되기 때문에 /bin/sh을 실행하게 되면 root의 쉘을 획득할 수 있을 것이다

 

 

 

root 쉘을 획득하는 데 성공했다