#######################################################################
Luigi Auriemma
Application: EMC NetWorker (Legato)
http://www.emc.com/backup-and-recovery/networker/networker.htm
Versions: <= 7.6 sp3 (7.6.3.2 Build 860)
Platforms: AIX, HP-UX, Linux, Solaris, Windows
Bug: invalid read access
Exploitation: remote
Date: 14 Mar 2012
Author: Luigi Auriemma
e-mail: aluigi@autistici.org
web: aluigi.org
#######################################################################
1) Introduction
2) Bug
3) The Code
4) Fix
#######################################################################
===============
1) Introduction
===============
From vendor's homepage:
"EMC NetWorker backup and recovery software centralizes, automates, and
accelerates data backup and recovery across your IT environment.
NetWorker delivers record-breaking performance and a wide range of data
protection options to safeguard your critical business data."
#######################################################################
======
2) Bug
======
nsrexecd is a service listening on some default ports (like 111, 7937
and 7938) plus another couple of random ones usually over port 8000.
Through a malformed RPC packet sent to one these random ports it's
possible to crash the service due to the hash calculation performed
over an arbitrary amount of data.
From librpc.dll:
0038B3CF 8B4424 3C MOV EAX,DWORD PTR SS:[ESP+3C] ; my_size
0038B3D3 8B6D 00 MOV EBP,DWORD PTR SS:[EBP]
0038B3D6 2BF0 SUB ESI,EAX
0038B3D8 897424 38 MOV DWORD PTR SS:[ESP+38],ESI
0038B3DC 8B33 MOV ESI,DWORD PTR DS:[EBX] ; size
0038B3DE 8B9C24 90000000 MOV EBX,DWORD PTR SS:[ESP+90]
0038B3E5 2BF0 SUB ESI,EAX ; size - my_size
0038B3E7 8B43 10 MOV EAX,DWORD PTR DS:[EBX+10]
0038B3EA 50 PUSH EAX
0038B3EB 8D4C24 3C LEA ECX,DWORD PTR SS:[ESP+3C]
0038B3EF 51 PUSH ECX
0038B3F0 8D5424 48 LEA EDX,DWORD PTR SS:[ESP+48]
0038B3F4 52 PUSH EDX
0038B3F5 2BF7 SUB ESI,EDI
0038B3F7 53 PUSH EBX
0038B3F8 897424 54 MOV DWORD PTR SS:[ESP+54],ESI ; the new size
0038B3FC 896C24 50 MOV DWORD PTR SS:[ESP+50],EBP
...
0038AFC5 8D4C24 0C LEA ECX,DWORD PTR SS:[ESP+C]
0038AFC9 51 PUSH ECX
0038AFCA 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
0038AFCE 8D5424 0C LEA EDX,DWORD PTR SS:[ESP+C]
0038AFD2 52 PUSH EDX
0038AFD3 8B51 04 MOV EDX,DWORD PTR DS:[ECX+4] ; new size
0038AFD6 8B09 MOV ECX,DWORD PTR DS:[ECX]
0038AFD8 52 PUSH EDX
0038AFD9 8B5424 2C MOV EDX,DWORD PTR SS:[ESP+2C]
0038AFDD 51 PUSH ECX
0038AFDE 8B48 20 MOV ECX,DWORD PTR DS:[EAX+20]
0038AFE1 52 PUSH EDX
0038AFE2 8B50 1C MOV EDX,DWORD PTR DS:[EAX+1C]
0038AFE5 51 PUSH ECX
0038AFE6 52 PUSH EDX
0038AFE7 E8 04E3FFFF CALL LIBRPC.cryptoiface_get_hmac ; hash crash
Note: after the crash it's necessary to restart also the other services
so that the situation can return normal and the bug can be tested
again.
#######################################################################
===========
3) The Code
===========
http://aluigi.org/poc/nsrexecd_1.dat
https://gitlab.com/exploit-database/exploitdb-bin-sploits/-/raw/main/bin-sploits/18601.dat
nc SERVER PORT < nsrexecd_1.dat
it's enough to scan all the ports from 8000 to 10000 to catch the
correct one automatically.
#######################################################################
======
4) Fix
======
No fix.
#######################################################################