해킹/웹해킹

8주차 과제_bandit 워게임(2)

코코딩딩 2021. 2. 1. 21:22

# Level 15 -> Level 16

 문제를 보니까 SSL encryption을 사용해서 port 30001에서 현재의 비밀번호를 제출해야 찾고자 하는 비밀번호를 얻을 수 있을 거 같다. 우선 SSL에 대해서 알아보았다. SSL은 웹브라우저와 서버간 암호화 통신을 위한 프로토콜이다. openssl이란 웹브라우저와 서버 간의 통신을 암호화하는 오픈소스 라이브러리이며, s_client는 openssl 명령으로 운영중인 웹서버의 SSL 인증서 정보를 볼 수 있으며 여러 옵션들이 있다. 그 중에 문제에서 주어진 포트에 접속해야 하므로, -connect <host>:<port>를 사용하여 문제를 해결할 수 있었다. 즉 openssl s_client -connect localhost:30001를 입력하고 현재 비밀번호를 입력해줌으로써 password를 알아냈다.

문제 푼 과정

# Level 16 -> 17

 문제를 보면 31000과 32000 사이에 있는 포트에 현재 비밀번호를 제출해서 비밀번호를 할아내는 것 같다. 우선 포트를 찾아내야 했다. nmap은 호스트나 네트워크를 스캐닝할 때, 유용한 시스템 보안툴이다. 문제를 풀기 위해 문제에서 주어진 범위를 스캔해야 했기 때문에, 대상 호스트의 특정 포트를 스캔하거나, 스캔할 포트의 범위를 지정하는 옵션인 -p <범위 시작>-<범위 끝>을 사용해야 했다. 즉 nmap -p 31000-32000 localhost를 입력하여 5개의 포트로 간추려질 수 있었다. 위의 단계에서 한 듯이 다섯 개의 포트에 접속했는데, 적절한 포트는 31790였다. 근데 private key로 주어졌다. private key 문제는 Level 13 -> Level 14에서 다루었기 때문에, 쉽게 할 줄 알았지만 잘 안 됐다.. 파일을 만들어줘야 했기 때문이다. 우선, mkdir /tmp/myname123을 통해 만들 파일이 있는지 알아보기 위해 혹은 생성하기 위해 입력해주었고, 그 파일 안에 cat > /tmp/myname123/bandit17.key 를 해주고 해당 private key를 복사 붙여넣기 해서 파일을 만들었다. 그래서 ssh -i / tmp/myname123/bandit17.key bandit17@localhost를 하여서 문제를 풀 수 있었다. 근데 중간에 캡쳐를 빼먹었는데, 처음에 ssh -i /tmp/myname123/bandit17.key bandit17@localhost를 입력해주었을 때 안 되었다. 구글링 해서 알아봤는데, 키값을 가진 파일의 퍼미션 문제 때문에 안 됐다고 했다. 이를 위해서 chmod 600 /tmp/myname123/bandit17.key를 입력해줘서 문제를 해결할 수 있었다. chmod는 change mode의 축약어로, 대상 파일과 디렉토리의 사용권한을 변경할 때 사용한다. 사용하는 방법은 chmod <변경될 퍼미션값> <변경할 파일>으로 사용해야 하는데, 내가 입력한 chmod 600 /tmp/myname123/bandit17.key의 의미는 소유자에만 읽기쓰기 권한을 주는 것으로 변경하는 것이다. 이를 통해 문제를 해결할 수 있었다!

문제 푼 과정

# Level 17 -> Level 18

 문제를 보면 passwords.new와 passwords.old 사이의 차이에 해당되는 비밀번호를 찾으라는 것 같다. diff는 differences의 약자로 두 파일 사이의 내용을 비교하는 명령어이다. 여러가지 옵션이 있었지만, 두 파일간의 차이점을 상세하게 출력하는 -d를 사용하였다. 즉 diff -d passwords.old passwords.new를 입력하여서 차이를 알아냈고, 알아낸 비밀번호를 입력했더니 Byebye! 했다..

