HFish安装

一、下载地址:

https://github.com/hacklcx/HFish/releases
https://github.com/hacklcx/HFish

二、docker安装

单年度部署
默认帐号密码限制:admin,如需修改可以通过加入-e USERNAME= -e PASSWORD=预先环境变量进行修改。-v $PWD:/opt 若要做数据持久化存储,可加参数挂载数据卷到主机机上,避免容器删除数据丢失。
docker run -d —name hfish -p 21:21 -p 22:22 -p 23:23 -p 3306:3306 -p 6379:6379 -p 8080:8080 -p 8989:8989 -p 9000:9000 -p 9001:9001 -p 11211:11211
imdevops/hfish:lates
21为FTP端口
22为SSH端口
23为Telnet端口
3306为Mysql端口
6379为Redis端口
8080为暗网端口
8989为插件扩展
9000为Web端口
9001为系统管理后台端口
11211为Memcache扩展
以上端口根据实际需要决定是否打开,并注意端口冲突。
集群部署
主节点部署
docker pull imdevops/hfish
docker run -d —name hfish-master -p 21:21 -p 22:22 -p 23:23 -p 3306:3306 -p 6379:6379 -p 7879:7879 -p 8080:8080 -p 8989:8989 -p 9000:9000 -p 9001:9001 -p 11211:11211 imdevops/hfish:latest
客户端子节点部署
docker run -d —name hfish-client -p 21:21 -p 22:22 -p 23:23 -p 3306:3306 -p 6379:6379 -p 8080:8080 -p 8989:8989 -p 9000:9000 -p 11211:11211 -e CLUSTER_IP=master_ip:7879 -e NODE_NAME=clinet imdevops/hfish:latest
7879 为集群通信 RPC 端口
环境变量 CLUSTER_IP 为集群主节点IP地址
环境变量NODE_NAME为客户端节点名称,集群唯一,不可重名
使用说明
在后续使用过程中,如需修改配置文件或代码。使用如下命令进入容器内修改:
docker exec -it 容器名 sh
设置

