*本文原创作者:shewey,本文属FreeBuf原创奖励计划,未经许可禁止转载
针对linux服务器攻击主要包括溢出提权攻击、端口扫描、后门程序植入等攻击手段,而针对web应用程序的攻击则覆盖更加广泛,包括SQL注入、XSS、命令执行、文件包含、木马上传等漏洞。本文主要考虑如何通过日志分析技术实现对攻击的检测和防范技术。
常见的操作系统攻击和web攻击如下:
图1:攻击手段分类
操作系统攻击方法和web的攻击防范很多,本文仅考虑上传攻击手段的检测和防范技术。
环境如下:
操作系统:CentOSrelease 6.4 (Final)
数据库系统:mysql Ver 14.14 Distrib 5.1.66
中间件环境:Apache/2.2.15(Unix)
Web应用程序环境:DVWA1.0.8
日志是Linux安全结构中的一个重要内容,是提供攻击发生的唯一真实证据。Linux中日志包括以下几类:登录时间日志子系统、进程统计日志子系统、错误日志子系统等。
登录时间日志子系统: 登录时间通常会与多个陈旭的执行产生关联,一般情况下,将对应的记录写到/var/log/wtmp和/var/run/utmp中。为了使用系统管理员能够有效地跟踪谁在合适登录过系统,一旦触发login等程序,就会对wtmp和utmp文件进行相应的更新。
进程统计日志子系统: 主要由系统内核实现完成记录操作。当一个进程终止时,系统就自动记录该进程,往进程统计文件或中写一个纪录。进程统计的目的是为系统中的基本服务提供命令使用统计。.
错误日志子系统: 其主要由系统进曾syslogd(以及替换版本rsyslogd)实现操作有各个应用系统(FTP、Samba等)的守护进程、系统内核来自动利用syslog向/var/log/secure中添加纪录,用来记录系统错误日志。
审计子系统: 审计子系统提供了一种记录系统安全信息的方法,为系统管理员在用户违反系统安全法则时提供及时的警告信息。在用户空间,审计系统由auditd、ausearch等应用程序组成。审计后台auditd应用程序通过netlink机制从内核中接收审计消息,然后,通过一个工作线程将审计消息写入到审计日志文件中,其中,还有一部分消息通过消息分发后台进程dispatcher调用syslog写入日志系统。
表1:常见日志总结
日志名称 | 日志内容 |
/var/log/boot.log | 该文件记录了系统在引导过程中发生的事件,就是Linux系统开机自检过程显示的信息。 |
/var/log/cron | 该日志文件记录crontab守护进程crond所派生的子进程的动作,前面加上用户、登录时间和PID,以及派生出的进程的动作。CMD的一个动作是cron派生出一个调度进程的常见情况。REPLACE(替换)动作记录用户对它的 cron文件的更新,该文件列出了要周期性执行的任务调度。 RELOAD动作在REPLACE动作后不久发生,这意味着cron注意到一个用户的cron文件被更新而cron需要把它重新装入内存。该文件可能会查 到一些反常的情况。 |
/var/log/maillog | 该日志文件记录了每一个发送到系统或从系统发出的电子邮件的活动。它可以用来查看用户使用哪个系统发送工具或把数据发送到哪个系统。 |
/var/log/messages | 该日志文件是许多进程日志文件的汇总,从该文件可以看出任何入侵企图或成功的入侵。 |
/var/log/syslog | 默认RedHat Linux不生成该日志文件,但可以配置/etc/syslog.conf让系统生成该日志文件。 |
/var/log/lastlog | 该日志文件记录最近成功登录的事件和最后一次不成功的登录事件,由login生成。 在每次用户登录时被查询,该文件是二进制文件,需要使用 lastlog命令查看,根据UID排序显示登录名、端口号和上次登录时间。如果某用户从来没有登录过,就显示为”**Never logged in**”。系统账户诸如bin、daemon、adm、uucp、mail等决不应该登录,如果发现这些账户已经登录,就说明系统可能已经被入侵了。 |
/var/log/wtmp | 该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件。因此随着系统正常 运行时间的增加,该文件的大小也会越来越大,增加的速度取决于系统用户登录的次数。该日志文件可以用来查看用户的登录记录,last命令就通过访问这个文件获得这些信息,并以反序从后向前显示用户的登录记录,last也能根据用户、终端 tty或时间显示相应的记录。 |
/var/run/utmp | 该日志文件记录有关当前登录的每个用户的信息。因此这个文件会随着用户登录和注销系 统而不断变化,它只保留当时联机的用户记录,不会为用户保留永久的记录。系统中需要查询当前用户状态的程序,如 who、w、users、finger等就需要访问这个文件。该日志文件并不能包括所有精确的信息,因为某些突发错误会终止用户登录会话,而系统没有及时 更新 utmp记录,因此该日志文件的记录不是百分之百值得信赖的。 |
以上提及的3个文件(/var/log/wtmp、/var/run/utmp、 /var/log/lastlog)是日志子系统的关键文件,都记录了用户登录的情况。这些文件的所有记录都包含了时间戳。这些文件是按二进制保存的 | |
/var/log/secure | 该日志文件记录与安全相关的信息。 |
/var/log/xferlog | 该日志文件记录FTP会话,可以显示出用户向FTP服务器或从服务器拷贝了什么文件。 |
其主要文件格式如下:
1、基于syslogd的日志文件格式。该格式主要采用syslog协议和POSIX标准进行定义,其日志文件的内容采用ASCII文本形式存在。一般由日期、时间、主机名、IP地址和优先级等。大部分应用程序产生的日志采用此种方式。例如FTP日志等。
具体syslog的格式可以参考链接: http://blog.csdn.net/luaohan/article/details/31722225
2、二进制的文件格式。对于各个终端的登录进行记录的日志。该信息通常采用二进制的方式进行存储,无法用用编辑器直接编辑,主要记录内容包括用户名、终端号、登陆IP、登陆使用时间等。
当然本文不仅仅需要考虑上述日志文件,而且需要手工配置history日志、sftp日志以实现能够记录访问操作系统的历史操作命令以及上传下载文件日志。
防火墙日志:在iptables中直接提供日志记录功能。实现了对经过网关的数据包进行记录,由系统的日志功能将其保存在一个特定的日志文件当中,这个文件中的每一行记录了一个经过的数据包的相关信息。
(一)history 日志 :
该日志记录了大量的用户操作命令,因缺乏日志法则中的安全审计元素,因此通常无法作为直接的日志使用,必须结合具体的场景分析,也存在伪造的可能。
1、 history操作日志配置方法如下:
首先history自身是无法记录日期和时间、IP地址这些信息的,且存在被删除的可能性,对于日志来说,一旦缺乏日期和时间,则基本上可以认为是不可信的,因此所有恶信息都可能伪造,因此需要对history进行加工。
这里我们通过logger来实现配置,logger 是一个shell 命令接口,可以通过该接口使用Syslog的系统日志模块,还可以从命令行直接向系统日志文件写入一行信息。logger命令默认的日志保存在 /var/log/messages中
因此可以通过logger将history中的操作命令记录到系统日志中。
具体的配置过程如下:
表2:HISTORY日志配置
步骤 | 配置内容 |
1 、使用 root 权限修改 /etc/profile 文件,增加 history 操作日志配置 | #history log config# export HISTTIMEFORMAT=”[%Y-%m-%d %H:%M:%S] [`who am i 2>/dev/null| / awk '{print $NF}'|sed -e 's/[()]//g’`] ” #增加history中事件和IP地址的记录 #将命令一个一个的传入到/var/log/messages中。 export PROMPT_COMMAND=’/ if [ -z "$OLD_PWD" ];then export OLD_PWD=$PWD; fi; if [ ! -z "$LAST_CMD" ] && [ "$(history 1)" != "$LAST_CMD" ]; then logger -t `whoami`_shell_cmd “[$OLD_PWD]$(history 1)”; fi ; export LAST_CMD=”$(history 1)”; export OLD_PWD=$PWD;’ #history log config# |
2 、执行命令,是配置内容立即生效 | source /etc/profile |
3 、配置完成后重新启动 rsyslog 服务 | service rsyslog restart |
日志记录格式如下: | Jun 7 00:19:46 webserver root_shell_cmd: [/root] 54 [2016-05-07 00:19:46] [192.168.197.1] whoami 日期时间 – 主机名 – 当前用户 – 当前目录 — 命令序号 – 执行时间 – 执行 IP 地址 – 执行命令 |
日志记录文件 | /var/log/messages |
具体步骤如下:
1、配置/etc/profile文件,增加配置内容如下:
图2:History日志配置方法
2、使环境生效以及重启rsyslog服务。
图3:使得配置生效
通过日志配置可以将所有的历史执行命令记录下来,为后续的取证提供证据。
(2)SFTP日志
默认情况下SSHD服务作为linux操作系统管理方法,其自带sftp(Secure File Transfer Protocol,安全文件传送协议)可以为传输文件提供一种安全的加密方法。可以实现命令执行以及文件上传下载功能,且默认上传和下载功能通常日志通常不存在,需要通过配置/etc/ssh/sshd_config配置文件来实现配置,进而实现SFTP日志的记录。
图4:默认的/etc/ssh/sshd_config配置
通过sshd的sftp-server的简单配置及操作日志的配置说明。
具体的配置过程如下:
表3:sftp日志配置
步骤 | 配置内容 |
1 、修改 /etc/ssh/sshd_config 配置文件,修改日志配置参数 | # Logging # obsoletes QuietMode and FascistLogging SyslogFacility AUTH LogLevel INFO # override default of no subsystems Subsystem sftp /usr/lib64/ssh/sftp-server -l INFO -f local5 |
2 、重启服务 | /etc/init.d/sshd restart |
日志记录格式如下: | Jun 7 01:31:10 webserver sshd[12064]: subsystem request for sftp Jun 7 01:31:11 webserver sftp-server[12084]: session opened for local user root from [192.168.197.1] Jun 7 01:31:11 webserver sftp-server[12084]: open “/root/11111.txt” flags WRITE,CREATE,TRUNCATE mode 0666 Jun 7 01:31:11 webserver sftp-server[12084]: close “/root/11111.txt” bytes read 0 written 73 Jun 7 01:31:11 webserver sftp-server[12068]: opendir “/root” Jun 7 01:31:11 webserver sftp-server[12068]: closedir “/root” 1 、首先开始 sftp 请求记录 2 、打开会话显示从那个 IP 地址过来 3 、上传文件的名称和大小以及当前的目录。 |
日志记录文件 | /var/log/messages |
具体配置步骤如下:
1、配置/etc/ssh/sshd_config文件,增加配置内容如下:
图5:SFTP日志配置
2、重启ssh服务,使其生效。
3、上传文件后测试发现可以直接记录上传日志
图6:上传文件日志
通过SFTP日志可以有效地审计上传和下载文件执行操作。
另外还需要说明的是,如果/var/log/下通过syslog记录的日志直接被删除时候,对应的服务需要重启。因此rm删除文件时会造成进程终端,无法记录后续的日志记录。运行命令:service syslog restart ;service sshd restart 后正常。
3.2 数据库日志
本文中主要考虑MySQL日志功能包括错误日志、慢查询日志、通用日志、二进制日志等。
本文主要考虑采用通用日志(Generallog)的方式对执行的SQL语句进行记录。因为通用日志是会记录所有的查询操作的,包含任何的SQL语句,因而生成的日志文件会很大,因此通用日志功能开启之后对数据库的性能会有很大的影响[,但对于从安全角度来考虑,在不影响影响性能的前提下可以开启该操作,可以及时的发现安全隐患。
当然更加具体的配置可以参考: http://drops.wooyun.org/运维安全/16067
图7:MySQL进程
数据库配置方法如下:
默认的mysql数据库配置文件mf.cnf在/etc/目录下。
图8:general log配置方法
配置general log日志完成后,就可以记录任何对数据库的操作了。当然这里的日志记录路径可以根据实际需要进行修改。
具体日志格式如下:
图9:General log 日志格式
日志文件:/var/run/mysqld/mysqld.log
中间件是web应用程序的运行支撑软件, 日志已经作为web应用软件的基本功能组建,例如最为广泛的apache、tomcat等web系统软件均支持日志功能,能够实时记录用户访问web的资源的详细情况,同时也能够直接反应用户的行为。
以Apache日志为例,通常日志分为两类:访问日志和错误日志。
1)Apache访问日志:访问日志通常用户记录客户端向服务器发出的请求,根据http协议,这个请求包含了客户端的IP地址、浏览器类型以及请求的URL等信息;服务器收到请求后,根据客户要求返回信息内容到客户端,如果出现错误则报告错误;web服务器将访问信息和状态记录到日志文件中,从而形成完整的访问日志。
为了便于分析 Apache 的访问日志, Apache 的默认配置文件中,按记录的信息不同 ( 用格式说明不同的信息 ) 将访问日志分为 4 类:
普通日志格式 (commonlog format,CLF),common 大多数日志分析软件都支持这种格式。CustomLog/var/log/apache2/access.log common
参考日志格式(referer log format) ,referrer 记录客户访问站点的用户身份。CustomLog /var/log/apache2/referer.log referer
代理日志格式 (agentlog format),agent 记录请求的用户代理。CustomLog /var/log/apache2/agent.logagent
综合日志格式(combined log format),combined 结合以上三种日志信息。通常使用一个综合日志格式文件进行记录,配置为:CustomLog /var/log/apache2/ access.log combined
2)Apache错误日志:该日志记录了服务器运行期间遇到的各种错误 , 以及一些普通的诊断信息 ,比如服务器何时启动、何时关闭等。
这里重点关注访问日志,因为通过访问可以了解当前web应用系统的请求/响应情况。当然所有的日志都会随着时间的增长变大,因此需要配置日志的循环。具体可参考官方文档。
图10:默认访问日志的配置
日志文件路径:/var/log/httpd/access_log
默认情况下,post请求不记录任何的请求数据值,听说可以用mod_dumpio模块,以为可以解决该问题。
配置方法如下:
1、在httpd.conf总找到如下行,并去掉注释
# LoadModule dumpio_module modules/mod_dumpio.so |
---|
编辑/etc/httpd/conf/httpd.conf文件,去掉注释。
2、配置日志级别。
#LogLevel warn LogLevel debug DumpIOInput On DumpIOOutput On DumpIOLogLevel debug |
---|
把默认的LogLevel改成 debug,然后打开 DumpIO的请求和响应报文开关。这样,在logs/error_log下面就可以查看到所有的报文data部分。
图11:dumpio_module配置日志级别
Error_log日志结果如下:
虽然能记录结果,但是日志量太大了。
记下来探讨一下攻击的检测的方法
(一)暴力破解
通过ssh远程连接是运维通用做法。
大体上分为如下几种情况:
通过上述日志可以知道通过/var/log/secure可以检测异常登陆的用户,IP地址、用户名等信息,默认情况下ssh具有登陆次数,超过后断开连接。
为了预防这种攻击,可以采用ssh最大登录次数锁定的方式。
进行如下的配置
# vim /etc/pam.d/sshd #%PAM-1.0 auth required pam_sepermit.so auth required pam_tally2.so deny=5 even_deny_root root_unlock_time=180 unlock_time=180 #增加一行内容 auth include password-auth account required pam_nologin.so account include password-auth password include password-auth # pam_selinux.so close should be the first session rule session required pam_selinux.so close session required pam_loginuid.so # pam_selinux.so open should only be followed by sessions to be executed in the user context session required pam_selinux.so open env_params session optional pam_keyinit.so force revoke session include password-auth |
---|
图12:登陆失败后锁定3分钟
图13:用户被锁定
(二)缓冲区溢出和提权
这里centos6.4存在提权漏洞,首先添加一个用户test,利用脚本如下
1、缓冲区溢出/本地提权需要上传提权脚本,不管是用什么方法,通过sftp还是webshell,总会存在上传的痕迹。
Ø rz等命令上传,则会存在与/var/log/messages中,因为配置了history日志
Ø 通过webshell上传会检测上传目录是否存在脚本文件,防御手段当然是限制执行权限。
Ø Sftp上传则会在/var/log/messages中存在上传日志。
Ø webshell命令执行漏洞/系统命令执行漏洞等攻击手段
提权脚本如下: http://fucksheep.org/~sd/warez/semtex.c
这里假设已经爆破了一个用户test,则需要进一步提权。
接下来执行提权操作,chmod给予执行权限,编译提权。
通过/var/log/messages日志可以明确的看出整个提权过程。
后面的执行命令无法准备区分是否值真正的root执行,但是从这里可以看出并非通过bash命令行的方式获取了root。
另外关于后门的检测,history日志和secure日志中应该可以存在蛛丝马迹。
Linux PAM&&PAM后门: http://drops.wooyun.org/tips/1288
(一)SQL注入攻防
Web的访问日志记录的比较详细的get请求,因此可以通过这些请求和数据库的日志来分析SQL注入信息。
SQL注入通过数据库日志、应用程序日志综合可以分析出来。
(二)命令执行
命令执行因为是通过web请求发生,因此操作系统命令无法记录web请求日志,智能通过access_log和error_log的dumpio模块检测请求的参数,已发现是否存在异常。
其他的攻击和检测手段类似。
本文仅仅是给出了一些攻击手段的检测方法和防御手段,当然日志需要不断地扩充和检查才能及时杜绝漏洞的发生。
[1] UNIX/Linuc网络日志分析与流量监控[M], 北京:机械工业出版社,2015
[2] 倪继利,linux安全体系分析与编程[M],电子工业出版社,2007年11月1日,25
[3] 谭森,基于日志分析的MySQL数据库取证算法研究[D],上海交通大学硕士学位论文,2015年1月,21
*本文原创作者:shewey,本文属FreeBuf原创奖励计划,未经许可禁止转载