본문 바로가기

Bandit 원정대

Bandit 원정대 3주차

반응형

Bandit Level 14 → Level 15

Level Goal

The password for the next level can be retrieved by submitting the password of the current level to port 30000 on localhost.

Commands you may need to solve this level

ssh, telnet, nc, openssl, s_client, nmap

 

 

step1. bandit14의 비밀번호가 저장되어 있는 /etc/bandit_pass/bandit14 파일을 열어 비밀번호를 확인하고,

bandit14의 ip주소를 확인한다.

 

step2. nmap 명령어로 해당 ip주소에서 open되어 있는 port를 찾아낸다.

 

step3. 30000port로 telnet 연결을 시도한다.

 

step4. telnet이 연결된 상태에서 bandit14의 비밀번호를 입력하여 전송한다.

전송하고나면 correct! 단어와 함께 다음 단계로 가는 비밀번호를 알려준다.

 

 

 

Bandit Level 15 → Level 16

Level Goal

The password for the next level can be retrieved by submitting the password of the current level to port 30001 on localhost using SSL encryption.

Helpful note: Getting “HEARTBEATING” and “Read R BLOCK”? Use -ign_eof and read the “CONNECTED COMMANDS” section in the manpage. Next to ‘R’ and ‘Q’, the ‘B’ command also works in this version of that command…

 

 

step1. openssl 명령으로 운영중인 웹서버의 ssl인증서 정보를 살펴본다. ip주소는 192.168.101.80 이고

port번호는 30001번으로 설정한다.

- openssl s_client -connect [서버]: [port]

 

step2.접속하면 다음과 같은 인증서 내용이 뜬다.

문제에서 해당 level의 비밀번호를 입력하라고 했으므로 비밀번호를 입력한다.

다음단계로 가는 비밀번호가 생성되었다.

 

 

Bandit Level 16 → Level 17

Level Goal

The credentials for the next level can be retrieved by submitting the password of the current level to a port on localhost in the range 31000 to 32000. First find out which of these ports have a server listening on them. Then find out which of those speak SSL and which don’t. There is only 1 server that will give the next credentials, the others will simply send back to you whatever you send to it.

 

 

step1. nmap 명령으로 31000 에서 32000까지 포트 중에 open되어 있는 포트가 있는지 확인한다.( port scanning)

 

step2. open되어 있는 port에 하나씩 openssl 접속을 시도해보도록 한다.

 

1. 31046 port 실패

 

2. 31518 port 실패

 

3. 31691 port 실패

 

4. 31790 port 성공

 

ste3. 우리가 얻은 RSA private key를 파일형식으로 저장을 해야한다.

임시 파일들을 저장하는 directory인 tmp  디렉토리에 위의 내용을 저장하자

필자는 해당 내용을 /tmp/privatekey라는 디렉토리를 만들고 

해당 내용을 /tmp/privatekey/masterkey 라는 파일에 저장을 했다..

 

step4. 해당 파일은 privatekey(비밀키) 이므로 해당 키를 이용하여 ssh에 접속을 할 수 있다.

전에 사용했던 ssh -i 명령과 옵션을 통해 private key를 사용하여 접속한다.

경고창에 Permissions 0644 for '/tmp/privatekey/masterkey' are too open.

It is required that your private key files are NOT accessible by others. 라고 뜬다.

해당 파일이 private key이지만 너무 open되어 있음을 보여준다.

즉 소유자외에 다른 group 과 etc permission에 접근할 수 있는 권한을 빼줘야된다는 뜻이다.

 

 

step5. 해당 파일로 돌아와서 파일의 permission을 chmod 명령으로 바꿔주도록 한다.

permission을 바꾼 후에 다시 ssh로 bandit17로 접속을 하도록 한다.

 

step6. bandit17 계정으로 로그인을 했으므로 bandit17로 들어오기 위한 password를 찾아야한다.

