snort는 룰을 정의할 때 protocol을 지정하게 되어있습니다.
메뉴얼에 보니까 현재 tcp, udp, icmp, ip 를 지원하고 있다고 되어있네요.
dsize 는 각 프로토콜에서 헤더부분을 제외한 실제 데이터 부분의 크기를 의미합니다.
content는 그 실제 데이터를 나타내고요.
넷웍쪽의 프로토콜은 레이어 구조로 나뉘어져 있기 때문에
어플리케이션에서 생성하는 하나의 메시지가 전송되기 위해서는
아랫쪽의 레이어를 거치면서 각 레이어에서 여러 정보들을 붙이게 됩니다.
application에서 "hello, world!" 를 TCP 소켓을 통해서 전송하면
TCP 단에서는 여기에 포트 정보, 시퀀스 정보, 윈도우 정보, 체크섬,
기타 플래그 등을 덧붙여서 IP단으로 내려보내고,
IP단에서는 TCP단으로 부터 온 정보에 IP address 정보, 상위프로토콜종류, TTL,
체크섬 정보 등을 추가해서 아랫단으로 내려보내죠.
ip 차원에서 보자면 tcp나 udp 데이터는 해당 ip 패킷의 payload가 되겠죠.
tcp 차원에서는 application에서 보내는 데이터
(write()나 send()로 보내는 데이터)가 해당 메시지의 payload가 되고요.
따라서 dsize와 content는 룰에서 사용하는 프로토콜에 따라서 구하는 방법이 틀립니다.
예를 들면 ip 프로토콜에서는 total length 필드(bit16~31. 바이트단위)에서 헤더의 길이를 빼면 dsize를 구할 수 있고,
패킷에서 헤더길이(bit4-7. 32bit 워드단위) 만큼을 지난 곳부터 읽으면 content가 되겠고요
tcp 프로토콜에서는 ip 의 total length에서 ip 헤더의 길이와 tcp 헤더의 길이
(bit96-99. 32bit 워드단위. Data offset)를 빼면 구할 수 있습니다.
content의 위치는 ip 패킷과 동일한 방식으로 구하시면 되고요.
(tcp 세그먼트는 자체에 길이정보를 가지고 있지 않고 아랫레이어정보로부터 계산을 해서 구합니다.)
snort는 룰을 정의할 때 protocol을 지정하게 되어있습니다.
snort는 룰을 정의할 때 protocol을 지정하게 되어있습니다.
메뉴얼에 보니까 현재 tcp, udp, icmp, ip 를 지원하고 있다고 되어있네요.
dsize 는 각 프로토콜에서 헤더부분을 제외한 실제 데이터 부분의 크기를 의미합니다.
content는 그 실제 데이터를 나타내고요.
넷웍쪽의 프로토콜은 레이어 구조로 나뉘어져 있기 때문에
어플리케이션에서 생성하는 하나의 메시지가 전송되기 위해서는
아랫쪽의 레이어를 거치면서 각 레이어에서 여러 정보들을 붙이게 됩니다.
application에서 "hello, world!" 를 TCP 소켓을 통해서 전송하면
TCP 단에서는 여기에 포트 정보, 시퀀스 정보, 윈도우 정보, 체크섬,
기타 플래그 등을 덧붙여서 IP단으로 내려보내고,
IP단에서는 TCP단으로 부터 온 정보에 IP address 정보, 상위프로토콜종류, TTL,
체크섬 정보 등을 추가해서 아랫단으로 내려보내죠.
ip 차원에서 보자면 tcp나 udp 데이터는 해당 ip 패킷의 payload가 되겠죠.
tcp 차원에서는 application에서 보내는 데이터
(write()나 send()로 보내는 데이터)가 해당 메시지의 payload가 되고요.
따라서 dsize와 content는 룰에서 사용하는 프로토콜에 따라서 구하는 방법이 틀립니다.
예를 들면 ip 프로토콜에서는 total length 필드(bit16~31. 바이트단위)에서 헤더의 길이를 빼면 dsize를 구할 수 있고,
패킷에서 헤더길이(bit4-7. 32bit 워드단위) 만큼을 지난 곳부터 읽으면 content가 되겠고요
tcp 프로토콜에서는 ip 의 total length에서 ip 헤더의 길이와 tcp 헤더의 길이
(bit96-99. 32bit 워드단위. Data offset)를 빼면 구할 수 있습니다.
content의 위치는 ip 패킷과 동일한 방식으로 구하시면 되고요.
(tcp 세그먼트는 자체에 길이정보를 가지고 있지 않고 아랫레이어정보로부터 계산을 해서 구합니다.)
댓글 달기