wargame/bandit

Bandit21 ~ Bandit26 문제 풀이

seungwon9201 2024. 7. 3. 15:59

Bandit21 → Bandit22

-문제-
cron이라는 프로그램이 규칙적인 간격으로 자동으로 실행 중이고 시간 기반 직업 스케줄러이다. /etc/cron.d/를 확인해서 어떤 명령어가 실행 중인지 확인하자.

 

풀이방법 : /etc/cron.d을 확인해보자.

 

문제에서 말한 경로로 들어가니 여러 개가 나온다.

bandit22 패스워드가 필요하기 때문에 저걸 실행해 보자.

그랬더니 이렇게 두 개의 줄이 출력된다.

첫 번째는 bandit22라는 사용자가 시스템이 재부팅될 때마다 /usr/bin/cronjob_bandit22.sh를 /dev/null로 보낸다는 뜻이다.

두 번째는 bandit22라는 사용자가 매분 /usr/bin/cronjob_bandit22.sh를 /dev/null로 보낸다는 뜻이다.

 

이 두 개의 줄이 문제에서 말한 시간 기반 직업 스케줄러라는 거 같다.

 

그럼 bandit22가 지속적으로 실행시키는 저 파일의 경로를 찾아가서 실행하면 될 거 같다.

 

이번에도 두 개의 줄이 출력됐다.

/tmp/t7... 에 있는 파일의 권한을 644로 바꾸고 bandit22 패스워드를 그 파일에서 출력되도록 만들었다는 뜻이다.

 

그럼 파일의 권한이 644인지 확인해 보자.

644 권한이 맞다.

그러면 그냥 저 파일을 실행하면 되겠다!

이렇게 패스워드를 찾을 수 있다.


 

Bandit22 → Bandit23

-문제-
cron이라는 프로그램이 규칙적인 간격으로 자동으로 실행 중이고 시간 기반 직업 스케줄러이다. /etc/cron.d/를 확인해서 어떤 명령어가 실행 중인지 확인하자.
풀이방법 : 위의 문제와 동일한 방식으로 풀어보자.

위의 문제와 동일하게 접근해 보자.

이번엔 bandit23을 실행했다.

이런 메시지가 뜨는데 분석해 보자.

현재 사용자의 이름을 myname에 저장하고, mytarget은 괄호 안에 있는 것이다.

/etc/bandit_pass/사용자이름을 실행한 것은 /tmp/mytarget 경로로 복사한다.

 

즉, myname으로 mytarget을 구하고 tmp/mytarget을 cat하면 된다.

 

이제 해보자.

내가 실행한 것은 cronjob_bandit23이니까 사용자 이름인 myname은 bandit23이 된다.  

이렇게 myname으로 mytarget값을 구했다. 

tmp/mytarget 값을 cat으로 실행해 주면 이처럼 패스워드가 나온다.


Bandit23 → Bandit24

-문제-
cron이라는 프로그램이 규칙적인 간격으로 자동으로 실행 중이고 시간 기반 직업 스케줄러이다. /etc/cron.d/를 확인해서 어떤 명령어가 실행 중인지 확인하자. 한번 실행하고 삭제되니까 복사하는 것을 권한다.
풀이방법 : 이것도 위의 문제와 동일하게 풀자.

위에 두 개의 문제에서 했던 방식으로 동일하게 접근해 보자.

(초반과정 생략)

 

이번문제는 어려워서 이해를 돕기 위해 악성코드라고 비유했다. 이해가 어렵다면 괄호 안을 확인하면 된다.

 

이제 문제를 풀어보자.

이번에는 내용이 좀 길어진 거 같다.

한번 분석해 보자.

/var/spool/myname/foo 경로로 이동을 하고, 그 경로에 있는 모든 스크립트들은 실행되고 지워진다.

반복문을 보니 bandit23이 소유자일 경우에 60초 동안 실행하고 그 뒤엔 삭제한다라고 나와있다.

 

