Tham khảo tài liệu dùng debugger để phân tích cấu trúc password hash của serv, công nghệ thông tin, an ninh - bảo mật phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
Nội dung trích xuất từ tài liệu:
Dùng Debugger để phân tích cấu trúc password hash của ServDùng Debugger để phân tích cấu trúc password hash của Serv-u FTPver 4.0Written by Nightmarehawbuckguy@yahoo.comGiới thiệu : Serv-u FTP+ Bạn có thể dễ nhận thấy rằng chương trnh Serv-u FTP là một ftp server khá ́phổ biến, có rất nhiều các website dùng chương trnh này, vd: www.rfd.gov.vn, ́www.vietlaw.gov.vn .. có lẽ các bác ở VDC dùng chương trnh này khá nhiều. ́+ Serv-u FTP khởi tạo như một service - ServUDaemon.exe thường là với quyềnAdministrator, password được lưu dưới dạng hash trong file ServUDaemon.ini vàhơi có biến tấu đi đôi chút, và nếu như bạn có lấy được chuỗi hash đó th́ hoàntoàn có thể crack được.+ Phiên bản 4.0 không giống như những phiên bản cũ trước đó -password có thểdễ dàng crack được bằng “John ripper” ̣Thăm dò :Trong file ServUDaemon.ini mỗi username được chia thành từng section :[USER=test|1]Password=ib0AD10648F17E9E8D1FF316C1BA75105AHomeDir=c:\ncRelPaths=1TimeOut=600Access1=c:\nc|RWAMELCDPUsername, password, start home dir, relpaths ?? là cái ǵ kô biết, Timeout cho mỗisession, Quyền : Read, Write... Trong đó nếu có quyền Execute : “E” bạn có th ểchạy command shell trên server tất nhiên là với quyền của user start ServiceServ-u và thường là Admin.Password “ib0AD10648F17E9E8D1FF316C1BA75105A” bạn có thể nh ận th ấyngay đây là password được lưu dưới dạng Hash.Hash (–băm) là một thuật ngữ trong đó nếu gọi y=f(x) là một hàm Hash th́ :- x có thể là một dữ liệu bất ḱ- nhưng kết quả y là một chuỗi có dộ dài xác định- không tồn tại y=f(x1)=f(x) với x1xDo vậy để crack được một password lưu dưới dạng hash bắt buộc ta phải dùngkiểu brute force.Trước hết ta thử đổi pass trong Serv-Admin (tất nhiên vẫn pass như cũ vd: test)th́ thấy chuỗi hash thay đổi .Trong khi đó nếu là hash th́ thường không đổi vàkhông có các kư tự 0..9,a..f (hexa) thế nhưng ta để ư thấy có hai kí tự [a..z] ở 2byte đầu.Như vậy serv-u đă biến đổi như thế nào đó.DisassemblyNgoài một số DLL của Win, Serv-u daemon cn dùng một vài DLL như ̣BugSlayerUtil.dll, libeay32.DLL, ssleay32.DLL, TZOLIBR.DLL, lên google searchth́ có thể thấy libeay32.dll là một DLL - Crypt Lib (trong file có một số keyword:Des,MD5..)+ Ta tiến hành dịch ngược file daemon.Debug:Có thể khi ftp server request user/password th́ SrvuDaemon sẽ open file .ini đểđọc pass hoặc user.Ta dùng Softice đặt breakpoint hàm CreateFileA.Nightmare#/C:\ftp NightmareConnected to nightmare.220 Serv-U FTP Server v4.0 for WinSock ready...User (nightmare:(none)): test331 User name okay, need password.Password:230 User logged in, proceed.ftp>khi ta nhập user (user có trong file .ini ) th́ softice sẽ break vào process củaDaemongơ d@(esp+4) để đọc tên đuợc truyền vào CreateFileA.-> Không thấy tên file .ini,như vậy daemon đă load hết vào memory khi start.Bằng cách khi đă break vào daemon process th́ ta search xem trong bộ nhớ chuỗiib0AD10648F17E9E8D1FF316C1BA75105A và đặt bpm tại những điểm đó.Sau khi phân tích một vài lần ta có thể nhận thấy .text:00478850 –đây là một hàmsinh ra hash.text:00478850 genhash proc near ; CODE XREF: sub_477A88+1E4p.text:00478850 ; sub_477CD4+1A3p.text:00478850 ; sub_4E3E50+323Fp.text:00478850 ; sub_5106E4+1F27p.text:00478850 ; sub_55F1B8+AC7p.text:00478850.text:00478850 arrayNum = dword ptr -58h.text:00478850 str = dword ptr 8 (first parammeter pass to genhash function).text:00478850 first2b = dword ptr 0Ch (second)-> Str = String ( = NULL if enter username, =Str if enter password).text:00478850 push ebp.text:00478851 mov ebp, esp.text:00478853 add esp, 0FFFFFFA8h.text:00478856 push ebx.text:00478857 push esi.text:00478858 mov ebx, [ebp+first2b].text:0047885B mov esi, offset unkhash0 ‘ global var array.text:00478860 push 2 ; maxlen.text:00478862 push ebx ; first2b.text:00478863 push esi ; unkhash.text:00478864 call _strncpy ‘ -> copy first 2 byte of password to unkhash.text:00478869 add esp, 0Ch.text:0047886C lea eax, [esi+2].text:0047886F push 0F7h ; maxlen.text:00478874 push [ebp+str] ; src.text:00478877 push eax ; dest.text:00478878 call _strncpy ; unkhash=first2b+str.text:0047887D add esp, 0Ch.text:00478880 lea edx, [ebp+arrayNum] ; create new array.text:00478883 mov byte ptr [esi+0F9h], 0.text:0047888A push edx.text:0047888B call newArray-> Newarray sub.text:0058B1B4 push ebp.text:0058B1B5 mov ebp, esp.text:0058B1B7 mov eax, [ebp+arg_0].text:0058B1BA xor edx, edx.text:0058B1BC mov [eax+14h], edx.text:0058B1BF mov [eax+10h], edx.text:0058B1C2 mov dword ptr [eax], 67452301h.text:0058B1C8 mov dword ptr [eax+4], 0EFCDAB89h.text:0058B1CF mov dword ptr [eax+8], 98BADCFEh.text:0058B1D6 mov dword ptr [eax+0Ch], 10325476h.text:0058B1DD pop ebpTa có thể thấy serv-u tạo một array có dạng : long () x=( 01234567,89ABCDEF,09876543...)--> Dễ dàng nhận thấy đây là một phần khởi tạo của thuật toán MD5 . hoặcSHA-1.. ???.text:00478890 pop ecx.text:00478891 push esi ; s.text:00478892 call _strlen ;->length(unkhash).text:00478897 pop ecx.text:00478898 push eax ; int.text:00478899 push esi ; src.text:0047889A lea ecx, [ebp+arrayNum].text:0047889D push ecx ; int.text:0047889E call sub_58B1E0Trong sub_58B1E0 có một mớ lằng nhằng nhưng ta chú ư nhất đến sub_58A809trong này có một doạn code rất dài toàn là shr,shr,add .. với các giá trị dặc biệt0D76AA478h, 0E8C7B756h...text:004788A3 add esp, 0Ch.text:004788A6 lea eax, [ebp+arrayNum].text:004788A9 mov edx, esi.text:004788AB add edx, 2.text:004788AE push eax.text:004788AF push edx.text:004788B0 call subgenhashD@eax ta thấy một array lưu các số - chính ...