您的位置 首页 php

从攻防演练打点到编写python版webshell提权


前言

本文作者:0verflow

此次实战是参加某地攻防演练打点所遇,如有打码不严请勿复现,大佬勿喷。

实战经过

摸到一个某信息管理平台

5eb680118a2747f89622f95acb95f0ab

ebbd35e3b92449abb115252c8e27aff4

开局一个登录框,那么尝试sql注入和弱口令爆破,从返回包中可以看出存在用户名枚举

f4269fa9a34a4655886cacc8e3501c66

尝试注入测试发现后端存在检测,试了几十个常见的测试手机号还无法枚举到用户名后,遂放弃此路

60b3c452035e4ad3b4bd8877361546cf

通过报错页面的信息,和url格式,我当时判断的是这是一个 java mvc 模型的站点,也给后面埋了个坑

da45d20951fa43e19adf5080fe830d49

于是开始翻看静态资源,熟悉的文件名格式,确认过眼神,这是vue的资源

0cbc0942bccc4535a42a24d80a57ac3f

根据以往的经验,VUE项目的关键代码存在于生成的以app开头的js文件中,所以通常遇到vue项目的目标,只需翻看其app开头的js文件,即可通过其内容大致了解到它的功能点。

4f69cb7bba3b4b62a66311f05e76f566

于是打开那个app开头的js文件,我个人是非常喜欢将js代码粘贴到 Pycharm 里面,然后按 Ctrl + Alt + L 来格式化代码,再慢慢的审阅寻找线索。

经过仔细的查看js代码,发现一处疑似后台主页的跳转url

c376c43efe7743dd8d146f89767ffb7b

直接粘贴至浏览器打开,进到了一个后台页面

9627c5380e8f4890a82371b430b12966

在熟悉它里面的功能点时,发现这只是一个框架页面,跟后端交互获取数据时仍需要验证用户身份

于是我灵机一动,猜测 url的company_id提交的可能就是用户凭证,所以直接在Pycharm使用字符串查找功能查找,没想到真的找到了一串md5值,看起来像是凭证,大喜之后将其补上到url后再访问

1bcdbbef55f94427bfab68b41a45a6e1

ca38df51676b4083a90f948328ddf351

获得了一个用户身份的后台(看右边的成员和部门那里已经与前面不同)

bd20e481704f416faceff5365e084115

但继续摸功能点后,发现只是个测试用户的身份

9d3963008780497eb18785cbd20fd18e

找到一处上传点,但是上传过去发现没有数据包响应

4a98e1954c78423d8644723f4dff03f5

于是查看浏览器控制台信息,发现是被同源策略给限制了,那么这里通过功能点直接上传是行不通的,除非你通过他的域名访问,我这里反查了ip查不到对应的域名

74046d2e54ec4902b678c079d618d887

这个时候可以手动构造文件上传表单, 然后浏览器打开上传

d9e7df67e6ea483ea0fde48301bdf00c

发包过去之后,是我天真了

233c83a9d67e4c2c83687f17bb088a1f

报了一个404回来,开始怀疑人生当中,不过后面想了想,我刚才访问的是82端口,提交上传的接口是8082端口,难不成这里面有问题?本着死磕到底的精神,我颤抖的手敲了敲键盘,在burp的重放功能那将8082端口改为了82端口,再尝试发包

79a36dbf992e466a80d3fc195f2309e4

回包果真不一样了,貌似是被后端接受了,但是却没有返回上传成功的文件路径,我怀疑是没有上传成功

d16ba171180242a6a3df800ca930c49c

于是掏出了我的大*,不对,是我的祖传字典,用于测试上传文件对象的键名

d42cff02e758427c816e9975e7ccc318

我晕,原来上传的文件对象键名就是 file

3ff63d1c1034417b9e4e41897d7fd872

将文件字典键名改为file, 文件名改为 .jsp后缀再上传,成功上传了

af404685f5e1442790324b9843662669

于是赶紧上传个冰蝎的 webshell ,发现被拦了,难不成存在waf ?

1fc90bf649984d41934cfc5d10bd2b41

那么先上传个打印字符串的短小代码,发现上传成功了也顺利访问了可是却不解析???

b7b5c979ad03416fbabe735863b5edef

我尼玛直接怀疑人生,这不是 tomcat 应用服务器吗,怎么可能不解析jsp

2ba0742241644df3a3ddbd2938913b55

后面在测试其他文件名时,

2c6885781d584af08f019419accd4315

发现解析php,这就离谱,tomcat + php还有这种搭配?麻烦搞懂的朋友告诉我

239eaea6f75f4dbf9ef61b42623ced1f

93aedb07c6694e599a8226a48ec2c616

蚁剑链接之,发现是 apache 权限,内核3.10

9798136e950d4758ac50310d58a97a18

其实这个时候通常都是上代理打内网的了,不过后面遇到了更诡异的事,我上传了frp 客户端做代理时,发现连接到服务端后几十秒就断了,再查看文件时,权限已经变成了 000

8404b77237134c349b50616bf8b7e6a9

看来是应该有某种防护软件?这是块硬骨头啊

b00e15aab0d2457c8a15f938c9304c85

然后开始打算提权,一般提权通用性比较高的就是内核提权,但是不太建议这种提权方式,因为溢出类的内核提权都有一定的偶然性,容易把服务器打宕机

查看了下进程,很惊喜的发现 python 以root权限运行了一个程序,有着 django 开发经验的我一眼就看出了这就是django,

3c9aa47639c0438295733cca5a8254b5

然后访问其8000端口,是一个 swagger 接口页面。

c6590e1dc1704c5ca53a3735eb17e529

这时随便访问个不存在的路由

1c244925616740fa9fd67679b91e4fef

通过报错信息得知这真的是django,并且开起了 debug 功能,开启后修改源代码会自动重启应用

心中大喜直接奔去寻找这个django项目的目录,很巧的是项目目录里的所有文件都具有777的权限,所以能改写视图函数,我添加了红框中的代码,大致意思就是当访问 test/ 路由时,返回字符串 “Hello Django”

a8fcd7463efb4c4ba847300917aab794

再去浏览器访问 test 路由,成功执行了我自定义的视图函数

28d452c11ac749bbadc1787c266bbb5c

于是这时候 python 版的webshell就出来了

1da430e053de4562ac69e5ea253aa8c0

去查看执行效果,ok提权成功

78ee390c0c094decb0ae59bf0831f63c

当我开始漫游时,问题又出现了,应该是流量特征太明显被 waf 拦了

0d0b93f3d8d54832a49e90feafaba72e

540a081b6ca540019f96aff1657ac1f8

然后我又把视图函数改了下,添加base64编码传输

4fd870b4198944ddbd208b40d9fde359

完美

7a447d0a81a948ceb93e78c900ae78e4

随便几行代码写了个方便点的利用工具

4d34c73e1b704e59be3c59e58c59da73

本次外网打点到此结束

9d9753d3f078464aa96f801c83453b4b

结论

渗透测试 的本质就是信息收集加弱口令,只要足够细心就一定会有突破口,

防御对策

建议开发人员注意检查静态文件中是否包含凭证,服务运行权限尽量采取最小化原则。

文章来源:智云一二三科技

文章标题:从攻防演练打点到编写python版webshell提权

文章地址:https://www.zhihuclub.com/38990.shtml

关于作者: 智云科技

热门文章

网站地图