《打击与网络安全:Linux命令行中的攻击,防御和分析》一书

图片您好,habrozhiteli!命令行可以是网络安全的理想工具。如果您具有适当的经验,那么令人难以置信的灵活性和绝对可用性将标准命令行界面(CLI)变为基本解决方案。

Paul Tronkon和Karl Albing的作者讨论了命令行工具和技巧,这些工具和技巧可帮助您通过主动保护来收集数据,分析日志并监视网络运行状况。渗透测试人员将学习如何使用几乎所有版本的Linux内置的强大功能进行攻击。


这本书是给谁的?


《打击与网络安全》一书是为那些想要学习如何在计算机安全性背景下使用命令行的人准备的。我们的目标不是用命令行脚本替换现有工具,而是教您如何有效地使用命令行来改善现有功能。

在整本书中,我们提供了一些安全方法的示例,例如数据收集,分析和渗透测试。这些示例的目的是演示命令行功能,并向您介绍高级工具中使用的一些基本方法。

尽管第一部分介绍了一些常规概念,但本书并非编程入门。

实时日志监控


事件发生后分析杂志的能力是一项重要技能。但是,同样重要的是,能够实时从日志文件中提取信息,以便在恶意或可疑行为发生时对其进行检测。在本章中,我们将研究读取日记条目的方法,这些日记条目的创建和格式设置为显示分析,并基于系统或网络的已知威胁指标(危害指标)生成警报。

文字记录监控


实时监视日志的最简单方法是使用带–f参数的tail命令-它会连续读取文件,并在添加新行时将其显示在stdout中。与前面的章节一样,例如,我们将使用Apache Web服务器访问日志,但是所描述的方法与任何文本日志都相关。要使用tail命令跟踪Apache访问日志,请输入以下内容:

tail -f /var/logs/apache2/access.log

tail命令的输出可以传递到grep命令,因此将仅显示符合特定条件的记录。以下示例跟踪Apache访问日志并显示与特定IP地址相对应的条目:

tail -f /var/logs/apache2/access.log | grep '10.0.0.152'

您也可以使用正则表达式。在此示例中,将仅显示返回HTTP 404状态代码“找不到页面”的记录。添加了-i选项以忽略字符的情况:

tail -f /var/logs/apache2/access.log | egrep -i 'HTTP/.*" 404'

要清除无关的信息,应将输出传递给cut命令。本示例监视访问日志以查找导致状态码404的查询,然后使用cut方法仅显示日期/时间和所请求的页面: 接下来,要删除方括号和双引号,可以将输出定向到tr -d' []“'。

$ tail -f access.log | egrep --line-buffered 'HTTP/.*" 404' | cut -d' ' -f4-7
[29/Jul/2018:13:10:05 -0400] "GET /test
[29/Jul/2018:13:16:17 -0400] "GET /test.txt
[29/Jul/2018:13:17:37 -0400] "GET /favicon.ico




注意:此处使用egrep命令的--line-buffering选项。每次换行时,这都会迫使egrep打印到stdout。如果没有此参数,将发生缓冲,并且直到缓冲区已满,才将输出发送到cut命令。我们不想等待那么久。此选项允许egrep命令在找到每一行时将其写入。

命令

缓冲区在缓冲期间会发生什么?想象一下,egrep找到很多与指定模式匹配的字符串。在这种情况下,egrep将有很多输出。但是输出(实际上是任何输入或输出)比数据处理(文本搜索)要昂贵得多(花费更多时间)。因此,I / O调用越少,程序的效率就越高。

grep , , . . grep . , grep 50 . , 50 , , . 50 !

egrep, , . egrep , , . , , , , . , .

, , tail -f ( ), . , « », . . .

, egrep , . , .


您可以使用tail和egrep命令来监视日志并显示与已知的可疑或恶意活动模式(通常称为IOC)相对应的任何条目。您可以创建一个简单的入侵检测系统(IDS)。首先,创建一个包含IOC正则表达式模式的文件,如示例8.1所示。

