我们就是喜欢在正常的位置放进去一些奇怪的东西。 0x01 引子 反弹Shell广泛应用于远程控制下的权限维持,通过反转攻(客户端)和受(服务端)的角色,来实现条件限制,尤其是内网情况下的远程连接。 反弹Shell的工具和实现方法多种多样,只要能够让被控端通过网络发送数据到控制端,并且实现数据的解析即可完成控制过程。 最近在继续了解网络协议,于是突然想在DNS数据包中插入一些伪造的命令来实现解析,本来准备自己尝试写一个DNS服务器和DNS请求程序来实现反弹,不过刚动笔就看到了别人开源的程序,于是直接使用别人的程序来学习了。 https://github.com/ahhh/Reverse_DNS_Shell 为了运行测试更方便,去掉了程序中的加解密功能,额外的Python包只需要dns和dnslib 0x02 DNS 为了关联主机和IP地址对应关系而诞生的DNS本身,不需要我在这里赘述了。跳过域名构成、查询过程等可以轻松在网络查询到的内容,我们直接来看看DNS的包构成 在smtp那篇文章中,我们提过一层一层洋葱状的协议包裹,在这里,我们跳过以太、IP、UDP头,直接到DNS数据的部分。 标志着数据开始的是Tran ID段,所有的问答信息都需要一定的机制来保证对应,这部分应该就是对应机制中的一部分。 紧接着的Flags,0x0100表明了一些查询属性。 Queries中是我们所要查询的host,查询类型。作为A类型查询,得到的是host的IP,这里也是我们做手脚的地方,不过TXT类型可以插入一些附加的信息,更适合我们用来构造命令语句。 服务器回应包如下: 作为回应的Tran ID,它和查询包相同。 Flags中标准回应标志位 重复显示的Queries 回应的Answers信息。通过CNAME查取主机规范名,再通过规范名查取对应IP。 利用这种相互应答的特性,我们初步计划通过以下流程来实现我们的反弹Shell
被控端: 发送DNS请求——> 接收回应并解析执行命令 ——> 发送DNS请求
| /|\ |
| | |
| | |
\|/ | \|/
控制端: 接收DNS请求并解析命令回显——发送添加了命令的回应——接收DNS并解析命令