记一次从零到getshell的渗透历程

0x00 前期

拿到测试范围清单后,首先用脚本获取了下各个子站的标题,基本都是XXX管理系统。浏览器查看后,各个子站也大同小异,纯登录系统,带验证码。这些系统基本都是jsp写的,逮到了两个没有验证码的小宝贝,一番暴力破解,小宝贝对我说:别爱我,没结果。又看到了两个站返回的Set-Cookie头:rememberMe=deleteMe; 很明显,这是Apache Shiro。打了一波exp,没有反应,放弃。搞了三天啥都没搞出来,和女朋友出去玩散散心,还是很高兴。

0x01 初显进展

测试范围内有六个门户网站,其中四个静态站(也不知道是不是伪静态,没拿下来),还有两个动态站。一个是Java写的,一个是PHP写的。出于对Java的敬畏之心,我对PHP下了手。是个伪静态站,URL是这样的:http://www.xxx.cn/index.php/lists/68.html,可是暴露的很明显。尝试还原为参数值,失败,显示下图页面:

很典型的MVC架构站,尝试指纹识别、浏览robots.txt,一无所获。看了下前台功能,除了浏览新闻就是下载文件,下载的文件名经过了MD5 hash,放弃任意文件下载。没有什么其他的功能点了,啥都不用考虑了,扫Web目录。

扫到了composer.json、composer.lock、.htaccess以及readme.md。前两个是composer包管理器的文件,.htaccess是Apache的配置文件,能够直接下载有点奇怪。重头戏就在readme.md了,查看得知此CMS名为PCCMS,基于ThinkPHP 5.1开发。百度了一下,并没有发现PCCMS的源代码,也没有相关漏洞信息,太小众了吧。以前也见过很多识别不出来的CMS,可能有的人就是喜欢用小众CMS?百度啥也没找到,谷歌也不用说了,中国人自己都用的不多,哪有外国人去关注这小CMS。

又去仔仔细细地浏览了下载下来的文件,composer.json里都是些开源组件的信息,又臭又长,又去看了下readme.md。里面给了后台管理页面截图的地址,我进不去后台,看看后台长什么样子不过分吧哈哈。复制截图地址在浏览器打开,UI挺好看的,仔细再看看,看到了YZNCMS几个字。百度了一下,找到了gitee的项目地址。好家伙,readme里提到是基于ThinkPHP 5.1开发的,其实是基于YZNCMS三次开发的。

直接去找TP 5.1的RCE payload,没有什么反应,估计是被修复了。看了下YZNCMS的目录结构,和TP没有什么不一样,通过阅读源代码确认RCE被修复了。但是我发现了一个有趣的文件——yzncms.sql,这是MySQL的备份文件。试着在网站上访问yzncms.sql,404。改名为pccms.sql,弹出了下载框,28M,有戏。

0x02 登录旁站

本来以为这单纯是建站时用于创建表结构用的,打开后发现,居然还有文章信息。看起来不再简单了,直接搜索password,在pccms_admin表找到了两个账户密码。密码都有盐,admin的密码解出来是admin,登录不上后台,意料之中。根据账户的最后登录时间戳来看,这CMS最晚的备份时间是去年7月,一个站用admin做密码,很难保证一年不被日。另一个账户的密码没解出来,思路这时候又断掉了。去看了测试范围外的一个子站,也是相同cms,ping一下IP,是个旁站。直捣黄龙,下载pccms.sql,发现两个站管理员账号密码居然一样?尝试去登录,依旧失败。去对比了两个sql文件的sha1哈希值,一模一样,操……又看了一下用户名,另一个用户名和子域名有相同之处,这个备份文件无疑是从旁站复制过来的了,可能是去年7月迁移了服务器。

admin没搞定,只能打剩下的那个账户的主意了。虽然cmd5解不开,但是我有hashcat呀。把哈希值和盐都复制出来,用hashcat配上我的辣鸡1050ti显卡,几秒钟不到居然跑出了密码,123456操……

