0成本保姆级手把手教你搭建自己专属的高匿HTTP/DNS LOG,从此挖洞无忧!
0x0 前言
经过log4j2漏洞的洗礼,相信很多人意识到自建DNSLog的重要性。笔者的工作流有两个,一个是类似P神Conote那种常规化的功能高度集成的WEB平台,另一个则是今天要与大家分享的,如何零成本快速创建一个高匿HTTP/DNS LOG服务的。
0x1 申请域名
挂上代理访问:https://www.freenom.com/zh/index.html?lang=zh
输入一个域名进行获取即可,然后点击右上角的check out
去结算。
申请域名结束后,进入域名管理,配置NameServer,指向CloudFlare。
darl.ns.cloudflare.com
gene.ns.cloudflare.com
CloudFlare的域名解析记录的速度是非常快的,后面添加到CloudFlare即可。
0x2 配置NS记录
分别申请两个DNS记录,NS记录代表子域名log.log4j.ga
的DNS服务器为ns.log4j.ga
。
然后我们设置ns.log4j.ga
的A记录指向我们DNS服务器所在的地址即可。
为了测试是否生效,可以用Python2写一个简单的DNS服务器返回指定的应答IP。
#/usr/bin/python2
# -*- coding:utf-8 -*-
from twisted.internet import reactor, defer
from twisted.names import client, dns, error, server
record={}
class DynamicResolver(object):
def _doDynamicResponse(self, query):
name = query.name.name
# 返回指定应答IP
ip = "x.x.x.x"
print(name+" ===> "+ip)
answer = dns.RRHeader(
name=name,
type=dns.A,
cls=dns.IN,
ttl=0, # 这里设置DNS TTL为 0
payload=dns.Record_A(address=b'%s'%ip,ttl=0)
)
answers = [answer]
authority = []
additional = []
return answers, authority, additional
def query(self, query, timeout=None):
return defer.succeed(self._doDynamicResponse(query))
def main():
factory = server.DNSServerFactory(
clients=[DynamicResolver(), client.Resolver(resolv='/etc/resolv.conf')]
)
protocol = dns.DNSDatagramProtocol(controller=factory)
reactor.listenUDP(53, protocol)
reactor.run()
if __name__ == '__main__':
raise SystemExit(main())
如图说明配置成功:
0x3 选择一 部署Knary
二进制文件部署:
wget https://ghproxy.com/https://github.com/sudosammy/knary/releases/download/v3.3.1/knary-3.3.1-linux-amd64
chmod +x knary-3.3.1-linux-amd64
mv knary-3.3.1-linux-amd64 knary
./knary
如果二进制不安全,可以考虑Docker 快速搭建:
export GIT_SSL_NO_VERIFY=0
git clone http://ghproxy.com/https://github.com/sudosammy/knary.git
# 编辑docker-compose.yaml的信息
vim docker-compose.yaml
可以看到环境变量信息有两种配置方式,一种是利用当目前的.env
文件,一种是直接配置环境变量environment
,也可以混合来用,我这里先配置下CANARY_DOMAIN
=CANARY_DOMAIN=log.log4j2.ga
。
version: "3.9"
services:
knary:
container_name: knary
hostname: knary
restart: always
env_file:
- .env # as commented below, you can also use the `environment` key to specify variables. This will overwrite anything in `env_file`
# environment:
# - DNS=true
# - HTTP=true
# - BIND_ADDR=127.0.0.1
- CANARY_DOMAIN=log.log4j2.ga
# (etc. etc.)
build: .
ports:
- "80:80"
- "443:443"
- "53:53/udp"
volumes:
- ./certs:/certs/
编辑一份环境变量:
vim .env
# 内容
# RENAME ME TO .env
DNS=true
HTTP=true
BIND_ADDR=0.0.0.0
CANARY_DOMAIN=log.log4j.ga
LETS_ENCRYPT=xxxxx@qq.com
EXT_IP=1x1.xxx.1xx.x3
DEBUG=true
LOG_FILE=knary.log
有两种方法,快速配置HTTPS证书:
1)自签名证书
当前目录创建一个cert文件夹
mkdir certs
openssl创建证书
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./certs/selfsigned.key -out ./certs/knary.crt
信息可以随意填,不重要。
2)Let's Encrypt 免费https,Kanry自带,只需要配置好邮箱即可,推荐使用这种!
docker-compose启动
# 卸载原先docker
apt-get remove -y remove docker
# 安装最新docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 安装docker-compose
sudo curl -L
"https://ghproxy.com/https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/bin/docker-compose
sudo chmod +x /usr/bin/docker-compose
Ubuntu构建过程可能会报错,修改/etc/resolv.conf
的值为这个即可。
nameserver 8.8.8.8
nameserver 114.114.114.114
nameserver 127.0.0.53
nameserver 223.5.5.5
options edns0
为了兼容国内VPS还需要修改Dockerfile添加Golang
代理,要不然go get
会失败:
RUN export GOPROXY=https://goproxy.io && go get .
效果展示
强烈推荐直接二进制运行,非常方便!
Docker运行界面:
0x4 选择二 部署Hyuga
git clone https://github.com/Buzz2d0/Hyuga.git
cd Hyuga
修改config.xml
文件
cd hyuga/
vim config.yaml
配置如图所示:
Docker快速组建:
docker-compose build
docker-compose up -d
如图所示,搭建成功!
DNS记录:
HTTP记录:
设置DNS重绑定:
for((i=1;i<=2;i++))
do
sleep 0.5 && dig @8.8.8.8 r.amz3.log.log4j.ga;
done
0x5 选择三 部署Interactsh
1) 手工搭建
安装Golang 1.16.1环境:
sudo apt-get update
sudo apt-get -y upgrade
apt install -y gcc
mkdir tmp
cd /tmp
wget https://dl.google.com/go/go1.16.1.linux-amd64.tar.gz
sudo tar -xvf go1.16.1.linux-amd64.tar.gz
sudo mv go /usr/local/
echo "export GOROOT=/usr/local/go" >> ~/.profile
echo "export GOPATH=$HOME/go" >> ~/.profile
echo "export PATH=$GOPATH/bin:$GOROOT/bin:$PATH" >> ~/.profile
source ~/.profile
安装Interachsh Server
go install -v github.com/projectdiscovery/interactsh/cmd/interactsh-server@latest
2) docker搭建
docker run projectdiscovery/interactsh-server:latest -domain log.log4j.ga
用法:
interactsh-server -domain log.log4j.ga -auth
获取到Client Token,打开https://app.interactsh.com/#/
结果界面显示:
0x6 分析三者优缺点
Knary的优点在于支持单文件部署,支持国外的信息推送、支持域名过滤,支持DNS、HTTP/HTTPS,缺点则是缺乏可视化界面、不支持生成随机域名,且运行的时候并不是很稳定,内存占用有点高。
Hyuga是国内开发者开发的,可以说很符合笔者的需求,有良好、简洁的WEB界面,支持DNS、HTTP、支持DNS重绑定、支持API,安装过程也很简单,但是很可惜缺乏信息推送和支持HTTPS请求,但是目前来说这个工具能满足大部分的需求了。
Interactsh安装过程也并不复杂,支持DNS、HTTP/HTTPS等多种协议,有可视化界面,支持生成随机域名,可通过与projectdiscovery的notify工具联动来进行信息推送,缺点不支持国内信息推送流、生成的随机域名太长,容易被判定为恶意网址。
笔者针对三者做了个简单的对比表格:
Knary | Hyuga | Interactsh | |
---|---|---|---|
DNS | √ | √ | √ |
HTTP | √ | √ | √ |
HTTPS | √ | × | √ |
WEB | × | √ | √ |
信息推送 | √ | × | √ |
API | × | √ | × |
支持随机子域 | × | √ | √ |
安装过程 | 非常简单 | 简单 | 简单 |
使用难易 | 较难 | 简单 | 有点难 |
0x7 问题汇总
下面由于安装环境的差异,可能会出现这些问题,提供给读者进行参考。
1) 53端口占用
vim /etc/systemd/resolved.conf
,如下图配置,关闭监听。
接着重启服务,sudo systemctl restart systemd-resolved
,发现53端口不被占用了。
如果出现这个错误,VPS一直都是依赖本地的DNS服务器,因为关闭了53端口导致错误。
vim /etc/resolv.conf
,分别指定两个公共DNS服务器即可。
2)域名没有备案,针对国内的VPS。
有两种解决方案:
1)不要用80,8080,443等端口,但这样会限制使用性,不推荐。
2)建议更换为国外服务器,比如Vultr、digital等等,按时间付费都很便宜。
3)乖乖备案,合理使用,适合白帽子!
0x8 总结
本文可以说是保姆级别的手把手教程了,涵盖了Github中较为流行、可用性强的项目具体搭建过程及其调试步骤,一条龙服务踩坑填坑,将三者的优缺点进行了分析。基于本文,读者不仅可以无需购买域名即可快速搭建出私人的Log,还可深入拓展研究,由于三个项目都是开源的,且代码量不大,有能力的读者完全可以去DIY自己的功能。
- 本文作者: xq17
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/1055
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!