Exploit-DB #17159
Description: Microsoft Host Integration Server 8.5.4224.0 - Denial of Service
Type: dos
Platform: windows
Date: 2011-04-12
Author: Luigi Auriemma

Exploit:
Source: http://aluigi.org/adv/snabase_1-adv.txt

#######################################################################

                             Luigi Auriemma

Application:  Microsoft Host Integration Server
              http://www.microsoft.com/biztalk/en/us/host-integration.aspx?pf=true
Versions:     <= 8.5.4224.0
Platforms:    Windows
Bugs:         various Denial of Service vulnerabilities
Exploitation: remote, versus server
Date:         11 Apr 2011
Author:       Luigi Auriemma
              e-mail: aluigi@autistici.org
              web:    aluigi.org


#######################################################################


1) Introduction
2) Bugs
3) The Code
4) Fix


#######################################################################

===============
1) Introduction
===============


From vendor's website:
"Microsoft Host Integration Server technologies and tools enable
enterprise organizations to integrate existing IBM host systems,
programs, messages and data with new Microsoft server applications."


#######################################################################

=======
2) Bugs
=======


The following are only Denial of Service vulnerabilities and there are
for sure some others but sincerely who cares?
Just for quick reference...


A]
--
  Endless loop affecting all the services that use the TCP protocol so
  snabase.exe on port 1478, all the snalink.exe on their dynamic ports,
  snaservr.exe, mngagent.exe and so on.
  The cause is "word[packet] - 2" that forces the continuous parsing of
  the same data.


Instead the following bugs affect only the UDP protocol used in
snabase.exe listening on the port 1478.
When this service terminates also the others depending by it like
snalink and msngagent will terminate.

B]
--
  0101FAC7  |>  0FB785 E0FEFF>|MOVZX EAX,WORD PTR SS:[EBP-120]
  0101FACE  |.  6BC0 37       |IMUL EAX,EAX,37
  0101FAD1  |.  8B8D DCFEFFFF |MOV ECX,DWORD PTR SS:[EBP-124]
  0101FAD7  |.  8D1C08        |LEA EBX,DWORD PTR DS:[EAX+ECX]
  0101FADA  |.  8D73 0E       |LEA ESI,DWORD PTR DS:[EBX+E]
  0101FADD  |.  89B5 D8FEFFFF |MOV DWORD PTR SS:[EBP-128],ESI
  0101FAE3  |.  6A 0F         |PUSH 0F
  0101FAE5  |.  59            |POP ECX
  0101FAE6  |.  8B3D FC690301 |MOV EDI,DWORD PTR DS:[10369FC]
  0101FAEC  |.  83C7 14       |ADD EDI,14
  0101FAEF  |.  33C0          |XOR EAX,EAX
  0101FAF1  |.  F3:A6         |REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS> ; unallocated memory

  the crash is caused by the tentative of accessing the unallocated
  memory located after the packet of max 0x1ee bytes.


C]
--
  an UDP packet longer than 0x1ee bytes blocks the receiving of any
  other UDP packet.


D]
--
  endless loop and crash:
  0101AF0D  /$  8BFF          MOV EDI,EDI
  0101AF0F  |.  55            PUSH EBP
  0101AF10  |.  8BEC          MOV EBP,ESP
  0101AF12  |.  33D2          XOR EDX,EDX
  0101AF14  |.  3955 0C       CMP DWORD PTR SS:[EBP+C],EDX
  0101AF17  |.  74 1E         JE SHORT 0101AF37
  0101AF19  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
  0101AF1C  |.  56            PUSH ESI
  0101AF1D  |>  0FB748 02     /MOVZX ECX,WORD PTR DS:[EAX+2]    ; unallocated memory
  0101AF21  |.  8B70 04       |MOV ESI,DWORD PTR DS:[EAX+4]
  0101AF24  |.  03D1          |ADD EDX,ECX
  0101AF26  |.  0FB7C9        |MOVZX ECX,CX
  0101AF29  |.  F7D6          |NOT ESI
  0101AF2B  |.  2175 0C       |AND DWORD PTR SS:[EBP+C],ESI
  0101AF2E  |.  03C1          |ADD EAX,ECX
  0101AF30  |.  837D 0C 00    |CMP DWORD PTR SS:[EBP+C],0
  0101AF34  |.^ 75 E7         \JNZ SHORT 0101AF1D               ; controlled cycle
  0101AF36  |.  5E            POP ESI
  0101AF37  |>  0FB7C2        MOVZX EAX,DX
  0101AF3A  |.  5D            POP EBP
  0101AF3B  \.  C2 0800       RETN 8


E]
--
  67489374  |.  83C4 0C       ADD ESP,0C
  67489377  |.  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
  6748937A  |.  83C0 2C       ADD EAX,2C
  6748937D  |.  50            PUSH EAX
  6748937E  |.  68 05010000   PUSH 105
  67489383  |.  8B45 E8       MOV EAX,DWORD PTR SS:[EBP-18]
  67489386  |.  05 29010000   ADD EAX,129
  6748938B  |.  50            PUSH EAX
  6748938C  |.  FF15 88124467 CALL DWORD PTR DS:[<&MSVCR80.strcat_s>]  ;  MSVCR80.strcat_s

  exception if the string is too big.


F]
--
  forced termination:
  "Error: Primary Host Integration Server computer already running in ???"


G]
--
  6748A73F   .  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
  6748A742   .  83C0 03       ADD EAX,3
  6748A745   .  50            PUSH EAX
  6748A746   .  6A 10         PUSH 10
  6748A748   .  68 F0F04F67   PUSH 674FF0F0
  6748A74D   .  FF15 38134467 CALL DWORD PTR DS:[<&MSVCR80.strcpy_s>]

  if the string is longer than 0x10 bytes then the server will raise an
  exception and terminates.


H]
--
  606CC91A    68 1C010000     PUSH 11C
  606CC91F    6A 40           PUSH 40                                   ; allocate 0x40 bytes
  606CC921    FF15 30106C60   CALL DWORD PTR DS:[<&KERNEL32.LocalAlloc> ; kernel32.LocalAlloc
  606CC927    8945 E4         MOV DWORD PTR SS:[EBP-1C],EAX
  606CC92A    837D E4 00      CMP DWORD PTR SS:[EBP-1C],0
  606CC92E    0F84 D8000000   JE 606CCA0C
  606CC934    FF75 08         PUSH DWORD PTR SS:[EBP+8]                 ; our string
  606CC937    6A 10           PUSH 10                                   ; max size
  606CC939    8B45 E4         MOV EAX,DWORD PTR SS:[EBP-1C]
  606CC93C    83C0 0C         ADD EAX,0C
  606CC93F    50              PUSH EAX                                  ; destination
  606CC940    FF15 5C116C60   CALL DWORD PTR DS:[<&MSVCR80.strcpy_s>]   ; MSVCR80.strcpy_s

  if the string is longer than 0x10 bytes then the server will raise an
  exception and terminates.


I]
--
  The opcode 0x02 allows to use an arbitrary MessageId argument in
  FormatMessage causing the crash through the values 0x11 an