Linux/bandit wargame

bandit wargame (level 13 ~ level 21) ... 24.09.17~18

cheonjaehacker 2024. 9. 18. 23:15

==> level 13

 

동일하게 data.txt에 비번이 있고

hexdump 파일로 되어있다고한다. 또한, 파일이 여러번 압축 되어있다고 알려준다.

 

여기서 새로운 명령어를 배워보자.

# xxd [파일명] 

 =>해당 파일을 16진수(hexdump)로 보여라!

이렇게 파일을 16진수로 변환해서 출력한다!

 

여기서 우리가 사용할 것은 옵션 -r 

 => hexdump를 binary로 바꿔라!

이렇게 바이너리 파일로 바꿔준다. 그럼 이 파일이 압축되어있다고 했으니

어떻게 압축되어있는지 알아보자.

 

오호 gzip? 으로 압축되어있다고 한다.

 

gzip?  ( .gz)

 => GNU zip의 준말로 리눅스, 유닉스 계열 운영체제에서 사용된다.

 => DEFLATE 알고리즘을 따른다고 한다. (이 부분은 파일 압축에 관해 공부할 때 따로 알아보자)

우리에게 필요한건? gzip 압축을 푸는 방법!

 

#gzip [파일명] 

 => 파일을 gzip으로 압축하라!

-d 옵션 : decompress의 약자로 압축 풀기

 

[+추가] # gunzip [파일명] => 이렇게 압축해제도 가능!

 

[참고]

gzip 은 확장자를 .gz 로 바꿔줘야 # gzip 명령어가 실행된다.

아니면 unknown suffix -- ignored 라고 뜸.

 

이렇게 에러가 뜨길래 mv로 파일 확장자를 .gz로 변경 후

파일압축을 풀었다. (풀었더니 확장자도 사라진다. 참고할 것)

 

다음은 bzip2..?

 

bzip2? ( .bz) 

 => gzip과 동일하게 단일 파일을 압축

 => gzip보단 높은 압축률을 보여준다고 함.

 

# bzip2 [파일 이름]

 => 파일을 bzip2로 압축하라!

-d 옵션 : 압축 풀기

-c 옵션 : gzip 명령 결과 출력.

 

풀리긴 했는데 원래이름을 못쓴다고 data2.out으로 바꿔버렸다.

 

 

이번엔 tar??

 

tar?

 => tar은 아카이브 파일. 즉, 하나의 파일이 아닌 여러파일이나 디렉토리를 하나로 묶은 것을 말한다.

 => 한국에선 이걸 압축 파일이라 부르지만 실제로는 압축되는 것은 아니고 여러개를 묶은 거라고 말한다.

   => 그래서 .tar.gz/ .tar.bz / .tar.xz 등 압축이 가능하다.

 요런 모양

 

#tar [파일명]

 => 해당파일을 tar 아카이브로 묶어라!?

사실 tar에는 엄청 많은 옵션이 있지만 그중에서 자주쓰는 옵션 조합을 조사했다.

 

1.tar로 묶기                     # tar -cvf [파일명.tar] [디렉토리]

2.tar로 풀기                     # tar -xvf [파일명.tar]

3. tar.gz로 압축하기        # tar -zcvf [파일명.tar.gz] [폴더명]

4. tar.gz로 압축풀기        # tar -zxvf [파일명.tar.gz]

 

이렇게 tar로 묶인 파일을 풀어보았다. 한번 더 묶여 있길래 풀었는데 

tar은 .tar 확장자로 안바꿔줘도 명령어에서 오류 메세지가 뜨진 않는듯 하다.

 

 

 

결국 gzip, bzip2, tar로 묶인 파일을 풀었더니 

아스키 파일이 나왔고 비밀번호 획득!

 

[결론]

이번 문제는 파일의 압축을 푸는 방식(gzip, bzip2, tar)와 데이터 형식(hexdump)을 배울 수 있었다.

***특히 확장자명을 바꾸는 것***

=> 이것이 굉장히 중요하다는 것도 배울 수 있었다. 

 

 

 

 

 

 

 

==> level 14

