Linux/bandit wargame

bandit wargame(level 0 ~ level 11) ... 24.09.15 공부 임시저장

cheonjaehacker 2024. 9. 16. 08:20

bandit wargame을 시작해보자.

 

 

level 0

# ssh [사용자아이디]@[접속서버주소] 

-p ==> 접속 포트

요렇게 접속해서 알려준 비밀번호 bandit0를 넣었다!

 

그러니

뭐 이런저런 가이드를 알려주고~

bandit0@bandit에 연결된 것을 확인 가능하다!

 

 

 

 

=> level 1

반딧 홈페이지에 뭐 readme 라는 파일이 홈디렉토리 안에 있을거다.

거기 비번이 있다길래 파일 확인하고 열어보았다.

이 비번을 bandit1 계정으로 들어갈 때 사용하면 된다고 한다. 

 

비번을 복붙했더니~!

bandit1 사용자로 접속했다! 이렇게 푸는거인듯?

 

 

 

 

=> level 2

홈 디렉토리를 확인했는데 - 파일이 있길래 열어보려했는데..?

안열린다 왜 안열리지...

 

곰곰히 생각해보다가 혹시 숨겨진파일이 있나?

있다!!

 

도저히 모르겠다 알아봤더니~

- 파일을 열어서 비밀번호 획득!

 

[참고]

이렇게 파일명에 -가 들어가면 명령어의 옵션과 헷갈려서 스택 오버플로우? 가 일어남.

방법1) ./- 

방법2) -- - 

둘다 파일을 나타내는 것이다.

추가 설명하자면 방법 1은 파일의 상대경로를 활용한 거고

방법2는 파일명 자체를 지칭한다. 리눅스에서는 -- -file 이런식으로 -file 이름을 가진 파일을 만든다.

 

[+추가]

알아보았더니 -(대쉬)만 적어주면 STDIN(스탠다드 인풋) to STDOUT(스탠다드 아웃풋)

즉, 키보드로 입력 받고 그대로 출력하겠다!

그래서 cat - 를 하면 입력하는 값 그대로 출력해주는 것.

 

 

 

 

 

 

==> level 3

 

폴더를 확인했더니 띄어쓰기가 포함된 파일이 있었다.

띄어쓰기가 들어간 파일은 이렇게

방법1) " "을 통해 문자열로 표시

방법2) '\ ' 백슬래쉬 + 스페이스바를 통해 띄어쓰기를 표현한다.

 

 

 

l

 

==> level 4

 

요건 쉽다

확인해보니 어떤 폴더가 있었고 그 폴더 내부에 파일이 없다?

숨겨진 파일이 있나 확인!

Hiding 뭐시기를 열었더니 비밀번호 획득!

 

 

 

 

 

==> level 5

 

폴더 내부에 파일들이 10개 있었다.

풀때는 하나하나 손으로 열었는데 말고 방법이