문제 푼 과정

# Level 18 -> Level 19

 문제를 보니까 readme 파일에 저장된 비밀번호를 찾아내라는 거 같다. 근데 어떤 것 때문에 로그인을 못하게 된 거 같다. 문제를 풀기 위해 권장되는 것을 보니 ssh, ls, cat 이렇게 있었다. 그래서 ssh를 통해 어떻게 해볼 수 있을 거 같아서 알아보았다. ssh 옵션 중에 -t는 pseude 터미널 할당을 강제하고, 원격 시스템에서 임의의 화면 기반 프로그램을 실행하는 데에 사용된다. 어떠한 것 때문에 로그인을 못하지만 이를 통해서 강제적으로 로그인 할 수 있을 거라 생각돼서 적절한 옵션이라고 생각했지만, 활용하는 방법을 모르겠어서 검색을 더 해봤다. -t 옵션으로 강제적으로 /bin/sh로 쉘을 사용하라고 해서, ssh bandit18@localhost -t /bin/sh을 입력해주고 비밀번호를 입력해주니 강제적으로 됐다. /bin/sh에 대해서 알아봤는데, 간단하게 말해서 쉘의 절대 경로라고 생각하면 된다고 한다. 이어서 ls로 파일을 확인하고, cat readme를 통해 비밀번호를 알아내서 문제를 풀었다.

문제 푼 과정

# Level 19 -> Level 20

 문제를 보면 setuid binary를 사용해서 주어진 곳에서 비밀번호를 찾으라는 것 같다. 그래서 setuid binary에 대해서 알아보았다. setuid는 파일을 실행할 때 Set(적용해라) UID(파일의 소유자로)이라고 한다. 즉, setuid가 적용된 파일을 실행하면, 실행 파일이 끝날 때까지 파일의 소유자의 UID가 되는 것이라 한다. setuid에 대해서 알아봤지만 잘 모르겠어서 우선 파일이 뭐가 있는지, /etc/bandit_pass는 어떤 정보의 폴더인지 알아봤다. 그 폴더에는 여러 파일이 있었는데 봤을 때, bandit20을 보면 될 거 같지만 Permission denied라고 떴다. setuid를 사용하라는 것이 이 곳에 사용되는 거 같다. 그래서 더 알아봤다. find -perm -4000을 통해 권한이 setuid인 것을 찾을 수 있다고 한다. 자세히 알아보면 find는 뭔가를 찾을 때의 명령어이고, -perm은 권한의 옵션, -4000은 setuid를 의미한다. 추가로 특수권한 숫자를 더 알아보면, 2000은 setgid이고 1000은 stickybit이라고 한다. 다시 돌아와서, find -perm -4000을 입력하니 ./bandit20-do가 떴다. 근데 이걸로 뭘 어떻게 하는지 모르겠어서 더 알아보니, ./bandit20-do를 입력하면 됐었다. 이러한 입력은 사용자로 bandit20-do 프로그램 실행을 의미한다고 한다. 그래서 ./bandit20-do를 입력했더니 잘 되는 거 같다. 그리고 예시로 ./bandit20-do id가 있어서 해보고 그냥 id도 쳐보니, 권한이 다르게 주어짐을 알 수 있었다. 그래서 이전에 보지 못한 bandit20을 보기 위해, ./bandit20-do cat /etc/bandit_pass/bandit20을 입력해주니 비밀번호를 알아낼 수 있었다.

문제 푼 과정

