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
'보안 > Bandit 워게임' 카테고리의 다른 글
OverTheWire - Bandit : Level 22 → Level 23 (0) | 2023.04.19 |
---|---|
OverTheWire - Bandit : Level 21 → Level 22 (0) | 2023.04.18 |
OverTheWire - Bandit : Level 20 → Level 21 (0) | 2023.04.17 |
OverTheWire - Bandit : Level 19 → Level 20 (0) | 2023.04.16 |
OverTheWire - Bandit : Level 18 → Level 19 (0) | 2023.04.15 |