微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

《bash 网络安全运维》 第五章

数据收集

数据几乎是所有安全运维防御的命脉。
防御操作相关的数据

数据 数据描述 数据位置
日志 系统历史活动和状态的详细信息,主要的日志文件包括 Web 和 DNS 服务器日志、路由器、防火墙、入侵检测系统日志和应用程序日志 在 Linux 中,大多数日志文件位于 /var/log 目录中。在 Windows 系统中,日志可以在事件日志中找到。
命令历史记录 最近执行的命令列表 在 Linux 中,可以通过执行 echo $HISTFILE 找到历史文件的位置。该文件通常位于用户的主目录 .bash_history 中。
临时文件 最近访问、保存和处理的各种用户和系统文件 在 Windows 中,可以在 c:\windows\temp 和 %USERPROFILE%\AppData\Local 中找到临时文件。在 Linux 中,临时文件通常位于 /tmp 和 /var/tmp 中,还可以使用 echo $TMPDIR 命令找到 Linux 临时目录。
用户数据 文档、图片和其他用户创建的文件 在 Linux 系统中用户文件通常位于 /home/,Windows 系统位于 c:\Users\
浏览器历史记录 Windows 注册 用户最近访问的网页,分层式数据库,存储对 Windows 系统和应用程序的操作至关重要的设置和其他数据 根据操作系统和浏览器的不同,差异很大。windows 注册表。

命令

cut

cut 是一个用于提取文件中特定内容的命令。它逐行读取提供的输入文件,并根据指定的分隔符解析该行。
常见命令选项:

  1. -c:指定要提取的字符。
  2. -d:指定用作分隔符的字符。认情况下,分隔符是制表符。
  3. -f:指定要提取的字段

文件 cutfile.txt 为例。

12/05/2017 192.168.10.14 test.html
12/30/2017 192.168.10.185 login.html

运行命令:

pwnki@LAPTOP-KETPO6R7:~/project$ cut -d ' ' -f2 cutfile.txt
192.168.10.14
192.168.10.185
pwnki@LAPTOP-KETPO6R7:~/project$

注:cut 命令把每个分隔符看作分隔了一个字段。

file

file 命令用于识别给定文件文件类型。
常见命令选项:

  1. -f:从一个给定的文件中读取需要分析的文件列表。
  2. -k:不要在第一个匹配处就停止,要列出文件类型的所有匹配。
  3. -z:检测压缩文件

示例:

pwnki@LAPTOP-KETPO6R7:~/project$ file cutfile.txt
cutfile.txt: ASCII text
pwnki@LAPTOP-KETPO6R7:~/project$

head 命令显示文件的前几行或者前几个字节。认情况下,head 显示前 10 行。

常见命令选项:

  1. -n:指定要输出的行数。
  2. -c:指定要输出的字节数。

reg

reg 命令用于操作 Windows XP 及更高版本中的 Windows 注册表。

常见命令参数:

  1. add:向注册表中添加条目。
  2. export:将指定的注册表条目复制到文件中。
  3. query:返回指定路径下的子健列表。

列出 HKEY_LOCAL_MACHINE 中的所有根建:

C:\Users\86189>reg query HKEY_LOCAL_MACHINE

HKEY_LOCAL_MACHINE\BCD00000000
HKEY_LOCAL_MACHINE\HARDWARE
HKEY_LOCAL_MACHINE\SAM
HKEY_LOCAL_MACHINE\Security
HKEY_LOCAL_MACHINE\SOFTWARE
HKEY_LOCAL_MACHINE\SYstem

C:\Users\86189>

wevtutil

wevtutil 用于查看和管理 Windows 环境中的系统日志。
常见命令参数:

  1. -el:列举可用的日志文件
  2. -qe:查询日志文件中的事件

常见命令选项:

  1. /c:指定要读取的事件的最大数量
  2. /f:将输出格式化为文本或 XML 。
  3. /rd:读取方向——如果设置为 true,它将首先读取最近的日志。

列出所有可用的日志文件

C:\Users\86189>wevtutil el
AMSI/Debug
AirspaceChannel
Analytic
Application
DirectShowFiltergraph
DirectShowPluginControl
Els_Hyphenation/Analytic
EndpointMapper
FirstUXPerf-Analytic
ForwardedEvents
General Logging
……

查看系统日志中的最新文件

C:\Users\86189>wevtutil qe System /c:1 /rd:true
<Event xmlns='http://schemas.microsoft.com/win/2004/08/events/event'><System><Provider Name='Service Control Manager' Guid='{555908d1-a6d7-4695-8e1e-26931d2012f4}' EventSourceName='Service Control Manager'/><EventID Qualifiers='16384'>7040</EventID><Version>0</Version><Level>4</Level><Task>0</Task><Opcode>0</Opcode><Keywords>0x8080000000000000</Keywords><TimeCreated SystemTime='2021-01-13T11:15:03.4012990Z'/><EventRecordID>9285</EventRecordID><Correlation/><Execution ProcessID='980' ThreadID='6876'/><Channel>System</Channel><Computer>LAPTOP-KETPO6R7</Computer><Security UserID='S-1-5-18'/></System><EventData><Data Name='param1'>Background Intelligent Transfer Service</Data><Data Name='param2'>按需启动</Data><Data Name='param3'>自动启动</Data><Data Name='param4'>BITS</Data></EventData></Event>

C:\Users\86189>

收集系统信息

使用 SSH 远程执行指令

