[해킹] Bandit Level 22 ~ 26 단계 - 정리
* 미션 풀이
[Level 21 -> Level 22]
1. bandit21에 로그인
2. /etc/cron.d/의 구성을 보고 어떤 명령이 실행되고 있는지 확인하라고 했으므로, cd /etc/cron.d/를 입력한 후 ls 명령어를 통해 확인한다.

3. bandit22와 관련된 파일이 있으므로 cat cronjob_bandit22를 한다.

4. cat /usr/bin/cronjob_bandit22.sh를 입력한다.

bandit22의 내용을 tmp파일 안에 넣어놓은 것을 알 수 있다.
5. cat /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv를 입력한다.

따라서, bandit22의 비번은 Yk7owGAcWjwMVRwrTesJEwB7WVOiILLI 이다.
[Level 22 -> Level 23]
1. bandit22에 로그인
2. cd /etc/cron.d/ 입력하고 ls 명령어로 확인한다.

3. cat cronjob_bandit23 입력

4. cat /usr/bin/cronjob_bandit23.sh 입력

tmp/$mytarget의 형태로 나왔다.
5. mytarget을 알아내기 위해서 echo I am user bandit23 | md5sum | cut -d '' -f 1을 입력한다.

즉, mytarget은 8ca319486bfbbc3663ea0fbe81326349이다.
6. cat /tmp/8ca319486bfbbc3663ea0fbe81326349 입력해서 비번을 알아낸다.

따라서, bandit23의 비번은 jc1udXuA1tiHqjIsL8yaapX5XIAI6i0n 이다.
[Level 23 -> Level 24]
1. bandit23에 로그인
2. cd /etc/cron.d 입력 후, ls 명령어 입력

3. cat cronjob_bandit24 입력

4. cat /usr/bin/cronjob_bandit24.sh 입력

var/spool/$myname 안에 있는 모든 스크립트를 실행시킨 뒤 60초 뒤에 지운다고 한다.
지워지기 전에 /etc/bandit_pass/bandit24 안에 있는 내용을 복사해야 한다.
5. 내용을 복사할 디렉토리를 생성한다. mkdir /tmp/rbdbd 입력한다.
그 후, cd /tmp/rbdbd로 들어가서 cat > bandit.sh 입력한다.

6. bandit24의 패스워드 파일 내용을 토대로 파일을 생성하라는 쉘 스크립트를 작성한다.
즉,
#!/bin/bash
cat /etc/bandit_pass/bandit24 > /tmp/rbdbd/password 입력.

7. 디렉토리와 파일에 권한을 부여하기 위해 chmod 777 bandit.sh 입력 후, chmod 777 /tmp/rbdbd 입력

8. bandit.sh를 /var/spool/bandit24/에 복사하기 위해 cp bandit.sh /var/spool/bandit24/ 입력

9. 1분 정도 후, cat password 해주면 비밀번호가 나온다.

따라서, bandit24의 비번은 UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ 이다.
[Level 24 -> Level 25]
1. bandit24에 로그인
2. 포트 30002가 열려 있다고 했으므로 nc localhost 30002 입력

bandit24 비밀번호는 알고 있고, pin코드 4자리만 알면 된다.
3. 내용을 복사할 디렉토리를 생성한다. mkdir /tmp/level25 입력한다.
그 후, cd /tmp/level25로 들어가서 cat > bd25.sh 입력한다.

4. brute-forcing을 하기 위한 쉘 스크립트를 다음과 같이 작성한다.

5. 디렉토리와 파일에 권한을 부여하기 위해 chmod 777 bd25.sh 입력 후, chmod 777 /tmp/level25 입력

6. ./bd25.sh 입력

7. cat pass.txt | nc localhost 30002 입력하면 brute-forcing이 실행된 이후 비번이 나온다.

따라서, bandit25의 비번은 uNG9O58gUE7snukf3bvZ0rxhtnjzSGzG 이다.
[Level 25 -> Level 26]
1. bandit25 로그인
2. ls 입력하면 sshkey가 있는 것을 알 수 있다.
ssh -i bandit26.sshkey bandit26@localhost를 입력하면 실행이 됐다가 바로 닫히는 것을 알 수 있다.


3. bandit26은 bash 쉘이 아닌 다른 쉘을 사용한다고 했으므로 cat /etc/shells를 입력하여 리눅스 쉘의 종류를 본다.

4. 이 쉘들 중, passwd 파일을 살펴보면 각 계정이 사용하고 있는 쉘을 확인할 수 있다.
즉, grep bandit26 /etc/passwd 입력한다.

5. 이를 통해 찾은 /usr/bin/showtext파일을 살펴보면 more 명령어를 통해 홈 디렉토리의 text 파일을 읽는 것을 알 수 있다.
즉, cat /usr/bin/showtext 입력

* more : 파일 내용을 확인하는 명령어들 중 하나로, 파일을 읽어 화면에 화면 단위로 끊어서 출력하는 명령어이다. 따라서, 임의로 화면을 작게 줄여서 more 명령어가 실행되게 만들면 문서편집기를 사용할 수 있게 되고, 문서 안에서 명령어를 시행할 수 있게 된다.
6. 화면을 줄여 ssh 명령어로 개인키를 이용해 접속하면 more 명령어가 실행되는 모습을 볼 수 있다.
ssh -i bandit26.sshkey bandit26@localhost 입력

7. v를 눌러 vi 편집기 상태로 전환시킨다.

