赞
踩
使用计划任务 crontab 让木马自动运行
[root@localhost ~]# crontab -e
#1 2 * * * /usr/bin/fregonnzkq &
#注:分 时 天 月 周 ,表示每天 2 点 1 分,执行命令/usr/bin/fregonnzkq &。* 表每X,比如: 每天,每月,每周
用户计划任务排查方法
[root@localhost ~]# crontab -l
* * * * * /bin/ls >/tmp/aaa.txt
#查看root用户计划任务 只能查看到当前用户的计划任务
其他用户建立计划任务
[root@localhost ~]# crontab -u bin -e # -u 指定用户为bin 最好使用系统已经存在的系统用户
排查查看所有用户建立的计划任务
排查:如何查看所有用户的计划任务? 做黑客要有一个很扎实的基础,还要有一个很好的思维。我 们不用遍历/etc/passwd 中所有的文件,这太 复杂了。因为每个用户的计划任务都有独立的文件。
[root@localhost ~l# ll /var/spool/cron #这个目录下存放着所有用户级别的计划任务
#注:所有用户的计划任务,都会在/var/spool/cron/下产生对应的文件。只要看一下这个目录下的文件,就知道哪些用户生成了计划任务。
查看系统级别计划任务开机自动启动
黑客在系统级别的计划任务中追加木马
[root@localhost tmp]# ls /etc/cron #按两下tab cron.d/ cron.daily/ cron.deny cron.hourly/ cron.monthly/ crontab 注: crontab #写具体时间的系统级别的定时任务 cron.d/ #系统级别的定时任务 cron.daily/ #系统每天要执行的计划任务 cron.hourly/ #系统每小时要执行的计划任务 cron.monthly/ #系统每月要执行的计划任务 cron.weekly/ #系统每周要执行的计划任务 [root@localhost ~]# find /etc/cron* #查看可以添加系统级别的计划任务 /etc/cron.d /etc/cron.d/0hourly /etc/cron.d/raid-check /etc/cron.d/sysstat /etc/cron.daily /etc/cron.daily/logrotate /etc/cron.daily/man-db.cron /etc/cron.daily/mlocate /etc/cron.daily/certwatch /etc/cron.deny /etc/cron.hourly /etc/cron.hourly/0anacron /etc/cron.monthly /etc/crontab /etc/cron.weekly
例1:系统级别的计划任务
[root@localhost ~]# vim /etc/crontab #写具体时间的系统级别的定时任务 SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # 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 * * * * * root /bin/ls >>/tmp/rootxt.txt ~
例 2:添加系统级别的木马程序。可以追加到系统自带的脚本中,也可以自己新创建一个脚本,放到 对应的目录下
[root@localhost /]# vim /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
/usr/bin/fregonnzkq & #这一行是添加的
exit 0
~
系统计划任务排查方法:利用 md5sum ,来检验文件的完整性
[root@localhost /]# md5sum /etc/cron.daily/logrotate
fdc63b7057623f10b657cdaf998222e6 /etc/cron.daily/logrotate
#修改一下文件的内容
[root@localhost /]# md5sum /etc/cron.daily/logrotate
1c39a6fd2b4590b1cbd071bc4febef3b /etc/cron.daily/logrotate
# MD5sum的值就发生了改变
注:所以通过对比 MD5 值,可以发现文件内容发生了变化。另外,系统级别的计划任务,从安装好 系统后,就固定下来,一般情况不会发生改变。
如何排查/etc/cron下所有文件有没有被黑客修改或追加? 思路:对所有文件都生成一个 md5 值库,后期进行对比,可以快速找出被修改的文件。 例: 对/etc/cron下所有文件都生成 md5 值,并存一个 md5 值
[root@localhost /]# find /etc/cron* -type f -exec md5sum {} \; > /usr/share/file_md5.v1
[root@localhost /]# cat /usr/share/file_md5.v1
1638f7fe39f7f52c412e1705a0bc52d1 /etc/cron.d/0hourly
367636170f3ac44df6a117e3cbf7e4ba /etc/cron.d/raid-check
b904bdae184e1d37d52b04dd28bd4ea6 /etc/cron.d/sysstat
16e73be8fe46a83f7525b59f921e9bab /etc/cron.daily/man-db.cron
5eacfc6f1e56958d60e0ae8dbe65c63b /etc/cron.daily/mlocate
b2140452ba36c5ddaa51b758ad5e6405 /etc/cron.daily/certwatch
1c39a6fd2b4590b1cbd071bc4febef3b /etc/cron.daily/logrotate
d41d8cd98f00b204e9800998ecf8427e /etc/cron.deny
8675eb4a3dba8e20bd6b82c626304556 /etc/cron.hourly/0anacron
fc0c335fab67574cd0e4ff0a404007b4 /etc/crontab
模拟黑客在文件的最后添加以下选中 的内容后,保存退出。
[root@localhost /]# vim /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
/usr/bin/fregonnzkq &
echo "aaaa" #这段代码是模拟添加的
exit 0
生成MD5sum 然后对比之前的MD5值是否相同
[root@localhost /]# find /etc/cron* -type f -exec md5sum {} \; > /usr/share/file_md51.v1
[root@localhost /]# diff /usr/share/file_md51.v1 /usr/share/file_md5.v1 #对比两个是否相同
7c7
< 08c6cef09a46402d46a26b6a2d438a8d /etc/cron.daily/logrotate
---
> 1c39a6fd2b4590b1cbd071bc4febef3b /etc/cron.daily/logrotate
注:如果忘提前生成/usr/share/file_md5.v1 怎么办?
找一台正常和你服务器系统版本号一样的虚拟机,在虚拟机中生成 md5 值数据库文件。复制到咱们 服务器上,再对比。
总结:通过计划任务运行木马程序
1、普通计划任务: crontab
2、高级 crontab ,篡改一个系统级别的计划任务
/etc/rc.local 这个是开机自动启动脚本
特例:很多人 vim 打开一个文件后,看到文档的后面是一片空白,就认为是达到文件的最后了。所 以黑客在/etc/rc.local 中添加很多空行,然后在文档最后添加木马程序, 再把光标移动到行首,保存退 出。也可以躲避一些运维人员的视线,达到隐藏木马的目的。
排查:过滤掉空行 [root@xuegod63 ~]# grep -v ^$ /etc/rc.local
参数说明: ^$ 表示找出以$结束符开头的行,即空行; -v 表示取反显示
[root@localhost tmp]# vim /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. touch /var/lock/subsys/local echo "aaaa" #测试 [root@localhost tmp]# bash /etc/rc.local aaaa
把木马程序脚本写到已经存在的开机启动服务中,例如: httpd (apache web 服务器启动脚本
/etc/init.d/ #这个目录下的脚本文件,都是可以开机启动的脚本文件
[root@localhost tmp]# ls /etc/init.d
functions netconsole network README
可以编辑network 文件添加自动启动的命令,也可以自己新增开机启动程序
[root@localhost init.d]# vim /etc/init.d/fregonnzkq #!/bin/sh # chkconfig: 12345 90 90 # description: fregonnzkq ### END INIT INFO case $1 in start) /usr/bin/fregonnzkq & ;; stop) ;; *) /usr/bin/fregonnzkq & ;; esac # 赋予启动脚本执行权限,并启动 [root@xuegod63 ~]# chmod +x /etc/init.d/fregonnzkq [root@xuegod63 ~]# service fregonnzkq start # 添加到开机自动启动服务列表 [root@xuegod63 ~]# chkconfig --add fregonnzkq [root@xuegod63 ~]# chkconfig --list fregonnzkq
fregonnzkq 0:关 1:开 2:开 3:开 4:开 5:开 6:关
拓展:0-6 为运行级别
0-系统停机状态,系统默认运行级别不能设置为 0,否则不能正常启动,机器关闭。
1-单用户工作状态,root 权限,用于系统维护,禁止远程登陆,就像 Windows 下的安全模式登
录。
2-多用户状态,没有 NFS 支持。
3-完整的多用户模式,有 NFS,登陆后进入控制台命令行模式。
4-系统未使用,保留一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本电脑的电
池用尽时,可以切换到这个模式来做一些设置。
5-X11 控制台,登陆后进入图形 GUI 模式,X Window 系统。
6-系统正常关闭并重启,默认运行级别不能设为 6,否则不能正常启动。运行 init 6 机器就会重
启。
[root@xuegod63 rc3.d]# chkconfig --del fregonnzkq
[root@xuegod63 rc3.d]# rm -rf /etc/init.d/fregonnzkq
将/etc/init.d/目录下的所有启动脚本进行 MD5 计算并保存到文件,如果文件被黑客篡改修改则 MD5 值发生改变。
[root@xuegod63 ~]# find /etc/init.d/ -type f -exec md5sum {} \; > /usr/share/init.d.v1
[root@xuegod63 ~]# find /etc/init.d/ -type f -exec md5sum {} \; > /usr/share/init.d.v2
[root@xuegod63 ~]# diff /usr/share/init.d.v1 /usr/share/init.d.v2
排查方法总结 方法 1:对比其他服务器好的配置文件 ,利用 MD5 值做对比 方法 2:查看被黑当天生成或被修改的文件
[root@localhost init.d]# find /etc/init.d/ -mtime -1 #查看前一天被修改的文件
/etc/init.d/
语法:rpm -V 软件包的名字 #使用 rpm 命令检查软件包安装后,生产的所有的文件的完整 性 语法:rpm -Vf 命令的绝对路径 #使用 rpm 检查命令的完整性
[root@xuegod63 ~]# yum install -y httpd
[root@xuegod63 ~]# echo aaaa >> /usr/sbin/httpd
[root@xuegod63 ~]# rpm -V httpd #可以看到 httpd 被修改了 S.5....T. /etc/rc.d/init.d/httpd
rpm -V 弹出的每列消息含意如下:
S file Size 大小不一致
MMode 模式不一致 (包括许可和文件类型)
5 MD5 sum 校验和不一致
DDevice 主从设备号不匹配
L readLink(2) 路径不匹配
UUser 属主不一致
GGroup 所属组不一致
T mTime 修改时间不一致
[root@localhost init.d]# which time #查看命令位置
/usr/bin/time
[root@localhost init.d]# rpm -Vf /usr/bin/time #检查命令是否被修改
[root@localhost init.d]# echo aaa >> /usr/bin/time #模拟修改命令
[root@localhost init.d]# rpm -Vf /usr/bin/time #再次检查命令是否被修改
S.5....T. /usr/bin/time # S大小不一致 5 md5sum 不一致 T 修改时间不一致
[root@localhost init.d]#
实战:查看所有 rpm 安装的软件包,生成命令或文件是否被改过? 例:rpm -Va > rpm_check.txt
[root@localhost init.d]# rpm -Va > /root/rpm_check.txt [root@localhost init.d]# cat /root/rpm_check.txt S.5....T. c /etc/sysconfig/authconfig 遗漏 /var/run/pulse S.5....T. /usr/bin/time S.5....T. c /etc/php.ini S.5....T. c /etc/crontab S.5....T. c /etc/yum/pluginconf.d/langpacks.conf S.5....T. c /etc/httpd/conf/httpd.conf .....UG.. /var/www/html 遗漏 /var/run/libgpod 未满足的依赖关系 Nessus-8.15.0-es8.x86_64: libc.so.6(GLIBC_2.25)(64bit) 被 (已安裝) Nessus-8.15.0-es8.x86_64 需要 libc.so.6(GLIBC_2.28)(64bit) 被 (已安裝) Nessus-8.15.0-es8.x86_64 需要 libstdc++.so.6(CXXABI_1.3.9)(64bit) 被 (已安裝) Nessus-8.15.0-es8.x86_64 需要 libstdc++.so.6(GLIBCXX_3.4.21)(64bit) 被 (已安裝) Nessus-8.15.0-es8.x86_64 需要 .M....... g /boot/initramfs-3.10.0-957.el7.x86_64.img 遗漏 /run/gluster ....L.... c /etc/pam.d/fingerprint-auth ....L.... c /etc/pam.d/password-auth ....L.... c /etc/pam.d/postlogin ....L.... c /etc/pam.d/smartcard-auth ....L.... c /etc/pam.d/system-auth .M....... g /var/lock/iscsi .M....... g /var/lock/iscsi/lock S.5....T. c /etc/rc.d/rc.local .....UG.. g /var/run/avahi-daemon S.5....T. c /etc/cups/cups-browsed.conf S.5....T. c /var/lib/unbound/root.key .......T. c /etc/cron.daily/logrotate 遗漏 /var/run/pluto
[root@localhost init.d]# which find /usr/bin/find [root@localhost init.d]# cp /usr/bin/find /usr/bin/ffind #拷贝一份find命令出来 [root@localhost init.d]# rm -rf /usr/bin/find #删除原来的find命令 [root@localhost init.d]# vim /usr/bin/find #新增一个find命令 内容如下: #!/bin/bash /usr/bin/ffind echo "aaaaa" [root@localhost init.d]# chmod +x /usr/bin/find #添加执行权限 [root@localhost init.d]# find / -name tt #测试一下 ./README ./functions ./netconsole ./network aaaaa #输出了aaaa表示我们修改成功
1、计划任务: crontab 和系统级别的计划任务
2、开机启动 rc.local 和开机启动脚本
3、系统命令被人替换,定一个触发事件
排查木马方法总结:
方法 1:通过生成 md5 值数据库,查询文件系统的完整性
方法 2: 利用 find 命令查找下最近被修改过的文件:一般情况下命令文件都很久之前被修改的。
方法 3: 被入侵后,检测所有 rpm -Va 生成的文件是否被改动过
一台服务器被黑后,找到了木马程序 hack.sh 文件,hack.sh 文件权限为-rw-r–r--。但 是使用 root 用户却删除不了此文件,也无法往此文件中写内容。
[root@localhost ~]# touch hack.sh aaa.sh #创建两个文件
[root@localhost ~]# ll hack.sh aaa.sh #查看文件类型
-rw-r--r-- 1 root root 0 7月 3 18:31 aaa.sh
-rw-r--r-- 1 root root 0 7月 3 18:31 hack.sh
黑客悄悄在后台添加 attr 扩展属性
[root@localhost ~]# chattr +i hack.sh #添加特殊权限
[root@localhost ~]# rm -rf hack.sh #现在已经删除不掉了
rm: 无法删除"hack.sh": 不允许的操作
chattr chattr 扩展权限说明
+i:即 Immutable,系统不允许对这个文件进行任何的修改。如果目录具有这个属性,那么任何的
进程只能修改目录之下的文件,不允许建立和删除文件。 注:immutable [ɪˈmju:təbl] 不可改变的
-i :移除 i 参数。
5、查看扩展权限
[root@localhost ~]# lsattr hack.sh
----i----------- hack.sh
解决方法
[root@localhost ~]# chattr -i hack.sh
[root@localhost ~]# lsattr hack.sh
---------------- hack.sh
chmod 0000 /bin/workstat && chattr +i /bin/workstat
生成木马的父进程,自动检测子进程,如果子进程被删除,父进程可以自动启动子进程。 这就是 Linux 删除木马后,木马自动又生成的原因。
[root@localhost ~]# cp /usr/bin/fregonnzkq /usr/wke #复制一份木马 #使用 pgrep 命令查看进程 pgrep fregonnzkq | wc -l 表示运行了几次 [root@localhost usr]# pgrep fregonnzkq 2937 [root@localhost usr]# pgrep fregonn | wc -l 1 #生成木马程序的父进程脚本 [root@localhost bin]# vim /bin/workstat #!/bin/bash while true do a=`pgrep fregonnzkq | wc -l` #统计当前系统运行了几个木马进程 if [ $a -le 1 ]; then #如查木马进程数小于等 1,那么再启动一个子进程,这样可以保障,最少有两个木马子进程在运行 /bin/cp /usr/wke /usr/bin/fregonnzkq #防止子进程文件被删除 /usr/bin/fregonnzkq & #service network restart #防止管理员关闭外网,让木马主动启动网络和外面联系。也可以加上 #清空防火墙规则的命令 fi done [root@localhost bin]# chmod +x workstat #添加可执行权限 [root@localhost bin]# /bin/workstat & #运行父进程 [3] 19216 #删除掉进程 [root@localhost bin]# ps -aux | grep fregon | grep -v grep root 2937 0.0 0.0 113412 1600 pts/1 S 15:39 0:05 /bin/bash /usr/bin/fregonnzkq root 5606 0.0 0.0 113412 1588 pts/1 S 15:54 0:03 /bin/bash /usr/bin/fregonnzkq [root@localhost bin]# kill -9 2937 5606 #因为父进程没杀掉 所以还是会自动运行子进程 [root@localhost bin]# ps -aux | grep fregon | grep -v grep root 11303 0.0 0.0 113284 1416 pts/1 S 17:42 0:00 /bin/bash /usr/bin/fregonnzkq root 11304 0.0 0.0 113284 1416 pts/1 S 17:42 0:00 /bin/bash /usr/bin/fregonnzkq
删除木马父进程 排查思路:这种情况下,你需要把找到木马的父进程,把父进程删除,再把病毒的原体删除
[root@localhost bin]# pstree | grep freg # 查找父进程
|-fregonnzkq---sleep
| | `-workstat---fregonnzkq---sleep
[root@localhost bin]# ps axu | grep workstat # 查看父进程路径
root 6050 2.4 0.0 113280 1408 pts/1 S 15:54 2:52 /bin/bash /usr/bin/workstat
root 21625 0.0 0.0 112824 984 pts/1 S+ 17:51 0:00 grep --color=auto workstat
[root@localhost bin]# vim /bin/workstat #可以查看一下父进程内容
[root@localhost bin]# rm -rf /bin/workstat #删除父进程
[root@localhost bin]# rm -rf /usr/wke #删除父进程中调用的病原体
如果进程杀掉后,快速又生成更多进程,怎么办? 解决方法:不杀进程,但是让进程不工作
[root@localhost bin]# ps axu | grep freg # 查看所有木马进程
root 11303 0.0 0.0 113284 1444 pts/1 S 17:42 0:00 /bin/bash /usr/bin/fregonnzkq
root 11304 0.0 0.0 113284 1444 pts/1 S 17:42 0:00 /bin/bash /usr/bin/fregonnzkq
root 23694 0.0 0.0 112824 984 pts/1 S+ 17:55 0:00 grep --color=auto freg
[root@localhost bin]# top -p 11303 #查看进程状态
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11303 root 20 0 113284 1444 1220 S 0.3 0.0 0:00.35 fregonnzkq
#S 表示是 sleep 状态 R 表示正在运行
[root@localhost bin]# kill -STOP 11303 #停止进程
[root@localhost bin]# top -p 11303
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11303 root 20 0 113284 1456 1220 T 0.0 0.0 0:00.52 fregonnzkq
我的木马需要对外发大量数据包,管理可以通过 iptables 在 output 链上做限制,比如,把从output 链出去 state 状态为 new 的全部 drop 掉。
[root@localhost bin]# iptables -t filter -A OUTPUT -m state --state NEW -j DROP
注:这是基于状态的防火墙规则。 由服务器自己自动发起的 TCP 链接状态为 NEW。木马程序一般都是主动发起连接的。
测试:
[root@localhost bin]# ping 192.168.1.1 #此服务器不能直接和外网通信了
[root@localhost bin]# ping www.baidu.com
ping: unknown host www.baidu.com
当然,黑客也可以在/bin/workstat 脚本中,添加放行木马通信的规则,如下:
iptables -F OUTPUT
iptables -t filter -A OUTPUT -m state --state NEW -j ACCEPT
这样木马就可以上网了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。