准备魔改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. Solution -「BZOJ 3779」重组病毒

    Description Link. Given is a tree. Every node initially has a color which is different from others'. ...

  2. 临时表、视图与系统函数_Lab2

    MySQL数据库操作 Lab1.md body { font-family: var(--vscode-markdown-font-family, -apple-system, BlinkMacSys ...

  3. Java-网络编程(TCP-UDP)

    Java-网络编程(TCP-UDP) 网络基础 网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的.中间最主要 ...

  4. nginx学习(基本概念、配置和命令、反向代理、负载均衡、动静分离)

    之前都只会照着网上的nginx配置和代码什么的直接拿过来用,但是没系统学习过,所以来系统学习一下nginx内容. 建议服务器不要关闭防火墙,按需开启端口就好,然后云服务器也要设置SSH密钥,安全性高一 ...

  5. 带着问题去分析:Spring Bean 生命周期

    1: Bean在Spring容器中是如何存储和定义的 Bean在Spring中的定义是_org.springframework.beans.factory.config.BeanDefinition_ ...

  6. 合并果子(lgP1090)

    贪心. 每次取最小的两堆合并,最后即为正确答案.(我也不会证明/wq) 所以说主要问题就是怎么找最小的两堆. 由于中间不断有插入和删除,所以用优先队列. 扯不下去了 直接看代码吧. #include& ...

  7. IPv4:根据CIDR显示地址范围

    最近遇到一个很有意思的点,于是就记录下来. CIDR一般是由IP地址和子网掩码组成,即 IP地址/子网掩码 格式. 子网掩码表示前面地址中的前多少位,为网络位,后面部分代表主机部分.例如:192.16 ...

  8. openwrt使用tailscale实现内网穿透

    问题 之前一直有电信公网ip,最近发现电信公网ip被撤下来了,打电话再去要发现给的是10开头的ip,电信客服还跟我说10开头就是公网ip,= =,根本就不是,无奈使用zerotier进行打洞,把zer ...

  9. HarmonyOS应用开发

    引言 本章将深入探讨 HarmonyOS 应用开发的关键方面,包括应用的生命周期.数据存储和网络访问.了解这些内容对于创建功能丰富.高效的 HarmonyOS 应用至关重要. 目录 HarmonyOS ...

  10. 又拍云+PicGo搭建图床教程

    具体搭建方法 https://blog.csdn.net/qq_41684621/article/details/114068076 这里有个细节 注意这里一定要加上 http:// 否则在自动生成 ...