日志(也称为Log)是系统运行时所发生事件的相关记录,包括日期、时间、使用者及操作等信息的描述。日志分析就是对这些记录进行审查与评估,以发现系统中可能存在的风险。
在CTF比赛中,对日志分析的考查方法多样。一是可以通过日志寻找线索,再根据线索找到flag。例如,在Web日志中发现有个奇怪的URL访问记录,我们访问这个URL就会找到flag。二是直接把flag隐藏到日志中。例如,对于SQL注入的日志,需要根据注入步骤,恢复攻击者获取的信息。还有一类题目是溯源分析,通过日志发现攻击者的IP地址等。
目前,CTF比赛中的日志分析可分为两类:Web日志分析和系统设备日志分析,下面我们分别进行讲解。
Web日志是对网络流量某些关键信息的提取和记录,其本质是一种网络流量的变形。常见的Web日志主要基于Apache和IIS,每一类中又包含规范化格式类型和自定义格式类型。规范化的Web日志格式包括Apache的 NCSA日志格式 和IIS的 W3C日志格式 。其中,NCSA格式分为NCSA普通日志格式(CLF)和NCSA扩展日志格式(ECLF)两种。目前最常用的日志格式是NCSA扩展日志格式及基于自定义格式类型的Apache日志格式。W3C扩展日志格式(ExLF)具备更丰富的输出信息,但目前应用并不广泛。
下面是一个常见的基于NCSA扩展日志格式(ECLF)的Apache日志样例:
日志中的每一项用空格分隔。下面给出每一项的具体含义:
❑第1项(58.61.164.141)是远程主机的IP地址。
❑第2项(-)是空白,用一个“-”占位符替代。这个位置用于记录浏览者的标识,一般是浏览者的E-mail或其他唯一标识,因为涉及用户邮箱等隐私信息,目前几乎所有的浏览器都取消了这项功能。
❑第3项(-)用于记录浏览者进行身份验证时提供的名字。如果需要身份验证,则这项不为空。但目前在大多数网站的日志中,这项依旧为空。
❑第4项([22/Feb/2010:09:51:46+0800])是请求的时间,格式为[日期/月/年:小时:分:秒时区]。
❑第5项(GET/reference-and-source/weblog-format/HTTP/1.1)记录了服务器收到的Web请求,格式为“请求方法请求资源协议版本”。
❑第6项(206)是状态码,用于表示服务器的响应状态,通常1××的状态码表示继续消息;2××表示请求成功;3××表示请求的重定向;4××表示客户端错误;5××表示服务器错误。
❑第7项(6326)表示发送给客户端的总字节数。把日志中的这个值加起来就可以得知服务器在一天、一周或者一月内发送了多少数据。
❑第8项(http://www.google.cn/search?q=webdataanalysis)用于表示浏览者在访问该页面之前所浏览的页面(Referrer),只有从上一个页面链接过来的请求才会有该项输出,如果是新开的页面,则该项为空。上例中的来源页面是google,即用户从google搜索的结果中单击进入。
❑第9项(Mozilla/4.0(compatible; MSIE 6.0; Windows NT 5.1))是客户端的User-Agent信息,包括操作系统的内核版本以及浏览器版本等信息。
下面是一段常见的IIS产生的W3C扩展Web日志,各字段也以空格分隔:
各字段的含义分别为:日期(2011-09-01),时间(16:02:22),请求方法(GET),请求资源(/Enterprise/detail.asp),客户端IP地址(70.25.29.53),用户浏览的前一个页面(http://www.example.com/searchout.asp),状态码(202),服务端发送字节数(17735),从客户端接收字节数(369)以及花费时间(4656,单位为毫秒)。
常用的Web日志分析方法包括特征分析法和访问频率分析法。
特征分析法是指利用网络行为的日志记录特征,从而可以快速在日志中定位相关行为。网络攻击或者Webshell会有一些比较明显的特征,例如,SQL注入攻击的日志中会有union、select等字段;XSS攻击的日志中会有<script>、alert、eval等字段;文件上传需要重点关注upload、file等内容,一般在上传后的日志中会有一个带日期的页面,此时可能存在恶意上传。
访问频率分析法就是根据一定时间内的访问频率来判断是哪种攻击方式,并实现对攻击者IP地址的溯源。当攻击者发起攻击时,一般会在短时间内发起大量网络请求。例如,当日志中出现大量HEAD方法请求时,很有可能是攻击者在进行扫描。HEAD请求只需要服务器返回头部信息,结合状态码等信息,即可知道资源在服务器中是否存在;或者是对同一个登录页面发出多次请求,那么可能是在爆破账号和密码。一般而言,当确定了服务器发生异常的时间段后,可以根据访问频率对IP地址排序,频率较高的IP地址可能就是攻击者的IP,这是一种不太精确但比较实用的方法。
特征分析法和访问频率分析法不存在孰优孰劣的问题,很多时候两种方法会一起使用,日志分析类题目的关键在于读懂日志内容,掌握请求内部的代码功能和各请求之间的逻辑关系。如果读者的编程能力较强,可以考虑编写一些小程序来快速处理日志;如果读者对于Python等脚本语言不太熟悉,可以将Web日志导入到Excel或WPS中再做进一步分析。
具体的导入方法为,在Excel或者WPS中单击“文件”,选择“打开”,再选择要分析的日志文件,如图1.3.1所示。选择“分隔符号”,单击“下一步”,只选择“空格”,再根据需求选择相应选项,即可导入成功。利用Excel或者WPS中自带的一些统计功能,可以快速完成日志分析。
图1.3.1 在Excel中导入日志
在CTF比赛中,Web日志的考法较为多样,可以是分析SQL注入日志以恢复数据信息,也可以做溯源分析,发现攻击者IP地址,或者查找Webshell等。
解题技巧
流量分析和日志分析是行业或企业CTF比赛时的重点题型。比赛实践表明,如果在比赛过程中对其他题目都无法下手,建议大家“死磕”这两个类型的题目。当这两类题目难度不大时,通过花费时间细致耐心地逐个查看,几乎都能发现题目中的关键点。所以,这类题目建议大家“逢题必做”,不要轻易选择放弃。
【例题】a.log
【题目来源】 2015 RCTF。
【题目描述】 找到flag。
【解题思路】 用记事本、Notepad++或者Sublime等文本编辑工具都可以打开并查看日志。该日志是Apache的NCSA扩展日志格式,粗略查看后,发现请求的URL中带有大量URL编码,所以该题目的第一个挑战是如何对所有记录做URL解码。
读者使用Notepad++打开日志文件后,可使用<Ctrl+A>组合键全选所有内容。如图1.3.2所示,单击“插件”,选择“MIME Tools”,再选择“URL Decode”,即可完成URL解码。
图1.3.2 利用Notepad++实现URL解码
使用Sublime也可以做同样的操作,但是Sublime不自带解码功能,需要联网安装插件。具体方法是:打开Sublime后,单击“Tools”按钮,选择“Command Palette”,如图1.3.3所示。输入“install package control”,如图1.3.4所示,单击回车,即可完成安装。安装完成后,输入“URL”,选择“URL Encode”,等待插件安装成功即可(如图1.3.5所示)。
图1.3.3 选择“Command Palette”
打开日志后,按Ctrl+A键全选所有内容,再打开“Command Palette”,输入“URL”,如图1.3.5所示,选择“URL Decode”即可完成解码。
图1.3.4 输入install package control
图1.3.5 安装URL Decode
URL解码完成后,我们继续观察日志,可以发现网站为PHP。从第359行开始,发现User-Agent字段变为“sqlmap/1.0-dev(http://sqlmap.org)”,意味着攻击者使用SQLmap对网站实施SQL注入攻击,那么网站数据库很可能为MySQL数据库。为了后面能理解SQLmap的注入步骤,需要先介绍下MySQL的数据库结构以及SQLmap的注入流程。
在MySQL中,把information_schema看作一个数据库,确切说是信息数据库。其中保存着MySQL服务器维护的所有其他数据库的信息。information_schema库中有以下几个常见表。
❑SCHEMATA表:提供当前MySQL实例中所有数据库的信息,命令show databases的结果来自此表。
❑TABLES表:提供关于数据库中的表的信息(包括视图),详细描述了某个表属于哪个schema、表类型、表引擎、创建时间等信息,命令show tables from schemaname的结果来自此表。
❑COLUMNS表:提供表中的列信息,详细描述了某张表的所有列以及每个列的信息,命令show columns from schemaname.tablename的结果就取自此表。
需要特别说明的是,在MySQL中,table_schema是数据库的名称,table_name是具体的表名,table_type是表的类型。
SQLmap的注入流程大致如下:首先寻找注入点,并验证注入点的有效性;然后,利用注入点,通过逐字节爆破获取MySQL中所有的数据库名,字节爆破一般会采用二分查找法以加快速度;根据攻击者选择的数据库,再通过逐字节爆破获取该数据库中所有的表名;接着,根据攻击者选择的表,通过逐字节爆破以获取该表中所有的列名;最后,根据攻击者选择的列,通过逐字节爆破,以获取该表中所选择列的每一项具体值。
在本题中,从359行开始,基本按上述步骤实施SQL注入攻击。第375行开始的代码用于获取数据库名,该行所构造的注入语句为:“AND 1334=IF((ORD(MID((SELECT DISTINCT(IFNULL(CAST(schema_name AS CHAR),0x20))FROM INFORMATION_SCHEMA. SCHEMATA LIMIT 0,1),9,1))>64),SLEEP(5),1334)”。初学者可以从内向外阅读来理解这条语句的逻辑:
❑CAST()函数:用于将某种数据类型的表达式转换为另一种数据类型。
❑IFNULL(expression1, expression2):如果expression1为null,函数返回expression2,否则将返回expression1。
❑DISTINCT:关键词,用于返回唯一不同的值。
❑LIMIT i,n:i为查询结果的索引值(默认从0开始),n为查询结果返回的数量。LIMIT 0,1表示只要找到对应的一条记录,就不会继续向下扫描了,效率会大大提高。
❑MID(column_name,start[,length]):MID函数用于从文本字段中提取字符,start默认从1开始,length表示返回的字符数,本例中表示返回第9个字符。
❑ORD():返回字符的ASCII码。
❑SLEEP函数:让SQL语句暂停执行指定的时间,参数是秒数。
❑IF(expr1,expr2,expr3):如果expr1是TRUE,则IF()的返回值为expr2,否则返回值为expr3。在本例中表示,如果ASCII码大于64,那么服务器等待5秒后返回0,否则直接返回1334。
综合上述逻辑,这条语句的功能是从INFORMATION_SCHEMA.SCHEMATA中得到一条数据库名,将其作为字符型,选取第9个字符比较ASCII码,如果满足条件,则服务器等待5秒后返回,否则服务器直接返回结果。根据服务器返回时间的差值,可以判断ASCII码的范围,这也是SQLmap中基于时间的延迟注入的原理。
从第855行开始,对于“table_schema=0x6d697363”,将其进行Hex转码,可以发现数据库名是“misc”,接下来开始逐字节爆破这个数据库的所有表名。数据库中有多个表,直到第2345行,从misc数据库flag表的flag列,开始逐字节爆破具体项的值。在第2352行可以发现,最后通过“!=”判断的ASCII码就是该字节的ASCII码。接下来,把所有的“!=”后的内容提取出来,就是flag。
上述方法是对日志的完整分析,但是速度较慢,这里提供第二种解法。在爆破数据库名的过程中,我们可以发现一个字节真正的ASCII码最后都要经过“!=”判断,那么把“!=”后面的字符提取出来,里面肯定有flag,利用脚本sqllog.py,运行方法为:python2 sqllog.py a-ch.log,其中a-ch.log是原日志解码后的结果,得到flag为ROIS{miSc_An@lySis_nG1nx_L0g}。
【例题】shop_access_log
【题目描述】 找到攻击者的IP地址。
【解题思路】 该日志较大,记录了45万条请求,因此可以考虑使用访问频率分析法。将日志导入WPS,因为要找攻击者的IP地址,所以可以按频率将IP地址排序。如果flag提交平台不限制提交次数,则可以写一个脚本逐个提交,肯定有一个IP地址是正确的。但是这种方法比较“无脑”,在本题中的效果也不是很好。现在把我们自己想象为一个攻击者,当我们面对一个网站时,可能首先会想找到网站的后台登录页面,然后尝试管理员弱口令登录。因此,我们搜索“admin”,搜索结果如图1.3.6所示,可以看到IP地址172.41.8.4尝试了4次以管理员身份登录,那么攻击者IP地址就是172.41.8.4。本题中,其余请求都是正常请求,只有这4个请求比较异常。大家应该掌握这种利用特征快速发现的方法。
图1.3.6 使用关键词admin查找的结果
除了Web日志,操作系统和安全设备也会产生相应的日志。其中,比较常见的是Windows与Linux系统日志。在CTF比赛中,系统日志分析的题目相对较少。
我们先介绍系统记录了哪些日志信息。Linux系统的日志主要记录在/var/log目录下,常见的日志包括以下几种:
❑/var/log/messages
用于记录系统相关信息,如执行程序、系统错误、启动信息等。一般使用messages日志查看可疑程序执行的可疑操作、系统在执行程序时出现的错误等。记录格式为: 日期 时间 主机 执行程序名称[进程ID]:具体操作 ,如图1.3.7所示。
图1.3.7 messages日志
❑/var/log/boot.log
用于记录系统启动信息的日志,一般用于查看系统启动时的所有相关信息。
❑/var/log/lastlog
用于记录用户近期的登录情况,直接查看lastlog文件可能信息不易识别,也可以使用lastlog命令进行查看。
❑/var/log/cron
保存Linux的计划任务相关信息的日志,可以用它来寻找攻击者可能会写入的一些恶意计划任务,其中可能会带有恶意软件的相关信息。cron日志有比较重要的作用,在CTF比赛中可以优先排查。其记录格式为: 日期 时间 主机 运行任务的程序[进程号]任务运行的具体信息 ,如图1.3.8所示。
图1.3.8 cron日志
❑/var/log/secure
Linux的安全日志,主要用于记录用户登录服务器以及安全相关的信息。一些服务,如polkitd、login、sshd等,无论登录成功与否,均会被记录到此日志中,所以可以通过它来判断服务器是否被攻击(如暴力破解、调用一些系统方法等),如图1.3.9所示。
图1.3.9 secure日志
常见日志的路径和功能总结如表1.3.1所示,读者可以根据CTF比赛中的需求访问这些日志。Linux系统的日志较为繁杂,学习时没有捷径可走,建议初学者多总结、多实践,这样在比赛时才能游刃有余。
表1.3.1 Linux常见日志的路径和功能总结
Windows系统也记录了非常详细的系统日志,不过我们可能平时没有注意到。Windows系统日志一般可以在事件查看器中进行查看,通常分为五类:应用程序、安全、Setup、系统、转发事件,其中又以系统日志、安全日志和应用程序日志更为常用。
事件查看器的打开方式为:打开控制面板,选择“系统和安全”,在“管理工具”中选择“查看事件日志”,如图1.3.10所示。
图1.3.10 Windows查看事件日志
❑系统日志
该日志包含Windows系统组件记录的事件,包括错误、警告及任何应用程序需要报告的信息等,该日志保存在System.evtx文件中,如图1.3.11所示。
❑安全日志
Windows的安全日志和Linux的安全日志相似,包含用户登录情况、用户访问时间以及访问是否授权等,并详细记录了使用者信息、登录类型、登录失败的账户、失败信息、进程信息、内网信息以及详细身份验证信息等。该日志在操作系统中保存在Security.evtx文件下。
❑应用程序日志
应用程序日志记录了应用程序的运行情况,包括运行出错及出错的原因。通过这些信息,可以进行对应的故障排查。该日志保存在Application.evtx文件中。
关于系统设备日志的分析,目前并没有一套通用的方法,大家可以借鉴Web日志的分析方法,但主要还是依靠熟能生巧,这类日志看得越多,分析起来就越熟练。在Linux系统下,可以结合特征分析法和访问频率分析法,快速定位关键信息;在Windows系统下,可以通过仔细查看事件查看器、有效利用特征过滤等方式快速发现异常信息。
图1.3.11 系统日志
【例题】tm1.evtx
【题目描述】 攻击者试图远程登录服务器,但尝试了一次后就被防火墙屏蔽IP,找出攻击者IP和端口。
【解题思路】 根据题目描述,我们要找只出现一次且登录失败的IP。如图1.3.12所示,单击“任务类别”,可以对其排序,重点关注“登录”事件。在该日志中有大量登录失败记录,事件ID为4625。在右侧“操作”栏中选择“筛选当前日志”,参数如图1.3.13所示,可过滤出31个事件,再单击“时间和日期”栏,按时间排序。单击任意事件,单击鼠标右键查看事件属性,在EventData中有LogonType字段,该字段为10表示远程登录,如图1.3.14所示。在逐个查看登录事件的过程中,可以发现192.168.105.242:58145以登录名kang多次尝试登录,不满足描述的内容。过滤出的最后两个事件均为远程登录失败,并且都只出现一次,将这两个事件对应的IP和端口提交,发现最后一个事件的IP和端口就是攻击者。
图1.3.12 只查看“登录”事件
图1.3.13 筛选当前日志
上述方法虽然能找到攻击者,但是无法区分过滤出的最后两个事件。另一种方法是把所有远程登录事件都过滤出来,过滤方法如图1.3.15所示,启动“手动编辑查询”,在<select>标签后输入“*[EventData[Data[@Name='logonType']='10']]”,即可过滤出所有远程登录事件,逐个查看事件属性,只有倒数第2个事件满足题目描述,所以得到flag{192.168.2.187:50118}。
图1.3.14 查看“远程登录”字段信息
图1.3.15 手动编辑查询