본문 바로가기

Bandit 원정대

Bandit 원정대 4주차

반응형

Bandit Level 21 → Level 22

Level Goal

A program is running automatically at regular intervals from cron, the time-based job scheduler. Look in /etc/cron.d/ for the configuration and see what command is being executed.

 

 

step1. /etc/cron.d/ 로 directory를 옮기고 directory 안에 파일들을 확인한다.

cronjob_bandit22 파일을 열어서 파일내용을 확인한다.

 

 

step2. cronjob_bandit22 파일 안에 다음과 같은 내용이 적혀있다.

1. /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv 파일의 권한을 644로 바꾼다.

2. /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv 파일에 bandit22의 passwd가 들어있다.

 

/tmp directory에 t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv 파일을 만들고 

chmod 644 명령으로 permission을 변경시켰다.

 

 

 

step3. cat 명령으로 해당 파일을 열어본다.

 

next level password: Yk7owGAcWjwMVRwrTesJEwB7WVOiILLI

 

 

 

Bandit Level 22 → Level 23

Level Goal

A program is running automatically at regular intervals from cron, the time-based job scheduler. Look in /etc/cron.d/ for the configuration and see what command is being executed.

 

NOTE: Looking at shell scripts written by other people is a very useful skill. The script for this level is intentionally made easy to read. If you are having problems understanding what it does, try executing it to see the debug information it prints.

 

 

 

step1. level 21에서와 동일하게 cronjob_bandit22 파일을 열어서 해당 파일에서 지시하는대로 

/usr/bin/cronjob_bandit23.sh 파일을 열어서 shell 파일을 확인한다.

 

 

step 2. $(whoami)는 지금 사용자가 누군지 알려주는 환경변수로 이 값을 bandit23으로 한다.

why? 우리가 알아내려는 pw의 계정은 bandit23이기 때문이다.

 

mytarget의 값은 다음과 같다.

 

$ ( echo I am user bandit23 | md5sum | cut -d ' ' -f 1)

 

1. echo I am user bandit23 | md5sum

bandit22@bandit:/etc/cron.d$ echo I am user bandit23 | md5sum
8ca319486bfbbc3663ea0fbe81326349  -  다음과 같은 값이 나온다.

 

 

2. cut -d ' ' -f 1 : 

cut은 주어진 문자열을 option에 따라 잘라내는 명령어이다.

-f 1 : 잘라낼 필드를 지정하는 option으로 첫번째 필드를 잘라낸다

-d ' ' : 필드를 구분하는 option으로 공백을 필드 구분하는 문자로 지정한다.

따라서 위의 결과를 종합하면 8ca319486bfbbc3663ea0fbe81326349 이라는 값이 나온다.

mytarget=8ca319486bfbbc3663ea0fbe81326349

 

 

step3. cat /tmp/8ca319486bfbbc3663ea0fbe81326349 명령으로 해당 파일의 내용을 확인한다.

 

next level password: jc1udXuA1tiHqjIsL8yaapX5XIAI6i0n

 

 

Bandit Level 23 → Level 24

Level Goal

A program is running automatically at regular intervals from cron, the time-based job scheduler. Look in /etc/cron.d/ for the configuration and see what command is being executed.

NOTE: This level requires you to create your own first shell-script. This is a very big step and you should be proud of yourself when you beat this level!

NOTE 2: Keep in mind that your shell script is removed once executed, so you may want to keep a copy around…

 

 

step1. level 22, 23과 동일하게 cron.d 에서 cronjob_bandit24 파일에 저장된 파일을 찾아 

해당 파일을 열어서 shell code를 확인한다.

cd /var/spool/$myname

이 실행은 /var/spool/$myname 에서 실행되는 것으로 파악된다.

그리고 /var/spool/$myname 파일은 실행과 동시에 모든 스크립들은 없어진다고 나온다.

 

for i in * .*;
do
    if [ "$i" != "." -a "$i" != ".." ];
    then
        echo "Handling $i"
        owner="$(stat --format "%U" ./$i)"

 

        if [ "${owner}" = "bandit23" ]; then
            timeout -s 9 60 ./$i
        fi
        rm -f ./$i
    fi
done

 

*: 어떤 문자, 숫자가 올 수 있다.

*.* :  문자 . 을 중심으로 좌우에 어떤 문자든 올 수 있다.

1. for i in *.* =>  . 을 중심으로 좌우에 어떤 문자든 올 수 있는 범위 중에  매개변수를 i로 설정

 

2. if [ "$i" != "." -a "$i" != ".." ]; => 매개변수 i 가 "." 이 아니고 , ".." 아닌 경우에 참인 조건문

-a: and 연산 

조건문이 참이면 아래의 code 실행

echo "Handling $i"
owner="$(stat --format "%U" ./$i)"

 

 

3. if [ "${owner}" = "bandit23" ]; then   => owner의 값이 bandit23일경우
            timeout -s 9 60 ./$i              => timeout -s 로 sigkill을 실행 시간제한은 60초
   fi                
        rm -f ./$i                                => 위의 조건문이 끝나면 해당 파일은 remove
 fi