示例8.1 ioc.txt (1)此模板(../)表示回旋目录攻击:攻击者试图退出当前工作目录并获取他无法访问的文件。(2) Linux etc / passwd和etc / shadow文件用于系统身份验证,并且绝对不能通过Web服务器进行访问。(3)

\.\./ (1)
etc/passwd (2)
etc/shadow
cmd\.exe (3)
/bin/sh
/bin/bash





提供cmd.exe,/ bin / sh或/ bin / bash文件表示Web服务器返回的反向连接。反向连接通常表示操作成功。

请注意,IOC必须采用正则表达式格式,因为稍后它们会被egrep命令使用。

ioc.txt文件可以与egrep -f选项一起使用。此参数告诉egrep从指定文件中搜索正则表达式模式。这使您可以使用tail命令监视日志文件,并在添加每条记录时,会将读取的行与IOC文件中的所有模板进行比较,显示任何对应的记录。这是一个例子:

tail -f /var/logs/apache2/access.log | egrep -i -f ioc.txt

另外,可以使用tee命令在屏幕上同时显示警告,并将警告保存以供以后在其自己的文件中处理: 同样,需要--line-buffered选项以确保不会由于缓冲命令输出而引起问题。

tail -f /var/logs/apache2/access.log | egrep --line-buffered -i -f ioc.txt |
tee -a interesting.txt




Windows日志监控


如前所述,您必须使用wevtutil命令访问Windows事件。尽管此命令是通用的,但它没有诸如tail之类的功能,该功能可用于检索新的传入记录。但是有一种解决方法-使用可以提供相同功能的简单bash脚本(示例8.2)。

示例8.2 wintail.sh

#!/bin/bash -
#
# Bash  
# wintail.sh
#
# :
#    tail   Windows
#
# : ./wintail.sh
#

WINLOG="Application" (1)

