passcode : throw me away
(NO DRAG, NO PASSCODE)
C언어로 구성된 간단한 소켓 프로그래밍 코드이다.
소켓 통신이란?
소켓 : IP address 와 Port 넘버가 합쳐진, 네트워크 상에서 서버 프로그램과 클리어언트 프로그램이 통신을 할 수 있도록 해주는 소프트웨어 장치이다.
엔드 포인트 : IP address + Port 조합, 식별자로 사용됨
일반적으로 서버는 특정 포트가 바인딩된 소켓를 가지고 특정 컴퓨터에서 작동한다. 클라이언트는 서버의 IP 주소 및 호스트 네임과 포트를 알고 있으며 이를 이용하여 연결 요청을 하게 된다. 요청을 하게 되면 서버는 소켓으로부터 요청을 받아들인다. 서버와 클라이언트가 통신을 하기 위한 과정은 다음과 같다.
- 클라이언트가 서버에 연결 요청을 한다.
- 이 때 클리이언트는 서버와 통신할 때 사용될 로컬 포트에 바인딩 된다.
- 서버가 요청을 수락한다.
- 수락되자마자 서버는 동일한 로컬 포트에 바인딩된 새로운 소켓을 얻게 되며 클라이언트의 주소와 포트로 설정된 리모트 엔드 포인트를 갖게 된다. (여기서 서버가 별도의 소켓을 얻는 이유는 하나의 클라이언트 이외에도 다른 클라이언트의 요청을 받아야 하기 때문)
- 연결이 수락되면 클라이언트의 소켓이 생성되고 이로써 클라이언트는 서버와 통신하기 위하여 소켓을 사용할 수 있다.
- 이제 클라이언트와 서버는 통신(읽기, 쓰기)을 할 수 있다.
이제 어떻게 하면 문제를 풀 수 있는지 살펴보자.
코드를 보면 클라이언트로 부터 buffer 에 256 bytes 입력을 받으므로 여기서 취약점이 발생한다는 것을 알 수 있다.
또한 일반적인 통신 방법으로는 해결할 수 없다. 왜냐하면 코드를 보았을 때 서버가 클라이언트로부터 값을 받아오는 것이기 때문에 우리가 아무리 shellcode 를 입력해서 쉘을 딴다고 하더라도 그 내용을 클라이언트 쪽에서는 볼 수가 없다. 따라서 역으로 서버가 클라이언트에 접속하게끔 만들면 우리가 쉘을 볼 수 있을 것 같다. 이것이 바로 Reverse Shell 이다.
Reverse Shell 을 사용하기 위해서는 우선 nc 명령어를 이용하여 클라이언트 쪽에서 Listening 상태를 만들어주고 서버에서 Reverse Shell 을 열어줌으로써 클라이언트는 쉘을 건네 받아 쉘을 따는데에 성공한다.
이제 Reverse Shell 을 위한 shellcode 를 만들어보자. peda 의 기능을 사용하여 만들 수 있다. 아무 바이너리를 대상으로 gdb를 실행하고 shellcode generate 를 통하여 만들면 된다. 형식은 아래와 같다.
- shellcode generate [arch/]platform type [port] [host]
그리고 이를 바탕으로 exploit.py 코드를 짜주자. 이 코드는 서버가 클라이언트에 접속하도록 하는 reverse shellcode 를 이용한 것이다.
이제 포트를 열어주고 서버가 클라이언트에 접속하여 Brute Force Attack 를 하도록 만들어주는 코드를 실행하면 쉘이 따질 것이다. 이제 문제를 해결해보자.
먼저 포트를 열어주고,
아까 작성한 exploit.py 를 실행해주면,
이렇게 Brute Force Attack (무차별 대입 공격)이 진행되면서 중간에 아래와 같이 서버가 accepted 하여 접속에 성공한 것을 볼 수 있다. 동시에 쉘이 따진 것도 확인할 수 있다.
[death_knight] : got the life
'Pwnable > LOB' 카테고리의 다른 글
[LOB] 20. DEATH_KNIGHT (0) | 2020.08.28 |
---|---|
[LOB] 18. NIGHTMARE (0) | 2020.08.28 |
[LOB] 17. SUCCUBUS (0) | 2020.08.28 |
[LOB] 16. ZOMBIE_ASSASSIN (0) | 2020.08.28 |
[LOB] 15. ASSASSIN (0) | 2020.08.28 |