linux检索日志文件技巧
linux检索日志文件技巧
日志文件格式
[2023/10/25:16:17:14] 10.10.140.96 storage.live.com:443 GET / 400 630 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
Position位置 | 名称 | 示例 |
---|---|---|
1 | 时间戳 | [2023/10/25:16:17:14] |
2 | 源ip | 10.10.140.9 |
3 | 域名和端口 | storage.live.com:443 |
4 | 请求方法 | GET |
5 | HTTP URI | / |
6 | 状态码 | 400 |
7 | 响应大小 | 630 |
8 | 用户代理 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" |
命令
cat
查看文件命令
cat xxx.log
[2023/10/25:15:42:02] 10.10.120.75 sway.com:443 CONNECT - 200 0 "-"
[2023/10/25:15:42:02] 10.10.120.75 sway.com:443 GET / 301 492 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
--- REDACTED FOR BREVITY ---
您可能对代理日志的内容感到不知所措。这是因为 cat 命令会转储所有内容,并且仅在渲染完文件末尾后才停止。但别担心,我们将在以下部分中学习更多优化命令输出的技巧。
less
一次一页的查看文件的内容
less xxx.log
使用 less 打开文件后,按 Up/Down
按钮一次移动一行,按 Page Up (b)/Page Down (space)
按钮一次移动一页。然后,您可以通过按 q
按钮退出视图。
head
head命令可以让你查看文件顶部的内容,默认显示前10条内容,如果指定显示需要使用-n
选项和行数。
head -n 1 xxx.log
[2023/10/25:15:42:02] 10.10.120.75 sway.com:443 CONNECT - 200 0 "-"
tail
类似于head命令,只是它默认显示文件最后10条内容,如果指定显示需要使用-n
选项和行数。
tail -n 1 xxx.log
[2023/10/25:16:17:14] 10.10.140.96 storage.live.com:443 GET / 400 630 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
wc
wc 命令代表字数统计。它是一个命令行工具,可以计算文本文件中的行数、单词数和字符数。
对于日志文件,我们主要使用-l
命令查看行数
wc -l xxx.log
49881 xxx.log
nl
nl 命令代表数轴。它以编号行格式呈现文件的内容。
nl xxx.log
1 [2023/10/25:15:42:02] 10.10.120.75 sway.com:443 CONNECT - 200 0 "-"
2 [2023/10/25:15:42:02] 10.10.120.75 sway.com:443 GET / 301 492 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
3 [2023/10/25:15:42:02] 10.10.120.75 sway.office.com:443 CONNECT - 200 0 "-"
--- REDACTED FOR BREVITY ---
如果在 head 或 tail 命令之前使用该命令非常有用,因为行号可以用作修剪输出的参考。了解日志条目的行号可以管理呈现为输出的值。
cut
可用于分割文件内容,-d
(分割符),-f
(分割位置)
cut -d ' ' -f1 xxx.log
[2023/10/25:15:42:02]
[2023/10/25:15:42:02]
--- REDACTED FOR BREVITY ---
文件格式:[2023/10/25:16:17:14] 10.10.140.96 storage.live.com:443 GET / 400 630 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
使用空格作为分割的位置,取第一位
cut -d ' ' -f1,3,6 xxx.log
[2023/10/25:15:42:02] sway.com:443 200
[2023/10/25:15:42:02] sway.com:443 301
[2023/10/25:15:42:02] sway.office.com:443 200
--- REDACTED FOR BREVITY ---
使用空格作为分割的位置,取第一位,第三位,第六位。
假设要获取用户代理列,则空格分隔符将不起作用,因为它的值可能包含空格,就像示例日志中一样:
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
因此需要更改分隔符并选择第 2 列,因为用户代理用双引号引起来。
cut -d '"' -f2 access.log
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36
在上面的示例中,我们使用了第 2 列,因为第 1 列将提供第一次使用双引号 (") 之前的内容。
管道命令:|
在 Linux 或类 Unix 操作系统中,管道(或“|”字符)是连接两个或多个命令以使它们无缝协同工作的一种方式。它可以获取一个命令的输出并将其用作另一命令的输入。
grep:是 Linux 中的一个命令,用于在文件或输入流中搜索文本。
1.获取 10.10.140.96 建立的前五个连接。
grep 10.10.140.96 xxx.log | head -n 5
[2023/10/25:15:46:20] 10.10.140.96 flow.microsoft.com:443 CONNECT - 200 0 "-"
[2023/10/25:15:46:20] 10.10.140.96 flow.microsoft.com:443 GET / 307 488 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
[2023/10/25:15:46:20] 10.10.140.96 make.powerautomate.com:443 CONNECT - 200 0 "-"
[2023/10/25:15:46:20] 10.10.140.96 make.powerautomate.com:443 GET / 200 3870 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
[2023/10/25:15:46:21] 10.10.140.96 o15.officeredir.microsoft.com:443 CONNECT - 200 0 "-"
解释:在文件中查找源ip为10.10.140.96的内容,并显示前5个。
2.获取所有工作站访问的唯一域的列表。
为此,我们将 sort 和 uniq 命令与 cut 命令结合起来。
Sort: 是一个 Linux 命令,用于按升序或降序对文本文件或输入流的行进行排序。
uniq :命令允许您从排序的文件或输入流中过滤并显示唯一的行。
如
111111
222222
333333
使用uniq筛选
123
注意:uniq 命令需要排序列表才有效,因为它只比较相邻行。
cut -d ' ' -f3 xxx.log | cut -d ':' -f1 | sort | uniq
account.activedirectory.windowsazure.com
activity.windows.com
admin.microsoft.com
--- REDACTED FOR BREVITY ---
文件格式:[2023/10/25:15:46:20] 10.10.140.96 make.powerautomate.com:443 GET / 200 3870 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
解释:使用空格
作为分割符获取第三位的内容及域名和端口,再使用:作为分割符获取第一位内容及域名信息,接着使用sort
排序,并用uniq
进行筛选。
cut -d ' ' -f3 access.log | cut -d ':' -f1 | sort | uniq -c | sort -n
78 partnerservices.getmicrosoftkey.com
113 malicious.com
118 ocsp.digicert.com
123 officeclient.microsoft.com
--- REDACTED FOR BREVITY ---
cut -d ' ' -f3 access.log | cut -d ':' -f1 | sort | uniq -c | sort -r
4992 www.office.com
4695 login.microsoftonline.com
860 www.globalsign.com
1581 malicious.com
1554 learn.microsoft.com
--- REDACTED FOR BREVITY ---
解释:添加uniq -c
可对筛选的域名进行计数,snort -n
再次排序(顺序), snort -r
降序显示。(snort -nr
合并使用依然为降序)
案例
寻找可疑流量
cut -d ' ' -f3 access.log | cut -d ':' -f1 | sort | uniq -c | sort -n | tail -n 10
606 docs.microsoft.com
622 smtp.office365.com
680 admin.microsoft.com
850 c.bing.com
878 outlook.office365.com
1554 learn.microsoft.com
1581 malicious.com
1860 www.globalsign.com
4695 login.microsoftonline.com
4992 www.office.com
解释:通过空格
分割,获取第三位;再通过:
分割,获取域名信息;进行排序,使用uniq
进行筛选,并使用-c
参数统计数量;使用snort -n
参数按照顺序排列,最后使用tail -n 10
显示最后10行数据,及统计数量最高的域名。
可以发现大部分都是 Microsoft的域,其中有一个不太正常为malicious.com,使用grep
和head
来检索与其建立的前10个连接。
grep malicious.com access.log | head -n 5
[2023/10/25:15:56:29] REDACTED_IP malicious.com:80 GET /storage.php?goodies=aWQscmVjaXBpZW50LGdp 200 362 "Go-http-client/1.1"
[2023/10/25:15:56:29] REDACTED_IP malicious.com:80 GET /storage.php?goodies=ZnQKZGRiZTlmMDI1OGE4 200 362 "Go-http-client/1.1"
[2023/10/25:15:56:29] REDACTED_IP malicious.com:80 GET /storage.php?goodies=MDRjOGExNWNmNTI0ZTMy 200 362 "Go-http-client/1.1"
[2023/10/25:15:56:30] REDACTED_IP malicious.com:80 GET /storage.php?goodies=ZTE3ODUsTm9haCxQbGF5 200 362 "Go-http-client/1.1"
[2023/10/25:15:56:30] REDACTED_IP malicious.com:80 GET /storage.php?goodies=IENhc2ggUmVnaXN0ZXIK 200 362 "Go-http-client/1.1"
检查请求列表,发现goodies
参数的字符串存在异常情况。尝试通过使用等号 (=)
作为分隔符来剪切请求 URI 来检索数据。
grep malicious.com access.log | cut -d ' ' -f5 | cut -d '=' -f2
aWQscmVjaXBpZW50LGdp
ZnQKZGRiZTlmMDI1OGE4
MDRjOGExNWNmNTI0ZTMy
ZTE3ODUsTm9haCxQbGF5
--- REDACTED FOR BREVITY ---
从格式来看,发送的数据似乎是用 Base64 编码的。使用这个理论,我们可以尝试通过将输出传输到 base64 命令来解码字符串。
grep malicious.com access.log | cut -d ' ' -f5 | cut -d '=' -f2 | base64 -d
id,recipient,gift
ddbe9f0258a804c8a15cf524e32e1785,Noah,Play Cash Register
cb597d69d83f24c75b2a2d7298705ed7,William,Toy Pirate Hat
4824fb68fe63146aabc3587f8e12fb90,Charlotte,Play-Doh Bakery Set
f619a90e1fdedc23e515c7d6804a0811,Benjamin,Soccer Ball
ce6b67dee0f69a384076e74b922cd46b,Isabella,DIY Jewelry Kit
939481085d8ac019f79d5bd7307ab008,Lucas,Building Construction Blocks
f706a56dd55c1f2d1d24fbebf3990905,Amelia,Play-Doh Kitchen
2e43ccd9aa080cbc807f30938e244091,Ava,Toy Pirate Map
--- REDACTED FOR BREVITY ---
解码数据就是恶意传输的敏感数据。