8. :를 눌러 r을 이용해 현재 권한으로 다음 레벨의 패스워드를 읽는다.
:r /etc/bandit_pass/bandit26 입력
그러면 다음과 같이 창이 뜨는데 무시하고 q를 입력하고 나온다.

9. 그러면 다음과 같이 뜬다.

따라서, bandit26의 비번은 5czgV9L3Xx8JPOyRbXh6lQbmIOWvPT6Z 이다.
* 미션 풀이에 필요한 지식 정리
- cron
cron이란 유닉스 계열 컴퓨터 운영 체제의 시간 기반 스케줄러이다. 소프트웨어 환경을 설정하고 관리하는 사람들은 작업을 고정된 시간, 날짜, 간격에 주기적으로 실행할 수 있도록 스케줄링하기 위해 cron을 사용한다.
cron은 부팅할 때 시작되고 데몬으로 백그라운드로 실행된다. 즉, 사용자 개입 없이 실행되고 실행을 결정할 어떤 이벤트가 발생하기를 기다리는 것이다. cron은 어떤 시점에 무슨 명령을 실행할지 결정하는데 crontab이란 파일을 읽어서 수행한다.

# crontab
cron 작업을 설정하는 파일을 crontab 파일이라고 한다.
cron 프로세스는 /etc/crontab 파일에 설정된 것을 읽어서 작업을 수행한다.
crontab 파일은 OS별로 각각 다른 위치에 저장된다.
crontab 파일을 확인해보면, #m h dom mon dow user command 라고 주석으로 되어 있다. 이는 분 시 일 월 요일 사용자 실행명령 형식을 가진다는 것을 뜻한다.

각 필드는 위 표에 명기된 설정된 값 이외에 *, -, 콤마, /를 사용할 수 있다.
* : 매월, 매일 할 때 그 every를 뜻한다. 만약, 3번째 필드에 *이 있으면 매일을 뜻하게 되는 것이다.
- : 그 사이의 모든 값을 뜻한다. 만약 3번째 필드에 1-5라고 되어 있으면 1일, 2일, 3일, 4일, 5일을 뜻하게 되는 것이다.
, : 지정한 모든 값을 의미한다. 주로 불규칙적인 값을 지정할 때 사용한다. 만약, 2번째 필드에 "1,3,4"는 1시 3시 4시를 의미한다.
/ : 연결된 설정 값 범위에서 특정 주기로 나눌 때 사용한다.
<crontab 사용법>
crontab [option] 파일명
--> 옵션

- Linux 데몬
데몬이란 리눅스 시스템이 처음 가동될 때 시행되는 백그라운드 프로세스의 일종이다. 사용자의 요청을 기다리고 있다가 요청이 발생하면 이에 적절히 대응하는 리스너와 같은 역할을 한다. 즉, 메모리에 상주하면서 특정 요청이 오면 즉시 대응할 수 있도록 대기중인 프로세스이다.
<데몬의 실행 방식>
--> standalone
독립적으로 수행되며 서비스 요청에 응답하기 위해 항시 메모리에 상주한다. 즉, 빠른 응답속도를 요하는 경우에는 이 모드를 이용한다. 메모리에 항상 상주해 있기 때문에 메모리 점유로 인한 서버 부하를 준다는 단점을 가지고 있다.
--> inetd
inetd라고 하는 특별한 데몬에 의해 간접적으로 실행되는 데몬이다. 보안상의 이유로 xinetd로 수정되었으며 슈퍼데몬이라고도 한다. inetd에 어떠한 요청이 들어오면 inetd는 해당되는 데몬을 메모리에 올리고 요청을 처리하게 된다. 응답속도가 standalone보다 느리다는 단점이 있지만, 서버부하를 상대적으로 줄일 수 있다는 장점을 가지고 있다.
- Brute Force
완전 탐색 알고리즘이다. 가능한 모든 경우의 수를 모두 탐색하면서 요구조건에 충족되는 결과만을 가져온다. 이 알고리즘의 강력한 점은 예외 없이 100%의 확률로 정답만을 출력한다는 것이다.
Brute Force 알고리즘은 모든 경우를 직접 하기 때문에 시간적으로 매우 비효율적인 알고리즘이다.
<Brute Force의 종류>
자료의 구조에 따라서 2종류로 나뉘게 된다.
선형구조 --> 순차 탐색
비선형 구조 --> BFS, DFS
# 순차 탐색
1. 문제에서 주어진 자룔를 선형 구조로 바꾼다.
2. 구조화된 자료들을 구조에 맞는 방법으로 해를 구할 때까지 탐색한다.
3. 탐색한 해를 주어진 문제의 출력 형식에 맞게 정리한다.
# BFS
선형 탐색을 이용하여 탐색을 할 수 없는 구조들이 있다. 대표적으로, 그래프 자료구조가 있다.
그래프 형태의 자료구조들은 탐색을 할 때, 선형 탐색이 불가능하기 때문에 비선형 구조 탐색법을 사용해야 한다.
그 중, BFS는 너비 우선 탐색이다.
루트노드에서 시작해서 인접한 노드를 먼저 탐색하는 기법이다. 인접한 노드들을 각각 큐에 넣어놓고 큐에서 하나씩 꺼내서 큐에서 나온 노드와 연결된 노드들을 순차적으로 먼저 탐색하고 또 인접한 노드 중에서 방문되지 않은 노드들을 지속적으로 탐색한다.
# DFS
깊이 우선 탐색이다. 이름과 같이 루트에서 가장 끝에 있는 막다른 노드까지 탐색을 해서 재귀적으로 함수가 탐색을 갔다가 빠져나오면서 연결된 노드들을 탐색하는 방식이다.