服务端配置
本配置为 Demo 服务端需要启动 rpc , 修改状态 status 为 1
[rpc]
status = 1 # 模式 0关闭 1服务端 2客户端
addr = 127.0.0.1:7879 # RPC 服务端地址 or 客户端地址
name = Server # 状态1 服务端 名称 状态2 客户端 名称
[admin] # RPC 状态为2 集群客户端的时候 admin 可以删掉
addr = 127.0.0.1:9001 # 管理后台启动地址
account = admin # 登录账号
password = admin # 登录密码
[api]
status = 1 # 是否启动 API 1 启动 0 关闭
web_url = /api/v1/post/report # 管理后台启动地址
deep_url = /api/v1/post/deep_report # 管理后台启动地址
plug_url = /api/v1/post/plug_report # 插件蜜罐上报 API
sec_key = 9cbf8a4dcb8e30682b927f352d6559a0 # API 认证秘钥
[plug]
status = 0 # 是否启动 蜜罐插件 0 关闭 1 启动, 需要先启动 API
addr = 0.0.0.0:8989 # 蜜罐插件 启动地址
[web]
status = 0 # 是否启动 WEB 1 启动 0 关闭, 启动 API 后 WEB 方可上报结果
addr = 0.0.0.0:9000 # WEB 启动地址,0.0.0.0 对外开放,127.0.0.1 对内开放 可走 Nginx 反向代理
template = wordPress/html # WEB 模板路径
index = index.html # WEB 首页文件
static = wordPress/static # WEB 静态文件路径 注意:必须存在两个目录,html 文件 和静态文件 不能平级
url = / # WEB 访问目录,默认 / 可更改成 index.html index.asp index.php
[deep]
status = 0 # 是否启动 暗网 1 启动 0 关闭, 启动 API 后 方可上报结果
addr = 0.0.0.0:8080 # 暗网 WEB 启动地址
template = deep/html # 暗网 WEB 模板路径
index = index.html # 暗网 WEB 首页文件
static = deep/static # 暗网 WEB 静态文件路径 注意:必须存在两个目录,html 文件 和静态文件 不能平级
url = / # 暗网 WEB 访问目录,默认 / 可更改成 index.html index.asp index.php
[ssh]
status = 0 # 是否启动 SSH 1 启动 0 关闭
addr = 0.0.0.0:22 # SSH 服务端地址 注意端口冲突,请先关闭服务器 openssh 服务 或 修改端口
[redis]
status = 0 # 是否启动 Redis 1 启动 0 关闭
addr = 0.0.0.0:6379 # Redis 服务端地址 注意端口冲突
[mysql]
status = 0 # 是否启动 Mysql 1 启动 0 关闭
addr = 0.0.0.0:3306 # Mysql 服务端地址 注意端口冲突
files = /etc/passwd,/etc/group # Mysql 服务端读取客户端任意文件; 多写逗号分隔,会随机取
[telnet]
status = 0 # 是否启动 Telnet 1 启动 0 关闭
addr = 0.0.0.0:23 # Telnet 服务端地址 注意端口冲突
[ftp]
status = 0 # 是否启动 Ftp 1 启动 0 关闭
addr = 0.0.0.0:21 # Ftp 服务端地址 注意端口冲突
[mem_cache]
status = 0 # 是否启动 MemCache 0 关闭 1 启动
addr = 0.0.0.0:11211 # Memcache 服务端地址 注意端口冲突
rate_limit = 4 # 每秒响应次数
客户端部署
本配置为 Demo 客户端可删除 admin 配置项
客户端需要启动 rpc , 修改状态 status 为 2
[rpc]
status = 2 # 模式 0关闭 1服务端 2客户端
addr = 127.0.0.1:7879 # RPC 服务端地址 or 客户端地址
name = Beijing_Clinet # 状态1 服务端 名称 状态2 客户端 名称
[api]
status = 1 # 是否启动 API 1 启动 0 关闭
web_url = /api/v1/post/report # 管理后台启动地址
deep_url = /api/v1/post/deep_report # 管理后台启动地址
plug_url = /api/v1/post/plug_report # 插件蜜罐上报 API
sec_key = 9cbf8a4dcb8e30682b927f352d6559a0 # API 认证秘钥
[plug]
status = 0 # 是否启动 蜜罐插件 0 关闭 1 启动, 需要先启动 API
addr = 0.0.0.0:8989 # 蜜罐插件 启动地址
[web]
status = 0 # 是否启动 WEB 1 启动 0 关闭, 启动 API 后 WEB 方可上报结果
addr = 0.0.0.0:9000 # WEB 启动地址,0.0.0.0 对外开放,127.0.0.1 对内开放 可走 Nginx 反向代理
template = wordPress/html # WEB 模板路径
index = index.html # WEB 首页文件
static = wordPress/static # WEB 静态文件路径 注意:必须存在两个目录,html 文件 和静态文件 不能平级
url = / # WEB 访问目录,默认 / 可更改成 index.html index.asp index.php
[deep]
status = 0 # 是否启动 暗网 1 启动 0 关闭, 启动 API 后 方可上报结果
addr = 0.0.0.0:8080 # 暗网 WEB 启动地址
template = deep/html # 暗网 WEB 模板路径
index = index.html # 暗网 WEB 首页文件
static = deep/static # 暗网 WEB 静态文件路径 注意:必须存在两个目录,html 文件 和静态文件 不能平级
url = / # 暗网 WEB 访问目录,默认 / 可更改成 index.html index.asp index.php
[ssh]
status = 0 # 是否启动 SSH 1 启动 0 关闭
addr = 0.0.0.0:22 # SSH 服务端地址 注意端口冲突,请先关闭服务器 openssh 服务 或 修改端口
[redis]
status = 0 # 是否启动 Redis 1 启动 0 关闭
addr = 0.0.0.0:6379 # Redis 服务端地址 注意端口冲突
[mysql]
status = 0 # 是否启动 Mysql 1 启动 0 关闭
addr = 0.0.0.0:3306 # Mysql 服务端地址 注意端口冲突
files = /etc/passwd,/etc/group # Mysql 服务端读取客户端任意文件; 多写逗号分隔,会随机取
[telnet]
status = 0 # 是否启动 Telnet 1 启动 0 关闭
addr = 0.0.0.0:23 # Telnet 服务端地址 注意端口冲突
[ftp]
status = 0 # 是否启动 Ftp 1 启动 0 关闭
addr = 0.0.0.0:21 # Ftp 服务端地址 注意端口冲突
[mem_cache]
status = 0 # 是否启动 MemCache 0 关闭 1 启动
addr = 0.0.0.0:11211 # Memcache 服务端地址 注意端口冲突
rate_limit = 4 # 每秒响应次数
修改配置
[api]
status = 1
web_url = /api/v1/post/report
deep_url = /api/v1/post/deep_report
sec_key = 9cbf8a4dcb8e30682b927f352d6559a0

