Cobalt Strike上线 -- 短信提醒

admin 2022年2月2日19:38:53评论105 views字数 4598阅读15分19秒阅读模式

原文作者:sunian 

原文地址:https://www.freebuf.com/articles/web/321010.html

前言

hello,师傅们好,我是sunian,你也可以叫我爪巴,距离我上一次写文章还是在上次。
事情是这样的,最近想搞个上线提醒脚本,虽然现在网上有几个现成的(https://github.com/sry309/cobalt_strike_bot.git ),但感觉微信消息太多,email和tg不常看,所以只剩下钉钉可以用一下。后来我又看到了
某个师傅写了cs-sms-send短信消息提醒,嗯,能搞。话不多说,直接开冲。
Cobalt Strike上线 -- 短信提醒

一、钉钉上线提醒

本来想偷懒直接用网上的现成cna脚本的,后来发现markdown信息老是发送不过去。
Cobalt Strike上线 -- 短信提醒
鱼逝,思路如下:
CobaltStrike cna插件脚本检测到上线后,调用python发包

1、钉钉创建新群

发起群聊---> 同学群 ---> 随便起个名CS_bot 创建即可
电脑端貌似不能自己一个人建群,必须要添加个人。(也可能是我没找到)我这里是用手机创建的。
Cobalt Strike上线 -- 短信提醒

2、创建个自定义机器人

创建机器人需要电脑端才行。否则就会如下情况
Cobalt Strike上线 -- 短信提醒
群设置 ---> 智能群助手 ---> 添加机器人 ---> 自定义机器人
起个名,设置关键词,想设置CobaltStrike的,发现有长度限制,算了,就这样吧
Cobalt Strike上线 -- 短信提醒
生成一个access_token记一下
Cobalt Strike上线 -- 短信提醒

3、cna脚本

大致构想就是:检测IP、计算机名、用户名;
检测到新会话,就运行一遍写好的脚本。
看了下官方文档,嗯,懂了。
Reacting to new Beacons
beacon_initial函数:对新Beacons做出反应。
提示:如果要DNS Beacon,则使用beacon_initial_empty函数。
我这里使用的是https Beacon,所以无所谓。
beacon_info函数:从Beacon session's会话中获取元数据(字段)信息。跟awk差不多。
(last | awk '{print $3}') awk是指定第几行的字段,而beacon_info是可以直接第二个参数指定元数据。如图所示
Cobalt Strike上线 -- 短信提醒
最终经过修改,代码如下
当有主机上线时,获取我们需要的参数,将参数发给py脚本,py脚本再执行将参数发送给钉钉(执行py脚本那里使用绝对路径)

on beacon_initial {
println("Initial Beacon Checkin: " . $1 . " PID: " . beacon_info($1,"pid"));
local('$internalIP $computerName $userName');
$internalIP = replace(beacon_info($1,"internal")," ","_");
$computerName = replace(beacon_info($1,"computer")," ","_");
$userName = replace(beacon_info($1,"user")," ","_");
$cmd = 'python3 /root/cob4.1/cs_dingding_request.py --computername ' . $computerName . " --internalip " . $internalIP . " --username " . $userName;

println("Sending dingding Notification: " . $cmd);
exec($cmd);
}

4、py脚本

py这里就是个简单的发送请求的脚本
接收参数的值,消息类型选择为text,使用isAtAll@所有人,也可以指定用户或手机号,发送给机器人接口
参考官网文档:钉钉官方机器人开发https://open.dingtalk.com/document/group/custom-robot-access

import requests
import json
import argparse

parser = argparse.ArgumentParser(description='Beacon Info')
parser.add_argument('--computername')
parser.add_argument('--internalip')
parser.add_argument('--username')
args = parser.parse_args()
computername = args.computername
internalip = args.internalip
username = args.username

def msg(text):
json_text = {
"msgtype": "text",
"at": {
"isAtAll": True
},
"text": {
"content": text
}
}
print(requests.post(api_url, json.dumps(json_text), headers=headers).content)


if __name__ == '__main__':

token ="这里为钉钉bot_token"
text = "CobaltStrike主机上线提醒+1n计算机名: "+computername+"nIP地址: "+internalip+"n用户名: "+username+"."

headers = {'Content-Type': 'application/json;charset=utf-8'}
api_url = "https://oapi.dingtalk.com/robot/send?access_token=%s" % token
msg(text)

最后测试启动CS

./teamserver IP地址 密码 .profele(没有可以不用)

启动cna

./agscript IP地址 端口 robot(随便写这是用户) 密码 dingding.cna

最终发送给钉钉的聊天群
Cobalt Strike上线 -- 短信提醒
如果有手表,可以对手表进行设置(以华为为例)
运动健康APP,选择华为手表,点击“消息通知”,选择钉钉 即可
Cobalt Strike上线 -- 短信提醒
Cobalt Strike上线 -- 短信提醒

二、短信上线提醒

思路:和刚才钉钉上线提醒一样,CS cna脚本判断是否有新主机,如果有新主机上线,则调用cna脚本,启动python调用腾讯云短信API发送短信,若没有,则cna的beacon_initial继续判断。

1、申请腾讯云短信服务

腾讯云的短信API每个账户前100条免费。
使用腾讯云的短信API需要一个公众号,服务号,企业号或者小程序。
我这里使用的公众号进行的申请。

(1)按照要求先创建签名

Cobalt Strike上线 -- 短信提醒

(2)然后创建模板

Cobalt Strike上线 -- 短信提醒
模板内容如下:

设备:{1} 
用户名:{2}
计算机名:{3}
IP地址:{4}
已上线
(3)获取SDKAppID 和 AppKey

在短信控制台的应用信息里获取这两个值。
Cobalt Strike上线 -- 短信提醒

2、接下来配置SDK

pip install qcloudsms_py
准备必要的参数

appid = 14000xxxxx
appkey = "4fcd263d315340bf57xxxxxxxxxxxxxx"
phone_numbers = ["152xxxxxxx", "181xxxxxxxx"] #手机号可以添加多个
template_id = 74039 #模板ID,在自己的控制台能够看到
sms_sign = '你自己的签名名称'

这里有点坑,本以为不需要sms_sign这个参数,一直报错“签名格式错误或者签名未审批”,最后还是把他加了回来,并且他会验证,不能随意填写。
最终脚本如下:

#coding:utf-8

from qcloudsms_py import SmsSingleSender
from qcloudsms_py.httpclient import HTTPError
import argparse

parser = argparse.ArgumentParser(description='Beacon Info')
parser.add_argument('--computername')
parser.add_argument('--internalip')
parser.add_argument('--username')
args = parser.parse_args()
computername = args.computername
internalip = args.internalip[0: 10]
username = args.username

appid = 1400XXXXXX
appkey = "3d3d5XXXXXXXXXXXXXXXXXXXXXXXXXXXX"
phone_numbers = ["180XXXXXXX", "180XXXXXX"] #手机号可以添加多个多个
template_id = XXXXX
sms_sign = 'XXXX公众号'

ssender = SmsSingleSender(appid, appkey)
#单条发送,所以参数phone_numbers[0],想群发自行更改成“SmsMultiSender”
params = ["win", username, computername, internalip]
#固定win,因为在第一行不换行,不咋好看
try:
result = ssender.send_with_param(86, phone_numbers[0], template_id, params, sign=sms_sign)
except HTTPError as e:
response = {'result': 1000, 'errmsg': "网络异常发送失败"}
except Exception as e:
print(e)

print(result)

坑:IP发不过来,报错 模板参数长度限制,每个参数最大只能12
而一个IP占用14。所以我这里IP是去掉了最后3位。(有点无奈)
如果想要去掉长度限制,需申请企业服务。

最后cna脚本则直接将cs_dingding_request.py改为短信发件的py脚本即可
看了一眼,阿里云也可以用短信服务,不过要花钱。总体来说算是个思路吧。

参考文档
https://cloud.tencent.com/document/product/382/37745

最终效果如下:
Cobalt Strike上线 -- 短信提醒

小tips:
以小米手机为例,如果短信被拦截,可以在"设置"-->"骚扰拦截"-->"短信拦截"中设置"关键词白名单",以防短信被吃


好书推荐

Cobalt Strike上线 -- 短信提醒

《C++从入门到精通(第5版)》从初学者角度出发,以通俗易懂的语言和丰富多彩的实例,详细讲解了C++程序开发需要掌握的知识。本书分为4篇共18章:第1篇是基础知识,包括绪论,数据类型,运算符与表达式,条件判断语句,循环语句,函数,数组、指针和引用,以及构造数据类型;第2篇是核心技术,包括面向对象编程,类和对象,以及继承与派生;第3篇是高级应用,包括模板、标准模板库、RTTI与异常处理、程序调试、文件操作和网络通信;第4篇是项目实战,结合人事考勤管理系统,依照软件项目的开发流程,讲述如何进行实际开发。书中所有知识都结合具体实例进行介绍,涉及的程序代码给出了详细的注释,读者可以轻松领会C++的强大功能,快速提高开发能力。

禁止非法,后果自负

欢迎关注公众号:web安全工具库

欢迎关注视频号:之乎者也吧

Cobalt Strike上线 -- 短信提醒


Cobalt Strike上线 -- 短信提醒

Cobalt Strike上线 -- 短信提醒

加我微信(ivu123ivu)私聊,暗号:短信,获取抽奖福利,仅当天有效。

原文始发于微信公众号(web安全工具库):Cobalt Strike上线 -- 短信提醒

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年2月2日19:38:53
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Cobalt Strike上线 -- 短信提醒https://cn-sec.com/archives/762019.html

发表评论

匿名网友 填写信息