Web Digest

还有众多网络文摘,仅供个人收藏和参考

Archive for the ‘日志分析|Log Analysis’ Category

分析Apache日志常用命令

leave a comment »

分析Apache日志常用命令:
1,查看apache进程:
ps aux | grep httpd | grep -v grep | wc -l

2,查看80端口的tcp连接:
netstat -tan | grep “ESTABLISHED” | grep “:80” | wc -l

3,通过日志查看当天ip连接数,过滤重复:
cat access_log | grep “20/Oct/2008” | awk ‘{print $2}’ | sort | uniq -c | sort -nr

4, 当天ip连接数最高的ip都在干些什么(原来是蜘蛛):
cat access_log | grep “20/Oct/2008:00” | grep “122.102.7.212” | awk ‘{print $8}’ | sort | uniq -c | sort -nr | head -n 10

5,当天访问页面排前10的url:
cat access_log | grep “20/Oct/2008:00″ | awk ‘{print $8}’ | sort | uniq -c | sort -nr | head -n 10

6,用tcpdump嗅探80端口的访问看看谁最高
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F”.” ‘{print $1″.”$2″.”$3″.”$4}’ | sort | uniq -c | sort -nr
接着从日志里查看该ip在干嘛:
cat access_log | grep 122.102.7.212| awk ‘{print $1″\t”$8}’ | sort | uniq -c | sort -nr | less

7,查看某一时间段的 ip连接数:
grep “2006:0[7-8]” www20060723.log | awk ‘{print $2}’ | sort | uniq -c| sort -nr | wc -l

Written by admin

April 4, 2010 at 11:50 am

使用正则表达式高效分析日志文件

leave a comment »

日志的分析工作需要有完善的搜索技能作基础,那样你才能找出问题所在。
虽然有好几种开源或商业软件可以进行一度程序的日志分析,但是有一个工具是它们都用到的–正则表达式(regex)。从根本上来说正则表达式就是一串字符串,它使得几乎任何一种语言或 搜索工具都可以对大量的文本数据执行快速、高级的搜索操作。正则表达式现在有好几个变种,使用得最广泛的一种是Perl风格的正则表达式。.NET Framework,Python,Java,Javascript ,所采用的格式都属于Perl风格,当然Perl里用的也是。结合任何一种搜索工具或脚本语言使用这种正则表达式,你都可以从大量的数据里快速、高效地解析出有用信息。

Apache,或者说httpd的日志是我们检查得最频繁的,我们时不时就得看看日志里有没有出现什么问题。这些 Web日志里往往隐藏着许多重要信息。比如说攻击尝试、攻击成功的迹象,甚至还能发现攻击的征兆。

我们将重点介绍通过egrep工 具使用正则表达式。egrep提供了一种很简单的搜索文件的语法并且几乎在当前流行的所有操作系统上都可以用。( Windows用户可以 从各种 来源下载到它的免费版本)

另外,记住所有能在egrep下使用的正则表达式在其它程序或脚本语言里也一样能兼容。

在本文中,我们将用Apache日志进行示范。但是这种通过正则表达式、egrep处理httpd日志的方法可以在数百种其它的平台、工具以及日志类型 上借用。理解什么是危险以及如何找出危险对于发现你们的安全隐患是非常重要的。

第一步:了解日志格式

要编写针对这些日志格式的正则表达式,我们首先就得理解它的结构。Aapche会保留服务器访问记录之类的信息,通常是在/etc/httpd /logs目录下,日志文件一般以access_log这样的方式命名。

你可以配置Apache让它把日志记录发送到一个 syslog或SIM系统上去,如果是这样的话,你的日志格式可能与默认格式略有不同。Apache会按如下格式保存用回车符分隔开的日志条目。

10.10.10.10 – frank [10/Oct/2007:
13:55:36 -0700] “GET /apache_pb.gif
HTTP/1.0” 200 2326

让我们一点一点地分开看。第一个值,10.10.10.10就是客户端的IP地址,如果HostnameLookups启用了的话,接下来紧跟 的就是客户端的主机名。往下来是日期和时间戳,10/Oct/2007:11:55:36 -0700。这对于某些与时间相关的操作是至关重要的。

接下来,我们看到的是HTTP头信息。这个信息是非常重要,因为它让我们了解到用户发出的是哪种类型的请求。在本例中 “GET/apache_pb.gif HTTP/1.0 ”表示的是一个GET方式的请求,请求的目标是位于httpd服务器根目录下名为apache_pb.gif的这个图片文件。

最 后,服务器返回响应代码, 200 ,表示该请求已经成功处理了。余下的那一点信息则是服务器响应内容的长度。

第 二步:开始下手

理解了日志格式的各个部分之后,我们就可以开始着手检查日志里的可疑请求记录了。例如,那些请求WebMin这个Web管理工具的记录,还有请 求admin这样的管理界面的记录都是非常可疑的。

大多数情况下这些特征字串都是日志记录里的一部分。知道这一点后,我们就可以把 这些字串当作正则表达式用egrep处理。

>egrep –n webmin access_log

这很容易看懂:先是egrep命令,然后跟上它的配置参数,然后是搜索条件,最后是要进行搜索的那个文件的文件名。

加上 -n参数后,就能显示出匹配的行的行号,以方便后面我们引用它。上面这条命令执行后应该要显示出所有在请求的URL里包含有webmin的日志条目, 比如像下面这个样子:

57:10.10.10.10 – bob
[10/Oct/2007:20:24:18 -0700] “GET /
webmin HTTP/1.0” 404 726

