# 왜 필요한가
이 게시글을 통해서 얻을 수 있는 결과는 (물론 무료이지만)
개인이 서버와 같이 서비스를 제공할 수 있는 IP 주소를 가질 수 있다
그렇다면 왜 이런 IP 주소를 얻으려고 하는걸까?
내가 이 게시글을 쓰는 이유는 다음과 같다.
1. pwnable 문제를 서버로 제공하기 위함
2. 나만의 웹사이트를 만들어보기 위함
3. 네트워크를 과제를 하기 위함
그렇다면 서버와 같은 서비스를 제공하는 IP가 무엇일까?
먼저 우리가 자주 듣는 Host(호스트)가 무엇인지부터 간단하게 이해해보자
호스트란 컴퓨터 네트워크에 연결되어 있는 컴퓨터나 연결 장치를 뜻한다
즉, 네이버도 호스트이고 내 컴퓨터도 하나의 호스트이다.
그리고 이 호스트는 서버와 클라이언트로 구분할 수 있다.
서버는 서비스를 제공하는 역할을 하고
클라이언트는 서비스를 요청하는 역할을 한다.
또한 요즘은 프로그램 단위로도 서버와 클라이언트를 구분하기도 하는데
예로 네이버로 접속을 요청하는 웹브라우저는 클라이언트 프로그램에 해당하고,
도메인으로의 접속을 도와주는 root DNS 는 서버 프로그램에 해당한다.
정리해보면 클라이언트가 서비스를 요청하면 이에 응답하는 측을 서버라고 말한다.
그렇기 때문에 서버를 가진다는 것은
내가 외부인에게 서비스를 제공할 수 있게 된다는 것이다.
# 구글 클라우드 플랫폼(GCP)
AWS와 GCP과 같은 클라우드 컴퓨팅 시스템은 IP 주소 할당 기능을 제공하고 있다.
일반적으로는 일정한 비용을 지불하고 사용해야하지만
무료크레딧을 통해서 제한적이지만 개인 서버를 가질 수 있는 방법을 소개하고자 한다.
먼저 구글에서 "구글 클라우드 플랫폼" 을 검색한다
그리고 처음 접속을 하게되면 url 입력창 바로 아래에 평가판을 사용할 수 있다는 알림이 발생하는데
활성화 버튼을 누르면 다음과 같은 개인정보를 입력하게 된다.
이 때 결제 수단 부분이 제일 중요한데
하나의 결제 수단을 하나의 계정에만 등록가능하기 때문에
여러 개의 무료판을 사용할 수는 없다
정상적으로 결제 수단까지 설정이 완료하면 무료 크레딧 $300를 얻게 된다.
이후 왼쪽 상단의 메뉴 버튼을 누르고 Compute Engine -> VM 인스턴스를 누른다
VM 인스턴스를 누르면 인스턴스 만들기 버튼이 나오는데
(상황마다 어떻게 나오는지는 다르지만 인스턴스 만들기 라는 버튼이 존재한다)
인스턴스 만들기를 누르면 다음과 같은 설정화면이 나온다
그 중에서 내가 했던 필수적인 설정들을 설명하겠다
이후에는 어떤 운영체제를 사용할 것인지 설정을 하는데
나는 Ubuntu에 익숙하므로 해당 운영체제로 부팅하도록 설정하였다
또한 용량도 사용할만큼 설정한다
이후 아래에서 방화벽도 설정해주는데 HTTP 트래픽을 허용한다는 것은
http:// 로 접속을 할 수 있도록 허용한다는 것이다 (웹사이트의 기본)
마지막 만들기 버튼까지 누르고 나면 VM인스턴스 목록에 아래와 같이 생성되어 있을 것이다
SSH 옆에 있는 메뉴 바를 누르고 "브라우저 창에서 열기" 를 클릭하면 된다
아래와 같은 브라우저 창이 뜬다면 성공한 것이다.
결과적으로 ubuntu 운영체제를 가진 서버를 하나 가지게 된 것이다.
이후 웹사이트를 제공하거나 pwnable 문제를 등록하는 등의 서비스 제공은
개인의 소량껏 이용하면 된다
# 예시
예시로는 pwnable 바이너리를 서버로 제공하는 것이다.
(바이너리를 서버로 제공한다는 말은 외부 IP로 누군가가 접속했을 때
해당 바이너리, 즉 프로그램을 실행하는 것을 의미한다)
현재는 도커(Docker)를 활용하여 컨테이너 별로 서비스 관리를 하고있지만
이번 글에서는 간단하게 xinetd를 이용하여 바이너리 서버를 제공하는 예시를 보여주고자 한다.
먼저 외부에서의 접속을 허용하기 위해서는 방화벽 설정이 필요하다
아까 compute engine이 있던 왼쪽 상단의 메뉴바에서
네트워킹의 VPC 네트워크 -> 방화벽을 선택하고
방화벽 규칙 만들기를 클릭한다.
그리고 설정하는 부분이 있는데, 아래 사진을 참고하면 좋다.
나는 다음과 같이 설정했다
대상 : 적용할 vm 인스턴스
-> 내가 만든 모든 vm 인스턴스에 적용했다
소스 IP 범위 : 접속을 허용할 IP
-> 0.0.0.0/0 으로 설정했다
프로토콜 및 포트(중요) : 접속이 허용되는 포트
-> 제공하고 싶은 포트번호로 설정했다
저렇게 설정을 하면 nc x.x.x.x 8080 을 하였을 때
내 서버로의 접속을 허용할 수 있게 된다
(이 설정을 하지 않으면 접속이 되지 않음)
다음은 xinetd를 이용해서 서비스를 제공하는 방법이다
먼저 xinetd를 설치하고, 바이너리 파일을 gcp 로 옮긴다
$ apt-get install xinetd
$ vi /etc/xinetd.d/[파일명]
* 이후에 설명하는 vim과 세부 설치들은 직접 찾아서 할 수 있으므로 생략하겠다
* permission denied 가 계속 발생한다면 sudo su를 입력하고 root 계정으로 진행하자
vim 창이 뜨면 아래와 같이 정보를 입력한다
$ vi /etc/services/[파일명]
/etc/services의 파일을 열어서 파일의 끝에 다음과 같이 추가한다.
[파일명] [사용할 포트]/tcp
(# Local services 주석은 미리 작성되어있는 것이다)
아래의 방식도 위와 똑같은 결과이다
$ echo '[파일명] [사용할 포트]/tcp' >> /etc/services
설정을 다하였다면 재시작을 하고 접속이 되는지 확인한다
$ /etc/init.d/xinetd restart$ nc localhost [사용할 포트]
예시와 같이 등록한 바이너리가 바로 실행되면 정상적으로 설정된 것이다
또한 다른 컴퓨터에서 nc [외부 IP 주소] [포트] 를 입력하여 접속이 된다면
외부에서 바이너리에 접근할 수 있는 설정을 완료한 것이다.
이 외에도 다른 설정이 궁금하다면 구글링이 최고이다.
'System Hacking > Study Notes' 카테고리의 다른 글
[ Kernel ] Meltdown 취약점 (0) | 2020.08.16 |
---|---|
어셈블리어 구구단 만들기 (3) | 2020.07.01 |
Large bin attack (0) | 2020.05.04 |
About Strtok (0) | 2020.04.29 |
Calloc Flow Control (0) | 2020.04.29 |