1 분 소요

1. 강의 수강

internet : network of networks.
네크워크 추상화
TCP/IP 프로토콜의 경우 몇 가지 계층으로 나누어짐

1 계층 : Link Layer
Link Layer는 컴퓨터들 간에 물리적으로 연결되어 있는 계층
Link Layer에서는 데이터를 프레임 형태로 송/수신
프레임은 데이터 앞/뒤로 header와 footer에 전송에 필요한 정보들을 추가한 형태로 구성

2 계층 : Internet Layer
Internet Layer는 올바른 목적지(컴퓨터)로
찾아가기 위한 정보를 담는 계층
주소 정보를 담고 있는 IP 헤더를 데이터 앞에 붙여 Link Layer로 전달

3 계층 : Transport Layer
Transport Layer는 올바른 프로그램을 찾아주는 계층
TCP/UDP 데이터 앞에 해당 프로토콜 헤더가 붙은 형태의 패킷을 생성해 Internet Layer로 전달

4 계층 : Application Layer
Application Layer는 프로그램과 상호작용하는 계층
아래 단계를 통해 전달된 패킷의 데이터를
전송 목적지인 프로그램에 전달하는 역할
송신 시에는 전송할 데이터가 어떤 프로그램의 데이터인지 정보를 담아
Transport Layer로 전달

2. 문제 풀이

1. babyhttp 4

babyhttp4-1

curl 명령을 이용해 설정한 hostname으로 요청을 전송하는 문제이다.
먼저 curl 명령으로 요청을 전송해보면
hostname이 맞지 않다며 어떤 hostname을 설정해야 하는지 보여준다.
따라서 curl 명령의 -H 옵션을 통해 header 정보 중 Host 부분을 설정해야 한다.
curl -H "Host: 호스트 이름" 127.0.0.1을 통해 flag를 획득할 수 있다.

babyhttp4-2

2. babyhttp 5

babyhttp5-1

nc 명령을 이용해 설정한 hostname으로 요청을 전송하는 문제이다.
nc 명령으로 서버에 접속한 뒤 GET 요청을 전송해 보았다.
위의 문제에서와 같이 hostname이 다르다며 에러를 발생시키고
hostname으로 설정되어야 하는 값을 알려준다.
nc 명령으로 접속한 뒤 요청을 전송할 때 HTTP 패킷의 형태와 같이 만들어 전송하면
header의 값을 변경할 수 있다.
echo -e "GET / HTTP/1.1\r\nHost: 51fdd1f7d5ddbf516909057cb35b1f10\r\n\r\n" | nc 127.0.0.1 80
GET 요청을 전송하며 패킷 헤더의 Host 부분을 해당하는 값으로 바꾼 것이다.
ehco -e는 문자열에서 \와 같은 문자를 모두 포함하라는 의미이고, 이 문자열을 nc 명령을 실행한 뒤의 입력으로 nc를 실행한다는 명령이다.
해당 명령을 실행하면 flag를 획득할 수 있다.

babyhttp5-2

3. babyhttp 6

babyhttp6-1 babyhttp6-2

python을 이용해 설정한 hostname으로 요청을 전송하는 문제이다.
먼저 python의 requests 모듈을 사용해 get 요청을 보냈다.
이번에도 마찬가지로 hostname이 다르다며 어떤 hostname이어야 하는지를 출력한다.

babyhttp6-3 babyhttp6-4

hostname을 설정해 요청을 보내기 위해 urllib의 request 모듈을 사용했다.
Request 함수의 파라미터로 url과 header 부분에 설정할 hostname을 입력하고
urlopen으로 열어준다.
이후 read()와 decode를 이용해 utf-8로 인코딩 되어 있는 데이터를 출력하면
flag를 획득할 수 있다.