# Level 20 -> Level 21

 문제를 보면 포트에 연결시키고 비밀번호를 입력시켜서 다음 레벨의 비밀번호를 준다는 소리인 거 같다. 우선 setuid 단어가 있어서 윗 단계에서 한 듯이 해볼까 싶어서 find -perm -4000을 입력하니 ./suconnect가 출력됐다. 그래서 그냥 ./suconnect를 입력해보니 ./suconnect <portnumber> 이렇게 사용하라는 것 같다. 그래서 ./suconnect 3333을 입력해봤는데 could not connect라고 나왔다. 문제에서 connection이 나왔는데, 이걸 풀기 위해서는 연결하는 시키는 게 필요한 듯해 보였다. 그래서 검색을 해봤다. nc는 넷캣(Netcat)으로, TCP나 UDP 프로토콜을 사용하는 네트워크 연결에서 데이터를 읽고 쓰는 간단한 유틸리티 프로그램이라고 한다. 사용법으로는 nc <옵션> <포트>이다. 문제를 풀기 위해 포트를 열어주고 지정해야 하니까, listen 모드로 port 오픈하는 -l와 local port 지정하는 -p 옵션을 사용했다. 즉, nc -l -p 3333을 입력해주고 다시 ./suconnect 3333을 입력하니 연결이 잘 됐다. 그래서 아래 사진에서의 오른쪽 터미널에 비밀번호를 입력해주니 찾아야 하는 비밀번호가 출력됐다.

문제 푼 과정(각각 다른 터미널)

# Level 21 -> Level 22

 문제를 보면 자동으로 실행되는 작업이 있는데, 실행중인 것을 확인하면 문제를 풀 수 있는 거 같다. 그래서 우선 문제 아래에 주어진 것들을 살펴봤다. cron은 유닉스 계열 컴퓨터 운영 체제의 시간 기반 잡 스케줄러이고 crontab은 주기적으로 어떤 일을 해야 할 경우에 사용되는 명령어이다. 문제를 풀기 위해서, 예약된 작업리스트를 볼 수 있는 -l 옵션을 사용했다. 즉, crontab -l을 입력해주어서 확인해봤다. 근데 permission denied가 나왔다. 그래서 문제에서 확인해보라는 파일로 이동해서 똑같이 입력해주었지만 똑같이 거부당했다. 그래서 그냥 파일을 봐봤다. cronjob_bandit22을 확인하면 될 거 같아서 cat cronjob_bandit22을 입력해봤는데, /usr/bin/cronjob_bandit22.sh가 실행된다고 한다. 추가로 *을 통해 주기를 알 수 있는데, *****는 매분 실행되는 것을 의미한다. 이어서 cat으로 확인해봤는데, /tmp/t7061ds9S0RqGh9aMcz6ShpAoZKF7fgv에 비밀번호가 저장됐다는 거 같아서 cat /tmp/t7061ds9S0RqGh9aMcz6ShpAoZKF7fgv을 입력하니 비밀번호를 알아낼 수 있었다.

문제 푼 과정

# Level 22 -> Level 23

 문제를 보면 윗 단계처럼 자동으로 실행되는 프로그램을 찾아서 비밀번호를 찾으라는 것 같다. 그래서 우선 앞에서 한 것처럼 /usr/bin/cronjob_bandit23.sh이 실행됨을 알 수 있었다. 그래서 cat /usr/bin/cronjob_bandit23.sh을 입력해주었더니 스크립트 내용이 나왔다. cronjob_bandit23.sh에 해당되게끔 myname은 bandit23으로 해서, echo I am user bandit23 | md5sum | cut -d ' ' -f 1을 입력해줬다. 이를 통해 mytarget은 8ca319486bfbbc3663ea0fbe81326349임을 알 수 있었고, cat /tmp/8ca319486bfbbc3663ea0fbe81326349을 입력해서 비밀번호를 알아낼 수 있었다.

문제 푼 과정