LASTLOG=$(wevtutil qe "$WINLOG" //c:1 //rd:true //f:text) (2)

while true
do
      CURRENTLOG=$(wevtutil qe "$WINLOG" //c:1 //rd:true //f:text) (3)
      if [[ "$CURRENTLOG" != "$LASTLOG" ]]
      then
            echo "$CURRENTLOG"
            echo "----------------------------------"
            LASTLOG="$CURRENTLOG"
      fi
done

(1)此变量定义要跟踪的Windows日志。有关系统上当前可用日志的列表,可以使用wevtutil el命令。

(2)在这里,执行wevtutil以请求指定的日志文件。 c:1参数仅返回一个日志条目。 rd:true参数允许命令读取最新的日志条目。最后,f:text以纯文本而不是XML格式返回结果,这使得从屏幕上读取结果变得容易。

(3)接下来的几行再次运行wevtutil命令,并将新接收到的日志条目与屏幕上显示的最后一个日志条目进行比较。如果它们彼此不同,则意味着日志中已有更改。在这种情况下,将显示一个新条目。如果要比较的记录相同,则什么也不会发生,并且wevtutil命令返回并开始再次搜索和比较。

实时直方图创建


tail -f命令提供当前数据流。但是,如果您要计算在一定时间内添加到文件的行数,该怎么办?您可以观察此数据流,启动计时器并在指定的时间段内执行计数;然后应停止计数并报告结果。

这项工作可以分为两个脚本过程:一个脚本将读取行,另一个脚本将观看时间。计时器使用称为信号的标准POSIX进程间通信机制通知线路计数器。信号是软件中断,并且存在各种信号。其中一些是致命的-它们导致流程结束(例如,浮点运算中的异常)。这些信号大多数都可以忽略或捕获。捕获信号时采取措施。这些信号中的许多信号在操作系统中都有预定的用途。我们将使用用户可用的两个信号之一。这是信号SIGUSR1(另一个是SIGUSR2)。

Shell脚本可以使用内置的trap命令捕获中断。在它的帮助下,您可以选择一个命令,该命令确定接收到信号后要执行的操作,以及触发该命令调用的信号列表。例如:

trap warnmsg SIGINT

每当外壳程序脚本收到SIGINT信号(例如,按Ctrl + C中断正在运行的进程)时,这都会导致调用warnmsg命令(我们自己的脚本或函数)。

例8.3显示了执行计数的脚本。

示例8.3 looper.sh

#!/bin/bash -
#
# Bash  
# looper.sh
#
# :
#    
#
# : ./looper.sh [filename]
# filename —  ,   ,
#  : log.file
#

function interval ()                                           (1)
{
      echo $(date '+%y%m%d %H%M%S') $cnt                       (2)
      cnt=0
}

declare -i cnt=0
trap interval SIGUSR1                                          (3)

shopt -s lastpipe                                              (4)

tail -f --pid=$$ ${1:-log.file} | while read aline             (5)
do
     let cnt++
done

(1)间隔函数将在收到每个信号时被调用。当然,必须先定义间隔,然后才能命名并在表达式中使用trap。

(2)调用date命令可为我们正在打印的cnt变量的值提供时间戳。显示计数器后,我们将此值重置为0,以开始下一个间隔的倒计时。

(3)现在定义了时间间隔,我们可以表明只要我们的进程接收到信号SIGUSR1就会调用该函数。

(4)这是非常重要的一步。通常,当存在命令管道(例如ls-l | grep rwx | wc)时,部分管道(每个命令)在子网中执行,并且每个进程以其自己的进程标识符结尾。对于这种情况,这可能是一个问题,因为while循环将位于具有不同进程标识符的子外壳中。无论启动什么进程,looper.sh脚本都不知道while循环进程的标识符来向其发送信号。此外,在子外壳中更改cnt变量的值不会更改主进程中的cnt值,因此主进程的信号每次都会将该值设置为0。您可以使用shopt命令解决此问题,该命令将(-s)参数设置为lastpipe。它告诉外壳程序不要为管道中的最后一个命令创建子外壳程序,并以与脚本本身相同的过程运行此命令。在我们的例子中,这意味着tail命令将在子shell中(即在另一个进程中)执行,而while循环将成为主脚本进程的一部分。注意:此shell选项仅在bash 4.x及更高版本中可用,并且仅适用于非交互式shell(即脚本)。

(5)这是带有另一个--pid参数的tail -f命令。我们指示该进程的标识符,该标识符在完成该进程后将终止tail命令。我们指定要查看的当前shell脚本$$的进程ID。此操作使您可以清理进程,而不必在后台执行tail命令(例如,如果此脚本在后台运行;示例8.4)。

tailcount.sh脚本使用秒表(计时器)启动和停止脚本,并计算时间间隔。

示例8.4 tailcount.sh

#!/bin/bash -
#
# Bash  
# tailcount.sh
#
# :
#    n 
#
# : ./tailcount.sh [filename]
#     filename:  looper.sh
#

#  —    
function cleanup ()
{
      [[ -n $LOPID ]] && kill $LOPID          (1)
}

trap cleanup EXIT                             (2)
bash looper.sh $1 &                           (3)
LOPID=$!                                      (4)
#   
sleep 3

while true
do
      kill -SIGUSR1 $LOPID
      sleep 5
done >&2                                      (5)

(1)由于此脚本将运行其他脚本,因此应在工作后清除。如果进程标识符存储在LOPID中,则变量将存储该值,因此该函数将使用kill命令向该进程发送信号。如果您在kill命令中未指定特定信号,则默认情况下将发送SIGTERM信号。

(2) EXIT命令不是信号。如果执行该脚本的外壳要关闭时,trap语句告诉外壳程序调用此函数(在这种情况下为清理),则这是一种特殊情况。

(3)现在真正的工作开始了。将启动looper.sh脚本,该脚本将在后台运行:要使该脚本在整个周期中都能正常工作(无需等待命令完成工作),请与键盘断开连接。

(4)这里,存储了我们刚刚在后台启动的脚本过程的标识符。

(5)此重定向只是预防措施。来自while循环或kill / sleep语句(尽管我们不希望它们)的所有输出都不应与looper.sh函数的任何输出混合,该函数虽然在后台工作,但仍将其发送到stdout。因此,我们将数据从stdout重定向到stderr。

总而言之,我们看到尽管looper.sh函数位于后台,但其进程标识符存储在shell变量中。每五秒钟,tailcount.sh脚本会向该进程发送一个信号SIGUSR1(在looper.sh函数中执行),该信号又调用looper.sh脚本以打印其中固定的当前行数并重新开始计数。退出后,通过向looper.sh函数发送SIGTERM信号以中断它,将清除tailcount.sh脚本。

借助两个脚本-一个执行行计数的脚本和一个带有秒表(计时器)的脚本来控制第一个脚本-您可以获取输出(一定时间段内的行数),下一个脚本将基于该输出构建直方图。它的名称如下:

bash tailcount.sh | bash livebar.sh

livebar.sh脚本从stdin读取数据,并将输出打印到stdout,每输入一行一行(示例8.5)。

示例8.5 livebar.sh

#!/bin/bash -
#
# Bash  
# livebar.sh
#
# :
#    «» 
#
# :
# <output from other script or program> | bash livebar.sh
#

function pr_bar ()                                         (1)
{
      local raw maxraw scaled
      raw=$1
      maxraw=$2
      ((scaled=(maxbar*raw)/maxraw))
      ((scaled == 0)) && scaled=1 #   
      for((i=0; i<scaled; i++)) ; do printf '#' ; done
      printf '\n'

} # pr_bar

maxbar=60     #         (2)
MAX=60
while read dayst timst qty
do
      if (( qty > MAX ))                                   (3)
      then
           let MAX=$qty+$qty/4    #   
           echo "                      **** rescaling: MAX=$MAX"
      fi
      printf '%6.6s %6.6s %4d:' $dayst $timst $qty         (4)
      pr_bar $qty $MAX
done

(1) pr_bar函数显示一列主题标签,这些主题标签根据提供的参数缩放到最大大小。正如我们之前在histogram.sh脚本中使用的那样,此功能可能看起来很熟悉。

(2)这是我们可以允许的最长标签行大小(无需换行)。

(3)要显示的值有多大?在不事先知道这一点的情况下(尽管可以将数据作为参数提供给脚本),脚本将跟踪最大值。如果超过此最大值,则该值将开始“缩放”,并且现在显示的行以及将来的行也将被缩放到新的最大值。该脚本将最大值增加25%,因此如果下一个新值每次仅增加1-2%,则不必缩放该值。

(4)printf定义要打印的前两个字段的最小和最大宽度。这些是日期和时间戳记,如果超过了宽度值,它们将被截断。要显示整个值,请指定四个字符的宽度。在这种情况下,尽管有限制,但将打印所有值。如果值中的字符数少于四个,则丢失的字符将以空格补充。

由于此脚本是从stdin中读取的,因此您可以自己运行它以查看其行为。这是一个例子:

$ bash  livebar.sh
201010 1020 20
201010     1020 20:####################
201010 1020 70
                       **** rescaling: MAX=87
201010     1020 70:################################################
201010 1020 75
201010 1020 75:###################################################
^C

在此示例中,输入与输出混合在一起。您还可以将输入放入文件中,然后将其重定向到脚本以仅查看输出:

$ bash livebar.sh < testdata.txt
bash livebar.sh < x.data
201010 1020 20:####################
                 **** rescaling: MAX=87
201010 1020 70:################################################
201010 1020 75:###################################################
$

»书上的更多信息上可以找到出版商的网站
» 目录
» 摘录

的优惠券Khabrozhiteley 25%的折扣- 巴什

在缴付书的纸质版本,电子书是通过电子邮件发送。

All Articles