显示标签为“漏洞”的博文。显示所有博文
显示标签为“漏洞”的博文。显示所有博文

2011年10月5日星期三

[轉載]飛秋0day


Author: instruder of Code Audit Labs of vulnhunt.com
version:飛秋2.4 修正版

//閃屏振動 數據包


代碼:
00136A70 31 5F 6C 62 74 34 5F 30 23 31 33 31 23 30 30 31 1_lbt4_0#131#001
00136A80 42 32 34 35 37 30 39 42 31 23 30 23 30 23 30 3A B245709B1#0#0#0:
00136A90 31 33 31 32 34 39 31 30 31 39 3A 61 73 6D 3A 41 1312491019:asm:A
00136AA0 53 4D 4B 45 52 4E 45 2D 36 30 44 46 36 46 3A 32 SMKERNE-60DF6F:2
00136AB0 30 39 09

asm:ASMKERNE-60DF6F 是我的主機名,冒號後面是發送的控制命令
將209改成200 即可導致飛秋崩潰


同時控制命令
147
198
199
都有問題

發送200命令後,導致飛秋堆棧溢出了,但是貌似源不可控.


漏洞代碼:

代碼:
00490D66 8B8424 20400000 mov eax, dword ptr [esp+4020]
00490D6D C78424 14400000>mov dword ptr [esp+4014], 0
00490D78 3D 00400000 cmp eax, 4000
00490D7D 7E 18 jle short 00490D97//有符號比較..
00490D7F 8D4C24 04 lea ecx, dword ptr [esp+4]
00490D83 C78424 14400000>mov dword ptr [esp+4014], -1
00490D8E E8 3D3DF7FF call 00404AD0
00490D93 33C0 xor eax, eax
00490D95 EB 63 jmp short 00490DFA
00490D97 8BC8 mov ecx, eax
00490D99 56 push esi
00490D9A 8BB424 20400000 mov esi, dword ptr [esp+4020]
00490DA1 8BD1 mov edx, ecx
00490DA3 8D7C24 10 lea edi, dword ptr [esp+10]
00490DA7 6A 00 push 0
00490DA9 C1E9 02 shr ecx, 2
00490DAC F3:A5 rep movs dword ptr es:[edi], dword ptr [esi]//掛了..
00490DAE 8BCA mov ecx, edx
00490DB0 6A 00 push 0
00490DB2 83E1 03 and ecx, 3
00490DB5 6A 22 push 22
00490DB7 F3:A4 rep movs byte ptr es:[edi], byte ptr [esi]

2011年9月26日星期一

【轉載】簡單分析mplayer播放器讀取.m3u格式文件漏洞


作 者: kindsjay
時 間: 2011-09-01,11:04:39
鏈接: http://bbs.pediy.com/showthread.php?t=139600

前言:這段時間一直在努力學習漏洞分析,並參考了failwest大牛製作<0day第二版>, 暴風m3u文件讀取漏洞(看雪網->鮮果也曾對其進行分析),小弟不才,只能跟著大牛後面跑.
附:暴風m3u分析,是在同事dge的幫助下完成的調試,乘熱打鐵,自己分析了同一類型(mplayer播放器)漏洞.也算是對自己知識的總結,第一次寫文章,還請大家指責批評,不清楚的地方可以發郵件問我

測試環境:
  windows xp sp3_cn (實體機測試,沒有使用虛擬機)
   ollyice看雪版
  poc和測試軟件版本見:http://www.exploit-db.com/exploits/17565/
  

漏洞觸發過程分析:
      ollyice 附加mplayer.exe進程,設置OD調試斷點(工具欄-->選項-->調試選項--->異常標籤)
------------------------------
   忽略在Kernel32中的內存訪問異常,並勾選以下選項
       int3 中斷
       單步中斷
       整數除以0
           無效或特權指令
       所有FPU異常
 -----------------------------------------

    將生成的m3u格式文件拖拽到mplayer播放器窗口中,F9運行,OD會自動下斷在程序異常信息信息處.
      觀察od堆棧信息窗口,查看棧信息

0022E948 00000000
0022E94C 00561760 返回到mplayer.00561760 來自<jmp.&msvcrt.strcpy>(可疑)
0022E950 0022EBB8 ASCII "http:// AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"...
0022E954 003FD5C8 ASCII "http:// AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"...
0022E958 00000000
0022E95C 00000000
0022E960 00000000
0022E964 0022E974
0022E968 00000000
0022E96C 7C930098 返回到ntdll.7C930098 來自ntdll.7C922AB0


可以發現jmp.&msvcrt.strcpy(可疑,再後面進行證實),鼠標右鍵點擊該行,選擇"反彙編窗口中跟隨",來到彙編主窗體,對該函數下斷點,重新載入m3u至mplayer,
F9來到斷點處,可以查看下堆棧信息和彙編信息

------------------------------------------
堆棧信息:
0022E950 0022EBB8 |dest = 0022EBB8(目標地址)
0022E954 003FD5C8 \src = "http:// AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"...(源地址)
0022E958 00000000
0022E95C 00000000
0022E960 00000000
0022E964 0022E974
0022E968 00000000
0022E96C 7C930098 返回到ntdll.7C930098 來自ntdll.7C922AB0

