보안/Bandit 워게임

OverTheWire - Bandit : Level 23 → Level 24

Security Engineer 2023. 5. 2. 21:00

OverTheWire - Bandit

강의목차: Level 23 → Level 24(쉘 스크립트 반복문, 조건)

 

Bandit 웹페이지

https://overthewire.org/wargames/bandit/

 

 

 

1. Bandit Level 23 → 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…

 

Commands you may need to solve this level

cron, crontab, crontab(5) (use “man 5 crontab” to access this)

 

 

한 프로그램이 cron에 의해 자동으로 그리고 주기적으로 실행되고 있다.

cron 은 시간 기반의 스케쥴러 프로그램이다.

/etc/cron.d/ 디렉터리에 가보면 어떤 프로그램이 실행하도록 설정되어있는지 확인할 수 있다.

 

참고 : 본 레벨은 쉘 스크립트 작성 능력을 요구한다.

참고2 : 당신의 쉘 스크립트는 한번 실행되면 제거된다. 그러므로 어딘가에 별도로 백업을 해두는 것을 권고한다.

 

 

Level 23 로그인

 

$ ssh -p 2220 bandit23@bandit.labs.overthewire.org

Level 23 패스워드: QYw0Y2aiA672PsMmh9puTQuhoz8SyR2G

 

 

$ cd /etc/cron.d

→ /etc/cron.d 로 디렉터리 이동

$ ls

$ ls -al

→ cron 확인

bandit24 패스워드의 정보는 cronjob_bandit24 에 있는것으로 추정된다.

 

$ cat ./cronjob_bandit24

→ cronjob_ bandit24 화면에 출력

cron 에 등록하려면 일정 형식을 맞춰서 등록해야한다.

* * * * * : 주기 , 매분 실행된다.

bandit24 : 사용자 

/usr/bin/cronjob_bandit24.sh &> /dev/null : 매분 누구의 계정으로 쉘 스크립트를 백그라운드(&) 에서 실행하며, 그 결과는 화면에 별도로 표시하지 않는다. ( /dev/null - 휴지통으로 보낸다. )

 

매분 bandit24 의 계정으로 쉘 스크립트를 실행한다.

cronjob_bandit24.sh 쉘 스크립트

 

쉘 스크립트 → 쉘 스크립트에서 사용하는 언어가 쉘에서 사용하는 명령어 기반으로 구성되어 있다.

쉘 종류에 따라 달라진다. 쉘 문법을 가지고 프로그램을 만들면 그것이 쉘 스크립트이다.

 

bash 에서 쉘 스크립트 만들면 bash shell script

 

 

$ file /usr/bin/cronjob_bandit24.sh

→ cron 파일 형태 확인

Bourne shell 로 만들어진 스크립트인것을 확인할 수 있다.

 

 

$ cat /usr/bin/cronjob_bandit24.sh

→ bandit24 쉘 스크립트 내용을 화면에 출력

#!/bin/bash

→ bash shell

 

myname=$(whoami)

→ whoami 입력해서 나온 값(bandit24)을 myname 변수에 저장한다($).

 

cd /var/spool/$myname/foo

→ /var/spool/bandit24/foo 경로로 이동한다.

 

echo "Executing and deleting all scripts in /var/spool/$myname/foo:"

→ /var/spool/bandit24/foo 디렉터리 내에 있는 모든 스크립트를 실행하고 삭제한다.

 

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 -rf ./$i
    fi
done

for i in * .*;

→ 해당 위치에 있는 모든파일(일반파일, 숨김파일)을 i 라는 변수에 넣는다.

 

do ~ done

→ for 문 반복

 

if [ "$i" != "." -a "$i" != ".." ];

→ $i (myname 에 들어있는 파일이름) 이 현재 디렉터리가 아니고, 상위 디렉터리가 아니면 then 부분을 실행한다.

 

$i : i 변수

!= : 아니다

= : 맞다

-a : and

"." : 현재 디렉터리

".." : 상위 디렉터리

 

echo "Handling $i"

→ Handling $i 를 출력 ( 현재 i 변수에 대해서 뭘 하고 있다라는 것을 의미 )

 

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

→ 파일의 소유자 이름을 owner 에 저장한다.

 

if [ "${owner}" = "bandit23" ]; then

→ 파일의 소유자가 bandit23 이라면,

 

timeout -s 9 60 ./$i

→ $i를 60초이내에 실행해라, 60초를 초과하면 해당 프로세스를 제거한다.

 

rm -f ./$i

→ 실행이 종료된 $i 를 강제로 제거한다.

 

 

 

해당 쉘 스크립트를 해석하면 다음과 같다. 참고로 cronjob_bandit24.sh 쉘 스크립트는 bandit24 소유의 파일이다.

 

myname = $(whoami)  => myname에 "bandit24" 저장

 

cd /var/spool/$myname/foo => /var/spool/bandit24/foo 로 이동.

echo "Executing and deleting all scripts in /var/spool/foo/$myname:" => 해당 문자열 출력

for i in * .*; => 모든 파일에 대해 반복함.

do

    if [ "$i" !="." -a "$i" != ".." ];  =>  해당 파일이 . (현재 디렉토리)이 아니고 ..(상위 디렉토리)이 아니라면,

    then

            echo "Handling $i"  => Handling [파일이름] 출력

            owner="$(stat --format "%U" ./Si)" => 파일의 소유자 이름을 owner에 저장.

            if [ "%{owner}" = "bandit23" ]; then  => 파일의 소유자가 "bandit23" 이라면,

                timeout -s 9 60 ./%i  =>  60초 후에 해당 파일을 종료한다.

            fi

            rm -f ./$i => 해당 파일 강제 삭제.

    fi

done

 

