一直知道Linux反弹shell。但是不知道其原理所以今天学习了一波。
什么是反弹shell?
假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面,web服务,ssh,telnet等等,都是正向连接。
那么什么情况下正向连接不太好用了呢?
1.某客户机中了你的网马,但是它在局域网内,你直接连接不了。它的ip会动态改变,你不能持续控制。
2.由于防火墙等限制,对方机器只能发送请求,不能接收请求。
3.对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知,所以建立一个服务端,让恶意程序主动连接,才是上策。那么反弹就很好理解了, 攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。
文件描述符
首先我们要明白文件描述符是什么?
文件描述符定义:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。
linux默认启动时,会启用三个文件描述符。
0 | 标准输入(standard input)--------->默认设备键盘 |
---|---|
1 | 标准输出(standard output-------->默认设备显示器 |
2 | 标准错误(standard error-------->默认设备显示器 |
在linux系统中打开文件就会获得文件描述符,它是个很小的非负整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。
注意:
- 以后再打开文件,文件描述符将会增加
- 一条shell命令,都会继承其父进程的文件描述符,因此所有的shell命令,都会默认有三个文件描述符
- 所有linux下打开的文件都是由文件描述符控制的(Linux一切皆文件,就连键盘显示器设备都是文件,因此他们的输入输出也是由文件描述符控制)
对于任何一条linux 命令执行,它会是这样一个过程:
一个命令执行了:
先有一个输入:输入可以从键盘,也可以从文件得到
命令执行完成:成功了,会把成功结果输出到屏幕:standard output默认是屏幕
命令执行有错误:会把错误也输出到屏幕上面:standard error默认也是指的屏幕
重定向
重定向字面意思是:数据本该定向到A的,结果中途将其转定向为B.
重定向主要分为两种:
输入重定向 用 <
或 <<
输出重定向 用 >
或 >>
注意:
<
是对标准输入 0 重定向 ,>
是对标准输出 1 重定向
当使用一个>
是将文件内容覆盖
当使用两个>>
是在原文件末尾补充
- 输入重定向
说明:这里是将文件描述符0以只读的形式打开
cat < file
hacker
cat 0< file
hacker
说明:当linux解析到重定向符号时就会解析重定向,将标准输入重定向到file,之后cat再从标准输入读取指令。
- 输出重定向
echo hello 1> file
cat file
hello
说明:这里的意思是输出hello并将其重新定向到 file文件中
文件描述符的复制
说明:文件描述符可以
n <& m
n >& m
将文件描述符 n 复制到 m ,两者的区别是,前者是以只读的形式打开,后者是以写的形式打开
因此 0<&1 和 0>&1 是完全等价的(读/写方式打开对其没有任何影响)
exec 绑定重定向
说明:将file读入到fd3中,将file中的内容作为标准写出,Ls将不会有显示,直接写入fd3中了,就上面的file中。
总结:反弹shell中最核心的部分就是重定向
参考链接:
https://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html
https://xz.aliyun.com/t/2548#toc-10
https://www.zhihu.com/question/24503813/answer/102253018