批量网站DNS区域传送漏洞检测——bash shell实现

燕云 2014-05-21 12:18:00

0x00 背景


下面图中的eecs.cc为笔者自建的一台具有私有根的DNS服务器,且对外开放了区域传送权限,故有结果:cc区域传送成功。该图只是一个实验验证,下面文章正式开始!

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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/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" 

最终效果图:

0x02 DNS区域传送权限自动检测


有如下命题:

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为参与检测的域名列表文件,可自定义之。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/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

程序结束。

# 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站点列表 :) 

希望这篇文章能帮助大家!

评论

X

xsser 2014-05-21 12:37:31

这兄弟bash玩儿的很好啊

X

xsser 2014-05-21 12:49:57

我一直想要哇

燕云 2014-05-21 13:55:56

哈哈!
dns_transfer_check.sh 里面还有很多需要优化的地方,比如:
1.目前的策略是一下子把整个文件读到内存,但是如果列表文件很大,程序开始时很可能会卡顿,而且内存消耗也会很大
2.另外,里面的正则模式写的奇丑。。。

_

_Evil 2014-05-21 14:30:07

这兄弟bash玩儿的很好啊

燕云 2014-05-21 14:35:23

过奖了 :)
另外,文章开篇的服务器上有个比较好玩的东西,自己看看,绝对有趣!这个页面捕获了所有尝试 ssh 22 登陆的用户动作。。。
http://eecs.cc:8080/secure

X

xiaoL 2014-05-21 15:39:10

原来bash玩得好这么高端啊- -
一直想写就是感觉不好实现
学习了

1

1ee 2014-05-21 16:00:39

学习了!

X

xsser 2014-05-21 16:11:30

这个是我一直想测试又没有做的,这个字典应该有意思

B

Bloodwolf 2014-05-21 16:44:14

弄点新鲜的玩意儿呗!

动后河 2014-05-21 19:52:46

自愧不如,
sh脚本压根看都看不懂

X

xxx 2014-05-21 20:43:05

linux 平台被你们玩精了!

B

bitcoin 2014-05-21 22:09:26

牛啊

F

F4K3R 2014-05-25 02:25:22

思路赞一个!

池寒 2016-05-21 18:21:32

@燕云请问这个怎么用

池寒 2016-05-21 18:22:42

感觉得去了解下bash了,看不懂

燕云

明白事物的根源 就能发现其弱点

twitter weibo github wechat

随机分类

Web安全 文章:248 篇
Windows安全 文章:88 篇
MongoDB安全 文章:3 篇
密码学 文章:13 篇
软件安全 文章:17 篇

扫码关注公众号

WeChat Offical Account QRCode

最新评论

K

k0uaz

foniw师傅提到的setfge当在类的字段名成是age时不会自动调用。因为获取

Yukong

🐮皮

H

HHHeey

好的,谢谢师傅的解答

Article_kelp

a类中的变量secret_class_var = "secret"是在merge

H

HHHeey

secret_var = 1 def test(): pass

目录