彙編主窗體信息:
00561754 |. 895C24 04 mov dword ptr [esp+4], ebx ; ||
00561758 |. 890424 mov dword ptr [esp], eax ; ||
0056175B |. E8 A8032900 call <jmp.&msvcrt.strcpy> ; |\strcpy
00561760 |. 8D9424 680200>lea edx, dword ptr [esp+268] ; |
00561767 |. C74424 04 2F0>mov dword ptr [esp+4], 2F ; |
0056176F |. 891424 mov dword ptr [esp], edx ; |
00561772 |. E8 C1032900 call <jmp.&msvcrt.strrchr> ; \strrchr
-----------------------------------------------

F7進入call:
   77C16030 > 57 push edi
77C16031 8B7C24 08 mov edi, dword ptr [esp+8]
77C16035 EB 6A jmp short 77C160A1
77C16037 8DA424 00000000 lea esp, dword ptr [esp]
77C1603E 8BFF mov edi, edi
77C16040 > 8B4C24 04 mov ecx, dword ptr [esp+4]
77C16044 57 push edi
77C16045 F7C1 03000000 test ecx, 3
77C1604B 74 0F je short 77C1605C
77C1604D 8A01 mov al, byte ptr [ecx]
77C1604F 41 inc ecx
77C16050 84C0 test al, al
77C16052 74 3B je short 77C1608F
77C16054 F7C1 03000000 test ecx, 3
77C1605A ^ 75 F1 jnz short 77C1604D
77C1605C 8B01 mov eax, dword ptr [ecx]
77C1605E BA FFFEFE7E mov edx, 7EFEFEFF
77C16063 03D0 add edx, eax
77C16065 83F0 FF xor eax, FFFFFFFF
77C16068 33C2 xor eax, edx
77C1606A 83C1 04 add ecx, 4
77C1606D A9 00010181 test eax, 81010100
77C16072 ^ 74 E8 je short 77C1605C
77C16074 8B41 FC mov eax, dword ptr [ecx-4]
77C16077 84C0 test al, al
77C16079 74 23 je short 77C1609E
77C1607B 84E4 test ah, ah
77C1607D 74 1A je short 77C16099
77C1607F A9 0000FF00 test eax, 0FF0000
77C16084 74 0E je short 77C16094
77C16086 A9 000000FF test eax, FF000000
77C1608B 74 02 je short 77C1608F
77C1608D ^ EB CD jmp short 77C1605C
77C1608F 8D79 FF lea edi, dword ptr [ecx-1]
77C16092 EB 0D jmp short 77C160A1
77C16094 8D79 FE lea edi, dword ptr [ecx-2]
77C16097 EB 08 jmp short 77C160A1
77C16099 8D79 FD lea edi, dword ptr [ecx-3]
77C1609C EB 03 jmp short 77C160A1
77C1609E 8D79 FC lea edi, dword ptr [ecx-4]
77C160A1 8B4C24 0C mov ecx, dword ptr [esp+C]
77C160A5 F7C1 03000000 test ecx, 3
77C160AB 74 19 je short 77C160C6
77C160AD 8A11 mov dl, byte ptr [ecx]
77C160AF 41 inc ecx
77C160B0 84D2 test dl, dl
77C160B2 74 64 je short 77C16118
77C160B4 8817 mov byte ptr [edi], dl
77C160B6 47 inc edi
77C160B7 F7C1 03000000 test ecx, 3
77C160BD ^ 75 EE jnz short 77C160AD
77C160BF EB 05 jmp short 77C160C6
77C160C1 8917 mov dword ptr [edi], edx(這裡出現異常)
77C160C3 83C7 04 add edi, 4
77C160C6 BA FFFEFE7E mov edx, 7EFEFEFF
77C160CB 8B01 mov eax, dword ptr [ecx]
77C160CD 03D0 add edx, eax
77C160CF 83F0 FF xor eax, FFFFFFFF
77C160D2 33C2 xor eax, edx
77C160D4 8B11 mov edx, dword ptr [ecx]
77C160D6 83C1 04 add ecx, 4
77C160D9 A9 00010181 test eax, 81010100
77C160DE ^ 74 E1 je short 77C160C1
77C160E0 84D2 test dl, dl
77C160E2 74 34 je short 77C16118
77C160E4 84F6 test dh, dh
77C160E6 74 27 je short 77C1610F
77C160E8 F7C2 0000FF00 test edx, 0FF0000
77C160EE 74 12 je short 77C16102
77C160F0 F7C2 000000FF test edx, FF000000
77C160F6 74 02 je short 77C160FA
77C160F8 ^ EB C7 jmp short 77C160C1
77C160FA 8917 mov dword ptr [edi], edx
77C160FC 8B4424 08 mov eax, dword ptr [esp+8]
77C16100 5F pop edi
77C16101 C3 retn
77C16102 66:8917 mov word ptr [edi], dx
77C16105 8B4424 08 mov eax, dword ptr [esp+8]
77C16109 C647 02 00 mov byte ptr [edi+2], 0
77C1610D 5F pop edi
77C1610E C3 retn
77C1610F 66:8917 mov word ptr [edi], dx
77C16112 8B4424 08 mov eax, dword ptr [esp+8]
77C16116 5F pop edi
77C16117 C3 retn
77C16118 8817 mov byte ptr [edi], dl
77C1611A 8B4424 08 mov eax, dword ptr [esp+8]
77C1611E 5F pop edi
77C1611F C3 retn

