.NET预编译环境下的两种Getshell方法

2021-04-26 / 无评论

注: 必须要有两个必要条件

1.文件名不会被重命名

2.可跨目录

先来了解一下什么是预编译?
1.png
这里我简单的写了一个ashx文件。正常来讲

应该是一个ashx和一个cs文件-(一个处理文件一个源文件)

或者另一种写法。只有一个ashx文件(源代码写在处理文件内)

这时候在web服务器上是可以正常访问的
2.jpg
当然,即使更改了ashx文件中的内容。也会在下一次请求文件时进行刷新。这种叫动态编译。即访问一次,编译一次。

那么预编译是什么?

就类似于先将源文件进行编译成dll文件。

index.aspx -> 预编译 -> index.dll

当用户访问时,并不是指向index.aspx而是指向index.dll

即使index.aspx 文件被删除了,或者进行了更改。只要index.dll没有进行更改。那么,内容就不会更新。

在程序进行发布时。会有这么一个选项

参考Visual Studio:
3.jpg
这里会有一个“允许更新预编译站点”。如果这个进行了选中。那么aspx进行更改的同时,也会进行处理。因为这里是允许更新预编译内容的。

如果程序在发布时没有进行选中。那么新建的aspx文件就不会更新处理。

这就导致了我们在实际渗透环境中,上传的aspx文件不能被处理。或者显示
4.jpg

has not been pre-compiled, and cannot be requested.

预编译,因此无法请求。

这里有两种解决方法:

第一种方法:

更改PrecompiledApp.config的内容(满足最开始的两个条件可以直接覆盖原文件内容)
5.jpg

<precompiledApp version="2" updatable="false"/>

PrecompiledApp.config主要作用就是控制程序是否允许更新预编译内容。

上面的默认配置是false。也就是不允许更新预编译内容。这时候我们上传的aspx内容是不会被编译处理的。

如果要进行处理需要把updatable的值改为true

<precompiledApp version="2" updatable="True"/>

上传的文件就可以直接进行处理
6.jpg
注意:这个方法比较鸡肋,需要重启IIS后才能生效。不建议

第二种方法:

既然预编译是将aspx编译成了dll文件存储在bin目录下。那么,当我们满足最开始的两个条件时。可以尝试往bin目录写一个已编译的dll文件。

具体操作:

使用NET.Framework自带的aspnet_compiler.exe进行编译。

aspnet_compiler.exe默认目录

C:\Windows\Microsoft.NET\Framework64\v2.0.50727

编译

aspnet_compiler -v \ -p (web文件所在目录) (编译后存储目录) -fixednames

-v 要编译的虚拟目录。这个\是根目录 也就是shell的所在的目录

-fixednames 每个.aspx文件都编译生成单独的dll文件,并使用固定文件名。

这里我使用冰蝎2.0的aspx shell,放在指定目录
8.jpg

然后运行命令

aspnet_compiler -v \ -p 需要编译的目录 编译后的存储目录 -fixednames

9.jpg

这时候shell.aspx已经被编译了
10.jpg
即使shell.aspx不存在,访问指定路径,也是能正常处理的。

这里主要看bin目录。
生成了两个文件
11.jpg

.dll .compiled文件。这就是已经编译好的内容

dll文件拖入dnspy
12.jpg

这里的AppRelativeVirtualPath 就是你shell的地址。这里是根目录下的shell.aspx

只需要将这两个文件上传到bin目录下即可。

13.jpg
19.jpg
上传完毕后。访问AppRelativeVirtualPath显示的路径

这里肯能会提示Server Too Busy

刷新几次就可以了
14.jpg

15.jpg
写在最后的话:

别用BurpPaste form File。 容易丢失字节,导致文件无法正常处理

自己写个表单,或者用PostMan等工具

无回应:“.NET预编译环境下的两种Getshell方法”

发表评论

电子邮件地址不会被公开。 必填项已用*标注