• Linux攻击排查


    Linux攻击排查

    1. 入侵排查思路

    1.1 账号安全

    //查看用户信息passwd文件 是否有恶意的用户
    [root@master ~]# less /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:998:User for polkitd:/:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    chrony:x:998:996::/var/lib/chrony:/sbin/nologin
    nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
    tcpdump:x:72:72::/:/sbin/nologin   
    ## 用户名:密码:用户ID:组ID:用户说明:家目录:登陆之后的 shell
    
    //影子文件
    [root@master ~]# cat /etc/shadow
    root:$6$KMaK//2Hp2$rrKd0MQA.8cCqzv0SEOkM3nq3qlhoYeSw2LLQtDdBL0Wy2qNXITg8kiiztre/WrTsn/ropx6aI5UdzW.mG613.:19144:0:99999:7:::
    bin:*:18353:0:99999:7:::
    daemon:*:18353:0:99999:7:::
    adm:*:18353:0:99999:7:::
    lp:*:18353:0:99999:7:::
    sync:*:18353:0:99999:7:::
    shutdown:*:18353:0:99999:7:::
    halt:*:18353:0:99999:7:::
    mail:*:18353:0:99999:7:::
    operator:*:18353:0:99999:7:::
    games:*:18353:0:99999:7:::
    ftp:*:18353:0:99999:7:::
    nobody:*:18353:0:99999:7:::
    systemd-network:!!:19108::::::
    dbus:!!:19108::::::
    polkitd:!!:19108::::::
    sshd:!!:19108::::::
    postfix:!!:19108::::::
    chrony:!!:19108::::::
    nscd:!!:19108::::::
    tcpdump:!!:19108::::::
    ## 用户名:加密密码:密码最后一次修改日期:两次密码的修改时间间隔:密码有效期:密码修改到期到的警告天数:密码过期之后的宽限天数:账号失效时间:保留
    
    //who 查看当前登录用户(tty 本地登陆  pts 远程登录)
    [root@master ~]# who
    root     pts/0        2022-06-23 10:13 (59.172.xxx.xxx)
    
    //uptime 最近登入多久,多少用户,负载状态
    [root@master ~]# uptime 
     15:57:58 up 15 days,  6:00,  1 user,  load average: 0.51, 0.26, 0.25
    
    //w 查看系统信息,知道某一刻用户的行为
    [root@master ~]# w
     16:02:14 up 15 days,  6:04,  1 user,  load average: 0.63, 0.35, 0.28
    USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
    root     pts/0    59.172.xxx.xxx   10:13    6.00s  0.13s  0.00s w
    
    • 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
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    入侵排查

    1、查询特权用户特权用户(uid 为0)
    [root@master ~]# awk -F: '$3==0{print $1}' /etc/passwd
    root
    2、查询可以远程登录的帐号信息
    [root@master ~]# awk '/\$1|\$6/{print $1}' /etc/passwd
    3、除root帐号外,其他帐号是否存在sudo权限。如非管理需要,普通帐号应删除sudo权限
    [root@master ~]#  more /etc/sudoers | grep -v "^#\|^$" | grep "ALL=(ALL)"
    root	ALL=(ALL) 	ALL
    %wheel	ALL=(ALL)	ALL
    4、禁用或删除多余及可疑的帐号
    usermod -L user    禁用帐号,帐号无法登录,/etc/shadow 第二栏为 ! 开头
    userdel user       删除 user 用户
    userdel -r user    将删除 user 用户,并且将 /home 目录下的 user 目录一并删除
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    1.2 历史命令

    1. 查看历史命令
    [root@master ~]# history 
    历史命令都保存在~目录下的.bash_history
    
    2. 更改历史命令保存的格式
    [root@node2 ~]# cat >> /etc/profile << EOF 
    > USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'`
    > if [ "$USER_IP" = ""  ]
    > then
    > USER_IP=`hostname`
    > fi
    > export HISTTIMEFORMAT="%F %T $USER_IP `whoami` "
    > shopt -s histappend
    > export PROMPT_COMMAND="history -a"
    > EOF
    [root@node2 ~]# source /etc/profile
    [root@node2 ~]# history 
        1  2022-06-09 11:21:45 59.172.208.226 root ss -antl 
        2  2022-06-09 11:26:01 59.172.208.226 root ss -antlp 
        3  2022-06-09 11:28:17 59.172.208.226 root systemctl status firewalld 
        4  2022-06-09 11:29:56 59.172.208.226 root ss -antl 
        5  2022-06-09 11:32:33 59.172.208.226 root docker ps 
        6  2022-06-09 11:32:43 59.172.208.226 root docker image
        7  2022-06-09 11:32:47 59.172.208.226 root docker images
        8  2022-06-09 11:33:02 59.172.208.226 root ss -antl
        
    3. history -c 清除历史记录日志
    
    • 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

    1.3 检查端口

    [root@node2 ~]# ss -antlp 
    State      Recv-Q Send-Q                                      Local Address:Port                                                     Peer Address:Port              
    LISTEN     0      128                                             127.0.0.1:10248                                                               *:*                   users:(("kubelet",pid=2657,fd=33))
    LISTEN     0      128                                             127.0.0.1:10249                                                               *:*                   users:(("kube-proxy",pid=7696,fd=13))
    LISTEN     0      128                                             127.0.0.1:33293                                                               *:*                   users:(("kubelet",pid=2657,fd=11))
    LISTEN     0      128                                                     *:30001                                                               *:*                   users:(("kube-proxy",pid=7696,fd=15))
    LISTEN     0      128                                                     *:22                                                                  *:*                   users:(("sshd",pid=1179,fd=3))
    LISTEN     0      128                                                     *:31000                                                               *:*                   users:(("kube-proxy",pid=7696,fd=14))
    LISTEN     0      100                                             127.0.0.1:25                                                                  *:*                   users:(("master",pid=1146,fd=13))
    LISTEN     0      128                                                  [::]:10250                                                            [::]:*                   users:(("kubelet",pid=2657,fd=28))
    LISTEN     0      128                                                  [::]:781                                                              [::]:*                   users:(("bcm-agent",pid=24037,fd=8))
    LISTEN     0      128                                                  [::]:10256                                                            [::]:*                   users:(("kube-proxy",pid=7696,fd=10))
    LISTEN     0      128                                                  [::]:22                                                               [::]:*                   users:(("sshd",pid=1179,fd=4))
    LISTEN     0      100                                                 [::1]:25                                                               [::]:*                   users:(("master",pid=1146,fd=14))
    
    //查看pid对应的进程文件
    ls -l /proc/$(ss -antlp | grep 10250 | awk '{print $6}' | awk -F, '{print $2}' | awk -F= '{print $2}')/exe
    lrwxrwxrwx 1 root root 0 Jun  6 14:33 /proc/2657/exe -> /usr/bin/kubelet
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    1.4 检查异常进程

    [root@node2 ~]# ps aux | grep $(ss -antlp | grep 10250 | awk '{print $6}' | awk -F, '{print $2}' | awk -F= '{print $2}')
    root      2657  1.6  2.6 1084468 54952 ?       Ssl  Jun06 411:10 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.2 --node-ip=xxx.xxx.xxx.xxx
    
    
    • 1
    • 2
    • 3

    1.5 检查卡机启动项

    运行级别含义
    0关机
    1单用户模式,可以想象为windows的安全模式,主要用于系统修复
    2不完全的命令行模式,不含NFS服务
    3完全的命令行模式,就是标准字符界面
    4系统保留
    5图形模式
    6重启动

    查看运行状态runlevel

    // 系统开机后进入那个级别运行
    [root@node2 ~]# cat >> /etc/inittab << EOF 
    > id=3: initdefault
    > EOF
    
    //开机启动的配置文件
    [root@node2 ~]# ls /etc/rc
    rc0.d/    rc2.d/    rc4.d/    rc6.d/    rc.local  
    rc1.d/    rc3.d/    rc5.d/    rc.d/
    ## 开机自启运行的脚本可以软连接进去
    [root@node2 ~]# ls
    docker.sh  
    [root@node2 ~]# ln -s docker.sh /etc/rc.d/rc3.d/S10docker.sh  ## S开头代表加载时自启动;如果是K开头的脚本文件,代表运行级别加载时需要关闭的。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    入侵排查

    //检查启动项文件
    [root@node2 ~]# more /etc/rc.local
    [root@node2 ~]# /etc/rc.d/rc[0~6].d
    [root@node2 ~]# ls -l /etc/rc.d/rc3.d/
    
    • 1
    • 2
    • 3
    • 4

    1.6 检查定时任务

    [linux下crontab与anacrontab的使用 ]

    crond 常用参数

    -e编辑任务
    -l列出任务
    -r删除任务
    -u指定用户名字
    –help显示帮助信息

    anacron 异步定时

    -f强制执行作业,忽略时间戳
    -u只将作业的时间戳更新到当前日期,但不运行任何操作
    -s序列化作业的执行,在前一个作业完成之前,anacron不会启动新作业
    -d在此模式下,anacron将信息性消息输出到标准错误和syslog,作业的输出像往常一样通过邮件发送
    -q禁止将消息显示为标准错误,仅适用于-d参数结合使用
    # /etc/anacrontab: configuration file for anacron
    
    # See anacron(8) and anacrontab(5) for details.
    
    SHELL=/bin/sh
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    # the maximal random delay added to the base delay of the jobs
    RANDOM_DELAY=45        <--随机给予最大延迟时间,单位是分钟
    # the jobs will be started during the following hours only
    START_HOURS_RANGE=3-22        <--延迟多少个小时内应该要执行的任务时间
    
    #period in days   delay in minutes   job-identifier   command
    1       5       cron.daily              nice run-parts /etc/cron.daily
    7       25      cron.weekly             nice run-parts /etc/cron.weekly
    @monthly 45     cron.monthly            nice run-parts /etc/cron.monthly
    #天数  延迟时间    工作名称定义                   实际要进行的指令串
    #天数单位为天;延迟时间单位为分钟;工作名称定义可自定义,指令串则通常与 crontab 的设定相同!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • RANDOM_DELAY定义的是最大随机延迟,也就是说cron.daily任务如果超过1天没有执行,并不会马上执行,而是先延迟强制延迟时间之后,再延迟随机延迟时间之后再执行命令。
    • START_HOURS_RANGE定义anacron的执行时间范围,anacron只会在这个时间范围之内执行。
    • period in days执行周期;最小 1 天,也可以 3 天,5 天,一个星期(7 天)乃至一个月(月份不能确定有多少天,所以用@monthly代替)。
    • delay in minutes延迟多长时间执行,以分钟为单位。为了避免多个任务在同一时间执行而造成服务器繁忙,所以应该错峰执行。
    • job-identifier 任务的唯一标识。它用来创建文件记录任务执行的时间,通常创建在/var/spool/anacron/目录中。
    • command真正执行的命令。

    入侵排查

    /var/spool/cron/* 
    /etc/crontab
    /etc/cron.d/*
    /etc/cron.daily/* 
    /etc/cron.hourly/* 
    /etc/cron.monthly/*
    /etc/cron.weekly/
    /etc/anacrontab
    /var/spool/anacron/*
    
    ## 可以使用more来查看/etc/cron.daily/*下所有的任务
    [root@node2 ~]# more /etc/cron.daily/
    
    *** /etc/cron.daily/: directory ***
    
    [root@node2 ~]# more /etc/cron.deny 
    [root@node2 ~]# more /etc/cron.daily/*
    ::::::::::::::
    /etc/cron.daily/logrotate
    ::::::::::::::
    ::::::::::::::
    /etc/cron.daily/man-db.cron
    ::::::::::::::
    #!/bin/bash
    
    if [ -e /etc/sysconfig/man-db ]; then
        . /etc/sysconfig/man-db
    fi
    
    if [ "$CRON" = "no" ]; then
       exit 0
    fi
    
    renice +19 -p $$ >/dev/null 2>&1
    ionice -c3 -p $$ >/dev/null 2>&1
    
    LOCKFILE=/var/lock/man-db.lock
    
    # the lockfile is not meant to be perfect, it's just in case the
    # two man-db cron scripts get run close to each other to keep
    # them from stepping on each other's toes.  The worst that will
    # happen is that they will temporarily corrupt the database
    [[ -f $LOCKFILE ]] && exit 0
    
    trap "{ rm -f $LOCKFILE ; exit 0; }" EXIT
    touch $LOCKFILE
    # create/update the mandb database
    mandb $OPTS
    
    exit 0
    ::::::::::::::
    /etc/cron.daily/mlocate
    ::::::::::::::
    #!/bin/sh
    nodevs=$(awk '$1 == "nodev" && $2 != "rootfs" && $2 != "zfs" { print $2 }' < /pro
    c/filesystems)
    
    renice +19 -p $$ >/dev/null 2>&1
    ionice -c2 -n7 -p $$ >/dev/null 2>&1
    /usr/bin/updatedb -f "$nodevs"
    ::::::::::::::
    /etc/cron.daily/rhsmd
    ::::::::::::::
    #!/bin/sh
    # nightly run of rhsmd to log entitlement expiration/validity errors to syslog
    # this is a cron job because it doesn't need to 'phone home'. should that
    # change, look into calling the dbus interface from rhsmcertd instead.
    config=$(grep -iE "^processTimeout" /etc/rhsm/rhsm.conf | grep -Po "[0-9]+")
    if [ -n "$config" ]; then
      rhsmd_timeout=$config
    else
      rhsmd_timeout=300
    fi
    
    /usr/libexec/rhsmd -s &
    sleep $rhsmd_timeout;
    
    • 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
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76

    1.7 检查服务

    服务自启动

    chkconfig [--level 运行级别] [独立服务名] [on|off]
    chkconfig –level  2345 httpd on  开启自启动
    chkconfig httpd on (默认level是2345)
    
    • 1
    • 2
    • 3

    入侵排查

    1、查询已安装的服务:
    
    RPM 包安装的服务
    
    chkconfig  --list  查看服务自启动状态,可以看到所有的RPM包安装的服务
    ps aux | grep crond 查看当前服务
    
    系统在3与5级别下的启动项 
    中文环境
    chkconfig --list | grep "3:启用\|5:启用"
    英文环境
    chkconfig --list | grep "3:on\|5:on"
    源码包安装的服务
    
    查看服务安装位置 ,一般是在/user/local/
    systemctl httpd start 
    搜索/etc/rc.d/init.d/  查看是否存在
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    1.8 检查异常文件

    • 查看敏感目录,如/tmp目录下的文件,同时注意隐藏文件夹,以“…”为名的文件夹具有隐藏属性

    • 得到发现WEBSHELL、远控木马的创建时间,如何找出同一时间范围内创建的文件?可以使用find命令来查找,如 find /opt -iname “*” -atime 1 -type f 找出 /opt 下一天前访问过的文件

    • 针对可疑文件可以使用 stat 进行创建修改时间。

    1.9 系统日志

    日志文件说明
    /var/log/cron记录了系统定时任务相关的日志
    /var/log/cups记录打印信息的日志
    /var/log/dmesg记录了系统在开机时内核自检的信息,也可以使用dmesg命令直接查看内核自检信息
    /var/log/mailog记录邮件信息
    /var/log/message记录系统重要信息的日志。这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件
    /var/log/btmp记录错误登录日志,这个文件是二进制文件,不能直接vi查看,而要使用lastb命令查看
    /var/log/lastlog记录系统中所有用户最后一次登录时间的日志,这个文件是二进制文件,不能直接vi,而要使用lastlog命令查看
    /var/log/wtmp永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看
    /var/log/utmp记录当前已经登录的用户信息,这个文件会随着用户的登录和注销不断变化,只记录当前登录用户的信息。同样这个文件不能直接vi,而要使用w,who,users等命令来查询

    日志分析小技巧

    1、定位有多少IP在爆破主机的root帐号:    
    grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
    
    定位有哪些IP在爆破:
    grep "Failed password" /var/log/secure|grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"|uniq -c
    
    爆破用户名字典是什么?
    grep "Failed password" /var/log/secure|perl -e 'while($_=<>){ /for(.*?) from/; print "$1\n";}'|uniq -c|sort -nr
     
    2、登录成功的IP有哪些: 	
    grep "Accepted " /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
    
    登录成功的日期、用户名、IP:
    grep "Accepted " /var/log/secure | awk '{print $1,$2,$3,$9,$11}' 
    
    3、增加一个用户kali日志:
    Jul 10 00:12:15 localhost useradd[2382]: new group: name=kali, GID=1001
    Jul 10 00:12:15 localhost useradd[2382]: new user: name=kali, UID=1001, GID=1001, home=/home/kali
    , shell=/bin/bash
    Jul 10 00:12:58 localhost passwd: pam_unix(passwd:chauthtok): password changed for kali
    #grep "useradd" /var/log/secure 
    
    4、删除用户kali日志:
    Jul 10 00:14:17 localhost userdel[2393]: delete user 'kali'
    Jul 10 00:14:17 localhost userdel[2393]: removed group 'kali' owned by 'kali'
    Jul 10 00:14:17 localhost userdel[2393]: removed shadow group 'kali' owned by 'kali'
    # grep "userdel" /var/log/secure
    
    5、su切换用户:
    Jul 10 00:38:13 localhost su: pam_unix(su-l:session): session opened for user good by root(uid=0)
    
    sudo授权执行:
    sudo -l
    Jul 10 00:43:09 localhost sudo:    good : TTY=pts/4 ; PWD=/home/good ; USER=root ; COMMAND=/sbin/shutdown -r now
    
    
    
    ]: removed group 'kali' owned by 'kali'
    Jul 10 00:14:17 localhost userdel[2393]: removed shadow group 'kali' owned by 'kali'
    #grep "userdel" /var/log/secure
    
    5、su切换用户:
    Jul 10 00:38:13 localhost su: pam_unix(su-l:session): session opened for user good by root(uid=0)
    
    sudo授权执行:
    sudo -l
    Jul 10 00:43:09 localhost sudo:    good : TTY=pts/4 ; PWD=/home/good ; USER=root ; COMMAND=/sbin/shutdown -r now
    
    • 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

    参考

  • 相关阅读:
    华为Mindspore开发代码上传教程
    Python基础内容训练2(常用的数据类型-----字符串)
    ②⑩ 【MySQL Log】详解MySQL日志:错误日志、二进制日志、查询日志、慢查询日志
    @SpringBootApplication配置了scanBasePackages导致请求一直404,分析下原因
    GoLong的学习之路(十一)语法之标准库 fmt.Printf的使用
    UltraEdit2024免费版文本编辑器
    用frp搞个内网穿透
    信息安全服务资质认证CCRC证书‖中国网络安全审查技术与认证中心
    uni-app微信小程序使用ECharts
    【小白必看】网络安全(黑客)0基础学习笔记
  • 原文地址:https://blog.csdn.net/weixin_46634416/article/details/125432809