登录网站,失败;登录旁站,成功。操,旁站在测试清单之外。去向老师傅请示了一下,老师傅说先别测。我也累了,休息了。

第二天,老师傅说,旁站也在测试范围之内。

0x03 自助提权

此时已经是项目第六天,也就是昨天。登进了旁站的后台,当前用户是编辑权限。编辑也好, 比之前的普通会员权限大多了,还能编辑文章。

我的目标只有一个,拿shell。一波操作猛如虎,附件管理、图片上传、广告位上传,都试了一遍,一共两个上传接口,CMS自带的和Ueditor的,文件后缀限制的死死的,文件名md5哈希过,看样子是没办法绕过去了。

这时,一处不应出现的逻辑漏洞出现了。在管理员管理功能点,我发现了这个

操作之后,系统提示修改成功

绝了,此功能堪称自助提权,逻辑漏洞中的黑洞。

0x04 getshell

刷新页面,加载超管的功能模块,主要增加了会员管理、角色管理、模型管理模块。三个模块没有一处上传点,这时候我在“其他”模块里找到了插件管理功能,显眼的本地安装吸引了我的注意力。

结合我对应用开发的认知,以及之前日Empire CMS、WordPress的经验,Web应用的功能基本都是由脚本实现。那么,这个插件也会是php写的,想拿到shell,需要构造一个恶意插件安装包。在gitee项目页面搜罗了一番,找到了一个手册,手册里什么都有,唯独插件开发那栏是空的。那么只剩一条路了,代码审计。看了下addons.php的代码,船头调用API到船尾,我没造过船,看不懂,放弃。其实还有一条路,黑盒测试嘛,凭感觉。

按照其他插件的目录结构,我创建了一个config.php,其内容是:

<?php

    return null;

?>

又创建了一个info.php,调用phpinfo()函数,为了防止触发WAF规则,我习惯先上一段正常代码。将两个文件压缩后,直接上传,系统弹出这样的提示:

看来也就是个普通压缩包,根据gitee项目的目录结构,我确定插件解压在addons目录下,路径格式为: /addons/插件安装包名/文件名。访问了下插件目录,因为没有默认索引页,服务端响应403,表示目录存在。又访问了info.php,还是403,这就不正常了。根据之前的TP环境搭建经验,可能是.htaccess中的url重写功能影响了对shell的直接访问。那么,可以在目录下重写一个.htaccess,覆盖apache的配置。于是我写了这样一段.htaccess:

<FilesMatch "info">

    SetHandler application/x-httpd-php

</Filesmatch>

这个配置文件的作用是,把文件名包含info的文件,都当作php脚本解析。重新访问info.php后,我发现配置并没有生效。因为…这个Web容器根本不是Apache!!!看了下响应头,是openresty。我对这玩意非常陌生,一直认为只有CDN服务器才会用它。

换个思路,php不能解析,是不是整个addons目录都被配置为不可访问。我又传了txt纯文本,发现可以访问到文本内容。此目录有访问权限,只是不能访问PHP。我试着将php1-php7所有的后缀都打包成一个插件安装包,然而还是403。试着转换大小写,访问pHP,还是失败。可能使无视大小写,而且php1-php7都在黑名单里吧。最后,第七次上传安装包时,我用了php12345的后缀,通过访问pHP12345,成功看到蓝色的phpinfo,解析了,shell稳了。前前后后七次,终于要拿到shell了,我又有出息了=_=。直接上冰蝎马:

给冰蝎设置好测试用的代理,连接shell。然而,冰蝎一直在转圈圈,加载信息。看了看burp的http记录,发现只发了两个包,获取了两次密钥。两次都没被拦截,冰蝎也没有发第三个包,问题可能不在服务端。排查了一下,恍然大悟。我用畸形后缀解析了shell,冰蝎不能根据扩展名识别脚本类型,手动设置为php后,成功连接。

整个过程梳理起来,发现并不是很难。不轻易放弃,关注细节,总是能挖到洞的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容