이번에 비밀번호는 /etc/bandit_pass/bandit14 에 있다고 하는데.. 이건 사용자 bandit14만 읽을 수 있다?!

그래서 이번에 비밀번호는 얻을 수 없고 private SSH key를 통해 다음 레벨로 넘어갈 수 있다고 한다.

 

흠...

 

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

대칭 암호 / 비대칭 암호

*대칭 암호

 => 암호화, 복호화 모두 사용하는 키가 똑같은 암호

 => 대칭키

*비대칭 암호

 => 암호화, 복호화할 때 사용하는 키가 서로 다른 암호

 => A / B

   => 하나는 암호화, 하나는 복호화할때 쓰는 키.

   => 한 가지는 공개, 한 가지는 비밀로 자기 자신만 들고 있음.

     ==>>공개키/비밀키

 

ssh..?

                           

client                =======>                     ssh

비밀키                                                   공개키

 

 

1. 원래는 아이디와 비번을 줌.

2. 근데 매번 비번 주기 싫어. Key로 줄게. 

암호 보냈더니 hi~ im hacker~! 복호화 하니 오호 너 비밀키 갖고있는거 맞구나!

이렇게 비대칭 암호를 증명.

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

 

ssh 비밀키 사용법!

 

# ssh -i [비밀키] [ssh주소]

 

입력했는데 안되길래 포트까지 설정해서 보냈다.

여기서 localhost로 할 수 있는 이유는 현재 bandit~에 접속중이기 때문!!!

root 계정이었으면 주소 싹다 쳐야됨*****

 

이렇게 bandit14만 볼 수 있는 비밀번호 획득!

 

 

 

 

 

 

==> level 15

이번에는 30000포트 localhost에 현재단계의 비밀번호를 치면 다음 단계 비번을 얻을 수 있다고 한다.

 

흠..?

이게 아닌가...

 

다시 알아보니 localhost에서 30000포트에 현재 비밀번호를 전달할 수 있냐? 를 물어보는 문제라고 한다.

 

여기서 새로운 명령어가 나오는데

# nc [시스템 주소] [포트 번호]

 => nc, netcat의 약자로 TCP or UDP 프로토콜을 사용하여 네트워크에 연결해서 데이터를 읽고 쓸 수 있는 유틸리티!

 => 클라이언트-서버 애플리케이션을 만들고, 파일을 전송하고, 포트를 스캔하는 등 작업에 사용됨.

옵션이 몇개 있긴한데 다음에 정리할게요...

 

[+추가] TCP 프로토콜은 데이터를 텍스트 그대로 보낸다고 합니다.

그래서 스냅핑? 같은걸 해서 낚아채면 데이터를 그대로 들여다 볼 수 있습니다.

이렇게 30000포트 로컬호스트에 데이터를 전달해서 비밀번호 획득!

 

 

 

 

 

==> level 16

이번에는 30001 포트에 현재 레벨의 비밀번호를 전달하는데

SSL/TLS 암호화로 보내라! 는데... (그게 뭐노)

...네트워크 공부가 필요하다...

 

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

nc는 TCP프로토콜로 데이터를 그대로 보냄. ==> 보안 문제.

 

SSL?

=> 과거에는 데이터를 암호화 없이 보내서 누구나 가로채면 읽을 수 있었음. => 보안 이슈 발생!

 ==> 정보 보호, 인증, 데이터 무결성을 위해 Netscape가 처음 SSL을 개발했다네요.

 

TLS?

=> TLS는 SSL의 업데이트 버전~ (Netscape가 참여하지 않아서 소유권 문제 때문에 이름 변경 ㅋㅋ)

 => 결론 TLS는 SSL의 업데이트 버전. 이름만 다름 ㅋㅋ

 

작동방식 뭐 핸드쉐이크 키교환 데이터 전송... 뭐 많이 나오는데 나중에 알아볼게~

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

 

openssl?

# openssl s_client -connect localhost:30001

 ==> 이렇게하면 나를 클라이언트로 지정하고 로컬호스트의 30001 포트에 암호화로 연결한다고 알림!

 ==> 이제부터 정보가 암호화해서 날라감.

 