done

 

 

step2. tmp directory에 다음과 같은 directory를 생성하고 passwd.sh 라는 file을 생성한다.

위에서 보았듯이 /var/spool/bandit24 directory 내의 file은 실행하면 바로 없어지기 때문에 

/tmp directory에 복사본을 하나 만들기 위해 다음과 같은 작업을 수행한다.

그리고 chmod 777 jnu 명령으로 jnu directory permission을 변경시켜놓는다.

 

 

step3. vi 로 passwd24에 다음과 같은 shellcode를 작성한다.

/etc/bandit_pass/bandit24 파일에는 bandit24로 넘어가는 password가 있는데 이 파일을

/tmp/jnu/passwd24 라는 파일, 즉 지금 내가 작성하고 있는 이 파일로 넘기도록 하는 명령이다.

 

 

step4. 작성후 passwd.sh 파일 또한 permission을 777로 변경한다.

그리고 cp passwd.sh /var/spool/bandit24 명령으로 복사를 실행한다.

cp file1 dir1/

(앞에 파일이 오고 뒤에 디렉토리가 오는 경우)

목적지로 디렉토리를 사용하게 되면 파일을 디렉토리 안에 복사한다.

passwd24는 file

/var/spolol/bandit24는 directory이다.

그리고 나서 passwd24 파일을 확인하면 다음단계로 넘어가는 password가 담겨져있다.

 

next level password: UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ

 

 

 

Bandit Level 24 → Level 25

Level Goal

A daemon is listening on port 30002 and will give you the password for bandit25 if given the password for bandit24 and a secret numeric 4-digit pincode. There is no way to retrieve the pincode except by going through all of the 10000 combinations, called brute-forcing.

 

 

step1. nmap 명령으로 30002 port가 열려있는지 확인을 한다.

 

 

step2. nc 명령으로 localhost에 30002 port로 접속하고 bandit24에서 사용한 password와 

무작위로 bincode 네자리를 마음대로 넣어서 실행시켜 본다.

 

이 과정을 10000번을 해야만 한다는 것을 알게되었다.

그렇다면 이를 실행시킬 수 있도록 프로그래밍을 짜서 10000번을 brute-force 할 수 있도록 해야한다.

 

 

 

step3. mkdir /tmp/jnu25 directory를 만들고 파일을 하나 생성한다.

파일 이름은 passwd25.sh 로 지정했다.

 

 

step4. passwd25.sh 파일에 다음과 같은 shell code를 작성한다.

네자리의 pincode를 넣기 위해서 0000~9999 까지 총 10000번을 반복하기 위해 

i를 매개변수로 하는 for문을 작성하고

bandit level 24 password와 매개변수 i 를 반환한 것을 bandit25pw 파일에 추가하라는 명령을 내린다.

 

 

 

step5. chmod 명령으로 jnu25 directory와 passwd25.sh file의 permission을 777로 변환한다.

(보안 상의 문제가 있을 수 있으나 실습 차원으로 모든 user들에게 권한을 주는 형식으로 실행한다.)

 

 

step6. ./passwd25.sh 을 실행하고 bandit25pw 파일을 cat 명령으로 열어본다.

 

 

step7. cat bandit25pw | nc localhost 30002 >> masterkey25 명령으로 

bandit25pw에 있는 내용을 nc localhost 30002 와 pipe로 연결을 시키고, 그 결과를

masterkey25 라는 file에 copy를 하도록한다.

위의 명령어가 실행되면 cat masterkey25 명령으로 해당 파일의 내용을 확인하도록 한다.

 

 

next level password: uNG9O58gUE7snukf3bvZ0rxhtnjzSGzG

 

 

 

 

 

Bandit Level 25 → Level 26

Level Goal

Logging in to bandit26 from bandit25 should be fairly easy… The shell for user bandit26 is not /bin/bash, but something else. Find out what it is, how it works and how to break out of it.

 

 

step1. bandit26의 shell이 /bin/bash 가 아니라고 한다. /etc/passwd에서 bandit26의 shell을 확인한다.

bandit26 shell: /usr/bin/showtext

 

 

step2. /usr/bin/showtext 파일을 확인해보도록 한다.

more 가 실행된다는 code가 적혀있다.

이것말고는 큰 단서를 얻을 수 있는 것이 없어 보인다.

 

 

 

step3. text.txt 파일을 찾아보도록 한다.

위에 나온 정보를 가지고 어떻게 풀어야하는지 감이 잡히지 않았다.

ls -l로 파일들을 확인해 본 결과 bandit26.sshkey 파일이 있었다.

bandit 26으로 접속하기 위한 private key이다.

 

 

 

step4. ssh 명령으로 bandit26으로 접속을 시도한다.

접속을 시도했지만 connection to localhost closed 출력과 동시에 bandit25로 돌아와버린다.

여기서부터 아무리 생각해도 방법이 떠오르지 않아 구글의 힘을 빌려 문제를 해결했다.

 

 

step5. ssh -i 명령으로 다시 ssh 접속을 시도한다.

