asp.net无法getshell的一些解决办法
【推荐学习】暗月渗透测试培训 十多年渗透经验,体系化培训渗透测试 、高效学习渗透测试,欢迎添加微信好友aptimeok 咨询。
实际环境中经常碰到asp.net的站,这些站点多采用asp.net mvc、asp.net core或者是预编译等等,而采用这些方案最恶心的点在于无法拿到webshell来进行下一步渗透。
本文主要讲解在asp.net中拿到shell的几种实际案例。
预编译加跨目录文件上传
当碰到任意文件上传时,预编译的站点不会执行我们上传的aspx文件,如下图
预编译配置文件在PrecompiledApp.config,修改updatable为true就能动态编译aspx文件了。
但是修改这个值需要重启iis,鸡肋。
另一种方法是直接上传编译好的aspx文件
C:WindowsMicrosoft.NETFramework64v2.0.50727aspnet_compiler -v -p src target -fixednames
生成的文件除了PrecompiledApp.config
全部拖入目标网站
要求肯定是必须能跨目录,同时文件名可控
反序列化
反序列化可以随便执行csharp代码,写文件、执行命令拿回显都行。ysoserial.net有一个GhostWebShell的代码,可以通过ActivitySurrogateSelectorFromFile gadget来注入内存马
https://github.com/pwntester/ysoserial.net/blob/master/ExploitClass/GhostWebShell.cs
命令如下
.ysoserial.exe -f binaryformatter -g ActivitySurrogateDisableTypeCheck -c 123 // 4.8以上需要先禁用类型检查
.ysoserial.exe -f binaryformatter -g ActivitySurrogateSelectorFromFile -c "C:GhostWebShell.cs;System.dll;System.Web.dll"
反序列化的代码
发送序列化数据
最后会在 http://localhost:49718/fakepath31337/1.aspx 生成shell
而此时还有一种情况,shell需要进行POST请求,而有的路由不能进行POST,所以有时候就算注册了内存shell,连不上能把你恶心死。
所以有了我最后写的这种方法。
基于反序列化的命令执行
最后这种方法建立在可以执行命令的基础上,并且需要提权,我实际环境是基于反序列化的命令执行,先反序列化写了一个badpotato提权到system,然后通过iis的appcmd命令添加一个网站,在另一个网站放我的shell。
AppCmd可以做的一些事情:
- 创建和配置站点、应用程序、应用程序池和虚拟目录
- 启动和停止站点,并回收应用程序池
- 列出正在运行的工作进程,并检查当前正在执行的请求
- 搜索、操作、导出和导入 IIS 和 ASP.NET 配置
先看几个简单的命令
apps是iis中的应用程序,sites是网站,apppool是应用程序池。
一个app可以有多个site,site通过apppool来进行处理运行。
我们可以添加一个网站,并且设置应用程序池为.NET v2.0
来使其可以执行aspx脚本程序,最后再写入shell文件即可。命令如下
C:windowssytstem32inetsrvAPPCMD add site /name:test /bindings:"http/*:81:" /physicalPath:"C:windowstemp123"
cacls.exe C:windowstemp123 /e /t /g everyone:F
C:windowssytstem32inetsrvAPPCMD set app "test/" /applicationPool:".NET v2.0"
此时在C:windowstemp123
写shell就行了。
限制比较大:
- appcmd要求高权限
- 要求能执行命令
- 其他的端口可以被访问到
这个东西可能不太实用,但是确实在一些不出网、需要正向代理或者需要webshell的时候非常有效。
作者:Y4er
原文连接:https://y4er.com/posts/aspnet-getshell-tips/
原创文章,作者:mOon,如若转载,请注明出处:https://www.moonsec.com/9003.html