김승현
[OverTheWire] Bandit Level 23 → Level 24 본문
문제
제시된 명령어가 같으면 내용도 거의 비슷한 내용들인 것 같다.
프로그램은 cron으로 규칙적인 텀마다 자동으로 실행되는 시간 기반의 작업 스케쥴러라고 하고 /etc/cron.d를 봐서
설정이나 어떤 커맨드가 실행되고 있는지 보라는 말인 것 같다.
NOTE : 이 level에선 우리가 우리의 첫 셸스크립트를 만들길 요구한닥 ㅗ한다. 이건 매우 큰 스탭이고 이 문젤 스스로 풀면 자랑스러워 해도 된다고 한다.
NOTE1 : 한 번 실행된 우리가 만든 셸스크립트는 지워진다는 걸 명심하라고 하고 미리 저장해두라는 말인 것 같다.
풀이
문제에서 말한대로 /etc/cron.d에 들어가서 ls -al을 했다.
bandit24의 password가 필요하기 때문에 cronjob_bandit24파일을 읽어봤다.
/usr/bin/cronjob_bandit24.sh파일 부팅시, 그리고 매시 매분마다 쓰레기통에 넣는다고 한다.
매번 지우는 셸스크립트 파일이 수상해서 cat 명령어를 사용해서 보니까 좀 긴 스크립트가 출력됐다. 한 줄 한 줄 보자.
#!/bin/bash #bin/bash 셸을 사용 myname=$(whoami) # myname 변수에 bandit24를 저장 cd /var/spool/$myname/foo # /var/spool/bandit24/foo에 들어감 echo "Executing and deleting all scripts in /var/spool/$myname/foo:" # 해당 내용을 출력 for i in * .*; # 현재 디렉토리 내 모든 파일에 대해서 반복 do if [ "$i" != "." -a "$i" != ".." ]; # 만약 이름이 .이 아니고 ..이 아니라면 then echo "Handling $i" # 해당 내용을 출력 owner="$(stat --format "%U" ./$i)" # owner 변수에 현재 검사 중인 파일의 소유자명을 저장 if [ "${owner}" = "bandit23" ]; then # 만약 소유자가 bandit23이라면 timeout -s 9 60 ./$i # 60초 후 프로그램을 종료시킨다. fi # if문이 종료됐다는 걸 알림 rm -f ./$i # 해당 파일을 강제로 삭제 fi # if문 종료 done # for문 마무리 |
한마디로 /var/spool/bandit24/foo의 스크립트가 60초마다 삭제된다는 뜻이다.
owner변수가 있는 줄에 stat --format부분이 익숙하지 않을 수 있는데 난 아래의 블로그를 보고 이해했는데 깔끔한 것 같다!
bandit24/foo 디렉토리 내에는 우리에게 write할 권한이 없는 걸 알 수 있다.
그렇기 때문에 우리는 /tmp/pass/ 디렉토리를 만들고 bandit24의 password를 가져올 수 있는 셸 스크립트를 작성한다.
그러고 난 후 셸스크립트를 bandit24/foo로 옮겨서 스크립트를 실행하면 password를 얻을 수 있다.
일단 mkdir로 /tmp/pass라는 디렉토리를 만들었고 cd를 통해 이동했다.
그리고 디렉토리에 bandit24/foo에 옮길 셸스크립트를 하나 만들었다.
시작하는 부분엔 문제의 셸스크립트들처럼 #!bin/bash를 입력했다. 이걸 입력하는 이유는 bash 셸을 사용한다는 의미이다. 다른 데에선 #가 주석처럼 사용되지만 여기선 주석으로 사용되지 않는다.
/tmp/pass 디렉토리에 bandit24의 권한으로 파일을 하나 만들어야 하니까 일단 디렉토리의 권한을 777로 바꾸고
/etc/bandit_pass/bandit24의 password를 /tmp/pass/password.txt를 만들어서 여기 저장시키려고 했다.
그러나,
이걸 작동시켜 봐도 password.txt가 만들어지지 않았다. 만들어지지 않은 이유는 해당 셸스크립트가 실행되면 bandit24의 권한으로 실행이 되는데 /tmp/pass의 권한은 bandit23이 가지고 있기 때문에 마음대로 할 수 없는 것 같다. (추측)
그래서 word.sh에서 chmod 내용은 줄여서 작성했고,
셸에서 모두에게 tmp/pass에 대한 모든 권한을 줬다.
mv명령어도 있지만 지워진다고 하니까 cp명령어를 통해 bandit24/foo에 복사시키고 실행될 때까지 기다렸다.
중간에 이제 됐겠지? 하고 봤는데 안 돼있어서 네 번만에 성공했다.
cat 해보면 password를 얻을 수 있다!
다른 건 좀 그나마 쉬웠는데 진짜 이번 거는 압축 엄청 많이 해서 노가다하던 그 문제보다 시간도 제일 오래 걸리고 스스로 생각할 게 좀 있고 앞에서 푼 문제들 응용하는 게 많아서 좀 어려웠는데 진짜 풀고 나니까 완전 뿌듯하다ㅎㅎ
다음 문제
'Linux > OverTheWire : Bandit' 카테고리의 다른 글
[OverTheWire] Bandit Level 25 → Level 26 (0) | 2023.02.20 |
---|---|
[OverTheWire] Bandit Level 24 → Level 25 (0) | 2023.02.20 |
[OverTheWire] Bandit Level 22 → Level 23 (0) | 2023.02.20 |
[OverTheWire] Bandit Level 21 → Level 22 (0) | 2023.02.19 |
[OverTheWire] Bandit Level 20 → Level 21 (0) | 2023.02.19 |