Webshell通常指以JSP、ASP、 PHP等网页脚本文件形式存在的一种服务器可执行文件,一般带有文件操作、命令执行功能,是一种网页后门。攻击者在入侵网站后,通常会将Webshell后门文件与网站服务器Web目录下正常的网页文件混在一起,使用浏览器或专用客户端进行连接,从而得到一个服务器操作环境,以达到控制网站服务器的目的。
jsp:
<%Runtime.getRuntime().exec(request.getParameter("));%>
asp:
<%eval request("cmd")% >
php:
<?php
$a=exec($_GET["input"]);
echo $a;
?>
2.1、基于流量的Webshell检测
基于流量的Webshel检测方便部署,我们可通过流量镜像直接分析原始信息。基于payload的行为分析,我们不仅可对已知的Webshell进行检测,还可识别出未知的、伪装性强的Webshell,对Webshell的访问特征 (IP/UA/Cookie) 、payload特征、 path特征、 时间特征等进行关联分析,以时间为索引,可还原攻击事件。
2.2、基于文件的Webshell检测
我们通过检测文件是否加密(混淆处理) ,创建Webshell样本hash库,可对比分析可疑文件。对文件的创建时间、修改时间、文件权限等进行检测,以确认是否为Webshell。
2.3、基于日志的Webshell检测
对常见的多种日志进行分析,可帮助我们有效识别Webshell的上传行为等。通过综合分析,可回溯整个攻击过程。
系统被植入Webshell,可能出现以下几个异常
:
1、网页被篡改,或在网站中发现非管理员设置的内容;
2、出现攻击者恶意篡改网页或网页被植入暗链的现象;
3、安全设备报警,或被上级部门通报遭遇Webshell等。
1、删除检测到的Webshell文件,对文件进行备份,方便后续取证溯源。
2、对系统进行隔离,防止影响其他系统的。
扫描工具
:
1、D盾
Webshell查杀、可疑文件隔离;端口进程查看、base64解码,以及克隆用户检测等;文件监控。
2、河马Webshell查杀
河马Webshell查杀拥有海量Webshell样本和自主查杀技术,采用传统特征+云端大数据双引擎的查杀技术,支持多种操作系统。
1、Windows系统排查
利用Webshell扫描工具(如D盾)对应用部署目录进行扫描,如网站D: \WWW\目录,或者将当前网站目录文件与此前备份文件进行比对,查看是否存在新增的不一致内容,确定是否包含Webshell相关信息, 并确定Webshel位置及创建时间。然后利用文本文件打开,进一步分析发现可疑内容。
2、Linux系统排查
在Windows系统中使用的Webshell检测方法在Linux系统中同样适用。在Linux系统中,可用河马Webshell查杀工具扫描,也可手工搜索可能包含Webshell特征的文件。
//搜索目录下适配当前应用的网页文件,查看内容是否有Webshell特征
find ./ type f -name "*.jsp" | xargs grep "exec("
find ./ type f -name "*.php" | xargs grep "eval("
find ./ type f -name "*.asp" | xargs grep "execute("
find ./ type f -name "*.aspx" | xargs grep "eval("
//对于免杀Webshell,可以查看是否使用编码
find ./ type f -name "*.php" | xargs grep "base64_decode"
判断Webshell事件发生时间:
根据异常现象发生时间,结合网站目录中Webshell文件的创建时间,可大致定位事件发生的时间段。以便后续依据此时间进行溯源分析、追踪攻击者的活动路径。
对攻击路径进行溯源分析
:如果网站被植入暗链或出现单击链接跳转到其他网站(如博彩网站、色情网站等)的情况,应首先排查网站首页相关js,查看是否被植入了恶意跳转的js。
若网站首页被篡改或有其他被攻击的现象,可以根据网站程序信息,如程序目录、文件上传目录、war包部署目录,使用工具(如D盾)和搜索关键词(如eval、 base64_ decode、assert)方式,定位到Webshell文件并清除。然后根据日志进行溯源分析,同时除了进行Web应用层排查,还应对系统层进行全面排查,防止攻击者在获取Webshel后执行了其他的权限维持操作。
判断系统架构:
收集系统信息,为快速溯源分析提供前期准备工作
项目 | 内容 |
服务器 | Windows、Linux等 |
内容管理系统(CMS) | Jeecms、Wordpress、 Drupal、 TRS WCM、Phpcms、 Dedecms 等 |
中间件 | Tomcat、IIS、 Apache、 WebLogic、 JBoss、 Websphere、 Jetty 等 |
框架 | Struts2、Thinkphp、 Spring、 Shiro、 Fastjson 等 |
数据库 | Tomcat、IIS、 Apache、 WebLogic、 Struts、 MySQL等 |
脚本语言 | ASP、PHP、JSP 等 |
业务架构 | 如前端网页内容是否是后端通过FTP上传的(新闻网偏多)等 |
攻击者上传Webshell后,往往还会执行进一步的操作,如提权、添加用户、写入系统后门等,实现持久化驻留。因此,还需要对系统进行排查,主要排查内容如下。
1、用户信息排查
用户排查:
使用net user
命令,可直接查看用户信息(此方法看不到隐藏用户),若发现存在非管理员使用账户,则可能为异常账户;
如果需查看某个账户的详细信息,可使用net user username
命令。
隐藏用户排查:
打开计算机管理-->本地用户和组
,可查询隐藏用户。用户名称以$结尾的为隐藏用户。
克隆用户排查:
可使用注册表,利用F值进行对比,以排查克隆用户。也可直接使LP_Check工具排查克隆用户。
2、进程、服务、驱动、启动项排查
进程排查:
在排查可疑进程时,可以关注进程名称,对于异常的、不常见的名称要格外注意,另外可以重点观察进程的路径、CPU占用信息等。打开系统信息
和任务管理器
窗口,均可查看进程名称及其对应的执行文件。
进程信息还可以使用PCHunter工具查看,信息中黑色的条目代表微软进程;
蓝色的条目代表非微软进程,可能是第三方应用程序的进程,蓝色缺少文件厂商信息的进程需多加关注;
红色的条目代表可疑进程、隐藏服务、被挂钩函数。
服务排查:
在系统信息窗口-->软件环境-->服务
,可查看服务的启动情况及其对应的启动文件;或使用services.msc
命令,也可直接查看服务。查找异常服务。
驱动、启动项排查:
命令行msconfig
打开启动项;
Get-WmiObject Win32_PnPSignedDriver| select DeviceName, DriverVersion
命令可查看驱动;
3、网络连接排查
使用系统自带的netstat -ano
]命令,可查看当前网络连接情况,如果当前服务器只允许对指定IP地址建立连接,那么若发现未在指定范围内的连接情况,则很可能是异常连接。
也可以使用工具(如TCPView)
查看网络连接详细信息。TCPView可用于检测当前系统中的进程及其对应的连接状态。当进程标记为绿色时,表示该连接为新发起的连接,当进程标记为红色时,表示该连接为结束状态。
4、任务计划排查
攻击者在攻击成功后,添加任务计划往往是为了持久化控制。任务计划日志通常存放在C:\WINDOWS\System32\Tasks
目录下,可以直接打开系统自带的任务计划程序
窗口进行查看。若发现非自定义的任务计划,则较为可疑,需进行排查。
5、文件排查
攻击者在攻击成功后可能会在本地留下过程文件,这时需要应急响应工程师排查各个盘符下的
相关敏感目录,以便确定是否存在异常文件。
temp相关目录:
temp指系统临时文件夹,用于存储系统临时文件。在Windows系统中,常见temp目录主要分
布在如下位置:
C:\Windows\temp
C:\Users\Administrator\AppData\Local\temp
在寻找可疑文件时,先重点查看攻击时间范围内的文件,然后通过文件命令来判断。一般凡是在非系统System32或Syswow64目录下的svchost.exe文件基本为恶意文件;另外,命名特殊的文件也要重点排查。发现可疑文件后,可以提取样本做进一步的鉴定。
recent相关目录:
可通过查看最近打开的文件,判断可疑文件,目录如下:
C:\Documents and Settings\Administrator\recent
C:\Documents and Settings\Default User\recent
1、用户信息排查
//查看UID为0的用户
awk -F: '{if($3==0)print $1}' /etc/passwd
//查看能够登录的用户
cat /etc/passwd | grep -v "nologin" | grep -v "false"
//查看是否存在空口令用户
awk -F: 'length($2)==0 {print $1}' /etc/shadow
2、进程、服务、网络连接排查
ps aux
命令查看系统进程;
kill -9 PID
命令,可结束PID;
netstat -anp
命令,可查看网络连接、进程、端口及对应的PID等,排查时可优先关注对外连接的进程,或连接高危端口的进程;
ls -alh /proc/PID
,可查看其对应的可执行程序;
rm -rf filename
命令删除进程;
如果root用户都无法删除相关文件,那么可能是文件被加上了i属性
(设定文件不能被删除、改名、设定连接关系,同时不能写入或新增内容)。可以使用lsatter filename
命令查看文件属性,然后使用chattr -i filename
命令移除i属性,然后执行删除命令。
lsof -p PID
命令查看PID对应的可执行程序。
lsof -i:port
命令查看指定端口对应的可执行程序。
top
命令:可以根据CPU、内存占用率查看可疑进程。
查看隐藏进程。可以借助unhide工具排查隐藏进程。unhide是一个小巧的网络取证工具,能发现隐藏的进程和TCP/UDP端口。该工具在Linux、UNIX、MS-Windows等操作系统中都可用。
chkconfig --list
命令,可查看系统运行的服务,核查是否存在异常服务。
3、开机自启动排查
攻击者在攻击成功后往往会设置开机自启动,以实现持久化控制。
在Linux系统中,系统启动内核挂载根文件系统,然后启动并运行一个init程序,init进程的任务就是运行开机启动的程序,init是非内核进程中第一个被启动运行的,因此它的PID的值总是1,init读取其配置文件来进行初始化工作。
Linux系统为不同的场合分配不同的开机启动程序,又称为“运行级别”(run level) ,如下表所示:
运行级别 | 说明 |
---|---|
运行级别0 | 系统停机状态,系统默认运行级别不能为0,否则将不能正常启动 |
运行级别1 | 单用户工作状态,root 权限,用于系统维护,禁止远程登录 |
运行级别2 | 多用户状态(没有NFS ) |
运行级别3 | 完全的多用户状态(有NFS),登录后进入控制台命令行模式 |
运行级别4 | 系统未使用,保留 |
运行级别5 | X11控制台,登录后进入GUI模式 |
运行级别6 | 系统正常关闭并重启,默认运行级别不能为6,否则将不能正常启动 |
7个运行级别分别对应7个目录,对应/etc/rc[0-6].d 下的7个文件夹(rc0.d--->rc6.d ),每个目录下有对应的启动文件,具体文件路径都是在/etc/rc.d/init.d/ 目录中。 |
|
其中,文件名:字母S[K]+两位数字+程序名 ”的形式。字母S表示Start,启动;字母K表示Kill,关闭。 |
|
旧版本的linux下/etc/rc.d/ 目录下还有init.d目录和rc.local文件;新版本linux是在/etc目录下查看。 |
|
init.d目录 通常用于存放一些脚本, 包括linux系统中以rpm包安装时设定的一些服务的启动脚本,类似于Windows系统中的注册表; |
|
rc.local文件会在用户登录之前读取,在每次系统启动时都会执行一次,也就是说,如果有任何需要在系统启动时运行的工作,那么只需写入/etc/rc.d/rc.local配置文件即可。
点击查看Linux中没有rc.local文件的解决方法
进行应急响应处置时应重点关注以下目录文件(依系统而定) :
1、查看运行级别:
# runlevel
2、配置运行级别
# vi /etc/inittab
# id=5:initdefault 系统开机后直接进入哪个运行级别
3、查看启动项文件:
# more /etc/rc.local /etc/rc.d/rc[0~6].d ls -l /etc/rc.d/rc3.d/
4、查看init.d下的所有文件信息
# ls -alt /etc/init.d
5、查看init.d下的rc.local文件内容
# cat /etc/init.d/rc.local
6、rc.local为开机启动配置文件,查看rc.local文件内容
# cd /etc/rc.local
# cd /etc/rc.d/rc[0~6].d
4、定时任务排查
攻击者通常用定时任务来进行持久化控制:
crontab -l
命令是用户级别的,保存在/var/spool/cron/{user}
中,每个用户都可以使用crontab -e
命令编辑自己的定时任务列表。使用crontab -I
命令,可查看当前用户的定时任务,检查是否有后门]木马程序启动相关信息。
/etc/crontab
是系统级别的定时任务,只有root账户可以修改。另外,还需要注意的有/etc/cron.hourly、/etc/cron.daily、 /etc/cron.weekly、/etc/cron.monthly
等周期性执行脚本的目录。
使用ls /etc/cron*
命令,可查看etc目录系统级定时任务相关文件。例如,攻击者若想每小时执行一个脚本,则只需将脚本放到/etc/cron.hourly下,并且赋予执行权限即可。
5、rootkit排查
rootkit是种特殊的恶意软件,功能是在安装目标上隐藏自身及指定的文件、 进程和网络连接
等信息。rootkit一般会与木马、后门等其他恶意程序结合使用。
ls -alt /bin
命令,可查看相关系统命令的修改时间,判断是否有更改。
ls -alh /bin
命令,可查看相关文件大小,若明显偏大,则很可能被替换。
rpm -Va
命令,可查看发生过变化的软件包,若一切校验结果均正常,则不会产生任何输出。
第三方查杀工具
,如chkrootkit、 rkhunter进行查杀 。
6、文件排查
通过对一些敏感文件及敏感目录的排查,可判断是否存在攻击者的攻击存留文件,以及修改访
问过的文件。
ls -al
命令,可查看隐藏的文件。
find / mtime 0
命令,可查看最近24小时内修改过的文件。
stat filename
命令,可查看文件的修改、创建、访问时间。应重点关注与事件发生时间接近的文件的情况,或者修改、创建、访问时间存在逻辑错误的文件的情况。
ls -alh /tmp
命令,可查看/tmp目录文件。
ls -alh /root/.ssh/
命令,可查看是否存在恶意的ssh公钥,一旦发现非已知ssh公钥,则很可能是攻击者写入的。
对访问网站的Web日志进行分析,重点关注已知的入侵时间前后的日志记录,从而寻找攻击者漏洞分析通过日志中发现的问题,针对攻击者活动路径,可排查网站中存在的漏洞,并进行分析。
1、Windows系统排查
对Web日志进行分析,以查找攻击路径及失陷原因,常见Web中间件默认路径如下表所示:
Web中间件默认路径 | 默认路径 |
---|---|
Apache | apache\logs\error.log、apache\logs\access.log |
IIS | C:\inetpublogs\LogFiles、C:WINDOWS\system32LogFiles |
Tomcat | tomcat\access_log |
查看安全日志,多关注其中的特殊事件 : |
|
事件ID | 描述 |
- | - |
1102 | 清理审计日志 |
4624 | 用户登录成功时会产生的日志, |
4625 | 用户登录失败时会产生的日志(解锁屏幕并不会产生这个日志), |
4672 | 特权用户登录成功时会产生的日志,如登录Administrator,,一般会看到4624和4672日志一起出现 |
4720 | 创建用户时会产生的日志 |
4722 | 启用用户时会产生的日志 |
4724 | 试图重置账号、密码 |
4726 | 删除用户时会产生的日志 |
4728 | 将成员添加到启用安全的全局组中 |
4729 | 将成员从安全的全局组中移除 |
4732 | 已向启用了安全的本地组中添加某个成员,如通常在将创建的用户添加到Administrators管理员组时会产生该日志 |
%SystemRoot%\System32\Winevt\Logs 目录下还存在大量其他日志。例如:远程桌面会话日志会记录通过RDP登录的信息,包含登录源网络地址、登录用户等,在Webshell应急响应中也应当关注。其中: |
|
事件ID为21,表示远程桌面会话登录成功; | |
事件ID为24,表示远程桌面会话断开连接; | |
事件ID为25,表示远程桌面会话重新连接成功。 |
2、Linux系统排查
在Linux系统中,常见Web中间件默认路径如下表所示。
Web中间件 | 默认路径 |
---|---|
Apache | /etc/httpd/logs/access_log、/var/log/httpd/access_log |
Nginx | /usr/local/nginx/logs |
Linux系统日志一般位于/var/log
目录下,几乎保存了系统所有的操作记录,包括用户认证时产生的日志、系统定期执行任务计划时产生的日志、系统某些守护进程产生的日志、系统邮件日志、内核信息等。
常排查的系统日志:
系统日志 | 描述 |
---|---|
boot.log | 记录系统在引导过程中发生的事件,即Linux系统在开机自检过程中显示的信息 |
messages | 需启用rsyslog,记录Linux系统常见的系统和服务错误信息 |
secure/auth.log | Linux系统安全日志,记录用户和工作组变化情况、用户登录认证情况 |
lastlog | 记录最后一次用户成功登录的时间、登录IP地址等信息 |
btmp | 记录Linux系统登录失败的用户、时间及远程IP地址 |
wtmp | 永久记录每个用户登录、注销及系统启动、停机的事件,使用last查看 |
maillog | 记录系统中运行的邮件服务器的日志信息 |
bash_history | 记录之前使用过的shell命令 |
在Linux日志排查时,常用日志检索命令
如下:
定位具体的IP地址或文件名:
find . access_log | grep xargs ip
、
find . access_log | grep xargs filename
|
查看页面访问排名前十的IP地址:
cat access.log | cut -f1 -d "" | sort | uniq -c | sort -k 1 -r | head -10
查看页面访问排名前十的URL地址:
cat access.log | cut -f4 -d "" | sort | uniq -c | sort -k 1 -r | head -10
3、数据库日志排查
MySQL日志
:
Windows:MySQL的默认配置路径:C: Windows\my.ini
C: Windows\mysql\my.ini
Linux:MySQL的默认配置路径:/etc/mysql/my.cnf
MySQL常见的日志记录格式:
windows系统:
log-error=E:/PROGRA~1/EASYPH~1.0B1/mysql/logs/error.log"
、log="E:/PROGRA~1/EASYPH~1.0B1/mysql/logs/ mysql.log"
、
long_query_time=2
log-slow-queries= "E:/PROGRA~1/EASYPH~1.0B1/mysql/logs/slowquery.log"
linux系统:
log-error=/usr/local/mysql/log/error.log
log=/usr/local/mysql/log/mysql.log
long_query_time=2
log-slow-queries= /usr/local/mysql/log/slowquery.log
网络流量排查主要利用现场部署的网络安全设备,通过网络流量排查分析以下内容:服务器高危行为、Webshell连接行为、数据库危险操作、邮件违规行为、非法外连行为、异常账户登录为等。在缺少流量分析设备时,Windows系统可以借助抓包工具Wireshark辅助分析。
要注意的是,若数据包中带有z0、eval、 base64_decode,则该数据包很可能是中国菜刀客户端连接一句话木马时产生的。
若数据包中带有特殊的Referer、Accept-Language,则一般是攻击者利用Weevely Webshell工具连接产生的。
如果攻击者在攻击成功后利用msf中的reverse_ tcp 上线,那么在Wireshark数据包中一般会有
PSH标志位。
清除加固的方法如下:
1、处置时先断网,清理发现的Webshell;
2、如果网站被挂黑链或者被篡改首页,那么应删除篡改内容,同时务必审计源码,保证源码中不存在恶意添加的内容;
3、在系统排查后,及时清理系统中隐藏的后门及攻击者操作的内容,若发现存在rootkit类后门,则建议重装系统;
4、对排查过程中发现的漏洞利用点进行修补,切断攻击路径,必要时可以做黑盒渗透测试,全面发现应用漏洞;
5、待上述操作处置完成,重新恢复网站运行。
1、配置必要的防火墙,并开启防火墙策略,防止暴露不必要的服务为攻击者提供利用条件。
2、对服务器进行安全加固,例如,关闭远程桌面功能、定期更换密码、禁止使用最高权限用户运行程序、使用HTTPS加密协议等。
3、加强权限管理,对敏感目录进行权限设置,限制上传目录的脚本执行权限,不允许配置执行权限等。
4、安装Webshell检测工 具,根据检测结果对已发现的可疑Webshell痕迹立即隔离查杀,并排查漏洞。
5、时常备份数据库等重要文件。
6、需要保持日常维护,并注意服务器中是否有来历不明的可执行脚本文件。
7、采用白名单机制上传文件,不在白名单内的一律禁止上传,上传目录权限遵循最小权限原则。