准备魔改sliver去掉一些特征什么的,这里记录一下最简单实现上线消息通过企业微信机器人提醒的方式,这很简单也有很多不足还需要接着改的

protobuf中对消息Beacon和Session的定义如下,要显示的几个信息都是string类型的。

最好这里另外写一个消息类型(NotifyMsg),将要显示的消息字段放进去,然后这里Session和Beacon的相应部分就直接写NotifyMsg notify = 1; 这样写发送函数的时候,传参就可以直接写msg *clientpb.NotifyMsg了。不过又要重新生成proto文件了,简单一点就是直接一个个传了:

func sendMsgToBot(id, name, ip, hostname, arch, os, checkIn string) {}

机器人转发消息,用到的是一个封装好了的api:electricbubble/wecom-bot-api: 企业微信-群机器人-API (githubfast.com),这里面给了很详细的文档且支持markdown的形式发送,不过微信中不支持显示这样的类型:

所以就用最简单的text,按照他的demo来就行,如下:

func sendMsgToBot(id, name, ip, hostname, arch, os, checkIn string) {
botKey := "8ad64........" //这里填机器人的key
bot := botApi.NewWeComBot(botKey)
message := fmt.Sprintf(
" Karplin上线提醒\n 标识序号: %s\n 机器名称: %s\n 机器IP: %s\n 用户名: %s\n 架构: %s\n 系统版本: %s\n 上线时间: %s\n 请注意查收",
id, name, ip, hostname, arch, os, checkIn) _ = bot.PushTextMessage(message)
}

机器人的key移动端和pc端都能看,自己在群聊里面建一个机器人就能看到:

针对session和beacon上线提醒的两个位置:

		case consts.SessionOpenedEvent:
session := event.Session
currentTime := time.Now().Format(time.RFC1123)
shortID := strings.Split(session.ID, "-")[0]
con.PrintEventInfof("Session %s %s - %s (%s) - %s/%s - %v",
shortID, session.Name, session.RemoteAddress, session.Hostname, session.OS, session.Arch, currentTime) // Prelude Operator
if prelude.ImplantMapper != nil {
err = prelude.ImplantMapper.AddImplant(session, nil)
if err != nil {
con.PrintErrorf("Could not add session to Operator: %s", err)
}
} go sendMsgToBot(shortID, session.Name, session.RemoteAddress, session.Hostname, session.Arch, session.OS, currentTime) // beacon上线
case consts.BeaconRegisteredEvent:
beacon := &clientpb.Beacon{}
proto.Unmarshal(event.Data, beacon)
currentTime := time.Now().Format(time.RFC1123)
shortID := strings.Split(beacon.ID, "-")[0]
con.PrintEventInfof("Beacon %s %s - %s (%s) - %s/%s - %v",
shortID, beacon.Name, beacon.RemoteAddress, beacon.Hostname, beacon.OS, beacon.Arch, currentTime) // Prelude Operator
if prelude.ImplantMapper != nil {
err = prelude.ImplantMapper.AddImplant(beacon, func(taskID string, cb func(*clientpb.BeaconTask)) {
con.AddBeaconCallback(taskID, cb)
})
if err != nil {
con.PrintEventErrorf("Could not add beacon to Operator: %s", err)
}
}
echoed = true go sendMsgToBot(shortID, beacon.Name, beacon.RemoteAddress, beacon.Hostname, beacon.Arch, beacon.OS, currentTime)

编译完运行,开启监听后就生成session的,懒得再开一个win10就直接宿主机执行了

然后此时会收到企业微信机器人的提醒了,企业微信绑定了个人的微信的话,就像下面状态栏那里微信也会同时有提醒的。

sliver这边也能看到信息。

后续这个还有很多能改进的,除了上面说的新增一个消息类型来提高复用,还可以扩展钉钉、飞书那些平台的。机器人的key也最好是从配置文件里面读,这篇只是抛砖引玉,后续再改进

