当前位置:首页 > 技术学院 > 技术前线
[导读]反弹Shell是黑客(即Shell攻击者)用于控制受害服务器的一种手段。Shell攻击者指定服务端,并将需要受害服务器执行的命令(标准输入、标准输出、标准错误等)重定向到该服务端。

使用 Shell 脚本在 Linux 服务器上能够控制、毁坏或者获取任何东西,通过一些巧妙的攻击方法黑客可能会获取巨大的价值,但大多数攻击也留下踪迹。当然,这些踪迹也可通过 Shell 脚本等方法来隐藏。

寻找攻击证据就从攻击者留下的这些痕迹开始,如文件的修改日期。每一个 Linux 文件系统中的每个文件都保存着修改日期。系统管理员发现文件的最近修改时间,便提示他们系统受到攻击,采取行动锁定系统。然而幸运的是,修改时间不是绝对可靠的记录,修改时间本身可以被欺骗或修改,通过编写Shell 脚本,攻击者可将备份和恢复修改时间的过程自动化。

操作步骤

第一步:查看和操作时间戳

多数 Linux 系统中包含一些允许我们快速查看和修改时间戳的工具,其中最具影响的当数 “Touch”,它允许我们创建新文件、更新文件 / 文件组最后一次被 “touched” 的时间。

touch file

若该文件不存在, 运行上面的命令将创建一个名为 “file” 的新文件;若它已经存在,该命令将会更新修改日期为当前系统时间。我们也可以使用一个通配符,如下面的字符串。

touch*

这个命令将更新它运行的文件夹中的每个文件的时间戳。在创建和修改文件之后,有几种方法可以查看它的详细信息,第一个使用的为 “stat” 命令。

stat file

运行 stat 会返回一些关于文件的信息,包含访问、修改或更新时间戳。针对一批文件可使用 ls 参数查看各文件的时间戳,使用 “-l” 或者 “long”,该命令会列出文件详细信息,包含输出时间戳。

ls–l

现在就可以设置当前时间戳并查看已经设置的时间戳,也可使用 touch 来定义一个自定义时间戳,可使用 “d” 标志,用 yyyy-mm-dd 格式定义日期,紧随其后设置时间的小时、分钟及秒,如下:

touch -d"2001-01-01 20:00:00"file

通过 ls 命令来确认修改信息:

ls-lfile

这种方法适用于修改个别时间戳,对于隐藏服务器上的操作痕迹,这个方法不太奏效,可以使用 shell 脚本将该过程自动化。

步骤二:组织 Shell 脚本

在开始编写脚本之前需要考虑清楚需要执行哪些过程。为了在服务器上隐藏痕迹,攻击者需要将文件夹的原始时间戳写入一个文件,同时能够在我们进行任何修改设置之后还能回到原始文件。

这两个不同的功能会根据用户的输入或者参数的不同而触发,脚本会根据这些参数执行相应的功能,同时我们需要有一种方法来处理错误。根据用户的输入将会进行三种可能的操作:

没有参数——返回错误消息;

保存时间戳标记——将时间戳保存到文件中;

恢复时间戳标记——根据保存列表恢复文件的时间戳。

我们可以使用嵌套语句 if/or 语句来创建脚本,也可以根据条件将每个函数分配给自己的 “if” 语句,可选择在文本编辑器或者 nano 中开始编写脚本。

步骤三:开始脚本

从命令行启动 nano 并创建一个名为 “timestamps.sh” 的脚本,命令如下:

nano timestamps.sh

然后进行下列命令:

#!/bin/bash

