linux检索日志文件技巧

发布时间 2023-12-08 16:42:37作者: zero_4046

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命令可以让你查看文件顶部的内容,默认显示前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"
[2023/10/25:15:46:21] 10.10.140.96 o15.officeredir.microsoft.com:443 CONNECT - 200 0 "-"

解释:使用空格作为分割符获取第三位的内容及域名和端口,再使用:作为分割符获取第一位内容及域名信息,接着使用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,使用grephead来检索与其建立的前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 --- 

解码数据就是恶意传输的敏感数据。