你想要的数据可能并不是总是在本地可用。你可能需要连接到远程系统,如 Web、FTP 或 SSH 服务器,以获得所需的数据。
在远程系统上运行命令并将输出重定向到本地系统上的文件

ssh myserver ps > /tmp/ps.out

在远程系统上运行命令并将输出重定向到远程系统上的文件

ssh myserver ps \> /tmp/ps.out

也可以使用驻留在本地系统中的脚本,并使用 SSH 在远程系统上运行它们:

ssh myserver bash < ./osdetect.sh

收集 Linux 日志文件

Linux 系统的日志文件通常存储在 /var/log/ 目录中。
使用 tar 命令可以将日志文件收集到单个文件中:

tar -czf ${HOSTNAME}_logs.tar.gz /var/log/
  1. -c:用于创建存档文件
  2. -z:用于压缩文件
  3. -f:用于指定输出文件

Linux 日志文件
|日志位置|描述|
|/var/log/apache2/|Apache Web 服务器的访问和错误日志|
|/var/log/auth/log|关于用户登录、授权访问和远程身份验证的信息|
|/var/log/kern.log|内核日志|
|/var/log/messages|通用非关键系统信息|
|/var/log/syslog|通用系统日志|

注:要查找给定系统的日志文件存储位置的更多信息,可以查看 /etc/syslog.conf 或 /etc/rsyslog.conf

收集 Windows 日志文件

winlogs.sh 脚本使用 wevtutil el 参数列出所有可能的日志,然后使用 epl 参数将每个日志导出到一个文件

#!/bin/sh -
#
# cybersecurity Ops with bash
# winlogs.sh
#
# Description:
# Gather copies of Windows log files
#
# Usage:
# winlogs.sh [-z]
#   -z Tar and zip the output

TGZ=0
if (( $# > 0 ))                                      #<1>
then
    if [[ ${1:0:2} == '-z' ]]                        #<2>
    then
        TGZ=1 # tgz flag to tar/zip the log files
        shift
    fi
fi
SYSNAM=$(hostname)
LOGDIR=${1:-/tmp/${SYSNAM}_logs}                     #<3>
mkdir -p $LOGDIR                                     #<4>
cd ${LOGDIR} || exit -2

wevtutil el | while read ALOG                        #<5>
do 
    ALOG="${ALOG%$'\r'}"                             #<6>
    echo "${ALOG}:"                                  #<7>
    SAFNAM="${ALOG// /_}"                            #<8>
    SAFNAM="${SAFNAM//\//-}"                         
    wevtutil epl "$ALOG" "${SYSNAM}_${SAFNAM}.evtx"
done

if (( TGZ == 1 ))                                    #<9>
then
    tar -czvf ${SYSNAM}_logs.tgz *.evtx              #<10>
fi
  1. 脚本从简单的初始化开始,然后是一个 if 语句,该语句检查是否向脚本提供了参数。
  2. 该检查接收字符串(偏移量为 0 字节)开头的第一个参数($1)的子字符串,长度为 2 字节。如果参数是 -z ,我们将设置一个标志。脚本还执行了一个 shift 来略过该参数。如果有第二个参数的话,现在就是第一个了。如果有第三个参数的话,就变成第二个,以此类推。
  3. 如果用户想为日志指定一个位置,可以将其指定为脚本的参数。可选的 -z 参数已经被忽略过,所以用户提供的路径现在都将是第一个参数。如果命令行上没有提供值,大括号内的表达式将返回一个认值,如负号右侧所示。
  4. mkdir 的 -p 选项将创建目录和任何中间目录。如果目录存在,它也不会给出错误消息。在下一行,我们调用 cd 使该目录成为当前目录,日志文件将保存在其中。如果 cd 出现故障,将带着错误代码退出程序。
  5. 我们调用 wevtutil el 来列出所有可能的日志文件名。这些日志文件名通过管道输出一个 while 虚幻,该循环每次读取一行(一个日志文件名)。
  6. wevtutil 打印的每一行都以换行 “\n” 和回车 “\r” 字符结束。我们使用 % 运算符删除字符串最右侧的字符。为了指定(不可打印的)回车字符,我们使用 “$'string'” 结构将不可打印字符替某些反斜杠转义的字符。因此 \r 的两个字符被 ASCII 13 字符(回车字符)替换。
  7. 我们回显文件名,向用户展示当前进度和正在获取哪个日志文件
  8. 创建日志文件文件名中,我们对该文件名进行了两次编辑。首先,由于所提供的日志文件名可能有空格,所以我们用下划线替换空格。用于替换的语法是 “${VAR/old/new}” ,即在 VAR 中对应的字符串中用 new 替换 old 。在 “${VAR//old/new}” 中使用双斜杠是为了将 VAR 字符串中所有的 old 都替换成 new,而不是仅仅是第一个
    其次,一些 windows 日志文件名中有一个斜杠字符。然而,在 bash 中, “/” 是路径名中使用的目录之间的分隔符,它不应该在文件名中使用,所以我们使用字符 “-” 替换 “/”。
  9. 这是一个用双括号括起来的算数表达式。在这些表达式中, bash 在大多数变量名前面不需要加上 “$” 。对于位置参数,如 “$1” ,仍然需要它,以避免与整数 “1” 混淆。
  10. 在这里,我们使用 tar 将所有 .evtx 文件收集到一个归档文件中。

未完待续...

内容来源

《bash网络安全运维》

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