지난주 level14로 가는 관문에서 /etc/bandit_pass 디렉토리에 banidt level별로 password가 모여있는 것을

확인했다. bandit17에서 자기 자신의 password를 갖는 파일을 찾도록한다.

bandit17에 대한 권한이 있으므로 해당파일을 찾아볼 수 있다.

 

 

 

Bandit Level 17 → Level 18

Level Goal

There are 2 files in the homedirectory: passwords.old and passwords.new. The password for the next level is in passwords.new and is the only line that has been changed between passwords.old and passwords.new

NOTE: if you have solved this level and see ‘Byebye!’ when trying to log into bandit18, this is related to the next level, bandit19

 

 

step1. diff 명령을 이용하여 passwords.old 파일과 passwords.new 파일간의 차이를 찾아낸다.

 

step2. 맨 마지막줄의 kfBf3eYk5BPBRzwjqutbbfE887SVc5Yd 라인이 bandit18로 가는 password이므로

bandit18에 접속을 해본다.

정상적으로 작동하면 byebye라고 문장이 뜨면서 bandit18은 자동 종료된다.

 

 

 

 

 

Bandit Level 18 → Level 19

Level Goal

The password for the next level is stored in a file readme in the homedirectory. Unfortunately, someone has modified .bashrc to log you out when you log in with SSH.

 

bandit18로 ssh 접속이 안되므로 bandit17에서 다시 실행해보도록 한다.

 

 

step1. 경고창에 보면 permissions 0640~이라고 되어 있다 해당 경로 파일로 들어가서 permission을 바꿔본다.

 

step2. 해당 file의 permission을 chmod로 변경하려 했지만 권한이 없어 실패했다.

다른 방법을 사용해봐야한다.

 

step3. ssh를 이용하여 접속을 하려면 어떻게 해야되는지 옵션들을 찾아보았다.

permission이 없는 상황에서 접속을 할 수 있는 방법이 있는지 고민을 했다.

여기서-t 옵션을 사용하도록한다.

-t: pseudo-tty 할당을 강제한다. 즉 강제적으로 /bin/sh을 사용하는 옵션입니다.

cf) /bin/sh 은 로그인 정보들이 저장되어 있는 장소입니다. 즉 /bin/sh을 통해서 강제 접속을 실행하는 것입니다.

 

step4. level17에서 얻은 password를 입력하면 shell 형식이 바뀌게 되고 

이는 bandit18에 강제적으로 접속되었음을 보여줍니다.

여기서 ls -al과 cat readme 명령으로 다음 단계의 password를 찾아내도록 합니다.

 

 

 

Bandit Level 19 → Level 20

Level Goal

To gain access to the next level, you should use the setuid binary in the homedirectory. Execute it without arguments to find out how to use it. The password for this level can be found in the usual place (/etc/bandit_pass), after you have used the setuid binary.

 

 

step1. ls -al로 해당 디렉토리의 파일들을 확인한다. bandit20-do 라는 파일이 보이는 해당 파일을 열어본다.

bandit20-do 파일은 -rwsr-x--- 로 되어있으며 여기서 s 는 set uid가 설정되어 있는 파일임을 확인 할 수 있다.

 

step2. 위의 ./bandit20-do 의 출력 결과대로 ./bandit20-do id를 입력해본다.

여기서 나오는 결과중에 euid=11020(bandit20) 이라는 부분이 눈에 띈다.

setuid 비트를 실행 파일에 적용하면 실제 사용자에서 프로그램 소유자의 ID로 유효사용자가 변경되는 것을 뜻한다.

 

 

step4. /etc/bandit_pass 디렉토리에서 bandit20으로 가는 파일을 확인해보면 user,group 권한 모두 bandit20인 것을

볼 수 있다. 즉 위의 파일권한을 이용하여 우리가 원하는 bandit20 파일을 열어볼 수 있다.

 

