利用 AI Agent 进行 SSRF

0x00: 打我干嘛qwq

我的VPS被打了,一看sshd日志,全是登录尝试。不过有几个IP吸引了我的注意,它们使用了chaomixian作为用户名尝试登录,而且这样的记录有6049条!

那就拉一条最新的(2026-02-28 21:03)幸运儿61.169.28.178来分析一下。

0x01: 信息收集

fscan先上手做初步的信息收集,可以看到,资产还是不少的:
fscan

顺藤摸瓜先来到http://61.169.28.178:8000,网页Title是Deeplumen,我马上想到了《人生切割术》😂。

deeplumen

上网搜索一下,发现一篇水文。但无论怎么看,这个都像是山寨的。我更愿意相信deeplumen.io是真的,这个是假的。

对着8000端口扫一下dirsearch,结果还算丰富。
dirsearch
快速做一下fuzz,发现访问/assets/路由,会进入一个加载不太正常的网页:
assets
available
按钮乱点一通,发现ai真的有响应。这说明有戏啊。把混淆过的js扔给Gemini分析,获得以下api。

0x02: 你好,外卖🥡

请求方式接口路径功能描述请求参数 / Body
POST/public/ecommerce/api/generate触发 AI 生成内容(支持流式 SSE 和非流式){"productId": "...", "model": "...", "copyType": "...", "stream": true/false}
GET/public/ecommerce/api/products获取所有商品列表数据
GET/public/ecommerce/api/models获取系统支持的 AI 引擎模型列表(如 GPT-4o 等)

请求方式接口路径功能描述请求参数 / Body
POST/public/ecommerce/api/pipelines/category创建一个新的品类监测任务{"category": "空调"}
GET/public/ecommerce/api/pipelines/category/:id轮询/获取指定品类监测任务的详细状态和分析结果路径参数:id (任务ID)
GET/public/ecommerce/api/pipelines/category获取品类监测的历史任务列表(支持分页)Query参数:?page={page}&page_size={size}

请求方式接口路径功能描述请求参数 / Body
POST/public/ecommerce/api/pipelines/brand-duel创建一个新的品牌对抗任务{"brandA": "格力", "brandB": "美的", "category": "空调"}
GET/public/ecommerce/api/pipelines/brand-duel/:id轮询/获取指定品牌对抗任务的详细状态和对决结果路径参数:id (任务ID)
GET/public/ecommerce/api/pipelines/brand-duel获取品牌对抗的历史任务列表(支持分页)Query参数:?page={page}&page_size={size}

请求方式接口路径功能描述请求参数 / Body
GET/public/ecommerce/api/monitor/health检查 GPT 服务(浏览器自动化服务)的连接健康状态
POST/public/ecommerce/api/monitor/tasks发送对话任务(支持开启联网搜索功能){"targetUrl": "http://example.com", "message": "用请简要总结当前页面内容", "enable_search": true/false, "modelId":"gpt-4o"}
GET/public/ecommerce/api/monitor/tasks/:id轮询特定监控对话任务的状态、回答以及实时浏览器截图路径参数:id (任务ID) Query参数:?include_screenshot=true

在源码中,可以看到涉及长时间运行的任务(品类监测、品牌对抗、Monitor),前端均使用了短轮询(setTimeout 配合 GET 请求)来获取任务的进度。服务端返回的状态(status 字段)约定如下:

  • pending: 任务排队中
  • running: 任务运行中/查询中
  • analyzing: 正在进行 AI 分析总结
  • completed: 任务完成,附带 analysis_resultresponse 数据
  • failed: 任务失败,附带 error 信息
  • waiting_login / waiting_captcha: (特指Monitor模块)浏览器侧需要人工介入登录或过验证码

0x03: 隔壁老王

好啊,那当然要试一试。

1
2
POST /public/ecommerce/api/monitor/tasks
{"targetUrl":"http://45.62.101.83:8000","modelId":"gpt-4o", "message": "详细描述你看到的页面", "enable_search": true}

api_post_tasks
我去未鉴权,再读一下看看。

1
/public/ecommerce/api/monitor/tasks/01KJJTEH83S9Q3Z94Y0VJH9C66
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"id": "01KJJTEH83S9Q3Z94Y0VJH9C66",
"type": "chat",
"status": "pending",
"message": "详细描述你看到的页面",
"response": null,
"error": null,
"sources": null,
"user_id": "default",
"caller_user": null,
"created_at": "2026-02-28T19:08:48.769759",
"started_at": null,
"completed_at": null,
"screenshot": null,
"metadata": null
}

也是可以的。更重要的是,当statusrunning时,screenshot真的会不断以Base64形式更新截图。它居然是浏览器RPA访问ChatGPT
api_get_tasks
base64
get_screenshot

马上让ai写了一个自动脚本,轮询获取截图,希望能获取一些有用信息
screenshot_script
可惜这个状态截图只能看见GPT界面,没有什么用。基本上只能截到这几个画面:
chatgpt_clear_chat
chatgpt_add_photos

这时候,我大概明白整套系统的工作流程了,实际上是包装了一下Dify Workflow

  1. 首先,用户输入网址,应该是准备分析的;
  2. 然后,开一个浏览器,访问TargetUrl并且截图;
  3. 接着,通过RPA发给ChatGPT总结网页信息;
  4. 最好,交给其他LLM完成数据整合。

