The password for the next level is stored somewhere on the server and has all of the following properties:
owned by user bandit7
owned by group bandit6
33 bytes in size
ls -al
명령어를 활용하여 출력하면 홈 디렉터리에는 아무것도 찾아볼 수 없고, 대신 /(root)
디렉터리에 무언가 들어있음을 알 수 있다.
ls -al
total 20
drwxr-xr-x 2 root root 4096 Apr 23 18:04 .
drwxr-xr-x 70 root root 4096 Apr 23 18:05 ..
-rw-r--r-- 1 root root 220 Jan 6 2022 .bash_logout
-rw-r--r-- 1 root root 3771 Jan 6 2022 .bashrc
-rw-r--r-- 1 root root 807 Jan
cd
이용해서 루트 디렉터리로 이동 후, find
명령어를 활용하여 password를 찾아내야 하는 상황이다.
Level Goal
에서는 'is stored somewhere on the server'에 있다고 하였으니, 최상위 경로인 /
에서 find
명령어를 활용하여 주어진 조건들을 만족시키는 file을 찾도록 한다. Level 5 → Level 6에서 간단하게 적어두었던 find
명령어의 expression
을 사용하면 된다.
find / -size 33c -user bandit7 -group bandit6
→ Permission denied 된 파일을 포함해서 수많은 파일들이 출력
Permission denied
된 파일들이 상당함으로, 적당히 걸러서 볼 필요가 있다. 이때 error난 결과들을 걸러낼 수 있는 명령어를 활용하면 된다. ('Permission denied'에 대한 이야기는 밑에서 더 자세히 다루도록 하겠다.)
find / -size 33c -user bandit7 -group bandit6 2> /dev/null
→ /var/lib/dpkg/info/bandit7.password
cat
명령어로 위에 주어진 것 출력 값을 읽으면 password를 얻어낼 수 있다.
Bandit7 Password : z7WtoNQU2XfjmMtWA8u5rN4vzqu4v99S
매 level마다 find Expression
이 등장하는 것 같아, 별도로 정리해두면 편리할 것 같다. 추후 필요한 expression이 늘어난다면 글을 작성해볼 생각이다.
-user
: 지정한 '사용자'의 파일이나 디렉터리를 찾는다. (Level 5 → Level 6에서 다루었던, 파일/디렉터리 이름을 의미하는 -name
명령어와는 엄연히 다르다.)-group
: 지정한 그룹 소유의 파일이나 디렉터리를 찾는다.두 명령어 모두 명령어 뒤에 해당하는 user 이름과 group 이름을 적어주면 된다.
/dev/null
를 설명하기 전에 앞서, Level 1 → Level 2에서 다루었던 File Discriptor
와 Redirection
에 대해 다시 한 번 더 상기시키고 넘어가겠다.
File Descriptor
는 프로세스에서 특정 파일에 접근할 때 사용하는 추상적인 값으로, 0~2의 FD 값 중, 2
는 Standard Error
즉 표준 에러에 해당한다. 해당 level를 풀 때 마주했던 상당한 양의 Permission denied
(표준 에러, 2)들을 걸러서 원하는 값을 출력하려면, 표준 에러들을 다른 곳으로 보내면 된다. 이때 사용하는 것이 바로 Redirection
이다.
Redirection
은 간단하게 말해서 입, 출력의 방향을 지정할 때 사용한다. 표준 에러, 즉 FD가 2번인 것들을 특정 공간으로 이동시켜 원하는 값을 걸러내야 한다.
A > B
: A의 결과를 B로 보낸다. (덮어쓰기)A >> B
: A의 결과를 기존 B의 데이터에 추가한다.A < B
: B의 데이터를 A에 입력한다. (입력)/dev/null
는 linux의 쓰레기 통이라고 보면 된다. 간단하게 비유해서, 모든 출력을 흡수하는 블랙홀이다. 앞서 언급한 표준 에러인 2
를 전부 쓰레기 통으로 보내면 된다. 즉 표준 에러를 /dev/null
로 보내 출력하지 않게 해주면 된다.
2 > /dev/null