简单几行实现sliver上线提醒的更多相关文章

  1. C++ 实现简单命令行学生管理系统

    C++ 实现简单命令行学生管理系统 预览: 编译环境是macOS.system("clear") 在windows下请换成 system("cls") #inc ...

  2. GO实现简单(命令行)工具:sftp,文檔压解,RDS备份,RDS备份下载

    GO实现简单(命令行)工具:sftp,文檔压解,RDS备份,RDS备份下载 轉載請註明出處:https://www.cnblogs.com/funnyzpc/p/11721978.html 内容提要: ...

  3. 如何在MAC上使用SVN,简单几行命令搞定

    如果你要使用SVN管理代码,如果不是迫不得已,还是看看git吧,但是SVN也要知道怎么用,原理是相似的. 首先,要准备的东西:svnX软件 https://pan.baidu.com/s/1mhEay ...

  4. git base 简单命令行

    记录几个简单的命令 1:克隆-把线上的文件复制到本地 git clone 线上地址 2:检查状态 git status 3:放入待仓储 git add.文件名 git add * (全部文件,简单粗暴 ...

  5. Oracle学习笔记:一个简单的行转列例子

    一个简单的行列转换例子,原始数据. create table temp_cwh_student ( name ), subject ), score ) ) select * from temp_cw ...

  6. JS框架avalon简单例子 行编辑 添加 修改 删除 验证

    为什么要写这个例子:做表单的时候,表单包含主子表,对于子表的编辑,使用的是easyui datagrid的行编辑功能,由于业务比较复杂,实现起来比较麻烦,代码写的也很多,因为插件的封装,无法操作原始的 ...

  7. 1103简单SQL 行转列思路

    转自http://www.cnblogs.com/lhj588/p/3315876.html -- 经典行列转化DROP TABLE IF EXISTS TabName;CREATE TABLE Ta ...

  8. NodeJs简单七行爬虫--爬取自己Qzone的说说并存入数据库

    没有那么难的,嘿嘿,说起来呢其实挺简单的,或者不能叫爬虫,只需要将自己的数据加载到程序里再进行解析就可以了,如果说你的Qzone是向所有人开放的,那么就有一个JSONP的接口,这么说来就简单了,也就不 ...

  9. 《鸟哥的Linux私房菜》笔记——04. 简单命令行

    键入命令 [dmtsai@study ~]$ command [-options] parameter1 parameter2 ... 指令 選項 參數(1) 參數(2) 注意:有时也可以使用 + 放 ...

  10. Shiro 系列: 简单命令行程序示例

    在本示例中, 使用 INI 文件来定义用户和角色. 首先学习一下 INI 文件的规范. =======================Shiro INI 的基本规范================== ...

随机推荐

  1. 2019-A

    #include <iostream> #include <vector> using namespace std; class Mystack{ private: int t ...

  2. 3-MySQL基本数据类型介绍

    数据类型的介绍: 数据类型(data_type)是指系统中所允许的数据的类型.数据库中的每个列都应有适当的数据类型,用于限制或允许该列中存储的数据.例如,列中存储的为数字,则相应的数据类型应该为数值类 ...

  3. pbjs 无法编码 bytes 类型数据问题的解决方案

    问题背景 之前写过一篇<使用脚本收发 protobuf 协议数据>,通过 pbjs 命令可以将 protobuf 二进制数据转换为 json: > pbjs msg.proto -- ...

  4. heygen模型接口 简单使用 java版

    HeyGen - AI Spokesperson Video Creator  官网地址 Create a video (heygen.com) api地址 简介: 公司最近对ai方面业务比较感兴趣了 ...

  5. JUC并发编程(1)—CompletableFuture详解

    @ 目录 CompletableFuture介绍 1.创建异步任务 2.CompletableFuture API ①. 获得结果和触发计算(get.getNow.join.complete) ②. ...

  6. 基于 Python 和 Vue 的在线评测系统

    基于 Docker,真正一键部署 前后端分离,模块化编程,微服务 ACM/OI 两种比赛模式.实时/非实时评判 任意选择 丰富的可视化图表,一图胜千言 支持 Template Problem,可以添加 ...

  7. client-go实战之六:时隔两年,刷新版本继续实战

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 时隔两年,<client-go实战>被激活 ...

  8. 记Halo1.5版本迁移Halo2.10.0版本

    原文地址: 记Halo1.5版本迁移Halo2.10.0版本 - Stars-One的杂货小窝 上一篇Window10安装linux子系统及子系统安装1Panel面板 - Stars-One的杂货小窝 ...

  9. sqlserver在设计表结构时,如何选择字段的数据类型

    在设计表结构时,选择适当的字段数据类型是非常重要的,它会直接影响数据库的性能.存储空间和数据的完整性.以下是在 SQL Server 中选择字段数据类型时的一些建议和理由: 1. 整数类型:在 SQL ...

  10. kafka和zookeeper安装

    一.Kafka简介 Kafka 被称为下一代分布式消息系统,是非营利性组织ASF(Apache Software Foundation,简称为ASF)基金会中的一个开源项目,比如HTTP Server ...