什么鬼才想出来的…比较神奇的是,它使用的网页版ChatGPT没有登陆,每次使用重置一下环境,居然真的很稳定,极少出现需要登陆。

0x04: 是输入法(SSRF)

这一部分文字不多,但尝试了非常久。这蠢蛋API居然是一条一条顺序执行的,一次性发了19条,等了好久好久..

那么怎么 SSRF 呢。嗯,提示词工程让 ChatGPT 尽可能详细得描述页面,然后它可能就会回复:

1
当前页面包含了关于广告展示、管理以及如何与我互动的一些说明。主要内容如下:\n广告展示:广告可能会出现在对话中,尤其是在免费的使用计划中,且这些广告与我的回答无关。\n广告管理:用户可以隐藏不相关的广告,调整广告设置或选择报告广告。\n用户隐私:我的回答不受广告影响,广告商无法访问用户对话内容或数据。\n账户设置:免费用户会看到广告,而企业和付费计划则不会。\n如果你有其他问题或想了解更多,可以告诉我!

尝试 file:// 协议头读文件 和 javascript:// 协议头进行 XSS,都没有成功…不够就算成功,也没什么高价值信息,都是容器…(端口开得相当狂野,根本没SSRF的必要..)

其他的API也看了一下,都没鉴权,但这也没什么意思。
api_get_category
api_get_brand-duel
api_get_products

测试 React4Shell,修了。然后当然是进一步注册登陆,看看有没有什么洞了。不过注册完,登不进去…果然IP访问还是不行的…

0x05: 该睡觉了

这时候的思路是,找在线工具,用IP反查域名。不过一条记录也没有。。。突然想到,可以去看看注册时发验证码的邮箱地址啊,一看,是:

1
no-reply@notify.deeplumen.com

不过这个deeplumen.com及其子域名,一个都没活着。8000端口的网页里还有一个deeplumen.ai,同样是死了。不过上网一搜,居然找到一个deeplumen.cn,443端口是个Wordpress,里面全是AI水文,icon是真的deeplumen的,但像素很低,而且像是截图,嗯对了,对味了,大概率就是这个了。(为了假冒deeplumen,还真是费尽心思)

fake_deeplumen

目标当然不是这个Wordpress(47.110.83.239),但是可以信息收集一下嘛🤣。找到第一篇文章,发现有用户Harry评论。尝试用该用户名登陆Wordpress后台,提示用户名正确但密码错误。

接着去搜索deeplumen.cn的子域名,共搜索到(这个工具很好用):

1
2
3
4
5
6
mvp.deeplumen.cn (89.208.244.19)
www.deeplumen.cn (47.110.83.239)
blog.deeplumen.cn (61.169.28.178)
calendar.deeplumen.cn (47.110.83.239)
log.deeplumen.cn (47.110.83.239)
network.deeplumen.cn (61.169.28.17)

诶,诶,IP对上了!而且log.deeplumen.cn:443mvp.deeplumen.cn:443以及61.169.28.178:8000一模一样,连API都是一样的。不过经过测试,SSRF的来源地址都是61.169.28.178,应该是共用一个后端,反向代理到logmvp站。(API数据互通,但Web数据不互通)

注册log.deeplumen.cn并登陆,我终于理解这一切(雾)
dashboard
analysis

那么还有一个IP(89.208.244.19),nmap一下,woc,原来这才是真正的API,怪不得叫mvp!
nmap_again

这才相当当时发验证码的邮件下方的链接是localhost3000!
verify-email
(别盒了,临时邮箱qwq)

那么可以这样推测整个系统架构:

  • 47.110.83.239:面向用户的服务器(虽然还没上线的样子)
  • 89.208.244.19:开发时使用,承载业务AI分析相关API
  • 61.169.28.178:有魔法环境,负责对接 ChatGPT 等服务

0x06: 还有呢

杭州星图灵知智能科技有限公司,你服务器成肉鸡了知不知道,还招人呢,哥,别打我了,小水管撑不住😭
jobs

还有这套代码曾经叫GEOK应该是你吧。**还有这玩意真能骗到钱吗?**

0x07: 题外话

什么草台班子搞的东西,估计还有洞,要么是之前React4Shell被上线了没发现,不然打我vps干嘛…刚登上vps一看,已经被fail2ban给ban了。但还是非常蹊跷,这个IP尝试登录了我的两台VPS,而且都是知道用户名chaomixian,总计6000多次尝试,500多个IP,来自全球各地,大部分是中国。无语住了,这他妈的是被谁盯上了吧。留着钱吃吃喝喝,打我干嘛qwq。

IP 地址尝试次数地理位置 / 运营商
43.135.130.196494阿里云
100.42.181.193376-
41.186.188.77350南非
121.37.30.1298中国
118.219.255.16976中国
190.102.41.23274中国
162.240.61.3970美国
160.191.89.11870荷兰
62.60.135.9968德国
171.244.62.760美国
92.118.39.8456荷兰

这些IP每个扫过去,都像是被控了的肉鸡,不少直接能看到webshell(2222端口、222端口比较多)。真蚌埠住了。

不过,这些指定了chaomixian作为用户名的攻击,第一次从2025-07-11开始,打了他妈的 8个月了 !!如果计算所有的攻击次数,累计有 747,525 次,平均每30s就要被爆破一次,274 MB的日志不是开玩笑的😵

已关闭密码登陆.jpg