1) file ./* | grep "ASCII" 를 통해 아스키코드인 파일을 찾았다.

2) bash 스크립트로 할 수 있다는데 이건 나중에 자세히 알아보자.

 

..ㅅㅅ발 쓰던거 다 날라갔네.

레벨 5까지 풀었고 나중에 다시 정리하자.

 

 

==> level 6

 

상당히 어렵다.

파일이 많은데 이 중 어떤 파일이 비밀번호인지 모르겠다. 텍스트도 굉장히 많음.

홈페이지에 가보니 

-사람이 읽을 수 있고

-1033 바이트 

-실행 불가능.

이런 조건이 나온다.

모르겠다...

아 ㅋㅋㅋㅋ

 

# find -size (+,-)[파일크기]

+ ==> 입력한 크기 이상     /      - ==> 입력한 크기 이하

둘다 안쓰면 입력한 크기인 파일을 찾는다.

 

파일 크기가 1033 이라는 것을 통해 찾을 수 있었다.

find ./ -size 1033c 

여기서 c는 바이트를 의미하는 듯. c 없이 검색하니 안나옴

삽질 열심히 하다 c 붙여서 찾았다.. 참고로 find 할때는 저 * 안적어도됨.

 

성공..했다.. 후..... 내멘탈 ㅋㅋ 내 기록 다 날라갔다~ 

 

[+추가]

# find ./ -type f -size 1033c !-executable

=> 느낌표를 붙여서 실행가능한 파일이 아니다! 라고 알려주는 거임.

 

 

 

 

 

==> level 7

 

이번 문제는 조건이

-사용자 bandit7이 소유

-그룹 bandit6가 소유

-사이즈는 33바이트

 

흠 find로 찾을 수 있을 듯?

# find / -size 33c -user bandit7 -group bandit6

 

뭔가 주르륵 나와서 다 확인해봤는데 죄다 Permission denied라고 뜬다.

흠 내가 못찾은 건가? Permission denied 를 제외하고 출력하고 싶다.

아하! 리다이렉션!

 

# find / -size 33c -user bandit7 -group bandit6 2> /dev/null

캬 찾아버렸다. 리다이렉션으로 오류메세지 지우기!!!

 

 

 

 

==> level 8

 

이번 문제 비밀번호는 data.txt 파일에서 millionth 옆에 있다고 한다.

# cat data.txt | grep "millionth"

 

ps. 뭔가 워게임인데 그냥 리눅스 기본기를 테스트하는 느낌? 해킹느낌은 아닌듯하다.

 

[+추가]

vi editor로 명령모드에서 "/"로 찾는거 알지~?

 

 

 

==> level 9

 

이번에도 data.txt 파일에 있는데

단 한번만 나타나는 텍스트가 비밀번호란다. 즉 반복되는 텍스트는 제외하고 검색해야 하는듯.

 

이번엔 뭔가 새로운 명령어가 필요할 것 같아서 알아봤다

# sort [파일 이름] 

 => 해당 파일의 내용을 정렬한다. 옵션이 지정되지 않으면 순서는 공백, 숫자, 소문자, 대문자 순.

Options

  • 위치 지정 옵션
    • -k: key를 기준으로 정렬
    • -t: 필드 구분자로 데이터 컬럼을 나눠줌(기본 값은 공백)
  • 정렬 기준 옵션
    • -f: 대소문자 무시
    • -g: 일반 숫자 정렬
    • -n: 숫자 정렬
    • -r: 내림차순 정렬
    • -u: 정렬 후 행이 같을 경우 중복 제거

여기서 -u는 중복을 제거하고 하나만 남김!!

 

# uniq [파일 이름]

 => 중복되는 내용의 행이 연속으로 있으면 하나만 남기고 삭제한다. 

***중요 : 단, 이어진 중복만 제거하므로 sort로 정렬 후 사용해야 모든 중복 제거 가능!

Options

  • -d: 중복된 내용만 출력
  • -u: 고유한 내용만 출력
  • -i: 대소문자 무시

 

요 두가지 명령어를 조합해서

# sort data.txt | uniq -u

단 하나만 남았다.

 

다른 사람은 

메타스플로잇을 이용해서 사전 기반 브루트포싱 공격(Directory Brute Force Attack)을 가해준다.

 

뭐 이렇게 결과를 뽑았다는데 흠.. 나중에 자세히 알아보자.

 

 

 

 

 

 

==> level 10

 

요번 문제는

data.txt에 있고 사람이 읽을 수 있는 약간의 문자열로 이루어져있고. 앞에 "=" 문자 여러개가 있다고 한다.

실제로 열어보니 파일이 대부분 깨져있는듯 하다.

 

# cat data.txt | grep "="

요렇게 바이너리 파일은 읽을 수 없다고 한다.

그럼 바이너리 파일을 무시하는 옵션이 있나?

-I 옵션 : 바이너리 파일과 같은 것은 매치하지 않는다!

 

??? 근데 아무것도 안뜬다?

알아보니 -I는 디렉토리에서 파일을 검색할 때 바이너리 파일은 무시한다는 뜻이었다. ㅠㅠ

 

# cat data.txt | grep "=" --text (or -a) 

바이너리를 텍스트로 간주한다는 옵션을 넣고 돌렸는데

요상한게 잔뜩...

그와중에 비밀번호 같을것을 찾긴했는데 뭔가 찜찜하다.. 문제를 제대로 안푼 느낌.

 

알아보니 새로운 명령어 발견!

# strings [파일 이름] 

 => 특정 바이너리파일에서 문자열만 추출한다!!

오호 이런게 있다니 바로 써먹어.

잡았죠? ㅋㅋ strings 최고!

 

 

 

 

 

==> level 11

 

이번에도 data.txt 안에 있는데 base64로 인코딩된 데이터로 포함되어 있다네요.

하나하나 알아봅시다.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

인코딩이란? 

 => 정보의 형태나 형식을 표준화, 보안, 처리 속도 향상, 저장 공간 절약 등을 위해서 다른 형태나 형식으로 변환하는 처리     혹 은 그 처리 방식

base64는?

 => 말그대로 64진법. 

 => 핵심은 base64 Encoding은 Binary data를 Text로 변경하는 Encoding.

요게 base64 표.

변경하는 방식은 binary data를 6bit씩 자른 뒤 6bit에 해당하는 문자를 위 색인표에서 찾아 치환한다!

(실제로는 padding을 더한다는데 잘 모르겠음)

 

ASCII에 대해 알아보자.우선 컴퓨터는 1bit (0과1) 의 정보를 저장하고 이를 묶어서 8개의 bit로 1byte를 사용한다.컴퓨터가 데이터를 저장하는 최소단위 == byte여기서 아스키 코드는 7bit 단위의 인코딩으로 33개의 제어문과 95개의 문자들로 총 128개로 이루어져있다.

ASCII Code 사진 출처 https://shaeod.tistory.com/228

이렇게 128개의 숫자, 영어 대소문자, 특수기호로 이루어져있다.

==> 이를 통해 1byte로 위 문자들을 처리할 수 있다!

 

여기서 가끔 이상한 기호들을 볼 수 있는데 

이는 유럽어와 추가 특수문자를 표현하는 코드가 128개 더 있기 때문이다.

ASCII Code 사진 출처 www.asciitable.com

ASCII는 이렇게 1byte 내에서 해당 문자들을 2진 데이터로 저장한다.

 

base64에 대한 이해

예를 하나 들어보자. 만약 Hack 라는 문자는 컴퓨터에서 어떻게 표현될까?

아스키표에서 72 97 99 107에 해당한다.

이를 이진데이터로 변환해볼까?

 

깨알 리눅스 10진법 => 2진법 변환법!

echo "obase=2; [변환할 숫자]" | bc ==> 이렇게 해서 얻은 결과

여기서 8bit 데이터니 앞에 0을 붙여주면~

01001000 01100001 01100011 01101011

컴퓨터가 문자 "Hack"을 저장한 모습이다.

 

아까 base64는 이진데이터를 6bit씩 자른다고했다. 위 데이터를 6bit씩 자르면? 

010010 000110 000101 100011 011010 11

??? 마지막에 6자리가 아니라 남잖아??? 그래서 아까 말했든 padding 즉, 말그대로 '불필요하게 넣은 군더더기'가 들어감.

010010 000110 000101 100011 011010 110000

이렇게 0으로 채워서 6bit로 만든다. 

이는 18 6 5 35 26 48 이고 이를 base64 표로 바꾸면?

SGFjaw 가 된다. 여기서 Hac k--이므로 2개의 빈공간이 있음을 알려주기 위해 패딩문자를 추가!

SGFjaw== 가 최종적으로 base64 encoding의 결과물이다!

 

정리하면 "문자열 => ASCII binary => 6bit cut => base64_encode"로 base64 encoding이 진행된다.

결론적으로 말하면 문자열을 문자열로 인코딩하는거다. ㅋㅋ

 

[참고]

base64를 사용하는 이유는 ASCII가 데이터를 전달하기에 안전하지 않다고 한다! 자세한 내용은 나중에 알아보자~

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

자 다시 문제로 돌아와서.

요놈이 base64로 인코딩 되어 있다는거지?

 

# base64 [파일 이름] 

 => 해당 파일을 base64 encoding 하라!

 -d 옵션 : 해당 파일을 decoding!

 

우리는 인코딩된 데이터를 디코딩해야하니까~ -d 옵션을 넣고 비번 획득!

 

이번 문제는 배운게 정말 많은 듯하다 컴퓨터의 문자처리 방식부터 궁금했던 base64까지 !

중요한 명령어 base64랑 10진법 => 2진법으로 만드는  echo "obase=2; [변환할 숫자]" | bc !!

꼭 익혀두자.

 

 

 

 

 

==>level 12

data.txt에 대문자와 소문자가 rotated by 13 positions 되어 있다고 한다.

무슨말일까.. 13칸씩 순환되어있다?

그러면 소문자 대문자가 각각 13칸씩 옮겨져 있다는 말 같은데.. 이걸 어떻게 명령어로..?

힌트에 위키피디아 Rot13이 있길래 읽어보았다.

Rot13

 단순한 카이사르 암호의 일종.

 영어 알파벳을 13글자씩 밀어서 만듬.

 가장 단순한 암호화 방식? 이라고 합니다.

 

새로운 명령어

# tr SET1 [SET2]

ex. echo 'linuxize' | tr 'lin' 'red'

# reduxeze 

각각 l -> r, i -> e, n->d 로 바뀐다.

 

echo 'linuxize' | tr 'lmno' 'wxyz'

이렇게 연속적으로 바꾸는 경우 범위를 지정할 수도 있다.

echo 'linuxize' | tr 'l-n' 'w-z'

이렇게.

 

-c : SET1의 문자를 제외한 모든 문자를 SET2의 마지막 문자로 바꿈.

-d : SET1의 문자를 제거.

-s : 반복발생 시퀸스를 SET1의 마지막 문자로 대체..?

-t : SET1을 SET2 길이로 자름 (뭐라노.)

 

여튼 이걸 사용해서

tr 'A-Za-z' 'N-ZA-Mn-za-m' 이렇게하면 13칸씩 밀수 있다.

예를 들면

 $ echo "Or fher gb qevax lbhe Binygvar" | tr 'A-Za-z' 'N-ZA-Mn-za-m'

 

성공!

 

이번에는 새로운 명령어 #tr을 통해 패턴을 통한 암호화/복호화? 인코딩/디코딩? 방법을 배웠다.

익혀두자. 

 

오늘 공부는 여기까지..(9/15)

bandit12 passwd:7x16WNeHIi5YkIhWsfFIqoognUTyj9Q4