01本文概要
在.NET部署环境中,利用IIS中间件开启对ASP的支持,可以实现许多强大的文件操作功能。特别是在一些需要进行预编译的情况下,通过上传ASP脚本,可以获得WebShell,从而方便地进行各种操作。本文将介绍一个名为Sharp4ASPWebPack工具,该工具提供了在线打包和解包文件的功能,并详细解析其实现方式。该工具经过订正后可正常运行。
02实现打包功能
自定义实现的CCPack类是一个用于ASP环境下文件打包和解包的类。
Class CCPack
Dim Files, packname, rootpath, fso
Private Sub Class_Initialize
Randomize
Dim ranNum
ranNum = Int(90000 * Rnd) + 10000
packname = Year(Now)&Month(Now)&Day(Now)&Hour(Now)&Minute(Now)&Second(Now)&ranNum&".asp"&Year(Now)
rootpath = Server.MapPath("./")
Set Files = server.CreateObject("Scripting.Dictionary")
Set fso = Server.CreateObject("Scripting.FileSystemObject")
End Sub
Private Sub Class_Terminate
Set fso = Nothing
Set Files = Nothing
End Sub
通过该类,可以方便地将文件夹及其下的文件打包成一个文件,并可以在需要时解包这些文件。详细介绍CCPack类的实现代码使用方法如下所示
'添加该文件夹下的所有文件夹及文件
Public Sub AddDir(byval obj)
Dim f, subf
If fso.FolderExists(obj) Then
Set f = fso.GetFolder(obj)
'添加本文件夹
Add(f.Path)
'遍历子文件夹
For Each subf in f.SubFolders
AddDir(subf.Path)
Next
Set subf = Nothing
Set f = Nothing
End If
End Sub
AddDir方法,递归地添加文件夹及其下所有文件。检查文件夹是否存在,存在则添加该文件夹,并遍历其子文件夹递归调用AddDir方法。Pack方法:创建两个流对象,一个用于读取文件,一个用于写入打包文件。代码如下所示
'打包
Public Sub Pack()
Dim Str, ObjPack, ObjRead, a, b, buf, bf, FileDB, FDBLen
Set ObjPack = server.CreateObject("ADODB.Stream")
Set ObjRead = server.CreateObject("ADODB.Stream")
ObjPack.Open
ObjRead.Open
ObjPack.Type = 1
ObjRead.Type = 1
a = Files.Keys
b = Files.Items
bf = ( (Files.Count) + 1) / 100
For i = 0 To Files.Count - 1
If b(i) > 0 Then
ObjPack.LoadFromFile(a(i))
If Not ObjPack.EOS Then ObjRead.Write(ObjPack.Read)
End If
If b(i) = -1 Then a(i) = a(i) & "\"
a(i) = replace(a(i), rootpath, "\", 1, -1, 1)
a(i) = replace(a(i), "\\", "\", 1, -1, 1)
FileDB = FileDB & b(i) & ">" & a(i) & "*"
Echo "<script language=""javascript"" >"
Echo "f.innerText='" & Replace(a(i), "\", "\\") & "';"
Echo "p.innerText='" & clng(i / bf) & "%';"
Echo "n.innerText='" & (i+1) & "/" & Files.Count & "';"
Echo "</script>"
Response.Flush
If Not Response.IsClientConnected Then Exit For
Next
FDBLen = LenB(FileDB)
Str = CStr(Strright("000000000" & FDBLen, 10)) & FileDB
buf = TextToStream(Str)
ObjPack.Position = 0
ObjPack.Write buf
ObjRead.Position = 0
Do While Not ObjRead.EOS
ObjPack.Write ObjRead.Read(1024 * 64)
If Not Response.IsClientConnected Then Exit Do
Loop
ObjPack.SetEOS
ObjPack.SaveToFile(packname), 2
Set buf = Nothing
Set ObjRead = Nothing
Set ObjPack = Nothing
End Sub
遍历所有文件,将其内容写入打包文件,同时记录文件路径和大小信息。生成文件目录信息字符串并写入打包文件。UnPack方法:打开打包文件,读取文件目录信息并解析,逐个将文件内容写入目标路径。确保解压过程中路径和文件夹存在。代码如下所示。
'解压
Public Sub UnPack()
Dim Size, ObjPack, ObjWrite, arr, i, buf, bf
If Not fso.FolderExists(rootpath) Then
fso.CreateFolder(rootpath)
End If
Set ObjPack = server.CreateObject("ADODB.Stream")
Set ObjWrite = server.CreateObject("ADODB.Stream")
ObjPack.Open
ObjWrite.Open
ObjPack.Type = 1
ObjWrite.Type = 1
ObjPack.LoadFromFile(packname)
ObjPack.Position = 0
If Not IsNumeric(StreamToText(ObjPack.Read(22))) Then
Echo("<script>alert('文件格式不正确,系统无法解压!');</script>")
response.End
Else
ObjPack.Position = 0
End If
Size = Clng(StreamToText(ObjPack.Read(22)))
arr = Split(StreamToText(ObjPack.Read(Size)), "*")
bf = ( (UBound(arr)) + 1) / 100
For i = 0 To UBound(arr) - 1
arrFile = Split(arr(i), ">")
If arrFile(0) < 0 Then
myfind(rootpath & arrFile(1)) '确保文件存在
ElseIf arrFile(0) >= 0 Then
ObjWrite.Position = 0
buf = ObjPack.Read(arrFile(0))
If Not IsNull(buf) Then ObjWrite.Write(buf)
ObjWrite.SetEOS
ObjWrite.SaveToFile(rootpath & arrFile(1)), 2
End If
Echo "<script>"
Echo "f.innerText='" & Replace(rootpath & arrFile(1), "\", "\\") & "';"
Echo "p.innerText='" & clng(i / bf) & "%';"
Echo "n.innerText='" & (i+1) & "/" & UBound(arr) & "';"
Echo "</script>"
Echo vbcrlf
Response.Flush
If Not Response.IsClientConnected Then Exit For
Next
Set buf = Nothing
Set ObjWrite = Nothing
Set ObjPack = Nothing
End Sub
因此CCPack类非常适合在支持ASP运行环境下的.NET应用中进行文件打包和解包操作,特别是在需要通过Web接口进行文件传输和管理的应用场景下。为了达到更好的免杀,工具已混淆发表于星球,师傅们可自行查阅资料。
03推荐阅读
从漏洞分析到安全攻防,我们涵盖了.NET安全各个关键方面,为您呈现最新、最全面的.NET安全知识,下面是公众号发布的精华文章集合,推荐大家阅读!
04.NET安全知识库
为了更好地应对基于.NET技术栈的风险识别和未知威胁,dotNet安全矩阵星球从创建以来一直聚焦于.NET领域的安全攻防技术,定位于高质量安全攻防星球社区,也得到了许多师傅们的支持和信任,通过星球深度连接入圈的师傅们,一起推动.NET安全高质量的向前发展。只需199元就可以加入我们。
星球已成为中国.NET安全领域最知名、最活跃的技术知识库之一,从.NET Framework到.NET Core,从Web应用到PC端软件应用,无论您是初学者还是经验丰富的开发人员,都能在这里找到对应的安全指南和最佳实践。
星球汇聚了各行业安全攻防技术大咖,并且每日分享.NET安全技术干货以及交流解答各类技术等问题,社区中发布很多高质量的.NET安全资源,可以说市面上很少见,都是干货。
星球文化始终认为授人以鱼不如授人以渔!加入星球后可以跟星主和嘉宾们一对一提问交流,20+个专题栏目涵盖了点、线、面、体等知识面,助力师傅们快速成长!其中主题包括.NET Tricks、漏洞分析、内存马、代码审计、预编译、反序列化、webshell免杀、命令执行、C#工具库等等。
我们倾力打造专刊、视频等配套学习资源,循序渐进的方式引导加深安全攻防技术提高以及岗位内推等等服务。
我们还有一个会员专属的星球陪伴群,加入的成员可以通过在群里提出问题或参与论的方式来与其他成员交流思想和经验。此外还可以通过星球或者微信群私聊向我们进行提问,以获取帮助迅速解决问题。