[수정] 2020-05-20 풀이 오류 수정
사용 툴: cygwin
1) 문제
프로그램은 시간 기반 작업 스케줄러인 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 디렉터리를 살펴보면 우리는 지금 읽을 수 있는 권한도 없다.
자 .... 지금 우리가 해야할 것들을 나열해보겠다.
- /tmp/mydir333 라는 새로운 디렉터리 만들기 mkdir
- /tmp/mydir333/ 에 새로운 쉘 스크립트 파일 만들기. 이름은 my24.sh로 할 것이다. vi
- my24.sh 파일에 bandit24의 패스워드를 알아내는 쉘 스크립트를 짜기
(여기서 cat으로 하게되면 bandit24의 계정에서 열리게 된다. 우리는 지금 bandit23의 계정이니까 보지 못한다. 그러니까 패스워드를 적어놓은 파일을 생성하도록 쉘을 짜야한다.) - my24.sh를 /var/spool/bandit24 로 복사해주기 cp
- 최대 1분안에 my24.sh가 실행되고 삭제될 것 이다.
- /tmp/mydir333 으로 가서 bandit24 패스워드를 적어놓은 파일이 생성되었는지 확인하기
- 패스워드를 보고 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 권한을 추가시켜줘야한다.
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:~$
끝!
'WAR GAME > Bandit' 카테고리의 다른 글
[OverTheWire: Bandit] level25 -> level26 (0) | 2020.03.07 |
---|---|
[OverTheWire: Bandit] level24 -> level25 (2) | 2020.03.07 |
[OverTheWire: Bandit] level22 -> level23 (0) | 2020.03.03 |
[OverTheWire: Bandit] level21 -> level22 (0) | 2020.03.01 |
[OverTheWire: Bandit] level20 -> level21 (0) | 2020.03.01 |