분석해 본 결과 60초마다 실행되고 지워지니까 자신의 디렉토리를 만들고 거기에 쉘을 만들어서 실행하는 것이 좋아 보인다.

 

우선 새로운 디렉토리를 만들고 그 안에 쉘 스크립트 하나를 만들자.(이해를 돕기 위해 악성코드라고 비유하겠다.)

vi 에디터로 이렇게 적어주자.

 

이렇게 적은 이유는? 

현재 bandit24의 권한이 없기에 그 안에 있는 패스워드를 새로운 디렉토리를 만들고 그곳으로 복사하기 위해서이다.

(악성코드를 다른 pc에 삽입하여 자신의 패스워드를 다른 경로로 출력하도록 만든 것이다.)

 

저렇게 만든 yyyy.sh파일의 권한은 아래처럼 된다. 

읽고 쓰는 권한만 있지 실행할 수 있는 권한이 없기 때문에 읽기, 쓰기, 실행권한을 주기 위해서 777로 권한을 바꿔주자.

(권한을 바꿔주는 이유는 다른 pc에 이 악성코드가 삽입될 때 실행권한이 없으면 무용지물이기 때문에 다른 PC에서 실행되도록 만들기 위해서 이다.)

yyyy.sh와 yyyy.sh가 있는 디렉토리의 권한을 모두 읽고 쓰고 실행가능하도록 만들어 주었다. 

 

이제 yyyy.sh 쉘을 맨 위에서 주어진 경로로 복사를 해주자.

이제/var/spool/bandit24/foo 경로에 내가 만든 yyyy.sh 쉘이 복사가 되었다.(이 과정은 악성코드를 삽입한 거라고 생각하면 쉽다)

 

이제 무슨 일이 발생할까?

위에 조건에서 나와 있듯이 60초마다 쉘이 실행하고 삭제한다고 했었다.

그럼 /var/spool/bandit24/foo 경로에 있는 yyyy.sh 쉘이 시작을 하는 동시에 쉘은 삭제가 될 것이다.(기존의 쉘은 컴파일을 해야하지만 여기선 자동으로 시작되기 떄문에 따로 컴파일 하지 않았다.)

하지만 쉘 안의 내용은 실행이 될것이다.

쉘 안의 내용이 실행을 하게 되면 아까 적어둔 

yyyy.sh 쉘 내용

이 내용이 실행이 될것이다.

여기서는 cat /etc/bandit_pass/bandit24 명령어가 실행이 가능하다!(여기서 악성코드의 내용이 실행된다)

 

왜? yyyy.sh 쉘은 bandit24로 복사되어서 실행되었기 때문에 실행할 수 있게 된다.

 

즉, bandit24의 패스워드가 /tmp/yyyy/password로 저장이 되어서 나올 것이다.(60초 간격으로 실행되니까 안 나오면 기다리자)

이렇게 password파일이 새로 생겨서 bandit24의 패스워드를 출력할 수 있게 된다.

 

이 문제는 굉장히 어렵게 느껴졌다. 이해하는데도 시간이 걸렸던 문제였고 끝나고 보니 재밌는 문제이다.

지금 다시 생각해 보니 다른 pc에 악성코드를 삽입하고 그 pc에서 악성코드가 실행되어 자신의 정보를 노출하는 것처럼 비슷한 문제라고 생각이 든다!!


 

Bandit24 → Bandit25

-문제-
bandit25로 가기 위한 패스워드는 30002번 포트로 열려있는 데몬서버에 패스워드를 보내면 되는데, 그 패스워드는 bandit24 패스워드와 4개의 빈 번호를 입력하면 된다. 핀번호는 10000개의 조합(0~9999)이다. 
풀이방법 : brute force attack 방법을 사용하자.

 

우선 30002 포트 서버에 접속을 해보자.

이런 메시지가 뜨고 bandit24패스워드와 핀번호를 입력하고 사이에 공간을 두라고 한다.

우선 지금은 해결할 방법이 없으니 빠져나오자.

 

0~9999번까지의 핀번호를 대입하기 위해서 brute force attack방식의 쉘을 만들 것이다.

