DNS

出自gamedev
於 2023年7月3日 (一) 13:55 由 127.0.0.1留言 所做的修訂 (创建页面,内容为“{{Ctf_Wiki}} <span id="dns"></span> = DNS = == 简介 == <code>DNS</code> 通常为 <code>UDP</code> 协议,报文格式 <syntaxhighlight lang="sh">+-------------------------------+ | 报文头 | +-------------------------------+ | 问题 (向服务器提出的查询部分) | +-------------------------------+ | 回答 (服务器回复的资源记录) | +-------------------------------+ | 授权 (权威的资源记录)…”)
(差異) ←上個修訂 | 最新修訂 (差異) | 下個修訂→ (差異)
跳至導覽 跳至搜尋

{{#tree:

}}

DNS[編輯]

簡介[編輯]

DNS 通常為 UDP 協議,報文格式

+-------------------------------+
| 报文头                         |
+-------------------------------+
| 问题 (向服务器提出的查询部分)    |
+-------------------------------+
| 回答 (服务器回复的资源记录)      |
+-------------------------------+
| 授权 (权威的资源记录)           |
+-------------------------------+
| 额外的 (额外的资源记录)         |
+-------------------------------+

查詢包只有頭部和問題兩個部分, DNS 收到查詢包後,根據查詢到的信息追加回答信息、授權機構、額外資源記錄,並且修改了包頭的相關標識再返回給客戶端。

每個 question 部分

   0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
 |                                               |
 /                     QNAME                     /
 /                                               /
 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
 |                     QTYPE                     |
 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
 |                     QCLASS                    |
 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  • QNAME :為查詢的域名,是可變長的,編碼格式為:將域名用.號劃分為多個部分,每個部分前面加上一個字節表示該部分的長度,最後加一個 0 字節表示結束
  • QTYPE :占 16 位,表示查詢類型,共有 16 種,常用值有:1 ( A 記錄,請求主機 IP 地址)、2 ( NS ,請求授權 DNS 服務器)、5 ( CNAME 別名查詢)

例題[編輯]

題目:BSides San Francisco CTF 2017dnscap.pcap

我們通過 wireshark 打開發現全部為 DNS 協議,查詢名為大量字符串([\w\.]+)\.skullseclabs\.org

我們通過 tshark -r dnscap.pcap -T fields -e dns.qry.name > hex提取後,利用 python 轉碼:

import re


find = ""

with open('hex','rb') as f:
    for i in f:
        text = re.findall(r'([\w\.]+)\.skull',i)
        if text:
            find += text[0].replace('.','')
print find

我們發現了幾條關鍵信息:

Welcome to dnscap! The flag is below, have fun!!
Welcome to dnscap! The flag is below, have fun!!
!command (sirvimes)
...
IHDR
gAMA
bKGD
        pHYs
IHDR
gAMA
bKGD
        pHYs
tIME
IDATx
...
2017-02-01T21:04:00-08:00
IEND
console (sirvimes)
console (sirvimes)
Good luck! That was dnscat2 traffic on a flaky connection with lots of re-transmits. Seriously,
Good luck! That was dnscat2 traffic on a flaky connection with lots of re-transmits. Seriously, d[
good luck. :)+

flag 確實包含在其中,但是有大量重複信息,一是應為question 。在 dns 協議中查詢和反饋時都會用到, -Y "ip.src == 192.168.43.91"進行過濾後發現還是有不少重複部分。

%2A}
%2A}
%2A}q
%2A}x
%2A}
IHDR
gAMA
bKGD
        pHYs
tIME
IDATx
HBBH
CxRH!
C1%t
ceyF
i4ZI32
rP@1
ceyF
i4ZI32
rP@1
ceyF
i4ZI32
rP@1
ceyF
i4ZI32
rP@1

根據發現的 dnscat 找到 https://github.com/iagox86/dnscat2/blob/master/doc/protocol.md 這裡介紹了 dnscat 協議的相關信息,這是一種通過 DNS 傳遞數據的變種協議,題目文件中應該未使用加密,所以直接看這裡的數據塊信息

MESSAGE_TYPE_MSG: [0x01]
(uint16_t) packet_id
(uint8_t) message_type [0x01]
(uint16_t) session_id
(uint16_t) seq
(uint16_t) ack
(byte[]) data

qry.name中去除其餘字段,只留下 data 快,從而合併數據,再從 16 進制中檢索89504e.....6082提取png,得到 flag

import re


find = []

with open('hex','rb') as f:
    for i in f:
        text = re.findall(r'([\w\.]+)\.skull',i)
        if text:
            tmp =  text[0].replace('.','')
            find.append(tmp[18:])
last = []

for i in find:
    if i not in last:
        last.append(i)


print  ''.join(last)

flag

[[File:./figure/dnscat_flag.png|dnscat_flag]]

相關題目[編輯]

參考文獻[編輯]