cấu trúc password sever hash tài liệu, giáo án, bài giảng , luận văn, luận án, đồ án, bài tập lớn về tất cả các lĩnh vực...
ba`i nay` ben HVA post qua day cho dzui Dùng Debugger để phân tích Serv-u FTP khởi tạo như một service - ServUDaemon.exe thường là với quyền Administrator, 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àn toà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 ḍò : Trong file ServUDaemon.ini mỗi username được chia thành từng section : [USER=test|1] Password=ib0AD10648F17E9E8D1FF316C1BA75105A HomeDir=c:\nc RelPaths=1 TimeOut=600 Access1=c:\nc|RWAMELCDP Username, password, start home dir, relpaths ?? là cái gì kô biết, Timeout cho mỗi session, 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 Service Serv-u và thường là Admin. Password “ib0AD10648F17E9E8D1FF316C1BA75105A” bạn có thể nhận thấy ngay đâ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 thì Hash: - x có thể là một dữ liệu bất kỳ - 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 x1<>x Do vậy để crack được một password lưu dưới dạng hash bắt buộc ta phải dùng kiể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ấy chuỗi hash thay đổi .Trong khi đó nếu là hash thông 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] ở 2 byte đầu. Như vậy serv-u đă biến đổi như thế nào đó. Disassembly Ngoài một số DLL của Win, Serv-u daemon c̣n dùng một vài DLL như BugSlayerUtil.dll, libeay32.DLL, ssleay32.DLL, TZOLIBR.DLL, lên google search th́ 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 Nightmare Connected to nightmare. 220 Serv-U FTP Server v4.0 for WinSock ready User (nightmare:(none)): test 331 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ủa Daemon Gõ vào 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ỗi ib0AD10648F17E9E8D1FF316C1BA75105A 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àm sinh 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 cho username, =Str cho 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 ‘ -> Sao chép 2 byte đầu trước khi bị hash .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] ; Tạo 1 chuỗi mới .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 ebp Ta 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ặc SHA-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_58B1E0 Trong sub_58B1E0 có một mớ lằng nhằng nhưng ta chú ý nhất đến sub_58A809 trong 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ệt 0D76AA478h, 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 subgenhash Vậy ta thấy một array lưu các số - chính là hash password .text:004788B5 mov cl, [ebx] .text:004788B7 add esp, 8 .text:004788BA mov [esi], cl .text:004788BC mov edx, esi .text:004788BE mov al, [ebx+1] .text:004788C1 add edx, 2 .text:004788C4 mov [esi+1], al .text:004788C7 push 10h .text:004788C9 push edx .text:004788CA call conArr2Str Chuyển array ra chuối Kết quả: Như vậy hàm genhash đă tạo ra một hash bằng cách là lấy 2 byte đầu của password hash trong file .ini rồi concat với password bạn nhập vào sau đó qua hàm sinh hash tạo ra chuỗi sau đó tiến hành kiểm tra với chuỗi trong file .ini Bây giờ việc xác định thuật toán sinh hash – ta có thể đọc kĩ đoạn code trên ,dễ dàng phán đoán ra là kiểu MD5. Kiểm tra lại bằng Damn Hash calculator, vd: qctest sẽ có md5 là 80F5FC9FA7A8107EE3311C9F10890981 copy vào file .ini ghi đè lên section password trong user test : qc80F5FC9FA7A8107EE3311C9F10890981. Nightmare@C:\$ftp nightmare Connected to nightmare. 220 Serv-U FTP Server v4.0 for WinSock ready User (nightmare:(none)): test 331 User name okay, need password. Password: 230 User logged in, proceed. okie Brute Force password crack : Ta dùng mdcrack : mdcrack –b qc 80F5FC9FA7A8107EE3311C9F10890981 hoặc dùng John ripper với parammeter : -format:MD Nhưng nói chung là 2 chương tŕnh như nhau (với MD5 ) tôi đo thấy hash/s tương đương tuy rằng john có nhỉnh hơn tí Lời cuối: Việc dùng Softice, BoundsChecker trong môi trường Win ta hoàn toàn có thể chủ động để kiểm tra, phân tích các chương tŕnh và đặc biệt cực ḱ hữu dụng trong debug buffer overflow. thank for Nightmare . Kết quả: Như vậy hàm genhash đă tạo ra một hash bằng cách là lấy 2 byte đầu của password hash trong file .ini rồi concat với password bạn nhập vào sau đó qua hàm sinh hash tạo ra chuỗi sau đó. Admin. Password “ib0AD10648F17E9E8D1FF316C1BA75105A” bạn có thể nhận thấy ngay đâ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 thì Hash: -. crack được một password lưu dưới dạng hash bắt buộc ta phải dùng kiể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ấy chuỗi hash thay đổi .Trong