step5. ./bandit20-do cat /etc/bandit_pass/bandit20 명령으로 bandit20 파일의 내용을 열어본다.

 

 

 

 

Bandit Level 20 → Level 21

Level Goal

There is a setuid binary in the homedirectory that does the following: it makes a connection to localhost on the port you specify as a commandline argument. It then reads a line of text from the connection and compares it to the password in the previous level (bandit20). If the password is correct, it will transmit the password for the next level (bandit21).

NOTE: Try connecting to your own network daemon to see if it works as you think

 

step1. suconnect 파일을 실행하여 결과를 확인한다.

 

step2. 다른 쪽에서 올바른 비밀번호를 받게되면 다음 비밀번호를 전송받게 된다고 한다. 

두 프로그램 사이에서 송수신을 해야할 것 같다.

터미널을 두개를 열어서 두 터미널간에 통신을 해보도록 한다.

왼쪽 터미널은 suconnect 파일을 통해 오른쪽 터미널에서 열어둔 포트로 접속하도록 하고

오른쪽 터미널은 nc -ㅣ -p  명령을 통해 1998 포트를 임의로 열어 통신을 하도록 한다.

 

 

step3.

서로 연결이 되어있음을 확인하고 bandit20의 비밀번호를 오른쪽 터미널에 입력하여 결과를 확인한다.

다음 단계로 넘어가는 password를 확인할 수 있다.

 

 

※ 미션풀이에 필요한 리눅스 지식

 

1. nc : nc (netcat)은 TCP/UDP 프로토콜을 사용하는 네트워크 연결에서 데이터를 읽고 쓰는 간단한 유틸리티 프로그램

일반적으로 상대 서버의 포트가 열렸는지 확인하거나, 직접 서버가 되어 클라이언트에서 접속이 가능한지 확인하는 용도로 사용한다.

 

-명령어 형식

nc [option] [host] [port]

 

-문제풀이에 사용한 옵션-l : listen 모드로 port 오픈-p : local port 지정-n : 호스트 네임과 포트를 숫자로만 입력-v; verbosity를 증가 시켜 더 많은 정보를 얻을 수 있다.

 

 

2.SSL: 인터넷을 통해 client와 server가 통신할 때 통신 내용을 안전하게 보호하는 방법이다.SSL(secure sockets layer)은 서버인증, 클라이언트 인증, 데이터 암호화 기능을 제공합니다.지금은 TLS(transport layer security)라는 이름으로 표준화되었다.SSL은 전송계층(latyer5)의 암호화 방식으로 HTTP, NNTP,FTP 등 응용계층(layer7)프로토콜의 종류에 상관없이사용할 수 있는 장점이 있다.인증(authentication)은 통신의 상대방이 맞는지 확인하는 절차입니다.암호화(encryption)은 데이터가 누출되더라도 내용을 해독할 수 없도록 하는 것을 말합니다.

 

 

3.openssl: SSL과 TLS는 보안 통신을 위해 사용하는 프로토콜이다.이 프로토콜을 구현한 라이브러리 중 하나가 openssl이며 오픈 소스로 구현되어 있다.

통신 전문 암호화 뿐만 아니라 문서도 암호화 할 수 있다.

- s_client(SSL/TLS client program)는 openssl 명령으로 운영중인 웹서버의 SSL인증서 정보를 볼 수 있다.

SSL/TLS를 사용하는 원격 host에 접속하기 위한 일반적인 SSL/TLS client를 구현하는 명령어이다.

 

--> 문제풀이에 사용한 명령어 방식

openssl s_client -connect [server]:[port] [option]

ex: openssl s_client -connect 192.168.101.80 : 31790 (접속할 호스트와 31790 포트로 연결)

 

 

4.nmap(network mapper): 호스트나 네트워크를 scanning 할 때 사용하는 port scanning tool입니다.

네트워크상의 어떤 호스트가 작동중이며 그 호스트가 어떤 서비스를 제공하는지, 어떤 os를 사용하는지

