前言

在服务器的日常维护和蓝队的日常监控中,经常需要对服务器出现的各种问题进行及时的预警推送。国外的服务器推荐使用telebot,而国内由于特殊的网络环境,则推荐使用BARKChanify等进行推送。


Telebot推送

首先需要一个telegram的账号,点此 。在对话框中输入/newbot,根据提示输入机器人的nameusername,创建完成后会返回一个token,务必牢记。token类似如下:

1
5229xxxxxx:AAFAxxxxxxxxxxxxxxxxx1MJ4OY0

接着在该机器人的对话框下输入任意信息,接着按照以下方式获取自己telegram的用户id

1
2
3
4
5
6
7
# curl方式。{token}替换为上面的token
proxychains4 curl https://api.telegram.org/bot{token}/getUpdates

# python方式。
import requests
resp = requests.get("https://api.telegram.org/bot{token}/getUpdates")
print(resp.json())

请求后会返回类似如下json内容

1
{"ok":true,"result":[{"update_id":324xxxx11,"message":{"message_id":3,"from":{"id":100xxxx661,"is_bot":false,"first_name":"xxxx","last_name":"xxxx","username":"xxxx","language_code":"zh-hans"},"chat":{"id":100xxxx661,"first_name":"xxxx","last_name":"xxxx","username":"xxxx","type":"private"},"date":1647093375,"text":"haha"}}]}%

其中的id字段是我们所需要的,既我们自己的telegram账号的chat_id

python的简单用法如下:

安装依赖 pip install pyTelegramBotAPI

1
2
3
import telebot
bot = telebot.TeleBot(token="522xxxx:xxxxxxxxxOY0")
bot.send_message(chat_id="xxxxxx",text="haha123")

走代理跑

1
proxychains4 python3 telebot.py

可以看到,机器人已经给我们发来了指定的信息。当然除了发送文本信息,还可以发送图片、链接等,但这个不常用,就不做过多介绍了,各位师傅可以自己探索。

对于境外vps或者是网络环境允许的情况来说,Telebot是最好不过的预警推送方式。但是由于国内复杂的网络环境,这显然是不合理的。

因此这里尝试使用BARK这个免费开源的消息推送工具进行预警推送,虽然其功能较Telebot简陋一些,但起到基础的消息推送功能还是没有问题的。


BARK推送

先来看BARK的用法。BARK他会给每个账号提供一个私有ID,以GET方式请求 加上一定量参数即可。但同时带来的缺点就是由于get方式请求的url长度有限,因此不宜推送过长的内容。如对此有特殊要求,可使用如Chanify等其他app,但使用方式大同小异。

如果对于隐私要求高,可以在自己的私人服务器进行部署

推送方式

参数

参数名 解释 其他
sound 推送铃声 minuet、alarm等
isArchive 自动保存通知消息 1、0 设置为1则会自动保存,其他值则不会
icon 推送图标 [url] 需IOS15或以上
group 推送消息分组 [groupName]
level 时效性通知 active、timeSensitive、passive active:系统立即亮屏;timeSensitive:时效性通知,可在专注模式下显示通知;passive:仅将通知添加到通知列表,不会亮屏显示。
url 跳转 [url] 携带该参数时,点击推送会跳转到这个URL
copy 拷贝 [String] 携带该参数时,将只复制copy参数的值
badge 推送角标 [Num] 推送角标

测试

利用Python进行测试:

1
2
3
4
5
6
7
import requests
url = "https://api.day.app/6cPxxxxxxxxxxxF4/" #此处填入私有ID

def sendMessage(title,text,icon=""):
requests.get(f'{url+title}/{text}?icon={icon}')

sendMessage(title='Warning',text='Your server has been invaded',icon="https://th.bing.com/th/id/OIP.PnLgsfgLeK-s0mUrQOeonwAAAA?w=176&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7")


实战

写个shell脚本,让每次终端连接时都执行,放到/etc/profile.d中。这样当我们的服务器被意外连接时就能及时收到推送。

注意,由于url中不能存在空格,因此要把空格进行url编码

echo $string | sed 's/ /%20/g'

1
2
3
4
5
#!/bin/bash

message="主机名:$(hostname) 时间:$(TZ=UTC-8 date) 登陆用户:$(whoami) 当前所有登陆用户:$(who) 其他信息:$(w|awk 'BEGIN{OFS=" "}{print $1,$8}')"

curl "https://api.day.app/6cxxxxxxxxxF4/$(echo $message | sed 's/ /%20/g')?icon=https://th.bing.com/th/id/OIP.PnLgsfgLeK-s0mUrQOeonwAAAA?w=176&h=180&c=7&r=0&o=5&dpr=1.8&pid=1.7" &>/dev/null

这样,当某一个用户被远程登录连接时我们的手机就会收到实时的预警推送。


拓展

另外可以结合ssh蜜罐技术,或者是结合系统和中间件日志,对网页被篡改、被挂黑链、数据库篡改、主机出现其他用户等各种异常情况进行及时预警。