이 때 putty창을 최대한 작게 만들어서 접속을 시도한다.

그러면 다음과 같이 왼쪽 하단에 more 라고 적힌 부분이 나타날 것이다.

 

 

step6. v 를 입력하여 vi 명령 창으로 접속하고

:e /etc/bandit_pass/bandit26 명령을 입력한다.

e option은 editor상에서 bandit26 암호파일을 열 수 있게 해준다.

현재 bandit26의 권한으로 진입해 있기 때문에 bandit26 암호파일에 접근할 수 있다.

명령어를 실행하면 하단과 같이 bandit26의 암호가 나오게 된다.

 

 

step7. 이제 아까 shell 형식이 다르다는 것을 확인했으므로 

shell type을 /bin/bash shell로 바꿔준다.

그리고 :shell 명령으로 bandit26으로 접속을 완료한다.

 

next level password: 5czgV9L3Xx8JPOyRbXh6lQbmIOWvPT6Z

 

 

 

 

 

4주차 keyword

 

1. cron

주기적으로 반복되는 일을 자동으로 실행할 수 있도록 system 작업을 예약해놓는 것을 cron 이라고 부른다.

cron과 관련된 daemon(서비스)은 crond이고, 관련 파일은 /etc/crontab 이다.

위에서 살펴본 cron과 관련된 daemon파일을 분석해보자

 

/etc/crontab 형식

분 시 일 월 요일 사용자 실행명령

* * * * * bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null

 

* * * * * : 분, 시, 일, 월, 요일 어느때나 모두 다 허용

bandit22: user

/usr/bin/cronjob_bandit22.sh &> /dev/null: 실행명령

 

cron의 경우 주기적으로 실행할 내용을 directory에 넣어놓고 작동한다.

 

 

2. linux daemon

데몬은 리눅스의 백그라운드에서 동작하면서 특정한 서비스를 제공하는 프로세스를 의미한다.

리눅스 시스템에서 동작하는 web,DB,원격 접속 server 등 각종 서비스를 제공하는 프로세스들이 데몬이다.

 

 

-데몬의 동작방식

데몬은 독자형과 슈퍼데몬에 의해 동작하는 두가지 방식이 있다.

-1. 독자형: 시스템의 백그라운드에서 항상 동작한다.

-2. 슈퍼데몬에 의한 동작 방식: 슈퍼 데몬만 동작하다가 서비스 요청이 오면 슈퍼데몬이 해당 데몬을 동작시킨다.

독자형보다는 서비스 응답 속도에 시간이 걸리지만 자원 사용의 효율성이 높다.

 

 

-슈퍼 데몬

데몬의 종류가 늘어나면서 이를 관리하기 위한 목적으로 나온 데몬. 이름은 inetd

우분투에서는 xinetd로 쓰인다.

슈퍼 데몬은 네트워크 서비스를 제공하는 데몬만 관리한다.

즉, 사용자가 네트워크 서비스를 요청하면 슈퍼 데몬이 이를 받아서 해당하는 서비스 데몬을 동작 시킨다.

 

 

-주요데몬

crond: 주기적으로 실행하도록 예약한 명령 실행

httpd: 웹 서비스 제공

nfs: 네트워크 파일 시스템 서비스 제공

sshd: 원격보안 접속 서비스 제공

named: DNS 서비스 제공

routed: 자동 ip 라우터 테이블 서비스 제공

syslogd: log 기록 서비스 제공

atd: 특정 시간에 실행하도록 예약한 명령 실행

 

 

 

3. Brute Force

일명 무작위 대입 공격이라고 한다.

주로 비밀번호를 해킹할 때 모든 방식의 비밀번호를 다 넣어봄으로써 비밀번호를 탈취를 하는 방식이다.

이렇다보니 시간 면에서는 매우 비효율적인 방식이라고 볼 수 있으나, 그만큼 쉽게 만들어 낼 수 있는 방식이다.

하지만 비밀번호가 짧은 경우, 정보를 얻어내는데 까지 걸리는 시간은 기하급수적으로 줄게 된다.

한가지 예시를 들어보겠다.

 

여기 네자리 비밀번호가 있다고 가정하자

0~9 0~9 0~9 0~9

한자리당 10가지의 수가 들어가므로 10*10*10*10=10000 가지의 비밀번호가 존재한다는 것을 볼 수 있다.

그렇다면 이를 컴퓨터가 연산한다면 얼마만큼 빨리 그 번호를 탈취할 수 있을까?

2^x =10000  x=약14 

2진수로 표현했을 때 14비트 정도 내로 일만가지의 표현이 가능하다는 것을 보여준다.

지금의 cpu의 계산 속도라면 4자리 비밀번호를 탈취하는데는 시간이 그렇게 오래걸리지 않음을 보여준다.

 

반응형

'Bandit 원정대' 카테고리의 다른 글

Bandit 원정대 3주차  (0) 2021.07.08
Bandit 원정대 2주차  (0) 2021.06.30
Bandit 원정대 1주차  (0) 2021.06.23