当前位置: 首页 > news >正文

入侵检测——如何实现反弹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句柄

img

img

1.2 检测 file descriptor 是否指向一个管道符(pipe)

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

img

更进一步地说,不管做了多少层的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检测思路,以及实现举例,欢迎大家进行补充与分享!

四、参考链接

  1. 郑瀚Andrew的 反弹Shell原理及检测技术研究

相关文章:

入侵检测——如何实现反弹shell检测?

反弹shell的本质&#xff1a;就是控制端监听在某TCP/UDP端口&#xff0c;被控端发起请求到该端口&#xff0c;并将其命令行的输入输出转到控制端。reverse shell与telnet&#xff0c;ssh等标准shell对应&#xff0c;本质上是网络概念的客户端与服务端的角色反转。 反弹shell的结…...

Python常用语句学习

人生苦短&#xff0c;我用Python。 ——吉多范罗苏姆 文章目录前言一、判断语句&#xff08;一&#xff09;if语句1. 作用2. 构成3. 语法4. 样例5.说明&#xff08;二&#xff09;if嵌套二、循环语句&#xff08;一&#xff09;while循环1. 作用2. 语法3. 样例4. 说明&#xff…...

测试3年还不如应届生,领导一句点醒:“公司不是只雇你来点点点的”

你的身边&#xff0c;是否有这样的景象&#xff1f; A&#xff1a;写了几年代码&#xff0c;写不下去了&#xff0c;听说测试很好上手&#xff0c;先来做几年测试 。 B&#xff1a;小文员一枚&#xff0c;想入行 IT&#xff0c;听说测试入门简单&#xff0c;请问怎么入行 。 …...

华为网络设备之路由策略,前缀列表(使用,规则)

华为网络之路由策略 前言&#xff1a;在企业网络的设备通信中&#xff0c;常面临一些非法流量访问的安全性及流量路径不优等问题&#xff0c;故为保证数据访问的安全性、提高链路带宽利用率&#xff0c;就需要对网络中的流量行为进行控制&#xff0c;如控制网络流量可达性、调…...

白噪音简介与实现

一、简介&#xff1a; 白噪音&#xff08;White Noise&#xff09;是一种具有平均功率频谱密度的噪音信号&#xff0c;其功率在所有频率上均匀分布。白噪音是一种随机信号&#xff0c;其包含所有频率成分的等幅随机振荡。因此&#xff0c;白噪音看起来像是一种随机的“嘈杂声”…...

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&#xff0c;AOP工作流程3.1 AOP工作流程流程1:Spring容器启动流程2:读取所有切面配置中的切入点流程3:初始化bean流程4:获取bean执行方法验证容器中是否为代理对象验证思路步骤1:修改App类,获取类的类型步骤2:修改MyAdvice类&#xff0c;不增强步骤3:运行程序步骤…...

Modbus相关知识点及问题总结

本人水平有限&#xff0c;写得不对的地方望指正 困惑&#xff1a;线圈状态的值是否是存储在线圈寄存器里面&#xff1f;是否有线圈寄存器的说法&#xff1f;网上有说法说是寄存器占两个字节&#xff0c;但线圈的最少操作单位是位。类似于继电器的通断状态&#xff0c;直接根据电…...

【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)字符串拼接&#xff0c;将s1,s2…sn拼…...

MySQL高级

一、基础环境搭建 环境准备&#xff1a;CentOS7.6&#xff08;系统内核要求是3.10以上的&#xff09;、FinalShell 1. 安装Docker 帮助文档 : https://docs.docker.com/ 1、查看系统内核&#xff08;系统内核要求是3.10以上的&#xff09; uname -r2、如果之前安装过旧版本的D…...

带你弄明白c++的4种类型转换

目录 C语言中的类型转换 C强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast RTTI 常见面试题 这篇博客主要是帮助大家了解和学会使用C中规定的四种类型转换。首先我们先回顾一下C语言中的类型转换。 C语言中的类型转换 在C语言中&#xff0c;如果赋…...

8个明显可以提升数据处理效率的 Python 神库

在进行数据科学时&#xff0c;可能会浪费大量时间编码并等待计算机运行某些东西。所以我选择了一些 Python 库&#xff0c;可以帮助你节省宝贵的时间 文章目录1、Optuna技术提升2、ITMO\_FS3、Shap-hypetune4、PyCaret5、floWeaver6、Gradio7、Terality8、Torch-Handle1、Optun…...

互联网公司吐槽养不起程序员,IT岗位的工资真是虚高有泡沫了?

说实话&#xff0c;看到这个话题的时候又被震惊到。 因为相比以往&#xff0c;程序员工资近年来已经够被压缩的了好嘛&#xff1f; 那些鼓吹泡沫论的&#xff0c;真就“何不食肉糜”了~~~ 而且这种逻辑就很奇怪&#xff0c; 程序员的薪资难道不是由行业水平决定么&#xff…...

Excel 进阶|只会 Excel 也能轻松搭建指标应用啦

现在&#xff0c;Kyligence Zen 用户可在 Excel 中对指标进行更进一步的探索和分析&#xff0c;能够实现对维度进行标签筛选、对维度基于指标值进行筛选和排序、下钻/上卷、多样化的透视表布局、本地 Excel 和云端 Excel 的双向支持等。业务人员和分析师基于现有分析习惯就可以…...

RabbitMQ中TTL

目录一、TTL1.控制后台演示消息过期2.代码实现2.1 队列统一过期2.2 消息过期一、TTL TTL 全称 Time To Live&#xff08;存活时间/过期时间&#xff09;。 当消息到达存活时间后&#xff0c;还没有被消费&#xff0c;会被自动清除。 RabbitMQ可以对消息设置过期时间&#xff0…...

Ceres简介及示例(4)Curve Fitting(曲线拟合)

文章目录1、Curve Fitting1.1、残差定义1.2、 Problem问题构造1.3、完整代码1.4、运行结果2、Robust Curve Fitting1、Curve Fitting 到目前为止&#xff0c;我们看到的示例都是没有数据的简单优化问题。最小二乘和非线性最小二乘分析的原始目的是对数据进行曲线拟合。 以一个…...

音质最好的骨传导蓝牙耳机有哪些,推荐几款不错的骨传导耳机

​骨传导耳机也称为“不入耳式”耳机&#xff0c;是一种通过颅骨、骨迷路、内耳淋巴液和听神经之间的信号传导&#xff0c;来达到听力保护目的的一种技术。由于它可以开放双耳&#xff0c;所以在跑步、骑行等运动时使用十分安全&#xff0c;可以避免外界的干扰。这种耳机在佩戴…...

计算机操作系统安全

操作系统安全是计算机系统安全的重要组成部分&#xff0c;目的是保护操作系统的机密性、完整性和可用性。在当前的网络环境下&#xff0c;操作系统面临着许多威胁&#xff0c;如病毒、木马、蠕虫、黑客攻击等等。为了保护操作系统的安全&#xff0c;需要采取各种措施来防范这些…...

超详细从入门到精通,pytest自动化测试框架实战教程-用例标记/执行(三)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 pytest可以通过标记…...

Java SE 基础(5) Java 环境的搭建

Java 虚拟机——JVM JVM &#xff08;Java Virtual Machine &#xff09;&#xff1a;Java虚拟机&#xff0c;简称JVM&#xff0c;是运行所有Java程序的假想计算机&#xff0c;是Java程序的运行环境&#xff0c;是Java 最具吸引力的特性之一。我们编写的Java代码&#xff0c;都…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...