요약하면 /var/spool/bandit24에 존재하는 모든 파일을 실행하고 삭제하는 쉘 스크립트이다.

처음에 파일 복사본을 만들라고 했던 이유가 이것 때문이였다.

 

 

쉘 스크립트 작성방법

1. vi 파일이름 입력하여 편집모드로 들어간다.2. 첫 번째 줄에 #! /bin/bash 를 작성하고, 이후에 코드를 작성한다.3. 코드 작성이 끝나면 exit 0 을 입력하고 esc 를 눌러 편집모드를 비활성화 시킨 후에 :wq를 입력해서 저장 후 종료한다.

 

쉘 스크립트 기본문법

 

1 .출력echo 와 printf 가 있다. echo는 자동으로 개행 문자를 뒤에 삽입하며, printf는 개행문자를 삽입하지 않는다.

#! /bin/bash
echo "Echo"
printf "printf"
printf "%s %s" print test

 

2. 조건문

if 로 시작해서 조건문 마지막에 fi 를 써야한다.

if 조건
then
	실행할 내용
elif 조건
	실행할 내용
else
	실행할 내용
fi

 

3. 반복문

for 을 사용하는 형태

for 변수 in [값들]
do
	실행 내용
done

파이썬과 형태가 비슷하다.

 

 

while 은 아래 형태로 사용.

while 조건문
do
	실행 내용
done

 

쉘 스크립트 파일은 실행시키기 위해 항상 chmod +x 명령어로 실행 권한을 부여해주어야 한다. 

$ chmod +x ./파일이름.sh

 

 

 

bandit24 의 패스워드를 출력하는 쉘 스크립트를 만든다.

 

$ cd /var/spool/bandit24

$ ls -al

→ foo 디렉터리 확인

$ mkdir /tmp/mydir99

$ vi /tmp/mydir99/t123.sh

→ t123.sh 파일에 bandit24 의 패스워드를 출력하는 쉘 스크립트 작성

#! /bin/bash

cat /etc/bandit_pass/bandit24 > /tmp/mydir99/shell.txt

exit 0

 

$ ls -al /tmp/mydir99

$ chmod 777 /tmp/mydir99/t123.sh

→ t123.sh 에 모든권한 부여 (rwx)

 

$ ls -al /tmp/mydir99

→ /tmp/mydir99 디렉터리에 쓰기권한(w) 이 없는것을 확인.

 

$ chmod o+w /tmp/mydir99

 /tmp/mydir99 디렉터리에 쓰기권한(w) 부여.

 

 

$ cp /tmp/mydir99/t123.sh /var/spool/bandit24/foo

→ /tmp/mydir99/t123.sh 파일을 /var/spool/bandit24/foo 디렉터리에 복사

자세히 보면 foo 디렉터리에는 d/rwx/rwx/-wx 권한이 부여되었는데, other 에는 r권한(읽기) 이 없기 때문에 ls -al 을 사용할 수 없다.

 

1분 경과후 /tmp/mydir99 확인해보면 shell.txt 파일을 확인할 수 있다.

( 1분마다 쉘 스크립트 실행되어 shell.txt 파일 생성됨 )

 

$ ls -al /tmp/mydir99

→ shell.txt 파일 확인

 

$ cat /tmp/mydir99/shell.txt

→ shell.txt 파일 출력

플래그:  VAfGXJ1PBSsPSnvsjI8p759leLZ9GGar

 

 

$ exit ( ssh 접속 상태에서 홈으로 나가기 )

 

 

Level 24 접속 시도

 

$ ssh -p 2220 bandit24@bandit.labs.overthewire.org

Level 24 패스워드: VAfGXJ1PBSsPSnvsjI8p759leLZ9GGar

 

 

$ whoami

$ id

입력하여 현재 로그인한 계정 확인

 

 

 

2. 총 정리

매분마다 bandit24 계정으로 실행하는 cronjob 이 있는데, bourne shell  로 만들어진 스크립트이며, 해당 스크립트(bandit24)의 내용은 아래와 같다.

 

< /usr/bin/cronjob_bandit24.sh 스크립트 내용 >


/var/spool/bandit24/foo 디렉터리에
파일이 현재 디렉터리가 아니고 상위 디렉터리가 아니라면 ( 파일이 존재 한다면 ), 파일 이름을 출력, 파일의 소유자 이름을 owner 에 저장하고, 파일 소유자가 bandit23 이라면 실행 후 60초 후에 해당 파일을 종료한다. 이후 해당 파일 강제 삭제한다.

요약하면 /var/spool/bandit24/foo 에 존재하는 모든 파일을 실행하고 삭제하는 쉘 스크립트이다.

( /usr/bin/cronjob_bandit24.sh )


/tmp/mydir99 디렉터리를 생성하고, /tmp/mydir99 디렉터리에 t123.sh 라는 bandit24 의 패스워드를 출력하는 쉘 스크립트를 작성한다. ( /var/spool/bandit24/foo 디렉터리에 만들면 1분마다 삭제되므로, 새로운 디렉터리에 생성 )
/tmp/mydir99/t123.sh 쉘 스크립트를 /var/spool/bandit24/foo 디렉터리에 복사한다.

cronjob 에 의해서 /var/spool/bandit24/foo 디렉터리의 t123.sh 쉘 스크립트가 실행되며, 1분뒤에 종료 후 파일이 삭제된다. 
t123.sh 의 스크립트 내용에 의해 bandit24 의 패스워드가 /tmp/mydir99/shell.txt 파일에 저장된다.
cat 명령어를 사용하여 shell.txt 파일 내용을 출력한다.

플래그: VAfGXJ1PBSsPSnvsjI8p759leLZ9GGar

 

 

 


취미로 해킹1 강의 : https://www.inflearn.com/course/linux-3