数据收集
数据几乎是所有安全运维防御的命脉。
防御操作相关的数据
数据 | 数据描述 | 数据位置 |
---|---|---|
日志 | 系统历史活动和状态的详细信息,主要的日志文件包括 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 是一个用于提取文件中特定内容的命令。它逐行读取提供的输入文件,并根据指定的分隔符解析该行。
常见命令选项:
以文件 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
示例:
pwnki@LAPTOP-KETPO6R7:~/project$ file cutfile.txt
cutfile.txt: ASCII text
pwnki@LAPTOP-KETPO6R7:~/project$
head
head 命令显示文件的前几行或者前几个字节。默认情况下,head 显示前 10 行。
常见命令选项:
reg
reg 命令用于操作 Windows XP 及更高版本中的 Windows 注册表。
常见命令参数:
列出 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 环境中的系统日志。
常见命令参数:
常见命令选项:
列出所有可用的日志文件:
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/
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
- 脚本从简单的初始化开始,然后是一个 if 语句,该语句检查是否向脚本提供了参数。
- 该检查接收字符串(偏移量为 0 字节)开头的第一个参数($1)的子字符串,长度为 2 字节。如果参数是 -z ,我们将设置一个标志。脚本还执行了一个 shift 来略过该参数。如果有第二个参数的话,现在就是第一个了。如果有第三个参数的话,就变成第二个,以此类推。
- 如果用户想为日志指定一个位置,可以将其指定为脚本的参数。可选的 -z 参数已经被忽略过,所以用户提供的路径现在都将是第一个参数。如果命令行上没有提供值,大括号内的表达式将返回一个默认值,如负号右侧所示。
- mkdir 的 -p 选项将创建目录和任何中间目录。如果目录存在,它也不会给出错误消息。在下一行,我们调用 cd 使该目录成为当前目录,日志文件将保存在其中。如果 cd 出现故障,将带着错误代码退出程序。
- 我们调用 wevtutil el 来列出所有可能的日志文件名。这些日志文件名通过管道输出到一个 while 虚幻,该循环每次读取一行(一个日志文件名)。
- wevtutil 打印的每一行都以换行 “\n” 和回车 “\r” 字符结束。我们使用 % 运算符删除字符串最右侧的字符。为了指定(不可打印的)回车字符,我们使用 “$'string'” 结构将不可打印字符替某些反斜杠转义的字符。因此 \r 的两个字符被 ASCII 13 字符(回车字符)替换。
- 我们回显文件名,向用户展示当前进度和正在获取哪个日志文件。
- 创建日志文件的文件名中,我们对该文件名进行了两次编辑。首先,由于所提供的日志文件名可能有空格,所以我们用下划线替换空格。用于替换的语法是 “${VAR/old/new}” ,即在 VAR 中对应的字符串中用 new 替换 old 。在 “${VAR//old/new}” 中使用双斜杠是为了将 VAR 字符串中所有的 old 都替换成 new,而不是仅仅是第一个。
其次,一些 windows 日志文件名中有一个斜杠字符。然而,在 bash 中, “/” 是路径名中使用的目录之间的分隔符,它不应该在文件名中使用,所以我们使用字符 “-” 替换 “/”。 - 这是一个用双括号括起来的算数表达式。在这些表达式中, bash 在大多数变量名前面不需要加上 “$” 。对于位置参数,如 “$1” ,仍然需要它,以避免与整数 “1” 混淆。
- 在这里,我们使用 tar 将所有 .evtx 文件收集到一个归档文件中。
未完待续...
内容来源
《bash网络安全运维》
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。