막 뭐라뭐라 뜬다.

 

입력창이 있길래 현재 비번 줬더니 다음 비번을 알려줬다.

 

새로운 명령어를 배웠다고 생각합시다. 네트워크는 천천히 정리해보죠.

 

 

 

일단 오늘은 여기까지.. 비번은 kSkvUpMQ7lBYyCM4GBPvCvT1BfWRy0Dx

 

 

 

 

 

==> level 17

 

[+추가] 리눅스 정규 표현식..?

=> 정규 표현식은 특정 규칙을 가진 문자열의 집합을 표현하는 언어. 주로 문자열 패턴, 문자열 치환을 위해 사용.

grep 주로 과 같이 사용됨

 

대표적으로

 1. grep '[0-9]' ==> 0-9까지 숫자범위 지정(알파벳도 가능)

 ~~~~> 근데 여기서 더 범위를 늘리고 싶다? => egrep "[3][0-1][0-9][0-9][0-9]"  ==> 30000~31999 사이의 숫자 확인.

        ==> egrep은 확장 정규표현식을 사용하기 위해. 쓰임(== grep -E)

 2. grep 'a \ {2\}' ==> a 문자가 2번 연속반복.

    -> grep 'a \ {2,\}' ==> a문자가 2번 이상 반복.

    -> grep 'a \ {2, 4\}' ==> a문자가 2번 이상 4번 이하로 반복

 

# netstat ?

 => 네트워크 접속, 라우팅 테이블, 네트워크 인터페이스의 통계 정보를 보여주는 도구

# netstat {옵션}

-nap : 연결을 기다리는 목록과 프로그램 출력

-l  : LISTEN중인 목록 출력

 

위에 두개를 조합해서

이렇게 3개의 포트를 찾았는데 모두 SSL로 연결이 안된다.

 

 

daemon 

 => 백그라운드에서 자동으로 작업을 하는 프로그램?

 => 특정 이벤트가 발생하면 실행됨.

 

# nc

-z 옵션 : 어떤 데이터도 전송하지 않고 리스닝 상태의 daemon을 확인.

검색해서 추가로 31518, 31790 포트를 찾았는데 SSL로 연결은 되지만 

KEYUPDATE라는 쓸데없는 말만 보낸다.. 뭔 키가 업데이트여...

 

 

 

# nmap ?

 ==> 유~명한 네트워크 스캐너. 앞으로 보안공부할때 주로쓰일거임

이번에 사용할 옵션은 -p : 포트를 검색.

동일한 포트만 찾아냈다.. 흠 더 모르겠다...

 

알아보니 SSL이라 TCP로 검색을 갈겼다고 한다.

그리고 각각 SSL을 사용하는지 손수 대입했다는데

 

아 알아보니 문제에 오류가있다고

SSL 연결할때 -ign_eof 를 입력하면 비밀번호를 얻을 수 있다고 한다!

이렇게 얻었다.

 

[+추가] 

# nc -nv -w 1 -z 127.0.0.1 31000-32000 2>&1 | grep succeeded

 => -nv 자세히 보겠다. -w 워크 타임. -z 위에서 배웠죠? ㅎㅎ

localhost == 자기 자신 == 127.0.0.1

흠 나중에 알아보죠 ..

 

 

????? 왜 키로 파일을 만들려는데 안만들어질까

나한테 파일을 편집할 권한이 없다..? (홈 디렉토리라고 파일 w권한 있는건 아님)

그러면 누구나 파일을 만들 수 있는 /tmp 로 고고!

 

연결 시도했는데?

왜 안될까..?

알아보니 잘못된 permission(권한)으로 ssh 로그인을 접속하려했기 때문!

해결 방법은 permission을 private key로 바꾸면 된다.

 

# chmod 600 (644로 되어있던 권한을 변경!)

 

... 알아보니까 RSA키를 bigin 부분 부터 end까지 싹다 복사해야한다.. 이걸 몰랐다. 여튼 성공~

/etc/bindit_pass 에 비번있다!

오케이!

 

 

 

==> level 18

이번에는 두개의 파일이 있는데 

