入侵检测——如何实现反弹shell检测?
反弹shell的本质:就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。
反弹shell的结果:一个client上的bash进程 可以和 server上的进程通信。
而反弹shell的检测,本质上就是检测 shell进程(如bash)的输入输出是否来自于一个远程的server。
一、检测思路
1.进程 file descriptor 异常检测
1.1 检测 file descriptor 是否指向一个socket
以“重定向符”+"/dev/tcp网络通信"Bash反弹Shell这一类最经典的反弹Shell攻击方式为例,这类反弹shell的本质可以归纳为file descriptor的重定向到一个socket句柄。


1.2 检测 file descriptor 是否指向一个管道符(pipe)
对于利用“管道符”传递指令的反弹shell攻击方式来说,这类反弹shell的本质可以归纳为file descriptor的重定向到一个pipe句柄。

更进一步地说,不管做了多少层的pipe,反弹shell的本质是将server的输入传递给client的bash,因此肯定存在socket连接。
我们只需要根据pid追溯pipe上游的进程,并判断其进程fd,检查是否是来自一个socket。
例如,跟踪pipe,发现pipe的进程建立了socket连接,那么就存在反弹shell的风险。
2.netlink监控+fd异常检测
- 监听Netlink Socket,实时获取进程EXEC事件。
- 如果为Shell进程,检查进程启动打开的FD,
- 打开了Socket
- 未使用/dev/tty、/dev/pts/n、/dev/ptmx等终端
- 则确认为反弹Shell
绕过风险:仅能通过进程执行文件名判断是否为Shell进程,上传可执行文件、拷贝Bash文件到其他路径等方法会绕过这个方法。
例如通过将/bin/sh重命名为其他名字进行反弹shell。
3.脚本文件 && 应用程序 && 无文件(fileless)反弹shell检测
需要注意的是,操作系统是分层的,Bash只是一个应用程序的普通应用,其内部封装了调用glibc execve的功能而已,除了bash之外,白帽子还可以基于任意的应用层技术来实现反弹shell,例如:
- python/perl实现纯代码形式的反弹shell文件执行:文件脚本检测
- python/perl实现纯代码形式的反弹shell命令行指令(fileless):纯命令行fileless检测
- C/C++实现纯代码形式的反弹shell:二进制文件检测
4. 特征检测
4.1网络层反弹shell通信特征检测
反弹shell的通信会话中,会包含一些”cmdline shell特征“,例如”#root…“等,可以在网络侧进行NTA实时检测。
4.2DNS反弹shell特征检测
针对DNS流量进行分析,判断关联进程是否开启/dev/net/tun,或者/dev/net/tap隧道等等。
4.3 ICMP反弹shell特征检测
对于正常的ping命令产生的数据,有以下特点:
● 每秒发送的数据包个数比较少,通常每秒最多只会发送两个数据包;
● 请求数据包与对应的响应数据包内容一样;
● 数据包中payload的大小固定,windows下为32bytes,linux下为48bytes;
● 数据包中payload的内容固定,windows下为abcdefghijklmnopqrstuvwabcdefghi,linux下为!”#$%&’()+,-./01234567,如果指定ping发送的长度,则为不断重复的固定字符串;
● type类型只有2种,0和8。0为请求数据,8为响应数据。
对于ICMP隧道产生的数据,有以下特点:
● 每秒发送的数据包个数比较多,在同一时间会产生成百上千个 ICMP 数据包;
● 请求数据包与对应的响应数据包内容不一样;
● 数据包中 payload的大小可以是任意大小;
● 存在一些type为13/15/17的带payload的畸形数据包;
● 个别ICMP隧道工具产生的数据包内容前面会增加 ‘TUNL’ 标记以用于识别隧道。
因此,根据正常ping和ICMP隧道产生的数据包的特点,可以通过以下几点特征检测ICMP隧道:
● 检测同一来源数据包的数量。正常ping每秒只会发送2个数据包,而ICMP隧道可以每秒发送很多个;
● 检测数据包中 payload 的大小。正常ping产生的数据包payload的大小为固定,而ICMP隧道数据包大小可以任意;
● 检测响应数据包中 payload 跟请求数据包是否不一致。正常ping产生的数据包请求响应内容一致,而ICMP隧道请求响应数据包可以一致,也可以不一致;
● 检测数据包中 payload 的内容。正常ping产生的payload为固定字符串,ICMP隧道的payload可以为任意;
● 检测 ICMP 数据包的type是否为0和8。正常ping产生的带payload的数据包,type只有0和8,ICMP隧道的type可以为13/15/17。