기존에 만들어둔 디렉토리에 새로운 쉘을 만들어 주자.

bandit24번 패스워드와 함께 0~9999번까지 반복하는 쉘을 만들고 이것을 force라는 파일로 보낼 계획이다.

권한도 777로 바꿔서 실행할 수 있도록 바꿔주자.

 

자, 이제 내가 만든 brute.sh 쉘을 컴파일해줄 것이다.(바로 위의 문제에서 컴파일하지 않은 이유는 그 시스템 자체가 쉘을 자동으로 시작해 줬기 때문에 안 해준 것이지, 일반적으론 이처럼 컴파일해야 한다.)

 

cat force로 확인을 해보면

이렇게 0부터 9999까지 brute force attack 방식으로 출력이 된다.

이제 대입을 해보자

이제 이렇게 대입을 하면

하나하나 대입을 해보다가 결국 패스워드가 나오게 된다!

 


Bandit25 → Bandit26

-문제-
bandit26의 쉘은 /bin/bash가 아니라 다른 것이다. 그것이 무엇이고 어떻게 해결할지 알아내자.
풀이방법 : 열심히 찾아보자..

 

우선 파일 목록을 확인해봤더니 sshkey를 발견했다.

이것으로 ssh 연결을 해보자.

이렇게 접속을 했더니 

연결이 되는 듯하더니 접속이 되지 않는다.

 

문제에서 bandit26의 기본 셸이 /bin/bash가 아니라고 했으므로 어떤 셸이 사용되고 있는지 알아야 한다.

 

/etc/passwd 파일에는 각 사용자가 사용하는 셸과 함께 장치의 사용자에 대한 정보가 나오는데 여기서 확인을 하면 된다.

 

이렇게 passwd내용을 모두 볼 수 있다. 내가 궁금한 건 bandit26이기 때문에 따로 검색을 해주자.

다른 애들은 모두 bin/bash 쉘이지만 bandit26만 showtext라는 것을 확인할 수 있다.

 

이 showtext가 뭔지 확인해 보자.

내용을 살펴보면 쉘은 more 명령어를 사용하고 text.txt 파일의 내용을 출력한 다음 종료하는 쉘 스크립트이다.

우리가 bandit26에 접속이 안된 이유는 text.txt 파일의 모든 텍스트가 표시되자마자 실행되는 exit 0 때문이라는 것을 알 수 있다.

그래서 test.txt 파일의 모든 텍스트가 표시되지 않는 방법을 찾아야 한다.

 

more 명령어는 콘텐츠 양이 터미널 크기보다 많을 경우 more가 모든 콘텐츠를 볼 때까지 또는 프로그램을 수동으로 종료하지 않는 한 명령이 종료되지 않는다는 특징이 있다.

 

그래서 우리는 터미널(putty)의 창을 작게 만들어서 종료되지 않게 만들 것이다.

자 이렇게 창을 작게 만들고 다시 bandit26에 로그인해보자.

 

그랬더니 이렇게 more창이 뜬다. 우린 여기서 v 키를 눌러서 vi 에디터 모드로 들어갈 수 있다.

 

이제 vi 에디터에서 해야 할 일은 뭘까?

기존에 /bin/bash는 정상적으로 실행 됐었지만 /bin/showtext는 비정상적으로 종료가 됐었다.

우린 이 쉘을 다시 /bin/bash로 바꿔야 한다.

이렇게 shell을 /bin/bash로 바꿔주자.

그리고 shell을 입력하면 bandit26에 접속할 수 있다.


 

 

 

 

 

'wargame > bandit' 카테고리의 다른 글

Bandit31 ~ Bandit34 문제 풀이  (0) 2024.07.03
Bandit26 ~ Bandit31 문제 풀이  (0) 2024.07.03
Bandit16 ~ Bandit21 문제 풀이  (0) 2024.06.28
Bandit11 ~ Bandit16 문제 풀이  (0) 2024.06.26
Bandit6 ~ Bandit11 문제 풀이  (0) 2024.06.24