passwords.new 에 비번이 있고 passwords.old와 딱 한 부분이 다르다고 한다.

흠 어떻게 비교할까?

 

내가 생각한 방법은 이거다.

두 파일을 하나로 합쳐서 

sort | uniq -u 를 통해 유일한 부분을 찾는 것!

두개의 코드를 찾았고 둘 중 하나는 비밀번호일 것이다!

 

했는데.. 두번째 코드를 입력하니

ByeBye 라고만 뜨고 접속이 안된다.. 왜일까....

 

[+추가]

# diff [파일1] [파일2] 

=> 보통 소스코드가 업데이트 되었을 때 업데이트 된 부분이 무엇인지 알기 위해서 사용! 

 

파일의 몇번째 줄이 달라졌는지 나오고

윗부분이 파일1 아랫부분이 파일2 

즉 => 윗부분이 비밀번호다~

 

==> level 19

음.. 비번은 홈디렉토리에 있다!!! ?? 개꿀

그런데 누가 .bashrc를 바꿔놔서 로그인을 시도하면 로그아웃되게 만들었다.. (누구야 ㅅㅂ)

 

.bashrc는 bash가 수행될때 지역 시스템 설정과 관련된 파일. 

즉 함수는 오직 해당 사용자에게만 한정. 다른 사용자에겐 영향x

 

=> /bin/bash 

 => bash라는 쉘이 실행될 때 .bashrc라는 스크립트가 실행되게 하는 것!

즉, 누군가가 echo "ByeBye~!"

                     exit

 스크립트를 넣어둔것.

 

그럼 이번문제는 bandit18에 로그인해야 풀 수 있다네요.

맨 뒤에 command 보이시나요?

원래 ssh 특정 command 없이 명령하면 그냥 ssh에 연결됨.

하지만 command를 입력하면?

이렇게 비밀번호를 입력하니.. byebye 가 뜨는게 아닌 bandit18 사용자의 id 명령어가 실행됨!

그렇다면???

 

이렇게 bandit18 홈디렉토리에 readme가 있는 것을 확인!

 

성공!

 

이번 시간은 굉장히 유용했다.

ssh에 커맨드를 입력해서 원하는 명령만 실행할 수 있다니.

마치 쉘을 취득하는 느낌?

이점을 악용하면 여러방면에서 활용 가능할 것 같다.

 

[+추가] 진짜 쉘을 취득할 수 있다?!

==> 만약 당신이 해커라면 어떤 서버가 단 하나의 명령어만 들어준다면 어떤 명령을 내리겠는가?

 ====> 일반인: 음.. 아 뭐하지... 포트 열어줘??

 ========> 해커: 명령을 무한히 들어주세요. oHhhhhhh

 

마찬가지로 커맨드를 이용해서 내가 그냥 쉘을 열어버리는 거다.

/bin/sh

아무 반응이 없어 보이지만?!

사실 이곳은 진짜 쉘이었다...ㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷ

진짜 쉘을 땄다!!! command에 쉘을 열어줘 라고 요청하니 진짜 쉘을 줬다.

무한히 명령할 수 있는 권한을 줬다!

지리네

 

우리가 배운건.

ssh 는 bash를 기본 쉘로 쓴다. 

.bashrc라는 스크립트로 bash가 실행될 때 해당 스크립트가 실행되게 할 수 있다.

우리는 ssh를 연결할 수 있기도 하고, 명령어를 요청할 수도 있다!

그래서 명령을 들어준다면? 당연히 쉘을 달라고 해야지!

/bin/sh

[의문] 그럼 zsh도 열리나? 음 안되네.. 해당 쉘이 없는 듯하다.

 

 

==> level 20

이번엔 setuid binary 파일을 인자 없이 실행해서 어떻게 쓰는지 알아보고

이 파일은 쓴 후에 비번이 있는 곳(/etc/bandit_pass)를 찾을 수 있을 것이다.

 

뭐 아이디를 치라는데 흠... 잘 모르겠다

 

생각해보고 알아보니.

setuid는 사용자가 어떤 파일을 실행할 때

파일 소유자의 권한으로 실행할 수 있게 해주는 특수 권한이라고 들었다.