어떤 firewall을 사용하는지 알아낼 수 있는 명령어 입니다.

 

 

-명령어 형식: nmap [option] [host] 

 

-option

-sT: TCP open scan (모든 포트에 대해 스캔하는 방식)

-sS: TCP half scan (syn/ack를 응답 받으면 rst packt을 보내 접속 끊기)

-sP: ping을 이용한 scan (ping을 보내어 네트워크의 어떤 호스트가 살아있는지 확인 가능)

-sU: UDP port scan

-O: 대상 호스트의 OS 판별

-p: 포트선택

-F: nmap-service에 나열된 port만 scan

 

 

5.diff: differences의 약자로 두파일 사이의 내용을 비교하는 명령어다.

유사한 명령어로 cmp(compare) 명령어가 있지만, 보다 직관적이고 명확하게 결과를 도출하는 장점을 갖고 있다.

diff는 문서파일의 줄 사이 변경사항을 보여주며, 최대 3개의 파일까지 비교 가능합니다.

 

-명령어 형식

diff [option] [비교 file1] [비교 file2]  --> diff -d passwords.old password.new

 

-option

-c: 두 파일간의 차이점 출력

-d: 두 파일간의 차이점을 상세히 출력

-r: 두 디렉토리간의 차이점 출력, 서브디렉토리까지 비교 가능

-s: 두파일이 같을 때 알림

 

 

6. setuid

set + usr id 란 뜻으로 일시적으로 자신의 ID를 변경하는 것을 말한다.

일시적으로 자신의 ID를 변경하여 자신이 접근할 수 없는 파일에 접근하고 싶을 때 사용하는 방식이다.

프로그램을 실제 실행 중인 사용자에서 프로그램 소유자의 ID로 유효사용자(EUID)가 변경되는 것이다.

 

ls- al 명령을 치면 다음과 같은 파일 permission 내용이 나오는데

-r-s--x--x   1   root   root   1998   7/8   ...

여기서 s라는 부분이 setuid가 설정되었을 때 파일 permission에 표기가 된다. 

setuid가 설정되면 x가 들어갈 자리 대신에 s가 들어가게 된다.

만약 이 파일이 실행시키게 되면 다음과 같은 순서로 파일을 읽게 된다.

1. setuid가 파일에 걸린다.

2. setuid가 걸린 파일을 실행하면 나의 ID가 변경된다.

3. setuid가 걸린 파일의 실행이 끝나면 다시 원래의 ID로 돌아온다.

 

즉, 실행 파일이 끝날 때까지 파일의 소유자의 UID가 되는 것이다.
따라서 setuid는 신중하게 써야할 필요가 있습니다. 만약 setuid가 설정되어 있는 root 파일을 실행하면

끝날 때까지 실행하는 사람의 uid가 root의 uid가 되어 root 권한을 갖게 됩니다.

이 뜻은 누구나 root권한을 갖게 되면 해당 시스템내의 파일들이 손상을 입을 확률이 매우 높아짐을 보여줍니다.

 

setuid 와 permission 표기

2주전에 확인했던 permission개념을 좀 더 확장시키면 다음과 같습니다.

특수권한
7~0
s=4, s=2, t=1
s(setuid) s(setgid) t(stickbit)
u(user)
7~0
r=4, w=2, x=1
g(group)
7~0
r=4, w=2, x=1
o(other/etc)
7~0
r=4, w=2, x=1

setuid=4000 setgid=2000 sticky=1000 으로 permission을 숫자로 변경시킬 수 있다.

ex) chmod 7644 aaa

(permission권한이 644인 aaa 파일을 setuid setgid sticky를 적용한 파일로 변경) 

반응형

'Bandit 원정대' 카테고리의 다른 글

Bandit 원정대 4주차  (0) 2021.07.15
Bandit 원정대 2주차  (0) 2021.06.30
Bandit 원정대 1주차  (0) 2021.06.23