OverTheWire - Bandit
강의목차: Level 16 → Level 17(nc, s_client)
Bandit 웹페이지
https://overthewire.org/wargames/bandit/
1. Bandit Level 16 → 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.
Commands you may need to solve this level
ssh, telnet, nc, openssl, s_client, nmap
Helpful Reading Material
localhost의 31000~32000 사이의 포트에 현재 레벨의 패스워드를 제출하면, 다음 레벨의 패스워드를 얻을 수 있다. 첫째로, 어떤 포트가 리스닝 중인지 찾아라. 그리고 SSL 통신을 하는 포트와 평문 통신을 하는 포트를 구분해라. 단 1개의 서버에서만 다음 레벨 패스워드를 제공한다. 나머지 서버들은 사용자가 입력한 값을 똑같이 되풀이하여 답장할 뿐일 것이다.
Level 16 로그인
$ ssh -p 2220 bandit16@bandit.labs.overthewire.org
Level 16 패스워드: JQttfApK4SeyHwDlI9SXGR50qclOAil1
nc
TCP 또는 UDP 프로토콜을 사용하는 네트워크 환경에서 데이터를 읽고 쓰는 간단한 프로그램.
일반적으로 상대 서버의 포트가 열렸는지 확인하거나, 직접 서버가 되어 원격 서버에서(클라이언트) 접속이 가능한지 확인하는 용도로 사용을 한다.
사용법
nc [OPTIONS] [HOST] [PORT]
옵션
-u : udp 연결
-p : 소스 포트 지정
-l : LISTEN 모드로 포트 띄움
-z : 단순 포트 스캔만 진행
-v : 더 많은 정보 확인
-n : 호스트 네임과 포트를 숫자로만 입력받는다.
서버 내에서 어떤 프로그램들이 돌아가고 있는지 확인하기 위해 nc명령어를 사용하여 열려있는 포트를 확인한다.
localhost 의 31000~32000 사이의 포트를 nc 명령어를 사용해서 열려있는 포트를 확인한다.
-w 1 옵션 사용 이유
-w 1 옵션은 최대 1초까지 대기하는 것을 의미한다.
서버에서 즉각 답변을 해주는 경우도 있지만, 보안 등의 이유로 답변을 주지 않아 만약 서버 측에서 답변이 없다면 장시간 대기하게 되므로 스캐닝 시간이 지나치게 장기화 될 수 있다. 그러므로 -w 1 옵션을 사용한다.
$ nc -zvnw 1 127.0.0.1 31000-32000
→ 127.0.0.1(localhost) 의 31000~32000 포트 스캔
1000개의 포트를 스캔하기 때문에 여러개의 fail 과 succeeded 가 섞여있다.
일일히 다 찾기는 어려우므로 grep 명령어를 사용해서 succeeded 가 포함된 단어만 출력한다.
grep 명령어
grep 명령어는 특정 파일에서 지정한 문자열이나 정규표현식을 포함한 행을 출력해주는 명령어이다.
파일디스크립터 & 리다이렉션
파일디스크립터(일련번호) | 이름 | 용도 | 표준장치 |
0 | stdin | 명령어에 입력될 내용을 저장 | 키보드 |
1 | stdout | 명령어에서 출력될 내용을 저장 | 화면 |
2 | stderr | 명령어에서 출력될 에러메시지를 저장 | 화면 |
파일디스크립터 | 설 명 |
0 | 표준 입력 (standard input) (키보드로 부터 받는 데이터 값) |
1 | 표준 출력 (standard output) (모니터에 나오는 데이터 값) |
2 | 표준 에러 (statndard error) (에러메시지) |
리다이렉션 기호 | 방향 | 의미 |
> | 표준 출력 | 명령 > 파일 : 명령의 결과를 파일로 저장 |
>> | 표준 출력(추가) | 명령 >> 파일 : 명령의 결과를 기존 파일 데이터에 추가 |
< | 표준 입력 | 명령 < 파일 : 파일의 데이터를 명령에 입력 |
$ nc -zvnw 1 127.0.0.1 31000-32000 2>&1 | grep succeeded
→ 2 >&1 = 표준에러를 표준출력으로 redirection 하라는 의미.
총 5개의 포트가 열려있는 것을 확인할 수 있다.
5개의 포트에 각각 평문 통신과 암호화 통신을 시도한다.
$ nc 127.0.0.1 31046
$ nc 127.0.0.1 31518
$ nc 127.0.0.1 31691
$ nc 127.0.0.1 31790
$ nc 127.0.0.1 31960
31518 포트와 31790 포트가 1을 입력하면 입력값을 반환하지 않았다.
이 2개의 포트로 암호화 통신(SSL)을 시도해본다.
openssl s_client 를 사용해서 SSL 통신을 한다.
s_client 란?
SSL/TLS client Program
openssl 명령으로 운영중인 웹서버의 SSL인증서 정보를 살펴볼 수 있다.
s_client는 SSL/TLS 를 사용하는 원격 호스트에 접속하기 위한 일반적인 SSL/TLS client를 구현하는 명령어이다.
SSL에 대해 매우 유용한 진단도구이다.
사용방법
openssl s_client -connect 도메인:포트
openssl s_client -connect 아이피:포트
openssl s_client -connect 도메인:포트 -tls1_2
openssl s_client -connect 도메인:포트 -tls1_1
openssl s_client -connect 도메인:포트 -tls1
예시
openssl s_client -connect tezy.net:443
openssl s_client -connect 127.0.0.1:443
bandit 에서 사용
$ openssl s_client -connect 127.0.0.1:31518
패스워드 입력: JQttfApK4SeyHwDlI9SXGR50qclOAil1
패스워드를 입력하니 입력값을 다시 반환했다.
$ openssl s_client -connect 127.0.0.1:31790
패스워드 입력: JQttfApK4SeyHwDlI9SXGR50qclOAil1
Correct! 라는 문구와 함께 RSA PRIVATE KEY 가 반환되었다.
RSA PRIVATE KEY 를 복사하여 특정 디렉터리의 파일로 저장하여 -i 옵션(파일경로 지정하여 계정접근)을 사용하여 다음 레벨로 접속한다.
현재 디렉터리에서는 권한이 없으므로 새로운 디렉터리를 생성하여 저장한다.
$ mkdir /tmp/mytmp19
→ mkdir 명령어로 tmp 디렉터리에 mytmp19 디렉터리 생성
$ vi /tmp/mytmp19/rsakey
→ vi 명령어로 rsakey 파일 수정
i 입력하여 insert 모드
shift + v + g 누르면 전체 블록 선택 ( 이전에 데이터 있는 경우 삭제 )
esc 누르고 i 입력하여 insert 모드인 상태에서
아래 RSA PRIVATE KEY 삽입
rj7lyCtXMIu1kkd4w7F77k+DjHoAXyxcUp1DGL51sOmama +TOWWgECgYEA8JtPxP0GRJ+IQkX262jM3dEIkza8ky5moIwUqYdsx0NxHgRRhORT 8c8hAuRBb2G82so8vUHk/fur85OEfc9TncnCY2crpoqsghifKLxrLgtT+qDpfZnx SatLdt8GfQ85yA7hnWWJ2MxF3NaeSDm75Lsm+tBbAiyc9P2jGRNtMSkCgYEAypHd HCctNi/FwjulhttFx/rHYKhLidZDFYeiE/v45bN4yFm8x7R/b0iE7KaszX+Exdvt SghaTdcG0Knyw1bpJVyusavPzpaJMjdJ6tcFhVAbAjm7enCIvGCSx+X3l5SiWg0A R57hJglezIiVjv3aGwHwvlZvtszK6zV6oXFAu0ECgYAbjo46T4hyP5tJi93V5HDi Ttiek7xRVxUl+iU7rWkGAXFpMLFteQEsRr7PJ/lemmEY5eTDAFMLy9FL2m9oQWCg R8VdwSk8r9FGLS+9aKcV5PI/WEKlwgXinB3OhYimtiG2Cg5JCqIZFHxD6MjEGOiu L8ktHMPvodBwNsSBULpG0QKBgBAplTfC1HOnWiMGOU3KPwYWt0O6CdTkmJOmL8Ni blh9elyZ9FsGxsgtRBXRsqXuz7wtsQAgLHxbdLq/ZJQ7YfzOKU4ZxEnabvXnvWkU YOdjHdSOoKvDQNWu6ucyLRAWFuISeXw9a/9p7ftpxm0TSgyvmfLF2MIAEwyzRqaM 77pBAoGAMmjmIJdjp+Ez8duyn3ieo36yrttF5NSsJLAbxFpdlc1gvtGCWW+9Cq0b dxviW8+TFVEBl1O4f7HVm6EpTscdDxU+bCXWkfjuRb7Dy9GOtt9JPsX8MBTakzh3 vBgsyi/sN3RqRBcGU40fOoZyfAMT8s1m/uYv52O6IgeuZ/ujbjY= |
esc 누르고 :wq! 입력하여 저장 및 나가기
$ ssh -i /tmp/mytmp19/rsakey bandit17@127.0.0.1
→ -i 옵션으로 rsakey 가 저장되어 있는 파일 경로로 bandit17 계정에 접근 시도
보안 설정으로 인해 접근 실패
$ pwd
→ 현재 위치 확인 ( tmp/mytmp19 이면 cd 명령어 사용하여 디렉터리 이동할 필요 없음 )
→ 현재 위치 /home/bandit16 이므로 디렉터리 이동
$ cd /tmp/mytmp19
→ cd 명령어로 mytmp19 로 이동
chmod 명령어로 권한 설정
chmod 명령어
리눅스 파일 사용 권한 변경하는 명령어
문자 및 숫자 의미
- 파일에 저장된 데이터를 읽기. ( r = read )
- 파일에 데이터를 쓰기. ( w = write )
- 파일 실행. ( x = execute )
- 파일 소유자 ( u )
- 그룹 ( g )
- 그외 사용자 ( o )
- 모든 사용자 ( a )
- 추가 ( + )
- 제거 ( - )
- 지정 ( = )
r : 읽기 4
w : 쓰기 2
x : 실행 1
- : 권한 없음 0
--- : 0 ( 0+0+0 )
r-- : 4 ( 4+0+0 )
-w- : 2 ( 0+2+0 )
--x : 1 ( 0+0+1 )
rw- : 6 (4+2+0 )
r-x : 5 (4+0+1 )
-wx : 3 ( 0+2+1 )
rwx : 7 ( 4+2+1 )
$ chmod 700
→ chmod 700 으로 사용자에게 rwx 권한 부여, 다른 사용자들의 권한 제거
$ ssh -i /tmp/mytmp19/rsakey bandit17@127.0.0.1
→ -i 옵션으로 rsakey 가 저장되어 있는 파일 경로로 bandit17 계정에 접근 시도
error in libcrypto 에러가 발생한다.
다시 확인해보니 rsakey 에 저장된 RSA PRIVATE KEY 가 제대로 저장이 안되서 생긴 오류이다.
꼭 BEGIN RSA PRIVATE KEY 와 END RSA PRIVATE KEY 까지 같이 복사하여 저장해야 한다.
아래 RSA KEY 를 복사하여 /tmp/mytmp19/rsakey 에 삽입한다.
-----BEGIN RSA PRIVATE KEY----- MIIEogIBAAKCAQEAvmOkuifmMg6HL2YPIOjon6iWfbp7c3jx34YkYWqUH57SUdyJ imZzeyGC0gtZPGujUSxiJSWI/oTqexh+cAMTSMlOJf7+BrJObArnxd9Y7YT2bRPQ Ja6Lzb558YW3FZl87ORiO+rW4LCDCNd2lUvLE/GL2GWyuKN0K5iCd5TbtJzEkQTu DSt2mcNn4rhAL+JFr56o4T6z8WWAW18BR6yGrMq7Q/kALHYW3OekePQAzL0VUYbW JGTi65CxbCnzc/w4+mqQyvmzpWtMAzJTzAzQxNbkR2MBGySxDLrjg0LWN6sK7wNX x0YVztz/zbIkPjfkU1jHS+9EbVNj+D1XFOJuaQIDAQABAoIBABagpxpM1aoLWfvD KHcj10nqcoBc4oE11aFYQwik7xfW+24pRNuDE6SFthOar69jp5RlLwD1NhPx3iBl J9nOM8OJ0VToum43UOS8YxF8WwhXriYGnc1sskbwpXOUDc9uX4+UESzH22P29ovd d8WErY0gPxun8pbJLmxkAtWNhpMvfe0050vk9TL5wqbu9AlbssgTcCXkMQnPw9nC YNN6DDP2lbcBrvgT9YCNL6C+ZKufD52yOQ9qOkwFTEQpjtF4uNtJom+asvlpmS8A vLY9r60wYSvmZhNqBUrj7lyCtXMIu1kkd4w7F77k+DjHoAXyxcUp1DGL51sOmama +TOWWgECgYEA8JtPxP0GRJ+IQkX262jM3dEIkza8ky5moIwUqYdsx0NxHgRRhORT 8c8hAuRBb2G82so8vUHk/fur85OEfc9TncnCY2crpoqsghifKLxrLgtT+qDpfZnx SatLdt8GfQ85yA7hnWWJ2MxF3NaeSDm75Lsm+tBbAiyc9P2jGRNtMSkCgYEAypHd HCctNi/FwjulhttFx/rHYKhLidZDFYeiE/v45bN4yFm8x7R/b0iE7KaszX+Exdvt SghaTdcG0Knyw1bpJVyusavPzpaJMjdJ6tcFhVAbAjm7enCIvGCSx+X3l5SiWg0A R57hJglezIiVjv3aGwHwvlZvtszK6zV6oXFAu0ECgYAbjo46T4hyP5tJi93V5HDi Ttiek7xRVxUl+iU7rWkGAXFpMLFteQEsRr7PJ/lemmEY5eTDAFMLy9FL2m9oQWCg R8VdwSk8r9FGLS+9aKcV5PI/WEKlwgXinB3OhYimtiG2Cg5JCqIZFHxD6MjEGOiu L8ktHMPvodBwNsSBULpG0QKBgBAplTfC1HOnWiMGOU3KPwYWt0O6CdTkmJOmL8Ni blh9elyZ9FsGxsgtRBXRsqXuz7wtsQAgLHxbdLq/ZJQ7YfzOKU4ZxEnabvXnvWkU YOdjHdSOoKvDQNWu6ucyLRAWFuISeXw9a/9p7ftpxm0TSgyvmfLF2MIAEwyzRqaM 77pBAoGAMmjmIJdjp+Ez8duyn3ieo36yrttF5NSsJLAbxFpdlc1gvtGCWW+9Cq0b dxviW8+TFVEBl1O4f7HVm6EpTscdDxU+bCXWkfjuRb7Dy9GOtt9JPsX8MBTakzh3 vBgsyi/sN3RqRBcGU40fOoZyfAMT8s1m/uYv52O6IgeuZ/ujbjY= -----END RSA PRIVATE KEY----- |
$ ssh -i /tmp/mytmp19/rsakey bandit17@127.0.0.1
→ -i 옵션으로 rsakey 가 저장되어 있는 파일 경로로 bandit17 계정에 접근 시도
Permission denied 되었다. 22번 포트는 더이상 사용하지 않는 것으로 확인되어 2220 포트로 다시 시도한다.
$ ssh -i /tmp/mytmp19/rsakey bandit17@127.0.0.1 -p 2220
→ -i 옵션으로 rsakey 가 저장되어 있는 파일 경로로 bandit17 계정에 2220 포트로 접근 시도
접속 성공
$ whoami
$ id
입력하여 현재 로그인한 계정 확인
ssh 를 사용하여 임시로 bandit17 에 접근한것이므로 플래그를 찾아야한다.
$ vi /etc/bandit_pass/bandit17
/etc/bandit_pass/bandit17 에서 플래그 확인
Level 17 패스워드: VwOSWtCA7lRKkTfbr2IDh6awj9RNZM5e
$ exit ( ssh 접속 상태에서 홈으로 나가기 )
Level 17 접속 시도
$ ssh -p 2220 bandit17@bandit.labs.overthewire.org
Level 17 패스워드: VwOSWtCA7lRKkTfbr2IDh6awj9RNZM5e
$ whoami
$ id
입력하여 현재 로그인한 계정 확인
취미로 해킹1 강의 : https://www.inflearn.com/course/linux-3
'보안 > Bandit 워게임' 카테고리의 다른 글
OverTheWire - Bandit : Level 18 → Level 19 (0) | 2023.04.15 |
---|---|
OverTheWire - Bandit : Level 17 → Level 18 (0) | 2023.04.14 |
OverTheWire - Bandit : Level 15 → Level 16 (0) | 2023.04.12 |
OverTheWire - Bandit : Level 14 → Level 15 (0) | 2023.04.11 |
OverTheWire - Bandit : Level 13 → Level 14 (1) | 2023.04.10 |