Mục đích của chứng chỉ số (Signing Certificates) là để xác minh file có đến từ một nguồn đáng tin cậy hay không, tệp không bị giả mạo trước khi nhận và đảm bảo nguồn gốc của tệp có thể được xác thực. Chứng chỉ số sẽ tạo ra một hàm băm của code và mã hóa nó bằng một khóa riêng có thêm chữ ký của nó. Trong quá trình thực thi, chữ ký này được xác thực và nếu hàm băm khớp với nhau, thì đồng nghĩa với việc code không bị sửa đổi. Người dùng hoặc công cụ bảo mật có thể tin tưởng vào đoạn mã đã ký hơn là đoạn mã chưa ký ngay cả khi họ không biết ai đã cấp chứng chỉ hoặc tác giả là ai.
Chứng chỉ số là gì?
Công nghệ Authenticode là hình thức ký mã được Microsoft triển khai. Mã xác thực (Authenticode) không phải là cách duy nhất để ký vào driver (trình điều khiển). Bộ chứng nhận phần cứng Windows có các danh mục kiểm tra cho các loại thiết bị khác nhau. Nếu loại thiết bị có danh mục thử nghiệm, nhà xuất bản có thể sử dụng chữ ký phát hành WHQL cho driver package. Chữ ký phát hành WHQL bao gồm tệp danh mục được ký. Nếu không có chương trình thử nghiệm, thì nhà xuất bản có thể ký driver bằng Authenticode.
Có hai cách bạn có thể sử dụng để kiểm tra hoặc xác minh chứng chỉ.
2 cách kiểm tra chứng chỉ số
Cách đầu tiên
Đầu tiên là lệnh Get-AuthenticodeSignature
trên PowerShell. Nó chỉ đơn giản là lấy chữ ký mã xác thực. Mình sẽ sử dụng VS Code làm ví dụ.
PS C:UsersUser > Get-AuthenticodeSignature "C:UsersUserAppDataLocalProgramsMicrosoft VS CodeCode.exe" Directory: C:UsersUserAppDataLocalProgramsMicrosoft VS Code SignerCertificate Status Path ----------------- ------ ---- 8740DF4ACB749640AD318E4BE842F72EC651AD80 Valid Code.exe
Bạn có thể chuyển đầu ra sang Format-List.
Mẹo nhanh về PowerShell:
Có rất nhiều thông tin nhưng bạn cần chỉ quan tâm đến các thuộc tính SignerCertificate và Status. Bạn có thể thêm tham số -Property sau Format-List và chỉ định thuộc tính nào bạn muốn.
PS C:UsersUser > Get-AuthenticodeSignature "C:UsersUserAppDataLocalProgramsMicrosoft VS CodeCode.exe" | Format-List SignerCertificate : [Subject] CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US [Issuer] CN=Microsoft Code Signing PCA 2011, O=Microsoft Corporation, L=Redmond, S=Washington, C=US [Serial Number] 33000002528B33AAF895F339DB000000000252 [Not Before] 9/2/2021 11:32:59 AM [Not After] 9/1/2022 11:32:59 AM [Thumbprint] 8740DF4ACB749640AD318E4BE842F72EC651AD80 TimeStamperCertificate : [Subject] CN=Microsoft Time-Stamp Service, OU=Thales TSS ESN:D082-4BFD-EEBA, OU=Microsoft Ireland Operations Limited, O=Microsoft Corporation, L=Redmond, S=Washington, C=US [Issuer] CN=Microsoft Time-Stamp PCA 2010, O=Microsoft Corporation, L=Redmond, S=Washington, C=US [Serial Number] 330000018FF351A8EB5A72DDCC00010000018F [Not Before] 10/28/2021 12:27:46 PM [Not After] 1/26/2023 11:27:46 AM [Thumbprint] 3E4D2F820476E748070746A02695D1605B419A6A Status : Valid StatusMessage : Signature verified. Path : C:UsersUserAppDataLocalProgramsMicrosoft VS CodeCode.exe SignatureType : Authenticode IsOSBinary : False
PS C:UsersUser > Get-AuthenticodeSignature "C:UsersUserAppDataLocalProgramsMicrosoft VS CodeCode.exe" | Format-List -Property Status, SignerCertificate Status : Valid SignerCertificate : [Subject] CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US [Issuer] CN=Microsoft Code Signing PCA 2011, O=Microsoft Corporation, L=Redmond, S=Washington, C=US [Serial Number] 33000002528B33AAF895F339DB000000000252 [Not Before] 9/2/2021 11:32:59 AM [Not After] 9/1/2022 11:32:59 AM [Thumbprint] 8740DF4ACB749640AD318E4BE842F72EC651AD80
Nếu bạn thích GUI hơn, thì bạn có thể xem vàp thuộc tính tệp và xem chứng chỉ ở đó.
Cách thứ hai
Công cụ thứ hai là SignTool từ Windows SDK. Không giống như Get-AuthenticodeSignature, SignTool có thể xác minh chứng chỉ của tệp bằng cách kiểm tra chính sách driver Windows (mặc định) hoặc Chính sách xác thực mặc định. SignTool yêu cầu SDK Windows, vì vậy bạn cần cài SDK đó trước.
https://developer.microsoft.com/en-us/windows/downloads/windows-sdk/
Tuỳ chọn /pa
sử dụng Chính sách xác thực mặc định. Nếu nó không được sử dụng, SignTool sẽ mặc định sử dụng chính sách driver Windows để xác minh nhưng có thể xảy ra lỗi nếu chữ ký sử dụng chứng chỉ số, như tệp dưới đây.
Không có /pa
PS C:UsersUser > & "C:Program Files (x86)Windows Kitsbin.0.19041.0x64signtool.exe" verify "C:UsersUserAppDataLocalProgramsMicrosoft VS CodeCode.exe" File: C:UsersUserAppDataLocalProgramsMicrosoft VS CodeCode.exe Index Algorithm Timestamp ======================================== SignTool Error: A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider. Number of errors: 1
Có /pa
PS C:UsersUser > & "C:Program Files (x86)Windows Kitsbin.0.19041.0x64signtool.exe" verify /pa "C:UsersUserAppDataLocalProgramsMicrosoft VS CodeCode.exe" File: C:UsersUserAppDataLocalProgramsMicrosoft VS CodeCode.exe Index Algorithm Timestamp ======================================== 0 sha256 RFC3161 Successfully verified: C:UsersUserAppDataLocalProgramsMicrosoft VS CodeCode.exe
Copy chứng chỉ số từ app này sang app khác
SigThief là công cụ để sao chép một chứng chỉ và áp dụng nó vào một tệp khác (tệp .exe, .cab, .dll, .ocx, .msi, .xpi và .xap) và phần mềm kernel-mode. Ví dụ bạn có thể áp dụng chứng chỉ Microsoft cho Mimikatz. Bản thân công cụ này không thêm chữ ký hợp lệ vào một tệp và mình sẽ nói rõ hơn ở phần sau, nhưng mục đích của nó là để kiểm tra các phần mềm AV để xem cách chúng ưu tiên các CA và liệu chúng có kiểm tra tính hợp lệ của chữ ký hay không.
Sử dụng SigThief
Bản thân công cụ này rất đơn giản. Lấy chữ ký từ một tệp và thêm nó vào một tệp khác. Có các tùy chọn khác như trích xuất chữ ký và lưu nó để sử dụng cho sau này, có thể áp dụng cùng một chữ ký vào nhiều tệp.
Trong ví dụ này, mình sẽ chỉ cho bạn cách lấy chứng chỉ từ VS Code và sao chép vào Mimikatz. Mimikatz ban đầu chưa được ký chứng chỉ số, vì vậy để nó không bị phát hiện, thì bạn nên cấy chứng chỉ.
PS C:UsersUser > Get-AuthenticodeSignature "C:UsersUserDownloadsmimikatz_trunkx64mimikatz.exe" Directory: C:UsersUserDownloadsmimikatz_trunkx64 SignerCertificate Status Path ----------------- ------ ---- NotSigned mimikatz.exe
PS C:ToolsSigThief > python .sigthief.py -i "C:UsersUserAppDataLocalProgramsMicrosoft VS CodeCode.exe" -t "C:UsersUserDownloadsmimikatz_trunkx64mimikatz.exe" -o mimicode.exe !! New Version available now for Dev Tier Sponsors! Sponsor here: https://github.com/sponsors/secretsquirrel Output file: mimicode.exe Signature appended. FIN. PS C:ToolsSigThief > .mimicode.exe ...#####. mimikatz 2.2.0 (x64) #19041 Sep 19 2022 17:44:08 ..## ^ ##. "A La Vie, A L'Amour" - (oe.eo) .## / ## /*** Benjamin DELPY `gentilkiwi` ( [email protected] ) ## / ## > https://blog.gentilkiwi.com/mimikatz '## v ##' Vincent LE TOUX ( [email protected] ) '#####' > https://pingcastle.com / https://mysmartlogon.com ***/ mimikatz # exit Bye!
PS C:ToolsSigThief > Get-AuthenticodeSignature .mimicode.exe Directory: C:ToolsSigThief SignerCertificate Status Path ----------------- ------ ---- 8740DF4ACB749640AD318E4BE842F72EC651AD80 HashMismatch mimicode.exe
Chứng chỉ code.exe đã được sao chép sang mimikatz.exe và một tệp nhị phân mới đã được tạo.
Bây giờ tệp này có thể được tải lên VT, hoặc thử nghiệm với AV trên hệ thống của riêng bạn,… Mục tiêu là để xem AV có quét được tệp thực thi độc hại khi nó có chữ ký từ một bên đáng tin cậy hay không.
Nhưng chỉ vì nó được ký từ một bên đáng tin cậy không có nghĩa là tệp thực thi đó hợp pháp. Tương tự như HTTPS, kết nối của bạn riêng tư chứ không có nghĩa là trang web bạn đang truy cập là an toàn.
Với mimicode.exe hiện có chứng chỉ VS Code, nó có vẻ hợp pháp. Nhìn vào SignerCertificate của micecode.exe so với code.exe
PS C:UsersUser > Get-AuthenticodeSignature "C:UsersUserAppDataLocalProgramsMicrosoft VS CodeCode.exe" Directory: C:UsersUserAppDataLocalProgramsMicrosoft VS Code SignerCertificate Status Path ----------------- ------ ---- 8740DF4ACB749640AD318E4BE842F72EC651AD80 Valid Code.exe
Mình nói có vẻ vì nhiều lý do. Như mình đã đề cập trước đây, bản thân công cụ này không thêm chữ ký hợp lệ vào tệp. Nó có ghi rõ ràng trong Digital Signature Details.
PS C:UsersUser > & "C:Program Files (x86)Windows Kitsbin.0.19041.0x64signtool.exe" verify /pa "C:ToolsSigThiefmimicode.exe" File: C:ToolsSigThiefmimicode.exe Index Algorithm Timestamp ======================================== SignTool Error: WinVerifyTrust returned error: 0x80096010 The digital signature of the object did not verify. Number of errors: 1
Không giống như xác minh thành công từ code.exe, lỗi này đề cập đến WinVerifyTrust. Đây là một chức năng trong CryptoAPI thực hiện hành động xác minh độ tin cậy trên một đối tượng được chỉ định. Đây là lý do tại sao SignTool lại quan trọng vì nó đang thực hiện một hành động, không chỉ nhận một giá trị. Dữ liệu được chuyển đến một nhà cung cấp tin cậy để kiểm tra dữ liệu đó có dựa trên danh sách tin cậy chứng chỉ hay không. Mã băm của tệp không khớp với mã băm được lưu trữ trong chữ ký điện tử. Đây thực chất là những gì lệnh xác minh đang thực hiện trong SignTool.
Trong hình trên, bạn cũng có thể nhận thấy biểu tượng tệp cũng giống như Mimikatz.
Các thuộc tính tệp cũng hiển thị rất nhiều manh mối:
- File description
- Product name
- Original filename
PS C:Tools > Get-Item C:ToolsSigThiefmimicode.exe | select-object -property * PSPath : Microsoft.PowerShell.CoreFileSystem::C:ToolsSigThiefmimicode.exe PSParentPath : Microsoft.PowerShell.CoreFileSystem::C:ToolsSigThief PSChildName : mimicode.exe PSDrive : C PSProvider : Microsoft.PowerShell.CoreFileSystem PSIsContainer : False Mode : -a---- VersionInfo : File: C:ToolsSigThiefmimicode.exe InternalName: mimikatz OriginalFilename: mimikatz.exe FileVersion: 2.2.0.0 FileDescription: mimikatz for Windows Product: mimikatz ProductVersion: 2.2.0.0 Debug: False Patched: False PreRelease: True PrivateBuild: True SpecialBuild: True Language: English (United States) BaseName : mimicode Target : {} LinkType : Name : mimicode.exe Length : 1365416 DirectoryName : C:ToolsSigThief Directory : C:ToolsSigThief IsReadOnly : False Exists : True FullName : C:ToolsSigThiefmimicode.exe Extension : .exe CreationTime : 2/13/2023 10:18:09 AM CreationTimeUtc : 2/13/2023 6:18:09 PM LastAccessTime : 2/13/2023 6:38:31 PM LastAccessTimeUtc : 2/14/2023 2:38:31 AM LastWriteTime : 2/13/2023 10:18:09 AM LastWriteTimeUtc : 2/13/2023 6:18:09 PM Attributes : Archive
Các cuộc tấn công sử dụng kỹ thuật này
MITRE Technique
T1588.003 – Obtain Capabilities: Code Signing Certificates
Mình đã trình bày rất nhiều cách để kiểm tra xem chữ ký có hợp lệ hay không và dễ dàng nhận ra rằng tệp thực thi “đáng tin cậy” đang được chạy có thực sự độc hại hay không, nhưng điều đó không có nghĩa là kỹ thuật này dễ dàng phòng tránh. Các chứng chỉ bị đánh cắp được thu thập từ các bên đáng tin cậy và sau đó đôi khi được bán trên Dark Web thông qua các trang thương mại điện tử. Nhưng cũng có thể là kết quả của việc lưu trữ chứng chỉ không đúng cách.
LAPSUS$
Vào tháng 3 năm 2022, LAPSUS$ đã sử dụng chứng chỉ ký mã Nvidia bị đánh cắp để ký phần mềm độc hại và cho phép tải driver độc hại trong Windows. Các chứng chỉ này đã hết hạn, nhưng Windows vẫn cho phép sử dụng chúng cho mục đích ký driver. Một số phần mềm độc hại được sử dụng trong hoạt động này bao gồm CS beacons, Mimikatz, backdoors và RAT. Tất cả đều được ký hợp pháp.
Biện pháp giảm thiểu ở đây là định cấu hình các chính sách Kiểm soát ứng dụng của Windows Defender để kiểm soát những driver nào có thể được tải.
Palmerworm
Palmerworm (BlackTech) là một nhóm gián điệp đã sử dụng chứng chỉ ký mã bị đánh cắp để ký các payload của mình.
Trong một chiến dịch khác, BlackTech đã sử dụng backdoor Plead được ký bằng chứng chỉ ký mã hợp lệ của D-Link Corporation. Chứng chỉ này đã được sử dụng để ký phần mềm D-Link không độc hại. Các mẫu khác sử dụng chứng chỉ đã hết hạn của một công ty Đài Loan có tên là Changing Information Technology Inc. Công ty này ban đầu đã bị xâm phạm trước để lấy chứng chỉ.
MegaCortex
MegaCortex ransomware đã rất bận rộn vào năm 2019 với bốn phiên bản được phát triển từ tháng 1 đến tháng 11. Họ sử dụng chứng chỉ ký mã được cấp cho các công ty giả mạo.
- MegaCortex v1: “3AN LIMITED”
- MegaCortex v2: “ABADAN PIZZA LTD”
- MegaCortex v3: “LYUKS ELIT, LTD” và “FELIX MEDIA PTY LTD”
- MegaCortex v4: “MURSA PTY LTD
Ryuk
TheDFIRReport đã viết về một chiến dịch của Ryuk vào tháng 11 năm 2020, trong đó Ryuk sẽ gửi một email lừa đảo có chứa liên kết Google Drive tải xuống backdoor Bazar Loader. Trình tải đã sử dụng chứng chỉ ký mã do Digicert thuộc tổ chức NOSOV SP Z O O ký.
OutSteel
Một chủ đề email có nội dung “Báo cáo về việc phạm tội”. Khi nạn nhân nhấp vào các biểu tượng, nó sẽ chạy các lệnh JavaScript độc hại được nhúng trong tài liệu. Tệp thực thi được JavaScript tải xuống là một Trojan, mà các nhà phát triển của nó đã ký bằng chứng chỉ “Electrum Technologies GmbH”. Tổ chức này có liên quan đến ví Electrum Bitcoin.Hầu hết các tác nhân đe dọa xâm nhập một công ty và đánh cắp chứng chỉ và đôi khi bán lại chứng chỉ trên các trang web ngầm. Vào năm 2018, TrendMicro đã báo cáo rằng các chứng chỉ EV (Xác thực mở rộng) lừa đảo đã được rao bán trên các diễn đàn. Chứng chỉ giả mạo cũng được cung cấp bởi các CA hợp pháp bắt chước một tổ chức hợp pháp. Một ví dụ là một nhà môi giới tài chính người Nga đã trở thành mục tiêu của tội phạm mạng khi sử dụng chứng chỉ gian lận cho phần mềm tống tiền Razy. Vậy còn OSINT thì sao? Bill Demirkapi đã đề cập đến một kỹ thuật mã nguồn mở tuyệt vời trong bài nói chuyện về BH/DC. Anh ấy đã sử dụng GrayhatWarfare để tìm kiếm các chứng chỉ bị rò rỉ công khai từ các bộ chứa S3 bằng cách lọc các phần mở rộng PFX và P12 và đã tìm thấy hơn 6.000 kết quả.
Kết luận
Lạm dụng chứng chỉ số không phải là mới. Chỉ trong vài năm qua, nó đã được chứng minh là một phương pháp hiệu quả để vượt qua một số biện pháp kiểm soát bảo mật nhất định để cho phép phần mềm độc hại chạy và trông có vẻ an toàn. SigThief là một công cụ kiểm tra tuyệt vời. Bắt buộc phải bảo mật các khóa riêng trong HSM để ẩn và bảo vệ tài liệu mật mã vì chúng yêu cầu quyền truy cập vật lý để lấy khóa. Xác thực chứng chỉ trước khi sử dụng chúng để ký mã và kiểm tra xem mã bạn đang ký có chứa lỗ hổng bảo mật hoặc phần mềm độc hại hay không. Cuối cùng, thực hiện quy trình quản lý vòng đời chứng chỉ. Đây là một quá trình dài nhưng đảm bảo các chứng chỉ bị thiếu, hết hạn, bị xâm phạm hoặc không được sử dụng sẽ bị thu hồi, gia hạn hoặc thay thế.