可以發現,在調試過程中,紅色地方,就是之前我們捕獲的異常地址處,說明該函數在函數cpy時,發生了溢出


命令:DD 0022EBB8,查看內存信息,內容已經被覆蓋,

0022EBB8 68 74 74 70 3A 2F 2F 20 41 41 41 41 41 41 41 41 http:// AAAAAAAA
0022EBC8 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0022EBD8 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0022EBE8 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0022EBF8 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0022EC08 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0022EC18 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0022EC28 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0022EC38 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA
0022EC48 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41..... AAAAAAAAAAAAAAA.....



原理分析:函數在拷貝的過程中,由於原地址數據超長,導致目標數據出現溢出.
總結:之前我看過failwest和仙果的文章,他們分別是按特徵字符串".m3u"和"Readfile函數"下斷點並進行跟踪,查找異常函數,而我此篇文章卻是直接分析的棧,可能會有些跳躍,大家可自行選擇

2011年9月15日星期四

【轉載】結合init源碼剖析android root提權漏洞(CVE-2010-EASY)


作 者: androider
時 間: 2011-09-04,21:41:26
鏈接: http://bbs.pediy.com/showthread.php?t=139738

轉載請註明出處:http://hi.baidu.com/androidhacker/blog/item/59faabfda34b71f57709d707.html

這篇文章是上一篇博客的後續分析,主要介紹向init進程發送熱拔插信息後init進程的處理流程

首先我們來了解一個數據結構,uevent,如下


代碼:
struct uevent {

    const char *action;

    const char *path;

    const char *subsystem;

    const char *firmware;

    int major;

    int minor;

};
 

內核收到的信息如下,ACTION=addDEVPATH=/../data/local/tmpSUBSYSTEM=firmwareFIRMWARE=../../../data/local/tmp/hotplug
通過如下函數parse_event進行解析


代碼:
static void parse_event(const char *msg, struct uevent *uevent)

{

 

    while(*msg) {

        if(!strncmp(msg, "ACTION=", 7)) {

            msg += 7;

            uevent->action = msg;

        } else if(!strncmp(msg, "DEVPATH=", 8)) {

            msg += 8;

            uevent->path = msg;

        } else if(!strncmp(msg, "SUBSYSTEM=", 10)) {

            msg += 10;

            uevent->subsystem = msg;

        } else if(!strncmp(msg, "FIRMWARE=", 9)) {

            msg += 9;

            uevent->firmware = msg;

        } else if(!strncmp(msg, "MAJOR=", 6)) {

            msg += 6;

            uevent->major = atoi(msg);

        } else if(!strncmp(msg, "MINOR=", 6)) {

            msg += 6;

            uevent->minor = atoi(msg);

        }

         while(*msg++);

    }

}
經過解析之後,u​​event的結構為:
action="add"
path="/../data/local/tmp"
subsystem="firmware"
firmware="../../../data/local/tmp/hotplug"


之後來到處理firmware的核心函數


代碼:
static void process_firmware_event(struct uevent *uevent)

{

    l = asprintf(&root, SYSFS_PREFIX"%s/", uevent->path);

    //root為/sys/../data/local/tmp/=/data/local/tmp/

    

    l = asprintf(&loading, "%sloading", root);

    //loading為/data/local/tmp/loading

    

    l = asprintf(&data, "%sdata", root);

    //data為/data/local/tmp/data 其內容為指向/proc/sys/kernel/hotplug的符號鏈接

    

    l = asprintf(&file, FIRMWARE_DIR"/%s", uevent->firmware);

    //file為/etc/firmware/../../../data/local/tmp/hotplug=/data/local/tmp/hotplug

    

    loading_fd = open(loading, O_WRONLY);

    

    data_fd = open(data, O_WRONLY);

    

    fw_fd = open(file, O_RDONLY);

    

    load_firmware(fw_fd, loading_fd, data_fd);

}

 

最後來到load_firmware函數,把hotplug中的數據寫到/proc/sys/kernel/hotplug中
其內容變為/data/local/tmp/exploid


代碼:
static int load_firmware(int fw_fd, int loading_fd, int data_fd)

{

    while (len_to_copy > 0) {

        char buf[PAGE_SIZE];

 

 

        nr = read(fw_fd, buf, sizeof(buf));

                                                                        

        len_to_copy -= nr;

        while (nr > 0) {

                                                                                              

            nw = write(data_fd, buf + nw, nr);

 

            nr -= nw;

        }

    }

}
 

終於/proc/sys/kernel/hotplug中寫入了我們的惡意程序了,只要再次受到如wifi打開、usb插入等熱拔插信息,內核就會以root權限加載我們的程序再一次執行,從而達到提權的目的