1. 메타스플로잇 TCP Server, Client 통신 실습
메타스플로잇에서 모듈을 활용해서 TCP 통신에 대해 알아보고 구현했다. 서버가 실행되면 클라이언트쪽에서는 어떤식으로 받는지, 메시지를 출력했으면 어떤식으로 완료했다고 화면에 출력이 되는지에 대해 실습해보도록 하겠다.
1) TCP Server, Client 통신 주고 받기
<그림 1-1 TCP Server, Client 파일>
먼저 TCP Server, Client 파일을 만들어준다. server와 Client 코드도 전부 다르기 때문에 각각 만들어 줘야한다.
<그림 1-2 TCP Server 파일 - 1>
vi에디터로 TCP Server 파일을 열어서 require을 입력해 어디서 라이브러리를 가져올 것인지 경로를 먼저 추가해준다. 그리고 include로 믹스인을 선언해준다. 우리는 TCPServer를 가져와서 쓸 것이기 때문에 TCPServer를 입력해준다. 처음에 클래스로 선언되어 있었던 Metasploit3 < Msf::Exploit::Remote 라는 부분을 그대로 가져와서 TCPServer라는 것만 추가해서 쓰는 것이다. 추가한 후에 Name, Author, Description, Targets부분을 수정해준다. Targets는 보통 1.0버전으로 공격을 감행하게 되는데 필자는 1.1버전까지 한번 추가해보았다. 이것은 본인의 자유이기 때문에 여러가지 방식으로 버전을 바꿔서 타겟팅을 정해 exploit을 시켜서 실험해보는 것도 많은 공부가 될 것이다.
<그림 1-3 TCP Server 파일 - 2>
이제 exploit부분을 작성해주어야 하는데, 먼저 우리는 서버쪽에서 Hello라는 값을 보낼 것이기 때문에 data에 hello라는 값을 입력해준다. 그리고 begin을 선언해 tcp_server를 연결시켜주겠다는 문구를 선언해준다. 만약 성공적으로 데이터가 전송이 되었다면 data send complete라는 메시지가 출력될 것이다. 만약에 데이터를 전송시키지 못하는 상황이 발생할 수도 있는데 전송시키지 못하게 되면 disconnect라고 해서 연결을 끊어준다는 코드를 작성해준다.
<그림 1-4 TCP Client 파일 - 1>
TCP Client파일도 마찬가지로 require부터 선언해서 어디서 라이브러리를 가져올 것인지부터 선언해주고 include를 이용해 믹스인을 선언한다. 이번에는 TCP라는 것을 가져와서 사용해보도록 하겠다. Server에서와 마찬가지로 Name, Description, Author, References, Tartgets를 사진과 같이 설정해준다.
<그림 1-6 TCP Client 파일 - 2>
client connect부분을 작성해주었는데, 서버에서 송신하는 것을 받는것이 클라리언트의 가장 큰 목적이다. world라는 메시지를 선언해 서버가 hello라는 메시지를 전송하면 Client에서는 world라는 메시지를 송신해주게 했다. 이제 사용자에게 메시지를 전달해주기 위한 작업은 끝이 났다.
<그림 1-6 msfconsole tcp_Server, Client exploit 과정>
msfconsole을 실행시켜 만든 파일 경로를 지정해준다. tcp_server파일부터 지정해주고 옵션에서 SRVPORT를 3000으로 지정해주고 rhost는 현재 칼리리눅스 IP를 지정해준다. 지정을 모두 완료 하고 exploit을 시킨다. 성공적으로 서버가 구동되면 Server started라는 메시지가 출력된다. 그리고 tcp_client로 경로를 바꿔서 이 역시도 옵션을 지정해준다.
< 그림 1-7 msfconsole tcp_client exploit 결과>
서버에서 port를 3000으로 지정해주었기 때문에 서버 정보를 받기 위해 client에서도 rport를 3000으로 지정해주고, lport는 client전용이기 때문에 4545라는 포트로 지정해준다. 서버 포트와만 다르게 하면 exploit하는데는 큰 문제는 없다. exploit을 실행하게 되면 사진과 같이 현재 칼리리눅스 ip주소와 hello, world라고 메시지가 정상적으로 잘 출력되었다는 것을 볼 수 있다. 세션은 따로 지정해주진 않았기 때문에 세션이 잡히지는 않았다.
<그림 1-8 TCP Client Check>
이번엔 check 메소드를 사용해 취약점을 알아보는 방법을 설명해보려고 한다. 먼저 check부분을 코드로 작성했다. 서버와 통신하겠다는 코드를 입력해준다. if, else문은 world라는 단어가 나오게 되면 Vulnerable이라는 메시지를 출력해주겠다는 의미이다. 이 역시 CheckCode쪽 안에 있는 vulnerable이라는 라이브러리를 가져왔고, else문 역시 Safe라는 라이브러리를 가져와서 출력해주겠다는 의미로 만들었다. print문을 써서 출력을 해줘도 되지만 core안에 있는 라이브러리들을 가져와서 쓰는 방법도 있다.
<그림 1-9 tcp.rc 파일>
msfconsole을 실행시켜 옵션을 지정해주고 exploit을 수동으로 한다는 것은 여간 번거로운 일이 아니다. 사진과 같이 rc파일을 만들어 우리가 사용할 옵션들을 지정해주고 자동으로 실행되게 하려고 한다.
<그림 1-10 tcp.rc 파일 실행 결과>
msfconsole -r tcp.rc 명령어를 실행시키게 되면 자동으로 msfconsole이 실행되면서 옵션들이 지정되고 최종적으로 사진과 같이 check까지 실행되게 된다. world라는 메시지가 출력이 되었기 때문에 최종적으로 The target is vulnerable이라는 메시지가 출력되었다. 이처럼 check메소드는 다양한 방식으로도 활용이 될 수 있기 때문에 이 방식 말고도 다른 방법으로도 연구해보면 좋을 것 같다.