Обсуждение статьи Эксплоит против RPC DCOM (MS03-039)
11.09.2003 15:33:18
Обсуждение статьи
|
|
|
|
11.09.2003 15:33:19
До эксплойта пока не дотягивает. Всего лишь кусок кода. Ждем-с полноценного. Самому дописывать лень.
|
|
|
|
11.09.2003 17:44:46
Ну что тут можно сказать.
Неделю был в отпуске. Вышел на вечерок, почитал и @#$%#@$% ... Краткое резюме - ховайтесь, хлопцы ... |
|
|
|
11.09.2003 19:04:37
Да. Ждем с нетерпением полноценного эксплоита.
|
|
|
|
11.09.2003 23:15:15
да=да=да=да=да=да=да
Ждем=ждем=ждем=ждем |
|
|
|
11.09.2003 23:16:01
у меня уже давно эксплойт валяется... 3 секунды и c:\windows у тебя...
|
|
|
|
11.09.2003 23:56:44
Дааааайте лицензию на xspider за такой замечательный експлойт!! ) Шутка %)
<вырезано> - опубликован эксплоит к 1 dcom уязвимости |
|
|
|
12.09.2003 00:19:55
Иммхо это к DCOM первому, но не ко второй уязвимости[IMG]
|
|
|
|
12.09.2003 00:23:14
Что-то этот от oc192 у меня не сработал с дефолтными оффсетами ни на XP, ни на W2k. Кто-нибудь знает с каким шагом брутфорсить оффсет?
|
|
|
|
12.09.2003 00:28:18
|
|||||
|
|
12.09.2003 00:41:50
Да, обладался, к первому. Сорри %)
|
|
|
|
12.09.2003 10:08:08
Лучше этого я еще ничего не видел:
|
|
|
|
12.09.2003 11:09:41
Он вообще на каком языке написан?
|
|
|
|
12.09.2003 13:30:36
он написан на языке NASL. качаешь интерпретатор nasl с nessus.org и юзаешь.
|
|
|
|
12.09.2003 13:43:21
Люди, а может у кого-нить уже есть эксплоит в привычном виде на С ?
|
|
|
|
12.09.2003 15:35:29
mastodont, не компилится оттуда исходник.
|
|
|
|
14.09.2003 23:09:14
Здесь опубликован только кусок кода. Сам же код скрипта для Nessus'а, естественно, расчитан только на проверку системы на уязвимость и может помочь разве что в организации DoS-аттаки. Для выполнения произвольного кода, к этому делу нужно еще шеллкод прикрутить, для чего надо побрутфорсить (или подебажжить DCOM ) со смещением.
Переписать это дело на С - как два байта отослать , nasl - почти алгоритмический язык "на английском" . Рабочий скрипт ниже: # # The script code starts here # include("smb_nt.inc"); function open_wkssvc(soc, uid, tid) { local_var uid_lo, uid_hi, tid_lo, tid_hi, r; uid_lo = uid % 256; uid_hi = uid / 256; tid_lo = tid % 256; tid_hi = tid / 256; r = raw_string( 0x00, 0x00, 0x00, 0x64, 0xFF, 0x53, 0x4D, 0x42, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x18, 0x07, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, tid_lo, tid_hi, 0x00, 0x28,uid_lo, uid_hi, 0x00, 0x00, 0x18, 0xFF, 0x00, 0xDE, 0xDE, 0x00, 0x0E, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9F, 0x01, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x00, 0x5C, 0x00, 0x77, 0x00, 0x6b, 0x00, 0x73, 0x00, 0x73, 0x00, 0x76, 0x00, 0x63, 0x00, 0x00, 0x00); send(socket:soc, data:r); r = smb_recv(socket:soc, length:4096); if(strlen® < 65)return(NULL); else { fid_lo = ord(r[42]); fid_hi = ord(r[43]); return(fid_lo + (fid_hi * 256)); } } function bind(soc, uid, tid, fid) { local_var uid_lo, uid_hi, tid_lo, tid_hi, fid_lo, fid_hi, r; uid_lo = uid % 256; uid_hi = uid / 256; tid_lo = tid % 256; tid_hi = tid / 256; fid_lo = fid % 256; fid_hi = fid / 256; r = raw_string(0x00, 0x00, 0x00, 0x9C, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00, 0x00, 0x00, 0x00, 0x18, 0x07, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, tid_lo, tid_hi, 0x00, 0x28, uid_lo, uid_hi, 0x00, 0x00, 0x10, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x48, 0x00, 0x54, 0x00, 0x02, 0x00, 0x26, 0x00, fid_lo, fid_hi, 0x59, 0x00, 0x05, 0x5C, 0x00, 0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0B, 0x03, 0x10, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xB8, 0x10, 0xB8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x98, 0xD0, 0xFF, 0x6B, 0x12, 0xA1, 0x10, 0x36, 0x98, 0x33, 0x46, 0xC3, 0xF8, 0x7E, 0x34, 0x5a, 0x01, 0x00, 0x00, 0x00, 0x04, 0x5d, 0x88, 0x8a, 0xeb, 0x1c, 0xc9, 0x11, 0x9f, 0xe8, 0x08, 0x00, 0x2B, 0x10, 0x48, 0x60, 0x02, 0x00, 0x00, 0x00); send(socket:soc, data:r); r = smb_recv(socket:soc, length:4096); return r; } function get_wks_info(soc, uid, tid, fid) { local_var uid_lo, uid_hi, tid_lo, tid_hi, fid_lo, fid_hi, r, name, len; local_var len_hi, len_lo, uname, i, wks, dce, smb; uid_lo = uid % 256; uid_hi = uid / 256; tid_lo = tid % 256; tid_hi = tid / 256; fid_lo = fid % 256; fid_hi = fid / 256; name = "\\" + get_host_ip(); for(i=0;i<strlen(name);i++) { uname += name[i] + raw_string(0); } uname += raw_string(0, 0); if((strlen(name) & 1) == 0)uname += raw_string(0, 0); len = strlen(name) + 1; len_hi = len / 256; len_lo = len % 256; wks = raw_string(0xB0, 0x3D, 0x7F, 0x00, len_lo, len_hi, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, len_lo, len_hi, 0x00, 0x00) + uname + raw_string(0x64, 0x00, 0x00, 0x00); len = 24 + strlen(wks); len_hi = len / 256; len_lo = len % 256; dce = raw_string(0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00, len_lo, len_hi, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00) + wks; smbpipe2 = raw_string( 0x05, 0x5C, 0x00, 0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00) + dce; len = strlen(smbpipe2); len_hi = len / 256; len_lo = len % 256; smbpipe = raw_string(0x26, 0x00, fid_lo, fid_hi, len_lo, len_hi) + smbpipe2; smb = raw_string( 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00, 0x00, 0x00, 0x00, 0x18, 0x07, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, tid_lo, tid_hi, 0x00, 0x28, uid_lo, uid_hi, 0x00, 0x00, 0x10, 0x00, 0x00, strlen(dce) % 256, strlen(dce) / 256, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, strlen(dce) % 256, strlen(dce) / 256, 0x54, 0x00, 0x02, 0x00) + smbpipe; netbios = raw_string(0, 0, strlen(smb) / 256, strlen(smb) % 256) + smb; send(socket:soc, data:netbios); r = smb_recv(socket:soc, length:4096); if(strlen® < 120)return NULL; len = ord(r[120]) + (ord(r[121]) * 256); len --; name = NULL; for(i=124;i<124 + len*2;i+=2) { name += r[i]; } return name; } function get_smb_host_name() { local_var r, soc, uid; if(!get_port_state(139))return NULL; soc = open_sock_tcp(139); if(!soc)return NULL; r = smb_session_request(soc:soc, remote:"*SMBSERVER"); if(!r)return NULL; prot = smb_neg_prot(soc:soc); if(!prot)return NULL; r = smb_session_setup(soc:soc, login:"", password:"", domain:"", prot:prot); if(!r)return NULL; uid = session_extract_uid(reply:r); r = smb_tconx(soc:soc, name:"*SMBSERVER", uid:uid, share:"IPC$"); tid = tconx_extract_tid(reply:r); if(!tid)return NULL; fid = open_wkssvc(soc:soc, uid:uid, tid:tid); r = bind(soc:soc, uid:uid, tid:tid, fid:fid); r = get_wks_info(soc:soc, uid:uid, tid:tid, fid:fid); close(soc); return r; } function dcom_recv(socket) { local_var buf, len; buf = recv(socket:socket, length:10); if(strlen(buf) != 10)return NULL; len = ord(buf[8]); len += ord(buf[9])*256; buf += recv(socket:socket, length:len - 10); return buf; } port = 135; if(!get_port_state(port))port = 593; else { soc = open_sock_tcp(port); if(!soc)port = 593; else close(soc); } if(!get_port_state(port))exit(0); #-------------------------------------------------------------# function hex2raw(s) { local_var i, j, ret; for(i=0;i<strlen(s);i+=2) { if(ord(s[i]) >= ord("0") && ord(s[i]) <= ord("9")) j = int(s[i]); else j = int((ord(s[i]) - ord("a")) + 10); j *= 16; if(ord(s[i+1]) >= ord("0") && ord(s[i+1]) <= ord("9")) j += int(s[i+1]); else j += int((ord(s[i+1]) - ord("a")) + 10); ret += raw_string(j); } return ret; } #--------------------------------------------------------------# function check(req) { local_var soc, bindstr, error_code, r; soc = open_sock_tcp(port); if(!soc)exit(0); bindstr = "05000b03100000004800000001000000d016d0160000000001000000000 send(socket:soc, data:hex2raw(s:bindstr)); r = dcom_recv(socket:soc); if(!r)exit(0); send(socket:soc, data:req); r = dcom_recv(socket:soc); if(!r)return NULL; close(soc); error_code = substr(r, strlen® - 4, strlen® - 1); return error_code; } function check2(req) { local_var soc,bindstr, error_code, r; soc = open_sock_tcp(port); if(!soc)exit(0); bindstr = "05000b03100000004800000001000000d016d0160000000001000000000 send(socket:soc, data:hex2raw(s:bindstr)); r = dcom_recv(socket:soc); if(!r)exit(0); send(socket:soc, data:req); r = dcom_recv(socket:soc); close(soc); if(!r)return NULL; error_code = substr(r, strlen® - 8, strlen® - 5); return error_code; } function check3(req) { local_var soc,bindstr, error_code, r; soc = open_sock_tcp(port); if(!soc)exit(0); bindstr = "05000b03100000004800000002000000d016d0160000000001000000010 send(socket:soc, data:hex2raw(s:bindstr)); r = dcom_recv(socket:soc); if(!r)exit(0); send(socket:soc, data:req); r = dcom_recv(socket:soc); close(soc); if(!r)return NULL; error_code = substr(r, strlen® - 24, strlen® - 21); return error_code; } function check4(req) { local_var soc,bindstr, error_code, r; soc = open_sock_tcp(port); if(!soc)exit(0); bindstr = "05000b03100000004800000002000000d016d0160000000001000000010 send(socket:soc, data:hex2raw(s:bindstr)); r = dcom_recv(socket:soc); if(!r)exit(0); send(socket:soc, data:req); r = dcom_recv(socket:soc); if(!r)return NULL; close(soc); error_code = substr(r, strlen® - 24, strlen® - 21); return error_code; } function check6(req) { local_var soc,bindstr, error_code, r; soc = open_sock_tcp(port); if(!soc)exit(0); bindstr = "05000b031000000048000000deadbeefd016d0160000000001000000000 send(socket:soc, data:hex2raw(s:bindstr)); r = dcom_recv(socket:soc); if(!r)exit(0); send(socket:soc, data:req); r = dcom_recv(socket:soc); close(soc); if(!r)return NULL; error_code = substr(r, strlen® - 24, strlen® - 21); return error_code; } function req5() { local_var name, buf, uname; name = get_smb_host_name(); if(!name)return NULL; name = "\\" + name + "\C$\"; len = strlen(name) + 1; for(i=0;i<strlen(name);i++) { uname += name[i] + raw_string(0); } if((strlen(name) & 1) == 0) uname += raw_string(0, 0); len_lo = len % 256; len_hi = len / 256; buf = raw_string(0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x96, 0x95, 0x2A, 0x8c, 0xDA, 0x6D, 0x4a, 0xb2, 0x36, 0x19, 0xBC, 0xAF, 0x2C, 0x2d, 0xea, 0x30, 0xeb, 0x8F, 0x00, len_lo, len_hi, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, len_lo, len_hi, 0x00, 0x00) + uname + raw_string( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xdc, 0xea, 0x8f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x95, 0x96, 0x95, 0x2A, 0x8C, 0xDA, 0x6D, 0x4a, 0xb2, 0x36, 0x19, 0xbc, 0xaf, 0x2c, 0x2d, 0xea, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x5C, 0x00); len = strlen(buf); len_lo = len % 256; len_hi = len / 256; tlen = len + 24; tlen_lo = tlen % 256; tlen_hi = tlen / 256; head = raw_string(0x05, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00, tlen_lo, tlen_hi, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, len_lo,len_hi, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00) + buf; return head; } #---------------------------------------------------------------# # Determine if we the remote host is running Win95/98/ME bindwinme = "05000b03100000004800000053535641d016d0160000000001000000000 soc = open_sock_tcp(port); if(!soc)exit(0); send(socket:soc, data:hex2raw(s:bindwinme)); rwinme = dcom_recv(socket:soc); close(soc); lenwinme = strlen(rwinme); stubwinme = substr(rwinme, lenwinme-24, lenwinme-21); # This is Windows 95/98/ME which is not vulnerable if("02000100" >< hexstr(stubwinme))exit(0); #----------------------------------------------------------------# REGDB_CLASS_NOTREG = "5401048000"; CO_E_BADPATH = "0400088000"; NT_QUOTE_ERROR_CODE_EQUOTE = "00000000"; # req1 = "0500000310000000b003000001000000980300000000040005000200000 req2 = "0500000310000000b003000002000000980300000000040005000200000 req3 = "05000e03100000004800000003000000d016d01605af000001000000010 req4 = "05000003100000009a00000003000000820000000100000005000200000 #display(hex2raw(s:req)); #exit(0); error1 = check(req:hex2raw(s:req1)); error2 = check(req:hex2raw(s:req2)); error3 = check(req:hex2raw(s:req3)); error4 = check2(req:hex2raw(s:req4)); error5 = NULL; null_session_failed = 0; if(hexstr(error1) == "00000000") { req = req5(); if(req) error5 = check4(req:req); else null_session_failed = 1; } #display("error1=", hexstr(error1), "\n"); #display("error2=", hexstr(error2), "\n"); #display("error3=", hexstr(error3), "\n"); #display("error4=", hexstr(error4), "\n"); #display("error5=", hexstr(error5), "\n"); error5 = NULL; null_session_failed = 1; if(hexstr(error1) == "00000000" && hexstr(error2) == "00000000" && hexstr(error4) == "1c00001c" && isnull(error5))exit(0); # HP-UX dced if(hexstr(error2) == hexstr(error1)) { vulnerable = 1; if(hexstr(error1) == "05000780")exit(0); # DCOM disabled if(hexstr(error1) == "00000000") { if( hexstr(error5) == "04000880" )vulnerable = 0; else if( null_session_failed ) { req6 = "0500000310000000c600000000000000ae0000000000000005000100000 error6 = check6(req:hex2raw(s:req6)); req7 = "0500000310000000c600000000000000ae0000000000000005000100000 error7 = check6(req:hex2raw(s:req7)); if(hexstr(error6) == "54010480" && hexstr(error7) == "04000880")vulnerable = 0; } } } if(vulnerable) { # The remote host is vulnurable! } |
||||
|
|
|||