Linux

IP spoof에 관하여

aucd29 2013. 9. 26. 20:54
IP spoof에 관하여



IP spoof는 Source Address및 Dest Address, port등을 가상으로 조작하여 패킷을 전송하는 방법을 통칭한다. 이것을 구현하는 방법은 여러가지가 존재할 수 있으나 MAC layer까지 내려가지 않는다는 가정하에서는 RAW socket을 이용하여 구현할 수 있다.

네트웍 상에서 패킷의 전송을 위해서 socket interface를 사용한다. socket함수의 사용법을 간단히 살펴보면 다음과 같다.



int socket(family, type, proto)

family는 socket이 사용되는 곳을 전체적으로 구분할 때 사용되는데, 이것의 예로는 AF_INET, AF_UNIX등이 있다.

AF_INET은 internet에 관련된 socket operation에 쓰이고, AF_UNIX는 한 UNIX 시스템 내에서의 통신(IPC)에 사용된다. 일단 여기에서는 당연히 AF_INET을 사용한다.

AF_INET에서의 type에는 여러가지가 존재하는데, 그것은 SOCK_STREAM, SOCK_DGRAM, SOCK_RAW등이 있다. SOCK_STREAM은 TCP에 대해서 사용하며, SOCK_DGRAM은 dgram이 datagram이라는 것을 알면 UDP라고 생각할 수 있을 것이다. 이들 TCP/UDP등의 high level을 제외한 IP level에서의 통신을 위해서는 SOCK_RAW가 쓰인다.



SOCK_RAW에서의 prototype에는 여러가지가 존재하는데, 이것은 IPPROTO_RAW, IPPROTO_ICMP등이 존재한다. 여기에서 IP-spoof를 하고자 하므로, IP packet을 생성해야 한다. 그러므로, IPPROTO_RAW를 사용하게 된다.

이제 socket을 여는 방법을 알았다.

sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);

지금까지 socket의 정의에 대해서 논했는데, IP-spoof를 위해서 SOCK_RAW같은 것을 알아야 하는가에 대해서 궁금할 수 밖에 없다. 그것은 바로 각 layer의 역할에 답이 있다.



TCP 프로토콜의 header의 정보를 살펴보자.

TCP header에는 각각 다음의 정보가 존재한다.

SOURCE PORT, DESTINATION PORT, SEQUENCE NUM, ACK NUM, HLEN, FLAGS, WINDOW, CHECKSUM, URGENT POINTER

위에서 볼때 TCP에는 port정보등의 상세 통신 정보는 존재하지만, 중요한 IP address정보가 존재하지 않는다. IP spoof라는 것은 IP 주소를 가상으로 조작하여 전송하는 것을 뜻하는데, TCP/UDP등의 layer에서는 이러한 정보를 조작할 수 없음을 알 수 있다.

결론적으로 통신의 level은 IP level에 이르러야 한다.



이제 IP level의 socket을 정의하는 방법을 알았으므로, 이것을 이용해서 패킷을 인터넷 상에 전송할 수 있다.

다음은 IP spoof에서의 main에 해당할 기본 루틴만을 적은 것이다.

struct msg {
        struct iphdr ip;
        struct tcphdr tcp;
        char *mesg;
};

sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);

sendto(sock, &msg, *LENGTH_OF_MSG*, 0, &sin, sizeof(sin));
이 socket에 뿌려줄 data는 IP packet이다. IP packet에는 TCP header가 포함되어 있으며, TCP아래의 data또한 포함된다. 이것이 각각 Encapsulation되어 다음과 같은 형태를 지니게 된다.

IP-HEADER : TCP-HEADER : DATA

이것은 msg라는 structure에 담았으며, structure내의 각 data type은 위의 형태를 구현하고 있는 것이다.



sendto 명령을 이용하여 socket descriptor에 msg의 내용을 그대로 푸려주는 데, 그 원하는 destination은 뒤의 sin structure내에 적어주면 된다.



IP packet을 직접 조작할 수 있으므로, IP address의 조작이 가능하며, 또한 그 상위 레벨인 TCP header의 조작 또한 가능하다. 이것을 이용하면, TCP SYN flood 등의 공격이 가능하며, 또한 TCP RST등으로 connection을 끊는 공격, 그리고 궁극적으로 IP hijacking에 이를 수 있게 된다.