请启用 Javascript 以查看内容

微信、钉钉验证登录服务器

 ·   ·  ☕ 3 分钟  ·  ✍ CNSRE

cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控

一、服务器被入侵的前夕

  • 何时被入侵的?
  • 入侵者使用哪个账号登录的?
  • 入侵者身在何处?
  • 入侵者做过什么操作?
  • 如何避免服务器中毒,被入侵"
  • 所谓知己知彼,方能百战不殆

二、剖析问题并解决

针对上面 前3个问题,开发了一个企业微信二次验证码的安全功能,详细内容如下:

1、企业微信配置

1.1 获取AgentId(AppID)、Secret

创建一个企业微信应用
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控

1.2 获取 CropID

点击我的企业企业信息
cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控

2、监控用户登录,发送通知给微信

放到/etc/profile.d/ 登录自动触发

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/bash
#WeiXin ENV-------------------------------------------------------------------------------------
CropID='ww022bebbed74xxxx'
Secret='RauJ_-t-LxBhfEN7g1sh4OhVB_vREBWvqeFaaxxxxx'
APIURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret"
TOKEN=$(/usr/bin/curl -s -G $APIURL | awk -F\" '{print $10}')
POSTURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$TOKEN"
##WeiXin body--------------------------------------------------------------------------------------
function body() {
        local int AppID=1000004
        local UserID=xuewenlong
        local PartyID=2
        printf '{\n'
        printf '\t"touser": "'"$UserID"\"",\n"
        printf '\t"toparty": "'"$PartyID"\"",\n"
        printf '\t"msgtype": "text",\n'
        printf '\t"agentid": "'"$AppID"\"",\n"
        printf '\t"text": {\n'
        printf '\t\t"content": "'"$Msg"\""\n"
        printf '\t},\n'
        printf '\t"safe":"0"\n'
        printf '}\n'
     }

Status=`who am i | awk '{print $NF}' | sed 's/(//g' | sed 's/)//g'`

if [ -n "$Status" ]; then

Msg="有用户上线请注意:\n主机名:`hostname`\n主机ip:`ifconfig ens33 | grep "inet" | awk 'NR==1{ print $2}'`\n登录用户:`whoami`\n地址来源:"$Status""
/usr/bin/curl  -s --data-ascii "$(body guozhiheng0123 $2)" $POSTURL  2>&1 > /dev/null
fi

3、登录用户需要二次验证码 验证

read 读入

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/bin/bash
############################################
#通过微信发送验证码
#雪文龙  2020-4-26  V1
#
#修改者:xxx
#修改时间:2020-xx-xx 
#修改内容:修改内容描述
############################################
##WeiXin ENV-------------------------------------------------------------------------------------
CropID='ww022bebbed749xxxx'
Secret='RauJ_-t-LxBhfEN7g1sh4OhVB_vREBWvqeFaaxxxxx'
APIURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&corpsecret=$Secret"
TOKEN=$(/usr/bin/curl -s -G $APIURL | awk -F\" '{print $10}')
POSTURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$TOKEN"

##WeiXin body--------------------------------------------------------------------------------------
function body() {
        local int AppID=1000004
        local UserID=xuewenlong
        local PartyID=2
        printf '{\n'
        printf '\t"touser": "'"$UserID"\"",\n"
        printf '\t"toparty": "'"$PartyID"\"",\n"
        printf '\t"msgtype": "text",\n'
        printf '\t"agentid": "'"$AppID"\"",\n"
        printf '\t"text": {\n'
        printf '\t\t"content": "'"$Msg"\""\n"
        printf '\t},\n'
        printf '\t"safe":"0"\n'
        printf '}\n'
     }

Status=`who am i | awk '{print $NF}' | sed 's/(//g' | sed 's/)//g'`

if [ -n "$Status" ]; then

RANDOM=$(date +%s)
echo $RANDOM >/tmp/pass.txt

PASS=`tail -n 1 /tmp/pass.txt`

 Msg="你的验证码是:"$PASS""
  /usr/bin/curl --data-ascii "$(body xuewenlong  $2)" $POSTURL     > /dev/null 2>&1  

trap "" 2
read -p "请输入验证码:" A

  if [ "$A" != "xuewenlong" ] && [ "$A" != "$PASS" ]; then
     echo "Verification Code Fail, Now Exit!!!"
     sleep 1
     logout
  else
echo  " Welcome to BSH-GC11 System "
fi
fi

三、入侵者做过什么操作

一般通过几种手段去做:

  • 全站md5指纹识别,确认哪些文件被修改过
  • jumpserver 视频录像
  • 普通用户sudo操作日志
  • 系统日志
    cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控

1、钉钉配置

钉钉的配置与微信大致相同,具体不在说明,下面直接展示脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
DDcode.sh
#!/bin/bash
###############################
#           2020-4-26         #
#          by  wenlong        #
# 通过钉钉接口发送验证码二次验证 #
###############################
trap "" 1
read -p "请输入你的钉钉手机号:" user
  if [ ${#user} -ne 11 ]; then
     echo "请出入有效手机号码"
     sleep 1
     logout
fi
##dingding ENV-------------------------------------------------------------------------------------
Dingding_Url="https://oapi.dingtalk.com/robot/send?access_token=732b97ff63d6bce620025c3eb973ca39c668847260e7d2c9f0b43cf780be0c83"
Status=`who am i | awk '{print $NF}' | sed 's/(//g' | sed 's/)//g'`
if [ -n "$Status" ]; then
RANDOM=$(date +%s)
echo $RANDOM >/tmp/pass.txt
PASS=`tail -n 1 /tmp/pass.txt`
Msg="你的验证码是:"$PASS""
curl "${Dingding_Url}" -H 'Content-Type: application/json' -d "
{
 'msgtype': 'text',
 'text': {'content': '${Msg}\n'},
 'at': {'atMobiles': [ '${user}' ],  'isAtAll': false}
  }"  > /dev/null 2>&1
trap "" 2
read -p "请输入验证码:" code
  if [ "$code" != "xuewenlong" ] && [ "$code" != "$PASS" ]; then
     echo "验证码验证失败!!!"
     sleep 1
     logout
  else
echo  " Welcome to shvm01 System "
fi
fi

cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
login.sh
#!/bin/bash
###############################
#           2020-4-26         #
#          by  wenlong        #
#  通过钉钉接口发送用户登录信息  #
###############################
Dingding_Url="https://oapi.dingtalk.com/robot/send?access_token=732b97ff63d6bce620025c3eb973ca39c668847260e7d2c9f0b43cf780be0c83"
Status=`who am i | awk '{print $NF}' | sed 's/(//g' | sed 's/)//g'`
if [ -n "$Status" ]; then
Msg="有用户上线请注意:\n主机名:`hostname`\n主机ip:`ifconfig eth0  | grep "inet" | awk 'NR==1{ print $2}'`\n登录用户:`whoami`\n地址来源:"$Status""
curl "${Dingding_Url}" -H 'Content-Type: application/json' -d "
{
 'msgtype': 'text',
 'text': {'content': '${Msg}\n'},
 'at': {'atMobiles': ['${user}' ],  'isAtAll': false}
  }"  > /dev/null 2>&1
fi

cnsre运维博客|Linux系统运维|自动化运维|云计算|运维监控

文章链接
https://www.cnsre.cn/posts/210419130919/

分享

CNSRE
作者
CNSRE
一个📚学习中的👨‍💻SRE运维工程师🚀🚀🚀


目录