文本操作
TEXT MANIPULATION
在 Linux 系统中,我们处理的一切都是文件,并且绝大多数都是文本文件;举个例子,在 Linux 系统中,所有的配置文件都是文本文件。所以我们只需要打开文件,更改文件的内容,保存文件,再重新启动应用就可以更改应用配置。
由于存在大量文本文件,操作文本在 Linux 系统管理和 Linux 应用中显得尤为重要。在这一章节, 你可以通过一些命令和技巧,实现在 Linux 系统下操作文本。
为了方便演示,我将使用世界顶尖的网络入侵检测系统(NIDS)Snort 的文件,Snort 最早由 Marty Roesch 开发,现在属于 Cisco。NIDS 经常被用于检测黑客入侵,所以如果你想成为成功的黑客,你必须了解 NIDS 如何检测攻击和绕过检测的方法。
查看文件
如第 1 章所示,最基本的打印文本命令是cat,但是它有它的限制,使用cat命令打印位于/etc/snort 的 Snort 配置文件(snort.conf)(参见文本清单 2-1)
kali >cat /etc/snort/snort.conf
清单 2-1: 在终端中打印 snort.conf
现在你的屏幕上应该显示了整个 snort.conf 文件,但这并不是最方便或最实际的使用这个文件的方法。
# include $SO_RULE_PATH/exploit.rules
# include $SO_RULE_PATH/exploit.rules
# include $SO_RULE_PATH/exploit.rules
# include $SO_RULE_PATH/exploit.rules
# include $SO_RULE_PATH/exploit.rules
--snip--
# event thresholding or suppressions commands...
kali >
在接下来的两个小章节,我将向你展示head 和tail 命令。这是两种只显示部分文件内容的方法,用来更简单地查看关键点。
查看开头
如果你只是想查看文件开头,你可以使用head命令,这个命令默认打印文件的前 10 行。例如,下面这条命令会打印 snort.conf 的前 10 行。
kali >head /etc/snort/snort.conf
#----------------------------------------------
# VRT Rules Packages Snort.conf
#
# For more information visit us at:
--snip--
#Snort bugs:bugs\@snort.org
如果你想看多于或少于默认的 10 行,在head命令后和文件前输入连接符(-)和你想要的数量。例如,如果你想看文件的前 20 行,你需要输入如清单 2-2 上面的命令。
kali >head -20 /etc/snort/snort.conf
#--------------------------------------------
#VRT Rule Packages Snort.conf
#
#For more information visit us at:
#.
#.
#.
#Options : enablegre enablempls enabletargetbased
enableppm enableperfprofiling enablezlib enableact liveresponse enablenormalizer enablereload enablereact
清单 2-2: 在终端中打印 snort.conf 的前 20 行
你应该能在终端中看到 snort.conf 的前 20 行。
查看结尾
tail命令 和head命令相似。只是tail命令用于查看文件最后几行。使用tail查看 snort.conf:
kali >tail /etc/snort/snort.conf
#include $SO_RULE_PATH/smtp.rules
#include $SO_RULE_PATH/specific¬threats.rules
#include $SO_RULE_PATH/web¬activex.rules
#include $SO_RULE_PATH/web¬client.rules
#include $SO_RULE_PATH/web¬iis.rules
#include $SO_RULE_PATH/web¬miscp.rules
#Event thresholding and suppression commands. See threshold.conf
注意这个命令打印了最后的一些 include 行,但没有打印所有的 include 行。因为和 head 相似,tail 默认也是打印 10 行。你可以打印更多行如 snort.conf 最后 20 行。和使用 head 命令一样,你可以在 tail 命令和文件之间输入连接符(-)和你想要的行数。如以下清单 2-3
kali >tail -20 /etc/snort/snort.conf
#include $SO_RULE_PATH/chat.rules
#include $SO_RULE_PATH/chat.rules #include $SO_RULE_PATH/chat.rules
snip
#Event thresholding or suppression commands. See theshold.conf
清单 2¬3: 在终端中打印 snort.conf 的后 20 行
现在我们可以一次性看到几乎所有的 include 行。
标显行数
有时-尤其是处理非常长的文件的时候-我们可能希望打印文件行号。因为 snort.conf 超过 600 行,标上行号会有很大帮助,这样可以更容易地引用修改的位置并在以后返回到那个位置。
我们使用nl(number lines)命令打印行号。输入清单 2-4 里的命令。
kali >nl /etc/snort/snort.conf
612 #################################################################
613 #dynamic library rules
614 #include $SO_RULE_PATH/bad¬traffic.rules
615 #include $SO_RULE_PATH/chat.rules
snip
630 #include $SO_RULE_PATH/web¬iis.rules
631 #include $SO_RULE_PATH/web¬misc.rules
清单 2¬4: 在终端输出中显示行号
现在每一行都有一个数字(代表行号),引用起来更方便。
使用 GREP 过滤文本
命令grep 大概是使用最广泛的文本操作命令。它可以让你过滤打印出来的文件内容。例如,如果你想查看 snort.conf 文件里面所有带有 output 单词的行,你可以使用cat 然后要求只打印那些行。(参见清单 2-5)。
kali >cat /etc/snort/snort.conf | grep output
# 6) Con 图 output plugins
# Step #6: Con 图 output plugins
# output unified2: filename merged.log, limit 128, nostamp, mpls_event_types, vlan_event_types
output unified2: filename merged.log, limit 128, nostamp, mpls_event_types, vlan_event_types
# output alert_unified2: filename merged.log, limit 128, nostamp
# output log_unified2: filename merged.log, limit 128, nostamp
# output alert_syslog: LOG_AUTH LOG_ALERT
# output log_tcpdump: tcpdump.log
清单 2¬5: 打印被 grep 规定含有关键词或段落的行
这个命令或先查看 snort.conf 然后使用管道 (|) 将它传递给 grep, 它将会把文件作为输入,寻找出现单词 output 的行,然后只打印这些行。grep命令是使用 Linux 中的一个非常强大和必要的命令,因为它可以节约搜索文件中每一个词或命令的时间。
挑战: 使用 grep,nl,tail,and head
假设你想使用至少 4 个之前学过的命令打印 # Step #6: Con 图 output plugins 前面 5 行,你该怎么做?(提示:除了我们学过的命令,还有很多其他选择。你可以使用 Linux 内置命令 man 来学习更多命令。例如,man tail 会显示 tail 命令的帮助文档)。
有很多方法可以解决这个问题,我将向你展示通过更改那几行来实现其中一个方法,然后你需要寻找其他方法。
第一步
kali >nl/etc/snort.conf | grep output
34 # 6) Con 图 output plugins
512 # Step #6: Con 图 output plugins
518 # output unified2: filename merged.log, limit 128, nostamp, mpls_event_types, vlan_event_types
521 # output alert_unified2: filename snort.alert, limit 128, nostamp
522 # output log_unified2: filename snort.log, limit 128, nostamp
525 # output alert_syslog: LOG_AUTH LOG_ALERT
528 # output log_tcpdump: tcpdump.log
我们可以看到行 # Step #6: Con 图 output plugins 是第 512 行,然后我们知道我们想要第 512 行前面的 5 行和第 512 行本身 (就是第 507 到 512 行)。
第二步
kali >tail -n+507 /etc/snort/snort.conf | head -n 6
nested_ip inner, \
whitelist $WHITE_LIST_PATH/white_list.rules, \ blacklist $BLACK_LIST_PATH/black_list.rules
###################################################
# Step #6: Con 图 output plugins
在这里,我们使用tail使文本从第 507 行开始,再把文本输出到 head,然后我们返回文本开头的 6 行,从而获得 Step #6 那行前的 5 行和 Step #6 那行本身。
使用 SED 查找和替换
sed命令让你可以搜索出现的单词或字段然后在这些字段上做些什么。命令的名字是 stream editor(流编辑器)的缩写,因为它的概念和流编辑器是一致的。sed 最基本的形式就像 Windows 系统里的查找和替换功能。
使用grep在 snort.conf 里查找单词 mysql,像这样:
kali >cat /etc/snort/snort.conf | grep mysql
include $RULE_PATH/mysql.rules #include $RULE_PATH/server¬mysql.rules
你可以看到 grep 命令查找到 mysql 出现过两次。
假设你想要sed 将每一个出现的 mysql 替换成 MySQL(记住,Linux 大小写敏感)然后保存到文件 snort2.conf。你可以输入清单 2-6 中的命令 :
kali >sed s/mysql/MySQL/g /etc/snort/snort.conf > snort2.conf
清单 2¬6: 使用 sed 查找替换关键词或字段
s参数提供搜索,你先提供想要搜索的关键词 (mysql) 然后提供想要替换成的关键词 (MySQL), 用斜杠 (/)分开。g参数告诉 Linux 你希望全局替换,然后将结果保存到一个新文件 snort2.conf。
现在,当你使用grep查找 snort2.conf 中的 mysql,你将看到没有找到 mysql,但是当你搜索 MySQL 时,你将看到它出现了两次。
kali >cat snort2.conf | grep MySQL
#include $RULE_PATH/server¬MySQL.rules
如果你只想替换第一个出现的 mysql,你需要去掉末尾的 g 参数。
kali >sed s/mysql/MySQL/ snort.conf > snort2.conf
你也可以使用 sed 命令查找替换第一个出现字段以外的任意位置出现的字段。例如,如果你想只替换第二个出现的 mysql,只需要在命令末尾加上出现的次数(这里是 2)。
kali >sed s/mysql/MySQL/2 snort.conf > snort2.conf
这个命令值影响第二个出现的 mysql。
使用 MORE 和 LESS 查看文件
尽管cat是个打开文件和创建小文件的好工具,在打开大文件时它依然有它的限制。当你用 cat 打开 snort.conf,时,文件将一直被打印直到文件结束。如果你想要收集任何信息,这就变得很不实用。
为了打开大文件,我们有另外两个查看工具:more 和less。
使用 more 控制显示文件
more 命令一次只显示一页文件,并且让你可以使用ENTER 键翻页。这是man命令使用的工具,现在我们来使用它。使用more命令打开 snort.conf (参见清单 2-7) 。
kali >more /etc/snort/snort.conf
snip
# Snort build options:
# Options: enablegre enablempls enabletargetbased
enableppm enableperfprofiling enablezlib enableactive
response enablenormalizer enablereload enablereact
enableflexresp3 #
More(2%)
清单 2-7: 使用 more 命令在终端里一次显示一页
注意more 命令只显示一页然后就停止了,并且它会在左下角显示已经显示了多少内容(这里是 2%)。按ENTER键查看额外的行或页。按q键(quit)退出 more。
使用 less 显示和过滤文件
less命令和more命令非常相似,但是 less 有额外的功能,有句话叫 “Less is more。” 使用 less,你不但可以滚动查看一个文件,还可以过滤这个文件,清单 2-8,使用 less 打开 snort.conf :
kali >less /etc/snort/snort.conf
snip
# Snort build options:
# Options: enablegre enablempls enabletargetbased
enableppm enableperfprofiling enablezlib enableactive
response enablenormalizer enablereload enablereact
/etc/snort/snort.conf
清单 2-8: 使用 less 命令在终端里一次显示一页和过滤内容
注意less在屏幕左下角高亮了文件的路径。如果你按下斜杠键(/),less 会让你搜索文件里的字段。例如,当你开始设置 Snort 时,你需要先确定你想在何时向何处发送攻击警告输出。要想从配置文件中找到这一段,你只需要搜索 output,像这样:
# Snort build options:
# Options: enablegre enablempls enabletargetbased
enableppm enableperfprofiling enablezlib enableactive
response enablenormalizer enablereload enablereact
/output
这会立即将你带到第一个出现 output 的地方,并且高亮了 output。然后你可以按n键(next)到下一个出现 output 的地方。
# Step #6: Con 图 output plugins
# For more information, see Snort Manual, Configuring Snort - Output Modules
###################################################################
unified2
# Recommended for most installs
# output unified2: filename merged.log, limit 128, nostamp, mpls_event_types,
Vlan_event_types
output unified2: filename snort.log, limit 128, nostamp, mpls_event_types, vlan_event_types
# Additional configuration for specific types of installs
# output alert_unified2: filename snort.alert, limit 128, nostamp
# output log_unified2: filename snort.log, limit 128, nostamp
# syslog
# output alert_syslog: LOG_AUTH LOG_ALERT
:
如你所见,less 去掉了接下来出现的 output 并且高亮了所有搜到的字段。在这里, 它直接跳到 Snort 的输出段,真是方便啊!
总结
Linux 系统有许多操纵文本的方法,每种方法都有其优缺点。在本章中,我们已经接触了一些最有用的方法,但是我建议您尝试每一种方法,并建立您自己的感觉和偏好。例如,我认为grep是不可缺少的,并且我广泛的使用less,但是您可能会有不同的观点。