티스토리 뷰
# Level 0
우선 문제를 봤는데, 무슨 소리인지 잘 모르겠어서 다른 블로그의 풀이 방법을 참고하였다. PowerShell을 이용하여 문제를 풀기 위해서는 ssh bandit0@bandit.labs.overthewire.org -p 2220을 입력하고, 비밀번호를 입력하면 된다고 했다. 문제를 보면 ssh를 이용하라고 했고, username, password, 접속해야할 곳과 port 정보와 비교했을 때 대충은 알 수 있었지만, 잘 알지 못해서 개념을 조금 정리해보면 다음과 같다.
SSH는 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해 주는 응용 프로그램 또는 그 프로토콜을 가르킨다. 연결할 때는 ssh <username>@<remote>를 입력한다. 포트를 지정하려면 -p 0000을 추가하면 된다. 연결되면 비밀번호를 입력해야 하는데, 비밀번호를 입력할 때는 이동이나 입력된 문자를 볼 수 없다.
다시 정리해보면 문제에서 username은 bandit0이고, 서버의 주소는 bandit.labs.overthewire.org, 비밀번호는 bandit0이기 때문에, ssh bandit0@bandit.labs.overthewire.org -p 2220를 입력하고 주어진 비밀번호를 입력하면 된다.
# Level 0 -> Level 1
문제를 보면 readme라는 파일에서 password를 찾고 bandit1에 사용하면 되는 거 같다. 우선 사용할 수 있는 명령을 정리해보면 다음과 같다. ls는 현재 위치에 있는 파일과 폴더를 볼 수 있고, cd는 디렉토리를 이동할 수 있고, cat은 파일의 내용을 표시할 수 있다. 그리고 du는 서버의 용량을 확인할 수 있고, find를 통해 파일 및 폴더를 검색할 수 있다.
우선 ls를 통해 파일과 폴더를 확인했는데, readme 파일이 있었다. 그래서 cat를 사용하여 readme 파일 내용을 확인할 수 있었다. exit를 사용하여 bandit0에서 접속 종료하고, 구한 password를 통해 bandit1에 로그인할 수 있었다.
# Level 1 -> Level 2
문제를 보면, -인 파일에 저장된 password를 알아내는 것이 목표이다. 우선 ls 명령을 사용하여 파일을 보았는데 -인 파일이 존재했다. 근데 - 문자는 stdin 또는 stdout을 참조하는 문자여서 -로 시작하는 파일을 보통은 만들지 않는다. -로 시작하는 파일을 만든 경우에는 일반적으로 사용하듯이 cat -로 cat 명령을 사용하지 않고, cat < -로 사용함을 통해 파일의 내용을 확인할 수 있다. 이를 통해 문제를 풀 수 있었다!
# Level 2 -> Level 3
문제를 보면 "spaces in this filename"이 이름인 파일에 저장된 password를 알아내는 것이 목표이다. ls 명령을 사용해서 spaces in this filename이 있는지 확인하고, cat를 사용하여 파일의 내용을 확인하였다. 이때, 파일 이름에 스페이스가 포함됐기 때문에 따옴표로 묶어주는 것을 주의해야 했다.
# Level 3 -> Level 4
문제를 보면 inhere에 숨겨진 파일에 저장된 password를 찾는 것이 목표임을 알 수 있다. 우선 ls를 사용해서 파일과 폴더를 확인하였다. inhere이 있으므로, cd 명령어를 통해 이동하였다. 그리고 그 파일에서 ls를 다시 사용하였는데, 파일을 확인할 수 없었다. 그래서 명령어를 더 알아보았는데, ls -a를 통해서 숨겨진 파일 및 폴더를 포함한 모든 내용을 나열할 수 있음을 알게 되었다. ls -a를 통해 .hidden을 확인할 수 있었고, cat로 그 파일을 읽음으로써 password를 알아낼 수 있었다.
# Level 4 -> Level 5
문제를 보면 inhere에 있는 only human-readable 파일에 저장된 password를 알아내는 것이 목표임을 알 수 있다. 우선 ls를 통해 inhere 파일이 있음을 확인하고, cd를 통해 이동하였다. 그리고 다시 ls를 통해 파일을 확인했는데, 10개의 파일이 있었다. only human-readable file이 어떤 걸 말하는 건지 모르겠어서, cat을 통해 각각의 파일의 내용을 모두 확인해봤다. 읽을 수 없는 문자가 포함됐거나 알파벳과 숫자가 아닌 문자가 포함된 경우를 제외하면, -file07파일이 문제에서 말한 파일임을 알 수 있다. 구한 password를 통해 문제를 풀 수 있었다.
# Level 5 -> Level 6
문제를 보면 inhere에 어딘가에 속한 파일에서 password를 찾는 게 목표임을 알 수 있다. inhere 폴더에서 ls로 폴더와 파일을 봤는데, 너무 많았다. 그래서 find 명령을 어떻게 사용할 수 있는지 알아보았다. 우선 찾고자 하는 게 파일이고, human-readable, 1003 bytes in size, not executable을 만족하는 것이었다. 파일을 찾고 있으므로 -type f 를 작성하고, 해당 사이즈를 찾기 위해서 -size 1003c, not executable을 만족시키기 위해 ! -executable을 붙여 활용할 수 있었다. find 명령어 옵션이 많기 때문에, 필요한 거를 찾아 가져다 쓰는 게 중요한 것 같다. 그리고 human-readable 조건을 만족시키는 옵션은 다른 옵션과 달리 명확하게 제시되지 않아서 조건을 빼고 작성하였다..
# Level 6 -> Level 7
문제를 보면, 서버 어딘가에서 세 가지 조건을 만족하는 저장된 비밀번호를 찾는 게 목표이다. 우선 grep에 대해서 알아보면, 입력으로 전달된 파일의 내용에서 특정 문자열을 찾고자할 때 사용하는 명령어이다. 지금 문제에서 어떻게 사용할지 감이 안 온다. 일단 ls를 통해 파일과 폴더를 확인했는데 아무것도 없고, ls -a로 확인해봐도 아무정보 없는 폴더만 있었다. 그래서 파일이 어디있는지 모르기 때문에 cd / 를 사용하여 최상위 디렉토리로 이동했다. 그리고 ls로 확인하면 다양한 폴더가 있음을 알 수 있었다. 그래서 find로 찾아 봐야했는데 잘 모르겠어서 find에 대해 알아봤다. find를 통해 해당 user나 group에 해당하는 파일 및 폴더를 찾을 수 있음을 알 수 있었다. 문제에 주어진 세 가지 조건을 만족시키기 위해, find -user bandit7 -group bandit7 -size 33c 으로 작성하여 문제를 풀 수 있었다. 여러 파일이 나와서 bandit7.password를 직접 찾았는데, 이때 grep을 사용했으면 더 편하게 구할 수 있을 거 같다.
# Level 7 -> Level 8
문제를 보면 millionth 단어 옆에 있는 data.txt 파일에 있는 password를 찾는 게 목표다. ls를 통해 보니 data.txt파일이 있어서, cat으로 파일 내용을 봤는데 정말 계속 내용이 많이 나와서 그냥 창을 끄고 다시 했다. grep이 특정 문자열을 찾고자 할 때 사용하는 명령어였으므로, grep에 대해서 더 알아보았다. grep 명령어 옵션이 많았는데, 문제에서 필요한 건 data.txt에서 millionth를 검색하는 것이므로 grep "millionth" data.txt 를 통해 문제를 해결할 수 있었다.
# Level 8 -> Level 9
문제를 보면 한 번만 나온 data.txt에 있는 문자열을 찾는 것이 목표임을 알 수 있다. 우선 data.txt 내용을 봤는데, 한 번만 나온 정보를 찾기는 힘들었다. 문제에 제시된 내용 중에 uniq가 한 번만 나온 내용을 찾는 데에 도움이 될 거 같아서 알아보았다. uniq -c 는 중복된 값을 제거하지 않고 카운팅을 한다. 이 옵션은 한 번만 나온 내용을 확인하는 데에 도움이 될 거 같아서 사용하기로 했다. 그리고 바로 아래의 값과 다르면 중복이 안 됐다고 판단해서, uniq를 사용하기 전에, sort를 해줘서 중복된 내용이 같이 있게끔 해주었다.
즉, cat data.txt | sort | uniq -c 를 입력해주어서 1번만 나온 내용을 찾아서 문제를 풀 수 있었다.
# Level 9 -> Level 10
문제를 보면 주어진 조건에 맞는 data.txt에 저장된 password를 찾는 게 목표이다. 우선 data.txt 파일 내용을 cat으로 확인해봤는데, 뭔지 모르겠지만 창이 계속 저절로 꺼져서, 조건에 =가 앞에 있는 문자열을 찾고 있으니까 grep = data.txt (data.txt 파일에서 =로 시작하는 줄을 출력)를 통해 확인하였다. 근데 Binary file이라고 나왔다. 그래서 검색을 해봤다. binary처럼 cat이나 vi와 호환이 안 되는 파일을 읽고 싶을 경우에 strings를 사용하면 된다는 걸 알게 됐다. 그래서 strings data.txt | grep = 를 입력함으로써 조건에 맞는 내용을 출력했다. 조건을 보니까 several '='이라고 했으므로, =가 2개 이상인 문자열을 보니 password를 알 수 있었다. 앞에서 입력할 때, =로 입력하지 않고 ==로 입력했으면 정보를 찾기 더 쉬웠을 것이다.
# Level 10 -> Level 11
문제를 보면 주어진 조건에 맞는 data.txt에 저장된 password를 찾는 게 목표이다. 문제에서 base64 encoded data라고 했으므로, decode하는 법을 검색해봤다. base64 -d 를 통해 디코딩을 할 수 있다. 반대로, 디코딩 옵션을 안 넣으면 엔코딩을 하게 된다. 나는 디코딩을 해야 하므로, base64 -d data.txt 를 입력해줘서 문제를 해결할 수 있었다.
# Level 11 -> Level 12
문제를 보면 조건에 맞는 data.txt에 있는 password를 구하는 게 목표다. 근데 그 조건을 이해를 못하겠어서 좀 알아봤다. rotated by 13 positions를 못했는데, 이는 ROT13으로 알파벳에서 문자 뒤의 13번째 문자로 문자를 대체하는 간단한 문자 대체 암호임을 알 수 있었다. tr은 문자를 변경하거나 삭제할 수 있다. 예를 들어서 tr 'a-z' 'A-z' 를 입력하게 되면 소문자를 대문자로 바꿔지게 된다. 이처럼 문자 뒤의 13번째 문자로 대체하려면, tr 'A-Za-z' 'N-ZA-Mn-za-m' 을 해야 한다. 이때 알파벳은 26개임을 통해서, 한 번 더 13번째 문자로 대체하면 원래 문자로 돌아오게 됨을 알 수 있다. 그래서 cat data.txt | tr 'A-Za-z' 'N-ZA-Mn-za-m' 을 입력함으로써 문제를 풀 수 있었다.
# Level 12 -> Level 13
문제를 보면 data.txt에서 password를 찾아내는 것이 목표이다. 이때 data.txt는 hexdump of a file이라는데 뭔지 모르겠어서 알아봤다. hex dump는 램 또는 파일이나 저장장치에 있는 컴퓨터 데이터의 십육진법적인 보임새이다. 그래서 상응하는 아스키 코드를 변환해서 보여주는 hexdump -C 를 통해서 봤지만 도움되는 정보가 없었다. 그래서 문제에서 권유하는 파일 만들어서 복사하는 방식을 따라해봤다. mkdir /tmp/myname123 을 한 후에, cp data.txt /tmp/myname123 을 해줬다. mkdir은 원하는 이름으로 디렉토리를 생성하게 해주는 명령어이고, 뒤에 디렉토리 이름을 인자값으로 붙여서 사용한다. 그리고 cp는 파일을 복사해서 다른 파일을 생성하는 것인데, 내가 한 경우는 앞에 파일이 오고 뒤에 디렉토리가 오는 경우로 파일을 디렉토리 안에 복사하게 된다. 이렇게 해서, myname123으로 이동해서 파일 및 폴더를 봤는데 data.txt 하나만 있지 않고 여러개가 있었다. 그래서 우선 data.txt를 확인했는데 앞서서 본 내용이랑 똑같이 별 정보가 없었다. 그래서 파일을 그냥 차례대로 열어봤는데, data8.bin에 password가 있었다. 이를 통해 문제를 풀 수 있었다. 아마도 data 파일이 압축데이터여서 그랬던 거 같다.
# Level 13 -> Level 14
문제를 보면 private SSH key를 이용해서 다음 레벨로 가는 것이 목표이다. password를 찾는 게 목표였는데 달라져서 더 어렵게 느껴졌다. 일단 sshkey.private를 확인해 봤는데 모르겠었다. 그래서 private key를 통해 로그인 하는 방법을 알아봤다. 키가 별도의 저장경로에 설치했다면 -i 옵션으로 경로를 지정해서, ssh -i <key file path> <remote host address> 를 입력해서 접속할 수 있다. 그리고 문제에서 localhost를 언급한 점을 참고해서, ssh -i sshkey.private bandit14@localhost를 입력해줘서 문제를 풀 수 있었다.
# Level 14 -> Level 15
문제를 보면 현재 비밀번호를 port 30000에 제출하여 password를 구하라는 것 같다. 우선 전 단계에서 알려준 정보를 이용해서 cat /etc/bandit_pass/bandit14를 통해 현재 비밀번호를 알아냈다. 그리고 telnet <서버이름> <port> 를 통해 해당 포트에 연결할 수 있다는 점을 통해, telnet localhost 30000을 입력해줬다. 그리고 현재 비밀번호를 입력해서 다음 비밀번호를 알아냈다.
출처 : 문제사이트 https://overthewire.org/wargames/bandit/
'해킹 > 웹해킹' 카테고리의 다른 글
9주차 과제_LFI (1) | 2021.02.11 |
---|---|
8주차 과제_bandit 워게임(2) (0) | 2021.02.01 |
6주차 과제_CSRF 강좌 정리와 XSS 문제 풀이 (0) | 2021.01.04 |
5주차 과제 2_XSS 관련 문제 풀이 (0) | 2020.11.30 |
5주차 과제 1_XSS 강좌 정리 (0) | 2020.11.30 |