具体实现可参考https://blog.riskivy.com/%E5%9F%BA%E4%BA%8E%E7%BB%9F%E8%AE%A1%E5%88%86%E6%9E%90%E7%9A%84icmp%E9%9A%A7%E9%81%93%E6%A3%80%E6%B5%8B%E6%96%B9%E6%B3%95%E4%B8%8E%E5%AE%9E%E7%8E%B0/
二、具体实现举例
1.监听Netlink Socket 并轮询处理
func (ns *NetlinkSocket) ReceiveFrom() ([]syscall.NetlinkMessage, syscall.Sockaddr, error) {nr, from, err := syscall.Recvfrom(ns.fd, ns.buf, 0)if err != nil {return nil, from, err}if nr < syscall.NLMSG_HDRLEN {return nil, from, fmt.Errorf("Got short response from netlink")}msg, err := syscall.ParseNetlinkMessage(ns.buf[:nr])return msg, from, err
}
2.实时处理进程EXEC事件
func (p *Probe) netLinkHandler(e *netlinkProcEvent) {switch e.Event {case netlink.PROC_EVENT_EXEC:p.handleProcExec(e.Pid, false) // pid}
}
3.根据反弹shell的基本原理,判断进程 file descriptor 是否异常
//根据反弹shell的基本原理,判断进程 file descriptor 是否异常(也就是是否相等)
func (p *Probe) checkReverseShell(pid int) {//获取对应的inodeinodeStdin, err := osutil.GetFDSocketInode(pid, 0)if err != nil {return nil}inodeStdout, err := osutil.GetFDSocketInode(pid, 1)if err != nil {return nil}if inodeStdin != inodeStdout || inodeStdin == 0 {return nil}return osutil.GetProcessConnection(pid, nil, utils.NewSet(inodeStdin))
}//获取进程对应的连接
func GetProcessConnection(pid int, clientPort *share.CLUSProtoPort, inodes utils.Set) *Connection {var err errorif inodes == nil {inodes, err = GetProcessSocketInodes(pid)if err != nil {return nil}}if inodes.Cardinality() == 0 {return nil}var sport uint16if clientPort != nil {sport = clientPort.Port}pidDir := global.SYS.ContainerProcFilePath(pid, "/")if clientPort == nil || clientPort.IPProto == syscall.IPPROTO_TCP {if conn := getConnectionByFile(pidDir+"net/tcp", inodes, true, sport); conn != nil {return conn}if conn := getConnectionByFile(pidDir+"net/tcp6", inodes, true, sport); conn != nil {return conn}}if clientPort == nil || clientPort.IPProto == syscall.IPPROTO_UDP {if conn := getConnectionByFile(pidDir+"net/udp", inodes, false, sport); conn != nil {return conn}if conn := getConnectionByFile(pidDir+"net/udp6", inodes, false, sport); conn != nil {return conn}}return nil
}
以上方式的缺点为:仅能通过进程执行文件名判断是否为Shell进程,上传可执行文件、拷贝Bash文件到其他路径等方法会绕过这个方法。
除此以外,还可以对特定场景进行分析,进程对应的fd是否异常并且外联,开源代码可参考:https://github.com/zhanghaoyil/seesaw;
三、总结
这篇文章主要介绍了常见的反弹shell检测思路,以及实现举例,欢迎大家进行补充与分享!
四、参考链接
- 郑瀚Andrew的 反弹Shell原理及检测技术研究
相关文章:
入侵检测——如何实现反弹shell检测?
反弹shell的本质:就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。 反弹shell的结…...
Python常用语句学习
人生苦短,我用Python。 ——吉多范罗苏姆 文章目录前言一、判断语句(一)if语句1. 作用2. 构成3. 语法4. 样例5.说明(二)if嵌套二、循环语句(一)while循环1. 作用2. 语法3. 样例4. 说明ÿ…...
测试3年还不如应届生,领导一句点醒:“公司不是只雇你来点点点的”
你的身边,是否有这样的景象? A:写了几年代码,写不下去了,听说测试很好上手,先来做几年测试 。 B:小文员一枚,想入行 IT,听说测试入门简单,请问怎么入行 。 …...
华为网络设备之路由策略,前缀列表(使用,规则)
华为网络之路由策略 前言:在企业网络的设备通信中,常面临一些非法流量访问的安全性及流量路径不优等问题,故为保证数据访问的安全性、提高链路带宽利用率,就需要对网络中的流量行为进行控制,如控制网络流量可达性、调…...
白噪音简介与实现
一、简介: 白噪音(White Noise)是一种具有平均功率频谱密度的噪音信号,其功率在所有频率上均匀分布。白噪音是一种随机信号,其包含所有频率成分的等幅随机振荡。因此,白噪音看起来像是一种随机的“嘈杂声”…...
Springboot结合线程池的使用
1.使用配置文件配置线程的参数 配置文件 thread-pool:core-size: 100max-size: 100keep-alive-seconds: 60queue-capacity: 1配置类 Component ConfigurationProperties("thread-pool") Data public class ThreadPoolConfig {private int coreSize;private int ma…...
AOP工作流程
AOP工作流程3,AOP工作流程3.1 AOP工作流程流程1:Spring容器启动流程2:读取所有切面配置中的切入点流程3:初始化bean流程4:获取bean执行方法验证容器中是否为代理对象验证思路步骤1:修改App类,获取类的类型步骤2:修改MyAdvice类,不增强步骤3:运行程序步骤…...
Modbus相关知识点及问题总结
本人水平有限,写得不对的地方望指正 困惑:线圈状态的值是否是存储在线圈寄存器里面?是否有线圈寄存器的说法?网上有说法说是寄存器占两个字节,但线圈的最少操作单位是位。类似于继电器的通断状态,直接根据电…...
【MySQL】函数
文章目录1. DQL执行顺序2. 函数2.1 字符串函数2.2 数值函数2.3 日期函数2.4 流程函数2.5 窗口函数2.5.1 介绍2.5.2 聚合窗口函数2.5.3 排名窗口函数2.5.4 取值窗口函数1. DQL执行顺序 2. 函数 2.1 字符串函数 函数功能concat(s1,s2,…sn)字符串拼接,将s1,s2…sn拼…...
MySQL高级
一、基础环境搭建 环境准备:CentOS7.6(系统内核要求是3.10以上的)、FinalShell 1. 安装Docker 帮助文档 : https://docs.docker.com/ 1、查看系统内核(系统内核要求是3.10以上的) uname -r2、如果之前安装过旧版本的D…...
带你弄明白c++的4种类型转换
目录 C语言中的类型转换 C强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast RTTI 常见面试题 这篇博客主要是帮助大家了解和学会使用C中规定的四种类型转换。首先我们先回顾一下C语言中的类型转换。 C语言中的类型转换 在C语言中,如果赋…...
8个明显可以提升数据处理效率的 Python 神库
在进行数据科学时,可能会浪费大量时间编码并等待计算机运行某些东西。所以我选择了一些 Python 库,可以帮助你节省宝贵的时间 文章目录1、Optuna技术提升2、ITMO\_FS3、Shap-hypetune4、PyCaret5、floWeaver6、Gradio7、Terality8、Torch-Handle1、Optun…...
互联网公司吐槽养不起程序员,IT岗位的工资真是虚高有泡沫了?
说实话,看到这个话题的时候又被震惊到。 因为相比以往,程序员工资近年来已经够被压缩的了好嘛? 那些鼓吹泡沫论的,真就“何不食肉糜”了~~~ 而且这种逻辑就很奇怪, 程序员的薪资难道不是由行业水平决定么ÿ…...
Excel 进阶|只会 Excel 也能轻松搭建指标应用啦
现在,Kyligence Zen 用户可在 Excel 中对指标进行更进一步的探索和分析,能够实现对维度进行标签筛选、对维度基于指标值进行筛选和排序、下钻/上卷、多样化的透视表布局、本地 Excel 和云端 Excel 的双向支持等。业务人员和分析师基于现有分析习惯就可以…...
RabbitMQ中TTL
目录一、TTL1.控制后台演示消息过期2.代码实现2.1 队列统一过期2.2 消息过期一、TTL TTL 全称 Time To Live(存活时间/过期时间)。 当消息到达存活时间后,还没有被消费,会被自动清除。 RabbitMQ可以对消息设置过期时间࿰…...
Ceres简介及示例(4)Curve Fitting(曲线拟合)
文章目录1、Curve Fitting1.1、残差定义1.2、 Problem问题构造1.3、完整代码1.4、运行结果2、Robust Curve Fitting1、Curve Fitting 到目前为止,我们看到的示例都是没有数据的简单优化问题。最小二乘和非线性最小二乘分析的原始目的是对数据进行曲线拟合。 以一个…...
音质最好的骨传导蓝牙耳机有哪些,推荐几款不错的骨传导耳机
骨传导耳机也称为“不入耳式”耳机,是一种通过颅骨、骨迷路、内耳淋巴液和听神经之间的信号传导,来达到听力保护目的的一种技术。由于它可以开放双耳,所以在跑步、骑行等运动时使用十分安全,可以避免外界的干扰。这种耳机在佩戴…...
计算机操作系统安全
操作系统安全是计算机系统安全的重要组成部分,目的是保护操作系统的机密性、完整性和可用性。在当前的网络环境下,操作系统面临着许多威胁,如病毒、木马、蠕虫、黑客攻击等等。为了保护操作系统的安全,需要采取各种措施来防范这些…...
超详细从入门到精通,pytest自动化测试框架实战教程-用例标记/执行(三)
目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 pytest可以通过标记…...
Java SE 基础(5) Java 环境的搭建
Java 虚拟机——JVM JVM (Java Virtual Machine ):Java虚拟机,简称JVM,是运行所有Java程序的假想计算机,是Java程序的运行环境,是Java 最具吸引力的特性之一。我们编写的Java代码,都…...
别再手动调样式了!用WangEditor的Menu API在Vue3里打造你的专属工具栏
深度定制WangEditor:用Menu API在Vue3中构建企业级富文本生态 当我们需要在Vue3项目中集成富文本编辑器时,WangEditor以其轻量级和高度可定制性成为许多开发者的首选。但真正发挥其威力的关键在于深入理解其Menu API系统——这套机制允许我们突破默认功能…...
解决Ubuntu中libc6-dev:i386依赖问题的完整指南
1. 理解libc6-dev:i386依赖问题的本质 当你正在愉快地使用Ubuntu系统,突然在执行sudo apt-get upgrade时遇到一堆红色错误提示,特别是看到"libc6-dev:i386 : 依赖: libc6:i386 ( 2.31-0ubuntu9.14) 但无法安装它"这样的报错,是不是…...
2025届最火的十大降AI率方案实际效果
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在当下,关于AI生成内容的检测变得越发严格起来,于是降AI工具就相应地…...
破局双系统文件壁垒:WinBtrfs驱动终极应用指南
破局双系统文件壁垒:WinBtrfs驱动终极应用指南 【免费下载链接】btrfs WinBtrfs - an open-source btrfs driver for Windows 项目地址: https://gitcode.com/gh_mirrors/bt/btrfs 在Windows与Linux双系统环境中,用户常常面临跨系统文件访问的难题…...
从JDK21降到17:2025版IDEA搭建苍穹外卖项目,我踩过的那些版本坑
从JDK21降到17:2025版IDEA搭建苍穹外卖项目实战避坑指南 当你用最新版IDEA 2025和JDK 21打开一个要求JDK 17的项目时,就像穿着高跟鞋去爬山——不是不行,但绝对会走得很辛苦。最近在搭建苍穹外卖项目时,我就深刻体会到了这种&quo…...
别再死记硬背了!用FFmpeg实战拆解H.264码流,手把手教你读懂NALU头
从字节到画面:FFmpeg实战解析H.264码流中的NALU奥秘 当你用手机观看一段高清视频时,每秒25帧的画面流畅切换背后,是H.264编码算法在默默工作。但你是否好奇过,这些压缩后的数据究竟如何组织?今天我们将用FFmpeg这把&qu…...
别再纠结FP32了!手把手教你用PyTorch的BF16和FP16加速大模型训练(附完整代码)
突破显存瓶颈:PyTorch混合精度训练实战指南 当你在深夜盯着屏幕上那个"CUDA out of memory"的错误提示时,是否感到一阵无力?大模型训练就像是在走钢丝——一边是宝贵的显存资源,另一边是模型性能的悬崖。作为一名经历过…...
解锁3大高效创作模式:无需安装的在线演示神器全解析
解锁3大高效创作模式:无需安装的在线演示神器全解析 【免费下载链接】PPTist PowerPoint-ist(/pauəpɔintist/), An online presentation application that replicates most of the commonly used features of MS PowerPoint, allowing for …...
全球AI薪资热力图:旧金山VS深圳的残酷对比
一场不平等的技术竞赛当我们谈论人工智能(AI)的未来时,旧金山湾区与深圳无疑是最为闪耀的两个坐标。前者是硅谷的心脏,全球科技创新的策源地;后者是中国乃至世界硬件制造与新兴科技应用的前沿阵地。然而,对…...
高并发场景下的B2B对公支付方案:聚合支付、错付拦截与自动化对账
在B2B交易场景中,大额对公支付一直是一个绕不开的技术难题。与C端支付不同,B2B交易涉及百万级甚至千万级资金流转,传统的线下转账模式不仅流程繁琐,还带来了财务对账耗时、错付退款难、客户付款流失率高等一系列问题。本文将从技术…...