# Level 23 -> Level 24

 문제를 보면 자동으로 실행되는 프로그램을 찾고, 적절한 스크립트를 복사해서 생성해서 비밀번호를 얻으라는 거 같다. 그래서 우선 앞에서 한 듯이 자동으로 실행되는 프로그램을 찾았다. 해당 프로그램을 읽어보니 스크립트 내용이 나왔다. 솔직히 무슨 소린지 모르겠어서, 검색해보니 /var/spool/$myname/ 에 있는 스크립트들을 실행한 후 삭제하는 스크립트이었다. /etc/bandit_pass/bandit24 파일의 내용을 저장하는 스크립트를 작성해서 /var/spool/bandit24/ 에 저장하면 해당 스크립트가 cron에 의해 실행되어 패스워드를 얻게 된다. 이를 위해 mkdir /tmp/myname123을 입력하고, cat > /tmp/myname123/script.sh을 입력해서 적절한 스크립트 코드를 입력해주었다. 그리고 파일의 권환을 변경하기 위해 chmod 777 script.sh를 입력해주었다. chmod는 change mode로, 파일이나 디렉토리에 대한 접근 허용 범위를 변경한다. 사용한 방법은 8진수 mode를 사용한 것인데, 8진수 mode를 사용한 경우 3개의 숫자로 구성되며, 각각 소유자와 그룹, 기타 사용자의 접근 권한을 나타낸다고 한다. 작성한 777은 폴더 권한을 모든 사용자가 쓰기, 읽기, 실행하도록 바꿀 수 있도록 한 것이다. 그리고 이어서 script.sh을 복사해주기 위해 cp script.sh /var/spool/bandit24를 입력해줬다. 이어서 script.sh를 읽고, 다시 bandit24.key를 읽으니 비밀번호가 나왔다. 이 단계는 솔직히 풀기가 너무 어려워서 구글링을 열심히 했지만 부족하게 이해한 거 같다. 이 단계와 관련해서 더 공부해야겠다.

문제 푼 과정

# Level 24 -> Level 25

 문제를 보니 30002 포트에 접속을 시켜서 패스워드와 4자리를 입력시켜서, 비밀번호를 알아내는 것이었다. 우선 nc localhost 30002를 입력해서 localhost에 30002 포트로 접속했다. 그리고 임시로  몇 개 입력해주었다. 지금 글을 쓰면서 느낀 건데 10000개 조합이라고 해서 0부터 9999까지로 생각했는데, 네 가지의 숫자니까 516을 입력하는 것보다 0516을 입력하는 것이 더 정확한 입력이었을 거라 생각한다. 아무튼 두가지 경우를 입력했는데 모두 틀렸다. 그래서 이렇게 일일이 입력해서 할 수는 없으니까 다른 방법을 찾아보았다. 자동화 스크립트를 만드는 것이다. 윗 단계에서 문제에 제시된 스크립트를 참고해서 스크립트를 작성했다. 작성한 스크립트는 result라는 파일에 원하는 값을 저장하게 한 것이다. bash /tmp/myname123/script.sh를 입력해주어서 스크립트를 실행시키고, nc localhost 30002 < /tmp/myname123/result를 입력해주었다. 입력해준 것을 통해 result 파일을 전송해서 실행될 수 있다. 이를 통해서 비밀번호를 알아냈다.

문제 푼 과정

# Level 25 -> Level 26

 문제를 보면 bandit26은 /bin/bash가 아니라 다른 것이고, 그 것을 알아내서 비밀번호를 찾으라는 것 같다. 잘 모르겠어서 우선 ls로 확인하니 bandit26.sshkey 파일이 있었다. 그래서 cat으로 확인해보니 private key였다. 그래서 ssh -i bandit26.sshkey bandit26@localhost를 입력해주니 로그인이 된 듯 했지만 바로 나가졌다......

 그래서 쉘에 관해서 더 알아보기로 했다. grep <사용자 이름> /etc/passwd 를 입력하면 사용하는 쉘의 종류를 알 수 있다고 했다. 그래서 현재 사용하는 쉘과 bandit26이 사용하는 쉘의 종류를 알 수 있었다. 그리고 chsh -s <바꾸고 싶은 쉘 입력> <사용자 이름> 을 입력하면 사용하고 있는 쉘을 바꿀 수 있다고 한다. 그래서 입력했지만 Authentication failure가 떴다...

 

문제 푼 과정

 

 

 

 

출처 : 문제 사이트 overthewire.org/wargames/bandit/bandit16.html