结果显示在日志文件的第57行,有一条发生在10月10日下午8:44的请求记录,所请求的是Webmin目录。我们还看到服务器返回了一个 404错误,表示无法定位到该目录。这样做是很有必要的,因为那有应该有访问权限的用户肯定已经明确知道文件的具体路径(而不用请求整个目录)。如果不处 理好的话,Bob这样找着找着就能发现我们服务器的漏洞。

第3步:继续改进

有时候我们很想看看由Bob发出,并且服务器响应代码为200的那些请求。因为那表明它获取了所请求的资源。我们可以采用如下这条命令:

>egrep –n -i “bob|200” access_log

它返回的结果是出现了“Bob”或“200”的那些条目,不过这还并不能保证就一定由是Bob发出、并且响应为200的请求。它返回的结果还有 不少其实并不是我们想要的。如果我们把Bob和200同时作为搜索条件,搜索出来的结果就可以更准确一些。如果注意到Bob和200都是被空格分隔开了的 话,我们还可以更进一步地改进搜索条件。另外, 注意-i这个参数,它表示忽略大小写,因此Bob, bOb, boB, bob, 以及 BOB都可以匹配我们的搜索结果。

>egrep –n –i “\bbob\b. *200*” access_log

这条命令就可以把搜索条件设为“bob”和”200“同时出现的行。在bob两头的\b表示的是单词边界,或者说单词的开始和结束。200前的 那个*表示的是在bob和200之前有一些字符,200之后的那个*则表示允许200后面存在其它字符。这样的话,将返回如下结果:

57:10.10.10.10 – bob
[10/Oct/2007:20:24:18 -0700] “GET /
webmin HTTP/1.0” 404 726
59:10.10.10.10 – bob
[10/Oct/2007:20:24:59 -0700] “GET
/admin HTTP/1.0” 404 726
65:10.10.10.10 – bob
[10/Oct/2007:20:25:35 -0700] “GET /login
HTTP/1.0” 404 726

从上面的搜索结果里,你应该能看出来,Bob似乎在找什么东西。很可能是管理员登陆入口之类的,或者是入侵Web服务器的通道。另外,如果你注 意一下时间戳信息的话,你就会发现他在短短一分钟内发送了三次请求,这说明他要么打字超快,要么就是在用某种自动工具。而更可能的是后一种情况,这让我们 有了足够的理由进一步分析他的行为。

同时,注意Bob的请求返回结果全都是404 ”not found”信息。为什么会这样呢?我们要搜索的明明是返回代码为200的记录啊。这就是电脑没有人聪明的典型例子,在我们这个例子里,日期时间戳恰好包 含有200这个字串,于是它就被搜索出来了。使用正则表达式经常会造成误报,但是通过我们的简单查询,我们可以排除大部分误报。

下 面让我们进一步分析Bob的行为。

第4步:继续追踪

我们的最后手段就是找出Bob发送请求时的IP地址,以此跟踪它的行为。这要求我们必须在正则表达式里转义IP地址里的句号。转义的目的是告诉 正则表达式引擎,按字面意思解释这个字符,而不用考虑它的特殊意义。请看下面这条命令:

>egrep –n –i “10\.10\.10\.10” access_log

它让egrep找出日志文件里所有含10.10.10.10的条目。结果如下:

57:10.10.10.10 – bob
[10/Oct/2000:20:24:18 -0700] “GET /web
min HTTP/1.0” 404 726
59:10.10.10.10 – bob
[10/Oct/2000:20:24:59 -0700] “GET
/admin HTTP/1.0” 404 726
65:10.10.10.10 – bob
[10/Oct/2000:20:25:35 -0700] “GET /login
HTTP/1.0” 404 726
120:10.10.10.10 – [10/Oct/2000:21:14:11
-0700] “GET /index.html HTTP/1.0” 200
2571
157:10.10.10.10 – [10/Oct/2000:21:50:59
-0700] “GET /parent/directory HTTP/1.0”
404 726
260:10.10.10.10 – [10/Oct/2000:22:25:15
-0700] “GET /support.htm HTTP/1.0” 200
1056

由此可以看出,Bob明显是在四处试探我们的网站,但是还不一定有什么违法或越轨行为。不过,继续查看包含这一信息记录也是非常有必要的。

保持警惕

在进一步寻找更严重的攻击迹象时,我们不能只盯着请求频率和请求目标。比如说,在监视一个网络银行应用时,就一定要特别注意发送给 transfer的请求。例如,如果有人试图偷窥他人的转帐记录,那就会出现好多下面这种记录:

10.10.10.10 – [10/Oct/2000:x:x:x -0700]
“GET /banking/view/transfer.jsp?id=12345
HTTP/1.0” 200 1042
10.10.10.10 – [10/Oct/2000:x:x:x -0700]
“GET /banking/view/transfer.jsp?id=12346
HTTP/1.0” 500 798
10.10.10.10 – [10/Oct/2000:x:x:x -0700]
“GET /banking/view/transfer.jsp?id=12347
HTTP/1.0” 200 1042
10.10.10.10 – [10/Oct/2000:x:x:x -0700]
“GET /banking/view/transfer.jsp?id=12348
HTTP/1.0” 500 798

从这里我们可以看出来,有人发现了URL里的id有机可乘,并企图通过每次给id加1看到别的转帐记录。这样的大安全漏洞肯定是你在分析日志时 最希望斩获的。

Written by admin

April 4, 2010 at 11:01 am