转载---九维团队-青队(处置)| 中间件日志分析
2023-7-28 21:11 作者:酷帥王子 | 黑盒网络渗透测试 | 标签: 侵权请联系删除 转载自https://mp.weixin.qq.com/s/WxmZ4mDKHVafgv3K3QLMJQ
一、概要
当客户的网站遭受攻击需要溯源,或者中间件故障时,我们会通过查看中间件日志进行分析。本篇会从一些常见的中间件(IIS,Apache,Tomcat,Weblogic,Nginx )出发讲述如何进行分析。
二、基本知识
IIS
日志文件路径
选择“开始”菜单 → 管理工具(或 Windows 管理工具) → Internet 信息服务(IIS)管理器(或 Internet Information Services (IIS)管理器),打开 IIS 服务器窗口,依次展开要查看日志的网站。选择需要查看的网站,在管理项中有日志图标,双击图标。
|
IIS日志文件的格式是"ex+年份的末两位数字+月份+日期+.log"。如果是2022年10月1日的日志文件是ex221001.log。
当我们找到想要的日志文件后,将它们备份打包,再进行分析。
日志内容解析
IIS每条日志的格式由以下字段组成:
·
·
·
·
·
·
·
·
·
·
·
data(发出请求时的日期)time(发出请求时的时间)c-ip(客户端IP地址)cs-method(请求中使用的HTTP方法,如GET方法和POST方法)cs-uri-stem(URI资源, 记录作为操作目标的统一资源标识符,即访问的页面文件)s-port(服务器端口号)s-ip(服务器IP)cs(User-Agent)(用户代理,包括客户端浏览器、操作系统等情况)sc-status(HTTP状态代码)sc-bytes(服务器发送的字节数)cs-bytes(服务器接收的字节数)
*左右滑动查看更多
Apache
日志类型
成功日志:access_log/access.log错误日志:error_log/error.log如果使用SSL服务:ssl_access_log、ssl_error_log、ssl_request_log
*左右滑动查看更多
日志文件路径
访问配置文件查看以下字段:
·
·
·
ServerRoot"/etc/httpd" //Apache运行目录ErrorLog "logs/error_log"CustomLog logs/access_log combined //相对路径,如果按照ServerRoot"/etc/httpd"来看文件就在 /etc/httpd/logs/access_log
*左右滑动查看更多
日志内容解析
·
·
·
·
·
·
·
·
127.0.0.1 - - [08/Jun/2021:11:43:08 +0800] "GET /sqli-labs/index.html_files/freemind2html.css HTTP/1.1" 200 1335访问的主机IP用户邮箱(这里是空白 -)登录名(这里是空白 -)请求时间 []内的部分为请求事件,后面为时区请求 用""包裹,包含请求方式 资源路径 协议响应码 这里是200返回字节数
*左右滑动查看更多
Tomcat
日志文件路径
查看配置文件logging.properties,查看日志文件路径,路径会使用相对路径。
之后再查看配置文件bin/catalina.sh 找前面一段的绝对路径。
日志类型
catalina.out :我们在应用里使用System.out打印的内容都会输出到这个日志文件中。如果我们在应用里使用其他的日志框架,配置了向Console输出的,则也会在这里出现。
catalina.Y-M-D.log :是tomcat自己运行的一些日志。
localhost:一般都是程序异常,初始化异常,无法启动时查看这个日志。
manager:管理日志。
host-manager:虚拟主机方面的日志。
localhost_access_log.Y-M-D.txt:tomcat访问的日志,这部分是我们主要查看的日志。
日志内容解析
这个需要查看配置文件server.xml中对日志内容的格式:
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
%a - 远端访问的客户端IP%A - Server服务所在的服务器自身IP%b - 发送的字节数,不包含httpHeader 如果是0的话显示为 -%B - 发送的字节数,不包含httpHeader%h - 远端的客户端服务器名称(如果resolve host为false则即为IP)%H - 请求协议名称%l - 远端请求用来认证的用户名 (一直是 '-')%m - 请求方法 (GET, POST, 等.)%p - 接收请求的本地端口%q - 请求中的查询参数 (如果有的话,以?开头) (例如 /getIndex?id=3,其中'?id=3'就是)%r - 请求的第一行 (方法和请求地址)%s - 返回结果对应的http code%S - 用户的 session id%t - 日期和时间,使用普通Log形式展示%u - 远端访问的已认证的用户 (如果有的话), 没有的话显示 '-'%U - 请求的url路径%v - 本地服务所在服务器名称%D - 处理这个请求的时间, 毫秒表示%T - 处理这个请求的时间, 以秒表示%I - 当前请求的线程名称 (可以在调用栈中用来做比较和查询)
*左右滑动查看更多
Weblogic
日志类型
access log:该文件记录了在某个时间段,某个ip地址上的客户端访问了服务器上的哪个文件。这个日志文件也是我们需要的。
Server log :启动过程中和关闭过程中的日志,还包括部署在服务上面的应用,在运行过程中所产生的日志。
domain log:记录域配置相关信息以及Server运行情况。
日志文件路径
在后台中,可以去服务器概要中找到日志文件路径、名称。
日志文件内容
在后台中,HTTP访问日志的属性可在HTTP属性页中进行设置。
Nginx
日志类型
access.log:nginx的访问日志,这个也是我们进行日志分析需要的部分。
error.log:错误日志。
日志路径
access.log默认日志路径:
/var/log/nginx/access.log
也可以查看配置文件nginx.conf 中全局块的日志配置:
·
·
error_log log/error.logaccess_log logs/access.log
日志内容解析
Nginx默认的日志内容格式是这样的:
'$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'
192.168.100.175 - - [14/Jun/2022:20:18:59 +0800] "POST /mall_open_api.php?token=9f1063d6bf1ec1 HTTP/1.0" 300 1829 "-" "Dart/2.8 (dart:io)" "-" "mall-api.carisok.com" "0.556" "0.556" "0.000" "0.556"
其中:
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
$remote_addr变量:记录了客户端的IP地址(普通情况下)。192.168.100.175
$remote_user变量:当nginx开启了用户认证功能后,此变量记录了客户端使用了哪个用户进行了认证。没有 -
$time_local变量:记录了当前日志条目的时间。14/Jun/2022:20:18:59 +0800
$request变量:记录了当前http请求的方法、url和http协议版本。POST /mall_open_api.php?token=9f1063d6bf1ec1 HTTP/1.0
$status变量:记录了当前http请求的响应状态,即响应的状态码,比如200、404等响应码,都记录在此变量中。300
$body_bytes_sent变量:记录了nginx响应客户端请求时,发送到客户端的字节数,不包含响应头的大小。1829
$http_referer变量:记录了当前请求是从哪个页面过来的,比如你点了A页面中的超链接才产生了这个请求,那么此变量中就记录了A页面的url。-
$http_user_agent变量:记录了客户端的软件信息,比如,浏览器的名称和版本号。Dart/2.8 (dart:io)
增加变量:
'"$http_host" "$request_time" "$upstream_response_time" "$upstream_connect_time" "$upstream_header_time"';
$http_host 请求地址,即浏览器中你输入的地址(IP或域名) mall-api.carisok.com
$request_time:处理请求的总时间,包含了用户数据接收时间 0.556
$upstream_response_time:建立连接和从上游服务器接收响应主体的最后一个字节之间的时间 0.556
$upstream_connect_time:花费在与上游服务器建立连接上的时间 0.000
$upstream_header_time:建立连接和从上游服务器接收响应头的第一个字节之间的时间 0.556
*左右滑动查看更多
二、各案例的分析方法
篇幅原因,这里仅对案例一进行较为详细的说明,其他内容仅介绍思路。
案例一:SQL注入
攻击特征
- SQL注入的攻击特征首先在请求中存在SQL语句(要区分客户的业务是否是参数传值,有些客户的业务就是传sql语句的会导致误判)。
- SQL注入,攻击者肯定是希望获得服务器的敏感数据,短时间内访问次数高。
- 由于需要加入sql语句,有时需要绕过等方式,请求长度一定大于正常访问的长度。
分析思路
- 如果是客户业务为sql语句传输,我们需要查询的就是一些攻击者常用的关键词:
select * from '[LOGFILEPATH]' where text like "%XXX%"(此处XXX可以选择下方的这些关键字)
*左右滑动查看更多
该语句就是用于输出匹配以下关键字的日志:
·
·
·
·
·
·
·
·
·
·
·
database() //数据库名version() //版本号usr() //返回当前用户load_file() //读取计算机中的文件into outfile() //写入文件substring() //字符串截断hex() //返回字符串的16进制unhex() //把16进制格式的字符串转化为原来的格式information_schema //这是存放了当前数据库管理系统中所有数据库信息的一个数据库,mysql 5.0以上版本有information_schema.tables //此表存放了当前数据库管理系统下所有数据库的表information_schema.columns //存放了当前数据库管理系统中所有的列名
*左右滑动查看更多
- 统计访问整个IIS站点的IP top10,及访问次数。
SELECT top 10 c-ip,count(*) as cou FROM '[LOGFILEPATH]' GROUP BY c-ip order by cou desc (对访问IP进行top10的查询)
*左右滑动查看更多
- 对访问的请求进行筛选,将少于多少字节的请求认为是正常请求。
select * from '[LOGFILEPATH]' where cs-bytes > 1024 这里的意思是输出请求大于1024字节的日志这里的数字取决于网站正常访问的请求长度
*左右滑动查看更多
加固方案
1.使用预编译方法,该方式也是目前比较流行的方式。
2.站点防止SQL注入主要是要在查询字符串,数据以及Cookie、HTTP报头中防止一些特殊字符(单引号,分号)以及SQL语言(union等)的关键字,这类可以通过转义。
3.中间件本身自带的一些SQL注入相关的能力,例如php.ini配置文件中的 magic_quote_gpc (魔术字符) 就能做到一定的拦截SQL注入的能力。
4.使用其他的网站防火墙,例如IIS有IISUTM。
5.加入WAF产品。
案例二:恶意爬数据
- 这类流量会大于平常的流量,并且会出现某个IP访问次数极高的状况。
- 访问的请求内容中只会出现少量的差异,例如id数字遍历的情况。
分析思路
- 查询访问IP top10。
- 是否存在短时间内对同一个URI访问较多的情况。
- 对访问次数较多的IP的URL或者请求,进行对比。
案例三:Webshell
攻击特征
首先访问webshell文件的次数是非常少的,其次webshell文件的后缀名就几个特殊的尾缀(除非ini文件或者.htaccess为修改的)。
分析思路
- 访问Webshell的次数是少的,可以设定大于某个连接数的可以认为是正常的访问流量。
- 对于可以对于某些文件类型进行查询 : .asp、 .php、 .aspx、 .jsp、 phtml、,php3 等。
- 访问webshell的IP一定是少的,所以我们可以查询时找访问IP少的路径。
案例四:越权访问
攻击特征
- 越权访问大多是通过改变某些参数的值达到越权的效果。
- 攻击者的IP是固定的,但是理应不变的参数的值发生改变。
分析思路
我们可以对某个参数进行IP统计,IP比较平均的可以确认为正常IP,同个IP有多个参数的可以初步判定为越权访问(一个人可能有多个账号,但肯定不会太多)。
案例五:XSS
攻击特征
XSS的特点比较明确,一般就以下这些标签,前几个较多:
·
·
·
·
·
·
·
·
·
·
<script><img><input><details><svg><select><iframe><video><audio><body>
分析思路
只需要在url中或者请求中对以上这些敏感标签进行查询即可。
select * from '[LOGFILEPATH]' where text like "%XXX%"(此处XXX选择根据XSS特征的标签进行查询)
*左右滑动查看更多
案例六:漏洞扫描
攻击特征
- 攻击IP的访问次数较多。
- 漏扫结果一定是失败访问多。
分析思路
- 对访问IP进行访问次数 top10的查询。
- 对访问IP的失败响应码进行统计,失败较多的IP一般为扫描IP。
三、常用的分析工具
LogParser
IIS常用的日志分析工具为LogParser。该工具需要使用SQL语句查询。该工具是命令提示符方式的,后续有LogParser Studio工具,可以使用图形界面的方式。
下载链接:
·
·
https://www.microsoft.com/en-us/download/details.aspx?id=24659 LogParserhttps://gallery.technet.microsoft.com/office/Log-Parser-Studio-cd458765 LogParser Studio(同时需要下载LogParser)
*左右滑动查看更多
GoAccess
GoAccess可以快速分析和查看Apache Web服务器统计信息。
下载链接:
·
https://www.goaccess.cc/?mod=download
*左右滑动查看更多
常用的查询SQL语句
·
·
·
·
·
·
·
·
·
·
·
logparser.exe -i:IISW3C "SELECT c-ip, count(c-ip) FROM 'C://ex221025.log' GROUP BY c-ip" //统计访问整个IIS站点的IP,及访问次数。往往除了暴力破解、sql注入,恶意爬数据这类,均可以排除掉次数较多的IP
Select Top 20 LogRow as [Line Number],date as [Date],time as [Time],c-ip as [Client-IP],s-ip as [Server IP],s-port as [Server Port],cs-method as [Request Verb],cs-uri-stem as [Request URI],sc-bytes as [Bytes sent],sc-status as [Status],sc-substatus as [Sub-status],sc-win32-status as [Win 32 Status],time-taken as [Time Taken] From D:/Log/log_SQL/LogFiles/ex*.log Order by time-taken desc //找到运行最慢的20个页面
LogParser.exe -i:IISW3C "SELECT COUNT(*) AS Total FROM *.log WHERE DATE='2021-12-23' AND s-ip='xxx.xxx.xxx.xxx' " -o:datagrid//统计某个IP某天的的访问量
LogParser.exe -i:IISW3C "SELECT QUANTIZE(TO_LOCALTIME(TO_TIMESTAMP(date, time)), 60) AS Minute, COUNT(*) AS Total FROM *.log GROUP BY Minute ORDER BY Minute" -o:datagrid //每分钟访问量统计
*左右滑动查看更多
往期回顾
关于安恒信息安全服务团队安恒信息安全服务团队由九维安全能力专家构成,其职责分别为:红队持续突破、橙队擅于赋能、黄队致力建设、绿队跟踪改进、青队快速处置、蓝队实时防御,紫队不断优化、暗队专注情报和研究、白队运营管理,以体系化的安全人才及技术为客户赋能。
收录于合集 #九维技术团队
237个
上一篇网安图鉴 | 网安人常挂嘴边的特殊重大活动保障到底是个啥?
文章作者:酷帥王子
文章地址:https://www.2k8.org:443/post-473.html
版权所有 © 转载时必须以链接形式注明作者和原始出处!
发表评论: