본문 바로가기

리눅스 커널/네트워크

(15)
Wireless packet capture IEEE802.11 패킷을 캡쳐하기 위해선 먼저 PC가 무선랜을 지원해야 한다. 그리고 이 때 해당 인터페이스의 이름이 wlan0임을 가정하고 정리하겠다. 1. Aircrack-ng 툴 사용 [1] #airmon-ng start wlan0 [2] #airodump-ng wlan0mon [1] 실행 후 iwconfig를 실행하면 인터페이스 이름이 wlan0 -> wlan0mon 으로 바뀌어 있을 것이다. 또한 인터페이스의 모드가 Managed -> Monitor 로 바뀌어 있을 것이다. 무선 패킷 캡쳐를 위해 가장 먼저 해야할 일이 인터페이스 모드를 Monitor모드로 바꾸는 것이다. [2] 실행 후에는 주위에 모든 무선 패킷을 볼 수 있다. [3] CTRL-C [4] #airmon-ng stop wlan..
TCP Handshake 1. 3-way handshaking 주로 초기 연결 시 사용되는 메커니즘이다. ----------------------------------------------------------------------------------------------------- (1) Client------(SEQ: 1000)------>Server 클라이언트가 서버로 SYN: 1이 설정된 TCP 패킷을 보내어 연결 요청을 함 ------------------------------------------------------------------------------------------------------ (2) ClientServer 클라이언트가 서버로 ACK: 1이 설정된 TCP패킷을 보내어 해당 패킷을 잘 받았음..
Check Sum Layer 4 네트워크에서 패킷 전송 후 수신함에 있어 비트 에러 감지를 위해 체크섬을 사용한다. 체크섬의 계산 과정은 다음과 같다. 패킷을 2바이트 단위로 접근 하여 그 값을 더해 나가는데, Carry가 발생하면 이 값을 다시 더해 나가는 것이다. 이 후 마지막 2바이트에 대해서도 계산을 마무리 하면 1의 보수를 취하면 된다. 이를 코드로 구현하면 다음과 같다. unsigned short cksum(unsigned char * buff, int len) { unsigned short * buf = (unsigned short *)buff; unsigned int sum = 0; for (; len > 0; len -= 2) { if (len == 1) sum += (unsigned short)(*(unsigned c..
netlink example #include #include #include #include #include #include #include #include #define BUFSIZE 8192 struct gw_info { uint32_t ip; unsigned char mac[ETH_ALEN]; }; int send_req(int sock, char *buf, size_t nlseq, size_t req_type) { struct nlmsghdr *nlmsg; memset(buf, 0, BUFSIZE); //init nlmsg = (struct nlmsghdr *)(buf); nlmsg->nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); //struct rtmsg nlmsg->nlmsg_typ..
promiscuous mode #include #include #include #include #include #include #include #include "pktfilter.c" int main(void) { int sock; unsigned char buf[65536]; struct packet_mreq pm; sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); if (sock < 0) { perror("socket error"); return -1; } memset(&pm, 0, sizeof(pm)); pm.mr_ifindex = 2; //normally, 1: lo, 2: ens33(or eth0) pm.mr_type = PACKET_MR_PROMISC; if (setsockop..
DHCP DHCP packet format Message type(1) [1: request, 2: reply] HW type(1) [1: Ethernet] HW address length(1) [6: Ethernet] Hops(1) Transaction ID(4) Seconds elapsed(2) Bootp flags(2) Client IP address(4) Your(client) IP address(4) Next server IP address(4) Relay agnet IP address(4) Client MAC address(6) Client HW address padding(10) empty(128) Magic cookie(4) option, opcode 53 : DHCP message type(3) ..
Kernel handler packet capture #include #include #include #include #include static struct packet_type pt; static int proto_handler(struct sk_buff * skb, struct net_device * dev1, struct packet_type * pktype, struct net_device * dev2) { struct ethhdr * eth = eth_hdr(skb); struct iphdr * ip = ip_hdr(skb); printk("%pM -> %pM\n", eth->h_source, eth->h_dest); printk("%pI4 -> %pI4\n", &ip->saddr, &ip->daddr); return NF_ACCEPT; } in..
Kernel hooking packet capture #include #include #include #include #include #include #include struct nf_hook_ops hook; unsigned int hook_func(void * priv, struct sk_buff * skb, const struct nf_hook_state * state) { struct iphdr * ip = ip_hdr(skb); printk("caller: %s\n", current->comm); printk("ip protocol: %d\n", ip->protocol); printk("%pI4 -> %pI4\n", &ip->saddr, &ip->daddr); return NF_ACCEPT; } int start(void) { hook.hook =..
Raw socket outgoing packet capture 앞서 작성한 글에서는 raw socket을 이용해서 incoming packet을 스니핑하는 방법에 대해 다루어보았다. 그러나 테스트 시 한가지 문제가 있음을 볼 수 있다. outgoing packet에 대해서는 제대로 스니핑 되지 않는 것이다. 그래서 이번에는 raw socket 사용 시 outgoing packet을 스니핑 하는 방법에 대해서 살펴보겠다. #include #include #include #include #include #include #include #include "pktfilter.c" int main(void) { int sock; unsigned char buf[65536]; struct sockaddr_ll sll; sock = socket(PF_PACKET, SOCK_RAW..
Raw socket incoming packet capture 시스템으로 들어오는 패킷을 캡쳐하는 방식은 크게 세가지가 있다. 여기서는 유저레벨에서 할 수 있는 raw socket을 이용하여 패킷을 스니핑 해보겠다. raw socket에 대한 개념은 따로 언급하지 않고 사용 방법에 대해서만 정리해보겠다. 먼저 네트워크 계층 까지만 다룰 수 있는 raw socket과 데이터 링크 계층까지 전부 다룰 수 있는 raw socket 이렇게 두가지 가 있다는 것을 이해하고 아래 코드를 살펴보겠다. #include #include #include #include #include "pktfilter.c" //패킷을 뜯어서 터미널에 출력하는 함수가 정의된 파일. int main(void) { int sock; unsigned char buf[65536]; //domain, typ..