一直觉得自己对于这款工具的使用还差的很多,能做的仅仅是简单的拿鼠标点几下,甚至连点几下的功夫都练得不怎么明白。文章权当一次学习过程中的笔记,水平辣鸡导致疏漏和缺陷在所难免,欢迎提出批评和指正。
就从获得第一台winserver2003权限之后写起,通过web获得administrator权限添加账号进入服务器发现已经有很多人来过了,还有个小可爱的账号是“t00ls”。
我修补了出问题的地方,删掉了他们的账号。另外一开始的时候这台机器上是装了MSE的,很烦,哪有这么多免杀的东西给你造,直接卸载掉了。
好的,清完障碍,文章就开始了。
• 0X01 内网疑云
登陆的时候目测是有域环境存在的,”Log on to:” 那里两个选项,一个是域的名称,一个是电脑的名称,我添加的用户必然不是域用户,所以只能选择普通登陆。
常规操作,查看网络环境(其实正常来说第一步是去黑客们账号的桌面文件夹和敏感文件夹看看有没有什么0day和神器什么的)。
似乎存在域环境,但是“net view”却提示服务没有启动,尝试“net start server”等启动服务未果。
其实一开始对这个域环境的存在是抱着怀疑态度的,但是从登录界面来看应该是存在的,所以我先把机器弹到了cobalt strike(下文简称cs)上面。
另:当时我最开始使用的是cs2.x,先用ms08067拿下了172.16.3.1,但是后面发现cs2.x的mimikatz抓密码有问题,抓出来的结果和3.x有出入处不说,抓完有时候机器还会关机
==!,所以我后面就切换成3.x操作。下面的过程全部是使用cs3.8进行演示的,2.5版本的使用附在了最后面。个人感觉3.x的版本相对于2.x而言也确实有其进步之处。
对于cs的teamserver配置环节有很多文章介绍,这里我不再赘述。服务端启动完成之后,首先要设置一个listener,类型的选择看环境情况和个人习惯。因为目标环境简单(我也比较懒),我设置的常规http的reverse类型。
其次再生成一个简单的payload,也是常规类型。
“listener”选择创建好的监听器,“output”选择要创建的payload类型。其中“Windows EXE”与“Windows service EXE”的区别是前者只是简单的一个独立payload,exit之后不会重新上线,但是service这个需要且只能使用系统命令 sc create创建一个系统服务,服务创建成功之后重启还会上线,其中区别接近rat的绿色版和安装版的区别(service问题请教于vexs师傅)。因为这里只是利用该机器对内网进行渗透,所以选择“Windows EXE”。
对于需要x64格式的可以勾选“x64”后面的勾。再下面的数字签名功能似乎是专业版才可以使用的功能。
生成完毕之后可以放到web环境里再转移到靶机上,我图省事直接3389copy过去,双击运行。至此,战场正式转移到cs上。
• 0X02 柳暗花明
Cs自3.0版本以后,已经不再依存于msf的框架,而是以自己独有的模块作为一个独立的平台工作。事实上两种模式也是各有千秋。2.X的版本可以直接调用msf的各种模块进行操作,很方便,但是因为版本问题,它本身的功能有限是他的瓶颈。而3.0以后功能确实要强大,但是如果需要msf操作时要使用
“foreign” 类型的listener把会话中转到msf上面。
这是机器弹到cs上面的效果。
在正式操作之前需要注意一个细节,“last”一栏是靶机与我们的teamserver最后通信的时间间隔,3.x默认的sleep时间间隔是60s(此处不太确定是不是默认,我的都是这样的),就是一分钟。可能设计初衷是为了通信隐蔽考虑,对于持久化控制来说这个设置确实也很合理。但是我们在对机器进行操作时就需要自己去修改这个休眠时间了,不然你的每一步操作都需要等待一分钟才能得到结果。(一开始我以为是网络延迟之类的,被逼疯。)
右键靶机栏,session→sleep,将60修改为00,就是将其设置为无时间间隔即时刻保持通信。这个设置也是要等到它的读秒走到一分钟才会生效的,设置成功后会发现通信的时间间隔由秒变成了毫秒。
正常来说首先应该提升自身权限,在非system权限操作有时会因为权限不足或者uac阻拦导致出现没有回显、直接报错甚至出完结果就关机的情况。
常规操作是:右键靶机栏-->access-->elevate-->选择listener和提权方式-->反弹回来新的高权限会话
但是这两个在这台机器上都不好使,所以我这里使用进程注入的方法获得system权限。
进程注入操作:右键靶机栏-->explore-->process list-->inject一个高权限且不容易导致系统崩溃的进程-->选择listener-->获得高权限会话
这里有一点需要注意一下,延迟高的时候这个进程列表经常会第一下列不出来,这个时候refresh一下就好了。
本台机器的System权限会话get。
这里保险起见为了预防这个系统进程崩掉或者导致系统不稳定,我一般会“spawn”一下,获得一个由这个会话衍生出的同样是system的高权限会话。
Spawn是产卵、生产的意思,在cs里我的理解就是以同权限派生出新的会话。事实上这个功能的正确姿势是作者为了方便团队成员之间的渗透资源共享,提高分布式入侵的效率。另外也可以提前设置好foreign类型的listener以及msf的监听参数,使用spawn把会话反弹到msf上去。参考链接当中有位大师傅介绍的很详细,我这不在啰嗦。
到这里就可以开始对靶机进行抓取密码和hash的操作了。一般“dump hashes”和“run mimikatz”我都会进行一遍,两者的结果都是很有用的。获得明文密码在走投无路时配合smblogin有时会起到意想不到的效果。
右键靶机栏,点击interact(与靶机交互)可以看到回显结果。在 view→credentials 当中,或者点击快捷方式栏里小名片图案的快捷方式,可以更加直观地看到已经获得的凭证。
有时进程注入或者抓密码失败的解决办法也是先尝试使用elevate中的“ms14-068”和“uac.dll“先提升权限。这里我们已经得到这台机器部分用户的密码和哈希。
下面要进行的操作是arp scan和net view,去发现内网其它机器,并尝试利用已有的凭证获得其权限,进而获得更多的凭证,最终实现称霸内网。(net view 和 arp scan都能发现内网其它机器)
在2.x当中扫描的选项直接是“arp scan”,但是在3.x当中提供了更多的扫描方式。
Arp扫描操作:右键靶机栏-->explore-->port scan-->在下图的界面选择内网ip-->scan获得内网其它主机信息
在2.x的版本当中,操作之前需要先“add pivot”,实际上这里选择内网ip段的过程就是添加路由表的过程。
扫描比较消耗时间,扫描的结果会体现在快捷方式栏瞄准镜图案的那一栏,这一栏实际上也是发起攻击的工作台。因为获取信息不足,机器屏幕图标显示是黑色的,后面也不会跟着机器名字。
扫描结束之后就是登录尝试的环节了,拿我们已经抓到的凭证去尝试入侵内网当中其他的机器。因为已经拿到权限的这台跳板机是03,没有powershell,所以我只能尝试psecex这一种方式,支持psh的高版本系统有更多种方式可以去尝试。
选择好凭证,再选择相应的session,launch。
木马运行成功的话,log里会全程绿灯,新机器会上线,失败的话就继续去尝试其他机器(成功失败的情况区别下文会具体提到)。
因为我当时通过ms08067干掉了另一台正常的域内机器,在这台机器上抓取的有用凭证比通过web拿到的初始跳板机器是要多的多的。
所以我这里我通过smblogin手动上线一台机器,假装是通过psexec上线成功的。
现在我们得到了一台新机器的权限。
标准流程走一套:获得新机器-->改sleep时间-->基本命令-->权限提升-->凭证抓取
需要注意的一点是,对于机器的权限提升等其他针对目标机器本身的操作,需要在快捷方式栏三个点或者三道杠的界面操作,两者是一样的,只不过三个点的界面可以看到拿到权限目标机器之间的联系,比较骚一点。而对于发现的内网其他机器的攻击就需要在瞄准镜的界面操作。
在cs上执行目标机器上与msf略有不同,cs只需要**“shell 命令”**就可以,如下图所示。
通过执行命令信息获取基本确定域的基本信息、域控和域内成员,明确目标。
这里又有个小知识点,对于“net view”命令的执行,如果采取在interact当中以“shell net view”方式执行该命令的话,就不会触发这个小彩蛋。正确的姿势是在“explore”当中执行cs自带的net view命令。
彩蛋的效果就是这里,原来屏幕黑掉的机器,现在cs自动按照他们的身份证信息展示了。
(这是之前渗透时域内机器的数量)
(这是现在写文章时的数量 )
因为考试和我的重度拖延症等原因,这篇文章拖得太久了,大概两三个月,我也不知道这些机器们都经历了什么。但是数量不是这篇文章的重点,重点是这个流程。
• 0X03 一発入魂
提权抓凭证。
拿完凭证首先尝试对域控发起攻击,失败后继续我们的横向扩张,多个机器多个凭证多个现有session多多组合尝试一下。
失败的话这里会报错。
成功的话是一路绿灯,而且event log里面会提示您有新主机上线请注意。
**切记得到了新机器要记得停下抓凭证,继而去尝试登陆域控。**我们的目的不是横着撸穿所有机器,如果中途得到域管理员的凭证直接get 域控会省很多力气。
你看,刚才说什么来着。从“realm”可见凭证归属范围。
一发入魂。
咦?全部成功执行没有报错,为什么没有新会话弹回来呢?
抓到了域控的明文密码,手动登上去看了下,域控是个纯内网环境(其实这样的机器域内有很多)。它们根本无法访问外网更不可能向我们的teamserver弹来回话了。
这时候就需要新建一个“Windows/beacon_smb/bind_pipe”类型的listener了,这种监听方式不需要它回弹会话,借助已有跳板机器将命令中转过去再得到结果。这种方式不是持续通信的,只有当命令发出时才会有数据交互。所以“last”那里的时间会在执行命令之后一直增加,它并不是掉线了,只是它一开始就没“上线”。
选择这个新建的listener再次捅一下域控。
Launch,域控来了。
因为listener的使用不同,pivot graph界面(就是那个三个点的界面)也会给予不同的展示方式,smb方式的通信是橙色的箭头。
到这里,最初的目的基本已经达到了,拿到域控之后再抓凭证那可就多啦,为所欲为。
附上一张当时刚拿下时拿着到处装逼的图。
• 0X04 额外的点
1、文章演示操作流程:跳板机→使用cs3.8横向扩张在第三台机器拿到域管凭证→完成
实际操作流程:跳板机→使用cs2.5借助ms08067模块拿下一台主机,发现不好使→换成cs3.8横向扩张试了忘了多少反正很多台才拿到域管凭证→完成
当常规域渗透思路走不通时,就要尝试内网渗透当中的手法。
2、一开始内网机器都是装了赛门铁克的,ms08067的时候似乎是拦了一下,其他地方没感觉到阻碍,也可以手动关掉防护。有些关不掉的防护程序可以尝试先从服务里禁用掉它们的启动服务。此外还有个小小经验(不保证每次都好用),就是在一些03上面疯狂反复的点击和操作杀软,存在一定几率把他们整的崩掉自己无响应结束进程。
3、至于为什么封面图用EZ,因为我觉得这个小黄毛比他的那个帅多了。
4、cs2.5 的arpscan除了mac地址可以出详细的机器厂家型号等,发现的与跳板机相连系的机器也会列在pivot graph图形界面上(下图是我拿自己电脑演示的)。记得当时的内网使用cs2.5扫完还发现不少天朝出口的机器(下下图)。
4、另附我一开始使用cs2.5 借助ms08067拿到172.16.3.1的过程。
(此处演示使用的是cs2.5,生成payload和添加listener的流程都是一样的。不过2.5的安装过程贼麻烦,java版本要适配,想使用最新模块的话msf的安装方式还要同它契合,另外动不动还会嫌弃你的服务器内存不够。)
因为目标机器在内网,选择对应的内网段,创建一条路由规则。这个过程和msf当中run autoroute -s 的操作是一样一样的。
在这里输入需要的payload名称开头,它会自动搜索。Msf版本够新的话,模块都是有的。
双击ms08067的模块进入设置页面,图形化设置msf的参数,点击launch攻击成功的话会话就弹回来了。
大概就是上面这些了,文笔垃圾,措辞轻浮,内容浅显,操作生疏。不足之处欢迎大师傅们指点和纠正,感激不尽。
参考文章: https://klionsec.github.io/2017/12/28/cobalt-strike-spawn/
*封面图片自Google图片采集,版权归英雄联盟所有。其他图片均为原创。
*转载请联系本人微信, WeChat id: wojiao123dadaguai