if[$#-eq 0];then

echo“Use asave (-s) or restore (-r) parameter.”

exit1

fi

在 nano 中按下 Ctrl + O 保存这个文件,通过 chmod 命令将它标记为可运行的脚本。

chmod +xtimestamps.sh

然后运行脚本,测试无参数时返回错误信息的功能。如果脚本返回我们的 echo 语句,我们就可以继续下一个条件了。

./timestamps.sh

步骤四:将时间戳写入文件

定义 if 语句的条件,“-s” 表示执行保存功能:

if[$1="-s"] ; then

fi

当然,需要检查计划保存的时间戳文件是否存在,如果存在,我们可以删除它(名为 timestamps 的文件),避免重复或错误的输入,使用下面的命令:

rm-f timestamps;

然后使用 “ls” 命令列出所有文件和它的修改时间,可将其输出到另一个程序,如 sed,以帮助我们稍后清理这个输入。

ls–l

通常会出现下面的显示结果:

-rw-r--r-- 1 user user 0 Jan 1 2017 file

为了保存时间戳,我们只需要年、月、日及文件名,下面命令可以清除 “Jan” 之前的信息:

ls-lfile| sed 's/^.*Jan/Jan/p'

这样显示的就是我们程序需要的信息,只是需要修改月份格式为数字格式:

ls-lfile| sed 's/^.*Jan/01/p'

将所有月份都替换为数字:

ls -l | sed -n 's/^.*Jan/01/p;s/^.*Feb/02/p;s/^.*Mar/03/p;s/^.*Apr/04/p;s/^.*May/05/p;s/^.*Jun/06/p;s/^.*Jul/07/p;s/^.*Aug/08/p;s/^.*Sep/09/p;s/^.*Oct/10/p;s/^.*Nov/11/p;s/^.*Dec/12/p;'

在一个文件夹中运行我们会看到如下图所示的结果:


然后将输出结果通过 “>>” 发送到名为 “timestamps” 的文件中:

doecho $x | ls -l |sed -n 's/^.*Jan/01/p;s/^.*Feb/02/p;s/^.*Mar/03/p;s/^.*Apr/04/p;s/^.*May/05/p;s/^.*Jun/06/p;s/^.*Jul/07/p;s/^.*Aug/08/p;s/^.*Sep/09/p;s/^.*Oct/10/p;s/^.*Nov/11/p;s/^.*Dec/12/p;'>> timestamps

至此,脚本的前两个操作就完成了,显示结果如下图:


下面可用 “-s” 标示测试脚本,用 cat 检查保存的信息:

./timestamps.sh–s

cattimestamps

步骤五:恢复文件的时间戳

在保存好原始时间戳后,需要恢复时间戳让别人觉察不到文件被修改过,可使用下面命令:

if$1= "-r"; thenfi

然后使用下面命令,转发文本文件的内容,并一行一行运行:

cattimestamps |whilereadlinedodone

然后再分配一些变量让文件数据的使用更简单:

MONTH=$(echo $line| cut -f1 -d );

DAY=$(echo $line| cut -f2 -d );

FILENAME=$(echo $line| cut -f4 -d );

YEAR=$(echo $line| cut -f3 -d )

虽然这四个变量在保存的时间戳文件中是一致的,但是如果时间戳是在过去一年中发生的,它只会显示时间而不是年份。如果需要确定当前年份,我们可以分配为写脚本的年份,也可以从系统中返回年份,使用 cal 命令可以查看日历。

然后检索第一行,只让显示想要得年份信息:

CURRENTYEAR=$(cal | head -1| cut -f6- -d | sed 's/ //g')

定义了所有变量之后可以使用 “if else” 语句,根据格式化的日期更新文件的时间戳,使用 touch 语法:

touch -d "2001-01-01 20:00:00"file

由于每个时间都包含冒号,因此可使用下面的 “ifelse” 语句完成操作,整体操作如下图所示:

if[ $YEAR== *:* ]; then

touch -d $CURRENTYEAR-$MONTH-$DAY$YEAR:00 $FILENAME;

else

touch -d ""$YEAR-$MONTH-$DAY""$FILENAME;

步骤六:使用脚本

使用的命令主要有以下几个:

./timestamps.sh–s 保存文件时间戳

touch -d “2050-10-1210:00:00″ * 修改目录下的所有文件时间戳

ls–a确认修改的文件

./timestamps.sh–r 恢复文件原始时间戳

最后可以再次运行 “ls -a” 来查看文件的时间戳是否和之前备份的时间戳一致,整个的脚本就执行完成了。

总结

该脚本只是用来清除攻击服务器之后遗留的一些痕迹。为了隐藏痕迹,黑客在针对服务器实施具体的攻击时,必须仔细考虑使用的每一个方法,以及入侵服务器之后如何隐藏自己的痕迹。

通过上面的介绍我们了解到,时间戳也是 “会撒谎的”,因此系统管理员必须意识到他们的许多日志和保护措施是可以被操纵的,虽然看起来好像没有异常。

反弹Shell是黑客(即Shell攻击者)用于控制受害服务器的一种手段。Shell攻击者指定服务端,并将需要受害服务器执行的命令(标准输入、标准输出、标准错误等)重定向到该服务端。受害服务器主动连接攻击者的服务端程序,攻击者的服务端通过监听来自受害服务器的请求,对目标服务器下发指令并获取执行结果,以达到攻击者可以控制受害服务器的目的。

反弹Shell攻击现状

阿里云云安全中心通过分析历史中云上环境的Linux服务器入侵事件,总结出了攻击链路中实现反弹Shell的语言及工具使用率,详情如下图所示。

其中交互式Bash+/dev/tcp是使用最多的反弹Shell,/dev/tcp作为Bash的默认特性使得该反弹方式兼容绝大多数环境,因此使用率高。紧随其后的是兼容性较好且灵活易用的Python。随着Go语言的兴起,云上入侵事件开始出现Go反弹Shell。从上图可以看出弹Shell实现的方式灵活多样,每种语言都可以进一步延伸和扩展。因此,为了保障最优的检出效果,反弹Shell的检测方案需要综合考虑多种场景因素。

常规检测方法

常见的检测方案是通过正则匹配的方式,提取反弹Shell命令的特征去匹配命令日志、流量日志。该方案具有以下不足:

命令日志采集不完整:例如通过Netlink等方式采集的日志,在碰到管道符、重定向时会无法采集完整的原始执行命令。而通过Patch Bash的方式记录命令日志,在遇到服务器使用Zsh、Ksh等其他Shell环境,或攻击者上传自己编译的Bash时会失效。正则匹配无法覆盖无穷无尽的文本对抗:攻击者可以不断挖掘出新的变形方式来绕过正则匹配。在实际业务场景中,过多复杂的正则匹配会带来更大性能压力,而通配性更广的正则匹配会带来更多误报。特征匹配失效:在网络流量被加密后,特征匹配会失效。

分类检测思想

因为表层对抗是无穷无尽的,检测需要由表及里,尽可能挖掘出更本质的解决方法。从检测的角度来看,反弹Shell的本质可以理解为:网络通信+命令执行+重定向方式。

命令执行和网络通信借助重定向,可以构建出一条流动的数据通道。攻击者可以利用这条通道下发指令控制受害服务器。不同的实现方式组合在一起,就形成了多种多样的反弹Shell。例如:

网络通信可以使用TCP、UDP、ICMP等协议,TCP协议再细分又可以包含HTTP、HTTPS协议等,UDP包含DNS等。命令执行可以通过调用Shell解释器、Glibc库、Syscall等方式实现。重定向可以通过管道、成对的伪终端、内存文件等实现。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