https://github.com/Pxter7777/ICSHW1
#include <unistd.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/ip.h>
#include <netinet/udp.h>
#include <sys/ioctl.h>
#include <net/if.h>// struct ifreq
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <linux/if_ether.h>// struct ethhdr
#include <linux/if_packet.h>
#include <net/ethernet.h> //needless?
#include <errno.h>
很多ethernet header、IP header、UDP header的struct都可以在內建的header file裡面找到,不需要自己再額外定義 C語言中資料結構(struct)的大小 - attribute((packed))
linux強制使用者要有root priviledge(用sudo)才能使用raw socket
所以這邊我用這個方法
Non-root users
利用下列這段指令能讓non-root users執行dns_attack
sudo setcap cap_net_admin,cap_net_raw=eip dns_attack
- 本次作業不需要SPOOF ETHERNET,在socket、socket address記得使用AF_INET即可
- Protocal = 17(UDP)
- Source Address = Attacker輸入的Victim IP
- Destination Address = Attacker輸入的DNS IP
- total_len和checksum需要等整個封包寫好再做計算
- Source Port = Attacker輸入的UDP Port
- Destination Port = 53(DNS)
- total_len和checksum需要等整個封包寫好再做計算
- ID = 學號尾數2個byte(516067 = 0xdfe3)
- q_count = 1(一個問題)
- Additional RRs = 1
- qname = nctu.edu.tw處理後的網域
- q_type = 0x00FF = ANY
- q_class = 0x0001 = IN
- type = 41(OPT, 允許edns)
- Z: DO bit = 1(允許dnssec)
- IP header checksum
- 把IP header的資料以2 bytes為一組加總(checksum欄位除外)
- 進位補回
- 取補數
- UDP checksum
- Pseudo Header: Source IP + Destination IP + Protocol(0x0011) + L4 Header Length
- UDP header
- UDP Payload(注意要考慮byte長度為奇數的情況,應當幫他補上0. e.g.,0x??00)
其實直接sudo就好了==
DNSSEC, EDNS
- 運用dig可以直接由terminal發送dns request進行測試,意外測試到
dig ANY nctu.edu.tw @140.113.6.2
- 3083的TCP、3084的DNS其實是同一個封包,Fragment成2塊,實際總長約2500,查看他的Request,發現差別在Additional Records
- 實際照抄上去也會有同樣的效果
https://blog.cloudflare.com/deep-inside-a-dns-amplification-ddos-attack/