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
Sol)
바로 홈디렉토리에서 파일 리스트를 확인해보면
'suconnect'라는 실행파일이 존재한다. 이전 단계와 마찬가지로 setuid가 설정되어있다. 인자 없이 실행시켜보면
사용법과 설명이 나온다. '2220' 포트를 인자로 주고 실행 시키면 'ERROR'와 함께 비밀번호가 맞지 않다는 메시지가 출력되는 것을 확인할 수 있다.
'READ' 부분을 보면 'SSH-2.0-OpenSSH_8.9p1' 라고 나오는데 그 이유는 현재 2220 포트는 내가 접속한 ssh 연결이고 이 포트가 ssh 프로토콜 정보를 출력했기 때문.
그렇다면 결국 'suconnect'는 리스닝할 포트를 넣어주고 해당 포트에서 비밀번호를 넣어주면 그걸 읽고 'suconnect'에서 일치여부를 확인해 일치한다면 다음 비밀번호를 해당 포트로 보내거나 현재 실행중인 세션에 출력하거나 할 것이라 예상한다.
그럼 일단 아무 포트나 열어서 리스닝 하도록 만든다.
# nc [options] [host] [port]
#[option]
# -l (listen) : 지정된 포트에서 들어오는 연결을 기다리도록 설정. 즉, 서버 모드
# -v (verbose) : 상세 모드, 연결 과정과 관련된 추가 정보를 출력
# -p (port) : 리스닝할 포트 번호를 지정, '-l' 과 함께 사용
nc -lvp 12345
그럼 이 상태로 그냥 리스닝만 무작정 기다리는데, 그러면 'suconnect' 파일을 실행할 수 없다.
방법은 1) 두 개의 세션으로 작업 2) 백그라운드로 작업을 돌리는 방법 이 있다.
일단 세부과정을 보기 위해 'tmux'를 써서 시도한다.
tmux는 세션을 한 터미널에서 여러개 띄울 수 있다.
그래서 한 쪽은 리스닝 상태, 한 쪽은 'suconnect'를 실행 시키도록 한다.
그러면 nc 명령어로 리스닝 중인 곳에서 해당 포트로 연결이 되었다는 응답이 온다.
이제 nc를 통해 리스닝 중인 세션에서 현재 비밀번호를 입력해 준다.
그러면 'suconnect'가 실행된 세션에서는 비밀번호 일치와 함께 '12345' 포트로 다음 레벨의 비밀번호를 보내고, nc 세션에서는 비밀번호가 출력된다.
tmux가 사용하는 리눅스에 없을 경우도 있고, 설치할 수 없는 환경도 있기에 백그라운드로 한번 시도해보겠다.
'&'를 이용하여 백그라운드에서 동작할 수 있도록 명령어를 입력한다.
'ps' 명령어로 프로세스를 확인해보면 백그라운드에서 잘 실행되고 있다.
'jobs' 명령어를 통해서도 확인 가능.
이제 'suconnect'도 마찬가지로 '&'를 붙여 명령어를 입력해준다.
jobs 명령어로 상태를 확인해보면 현재 nc는 멈춰있다.
이 상태에서 'fg' 명령어를 이용하면 nc 프로세스를 포그라운드로 전환할 수 있다.
그리고 현재 계정의 비밀번호를 입력하게 되면
비밀번호가 나오고 두 개의 프로세스는 종료된다.