status 是否启动 Api 1 启动 0 关闭
web_url Api WEB蜜罐的路径
deep_url Api 暗网蜜罐的路径
sec_key 走接口上报,生产请修改 KEY

WEB Demo
URL: http://WEB蜜罐地址/api/v1/post/report
POST:
name : WEB管理后台蜜罐 # 项目名
info : admin&&12345 # 上报信息,&& 为换行符号
seckey : 9cbf8a4dcb8e30682b927f352d6559a0 # API 安全密钥
特殊说明:
URL api/v1/post/report 可在 config.ini 配置里修改
seckey 可在 config.ini 配置里修改,修改后 WEB 模板也需要同时修改
暗网 Demo
URL: http://暗网蜜罐地址/api/v1/post/deep_report
POST:
name : 暗网后台蜜罐 # 项目名
info : admin&&12345 # 上报信息,&& 为换行符号
seckey : 9cbf8a4dcb8e30682b927f352d6559a0 # API 安全密钥
特殊说明:
URL api/v1/post/deepreport 可在 config.ini 配置里修改
seckey 可在 config.ini 配置里修改,修改后 暗网 模板也需要同时修改
黑名单 IP
URL(Get): http://localhost:9001/api/v1/get/ip
获取全部钓鱼信息
URL(Get): http://localhost:9001/api/v1/get/fish_info
返回数据格式:
{
code: 200,
data: [
{
agent: “本机”,
city: “”,
country: “本机地址”,
createtime: “2019-08-26 21:29:00”,
id: 224,
info: “127.0.0.1:51548 已经连接&&stats&&&&set foo 0 6”,
ip: “127.0.0.1”,
project_name: “MemCache蜜罐”,
region: “本机地址”,
type: “MEMCACHE”
},
],
msg: “success”
}
字段 说明
id 数据库唯一标识
project_name 项目名称
type 类型
agent 集群名称
ip IP地址
country 国家
region 省份/地区
city 城市
info 上钩信息
create_time 上钩时间
设置 WebHook
格式为 POST 请求 Json 格式
设置里写 自己的服务 API 即可
数据格式
字段 说明
id 唯一标识
model 操作,new or update
project 项目名
type 类型
agent 集群名
ip IP地址
country 国家
region 省份
city 城市
info 上报信息
time 时间
特殊说明
第一次上报 model 为 new
同个 IP 上报同个连接的数据 model 为 update 意思是更新
Python Demo
from flask import Flask, request
import json
app = Flask(__name
)
@app.route(‘/api/callback’, methods=[‘GET’, ‘POST’])
def hello_world():
print json.dumps(request.json, indent=4)
return ‘Hello World!’
if __name
== ‘__main
‘:
app.run()