여기서 보면 파일 소유자는 bandit20이고 rws SETUID가 적용되어 있는 것을 확인했다.

 

파일을 실행해보니

내가 이 파일을 통해 id를 검색하면 euid=11020(bindit20)

즉 setuid로 bandit20 사용자의 권한으로 실행할 수 있는 것을 확인했다.

 

그럼 아까 배웠던대로? ㅎㅎ 쉘을 따보자ㅏㅏ

자세히 보자. 

보면 그저 bandit20의 권한으로 /bin/sh을 실행했을 뿐

내 현재 디렉토리나 파일은 변하지 않고 bandit19 사용자로도 홈 디렉토리에 들어갈 수 있는 것을 볼 수 있다.

우리가 원하는건? bandit20의 권한으로 침투!

bandit20만 들어갈 수 있는 홈디렉토리에 접근을 시도했더니 성공!

 ==> 즉, 지금 나는 bandit19 사용자지만 해당 setuid binary 파일을 실행시켜서

        bandit20의 권한으로 쉘을 실행시킨 것을 볼 수 있다!!!

 

실제로 눈에 보이는 id는 bandit19지만 

쉘을 실행시킬때 bandit20의 권한으로 실행해서 bandit20처럼 명령어 쓸 수 있다!

그럼 이제 비밀번호를 따러 가볼까?

 

될줄 알았는데 안된다......

곰곰이 생각해보니 사실 setuid는 그 파일을 실행할 때만 권한이 상승된다.

즉, 나는 쉘을 실행시킬때만 bandit20으로 실행한거지 그 후에는 다시 bandit19로 쉘을 이용하는 것이다...?

어떻게 하면 bandit20의 uid를 취득할 수 있을까?

 

흠... 고민하고 알아봤는데 이 파일로 쉘을 취득하는 건 다른 문제인듯 하다.

권한이 있다고 쉘을 주는건 아닌가? 흠.. 모르겠다

 

일단 패스워드를 알아오는 명령을 실행시켰다

성공~. 

 

나중에 setuid로 권한 상승하는 것을 해보고싶다. 궁금하다.

 

 

 

 

 

==> level 21

이번 프로그램은 어려워서 찾아봤다.

A                                              B

usr1                                       usr2

3333                                      1234

연결해서 내 비번 알려주면 연결된 계정의 비번 알려줌.

 

터미널 두개를 열어서

A                                               B

bandit21                                 bandit20

비번 돌려줌                            비번 알려주면

 

[전략]

어떻게 bandit21에 연결하지..?

아하! 그니까 bandit20에서 포트를 열고

bandit21 setuid로 bandit20에 연결시도해서

연결되면 bandit20에서 내 비번을 보내면?

bandit21에서 비번을 돌려줄 것이다!

 

# nc 옵션 정리

-l : listen의 약자. 들어오는 연결을 수신 대기.(open)

-p : 연결을 시작할 때 nc가 사용해야하는 소스 포트 지정.

-v : 네트워크 연결을 디버깅할 때 유용한 자세한 출력 활성화.

-n : nc는 기본적으로 host 이름을 IP주소로 확인하려고 시도. n옵션은 이것을 비활성화하고 IP주소를 직접사용.

-z : 아까배운 데이터 전송없이 연결되는 포트 찾기.

-u : TCP 대신 UDP 프로토콜 사용 지시.

 

bandit20에서 포트를 열 때

# nc -lnvp [포트 번호]

이렇게 열린 모습. setuid로 접속시도.

 

접속했더니 이렇게 서로 입력할 수 있게 연결된 것을 확인.

여기서 bandit20에서 자신의 비번을 보내기.

 

밑에서 보냈더니 자신의 비번을 응답한 모습..? ㅋㅋ

 

이번 문제는 도움없인 풀기 어려웠다...

특히 터미널을 두개 열어서 한쪽에는 포트를 열고 한쪽은 거기 연결하고 하는 작업은 처음이라 신기했다.

생각의 폭이 넓어진듯하다.

 

오늘은 여기까지...  레벨 21비번 EeoULMCra2q0dSkYj561DX7s1CpBuOBt