김승현

[OverTheWire] Bandit Level 23 → Level 24 본문

Linux/OverTheWire : Bandit

[OverTheWire] Bandit Level 23 → Level 24

kshind 2023. 2. 20. 17:14

문제

문제 원문

제시된 명령어가 같으면 내용도 거의 비슷한 내용들인 것 같다.

프로그램은 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부분이 익숙하지 않을 수 있는데 난 아래의 블로그를 보고 이해했는데 깔끔한 것 같다!

 

Stat 명령, Ubuntu의 몇 가지 기본 예

다음 기사에서는 Gnu / Linux에서 사용할 수있는 Stat 명령의 몇 가지 기본 예제를 살펴볼 것입니다.

ubunlog.com


bandit24/foo 디렉토리 내에는 우리에게 write할 권한이 없는 걸 알 수 있다. 

그렇기 때문에 우리는 /tmp/pass/ 디렉토리를 만들고 bandit24의 password를 가져올 수 있는 셸 스크립트를 작성한다. 

그러고 난 후 셸스크립트를 bandit24/foo로 옮겨서 스크립트를 실행하면 password를 얻을 수 있다.

일단 mkdir로 /tmp/pass라는 디렉토리를 만들었고 cd를 통해 이동했다.

그리고 디렉토리에 bandit24/foo에 옮길 셸스크립트를 하나 만들었다.

word.sh의 코드

시작하는 부분엔 문제의 셸스크립트들처럼 #!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를 얻을 수 있다!

 


다른 건 좀 그나마 쉬웠는데 진짜 이번 거는 압축 엄청 많이 해서 노가다하던 그 문제보다 시간도 제일 오래 걸리고 스스로 생각할 게 좀 있고 앞에서 푼 문제들 응용하는 게 많아서 좀 어려웠는데 진짜 풀고 나니까 완전 뿌듯하다ㅎㅎ

 

 


다음 문제

https://kshind.tistory.com/26

 

[OverTheWire] Bandit Level 24 → Level 25

문제 포트 30002포트로 리스닝을 하고 bandit24의 password와 4자리 암호를 주면 bandit25의 password를 준다고 하는 것 같다. pincode를 얻는 방법은 브루트포싱이라고 불리는 방법밖에 없다고 한다. 브루트

kshind.tistory.com